【Python】迭代器/生成器
Python迭代器/生成器******> »转到**思维导图****> »转到博客园**** 1.迭代 1.1什么是迭代: 更新换代(重复)的过程,每次迭代都必须基于上一次的结果 1.2什么是迭代器: 迭代取值的工具 1.3为什么要有迭代器: 迭代器提供了一种不依赖于索引取值的方式 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 1.4什么是可迭代对象: 可迭代对象指的是内置有__iter__方法的对象,即obj.iter 1.5什么是迭代器对象: 可迭代对象执行obj.iter()得到的结果就是迭代器对象。而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。 1.6注意: 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象 需要迭代取值的数据类型:字符串str、列表list、元组tuple、字典dict、集合set、文件对象 文件对象执行内置的__iter__之后还是本身 没有任何变化,文件对象本身就是迭代器对象 针对双下线开头双下划线结尾的方法,推荐读:双下+方法名 2.迭代器取值: 迭代器取值 调用__next__ 迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身 2.1异常报错StopIteration:取完了 2.2异常处理: while True: try: print(iter_d.__next__()) except StopIteration: print('老母猪生不动了') break 2.3迭代器取值的特点:只能往后依次取,不能后退 2.4迭代器取值的优点: 1.不依赖于索引取值 2.内存中永远只占一份空间,不会导致内存溢出 2.5迭代器取值的缺点: 1.不能够获取指定的元素 2.取完之后会报StopIteration错 3.for循环的本质 1.将in后面的对象调用__iter__转换成迭代器对象 2.调用__next__迭代取值 3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环 4.生成器 只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码 生成器就是迭代器,可以用__next__方法取值 yield后面跟的值就是调用迭代器__next__方法你能得到的值 yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回 可以用.send给yield左边的变量传参,但必须先将代码运行至yield才能为期传值 yeild 1.帮你提供了一种自定义生成器方式 2.会帮你将函数的运行状态暂停住 3.可以返回值 yeid与return异同: 相同点:都可以返回值,并且都可以返回多个 不同点:yield可以返回多次值,而return只能返回一次函数立即结束,yield还可以接受外部传入的值 5.生成器表达式 例如:res = (i for i in range(1,10) if i != 4) ...