可迭代对象
使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。如果没有实现__iter__而实现了__getitem__方法,并且其参数是从零开始的索引,这种对象如序列也是可迭代的
当解释器需要迭代对象时,会自动调用iter(x):
若对象实现了__iter__方法,获取一个迭代器;
若对象没实现__iter__方法,但实现了__getitem__方法,Python会创建一个迭代器,尝试从索引0开始获取元素;
若尝试失败,Python抛出TypeError。
迭代器
迭代器:用于从集合中取出元素的对象。
迭代器的功能:用于支持下列操作
- for循环
- 构建和扩展集合类型
- 逐行遍历文本文件
- 列表推导、字典推导和集合推导
- 元组拆包
- 调用函数时,使用 * 拆包实参
迭代器特点:
- 可迭代。由于Python中的迭代器实现了__iter__方法,因此也可以迭代。
- 易耗损。迭代器经过一次逐次取值的循环后便耗尽了。若想再次迭代须重建迭代器。
生成器
生成器函数:拥有yield关键字的Python函数。
生成器表达式:制造生成器的工厂,支持惰性产值。
生成器工厂函数:返回生成器的函数,定义体中可以没有yield关键字。
生成器函数与生成器表达式优点比较:
- 生成器函数:使用重复使用的情景,也可以作为协程使用。
- 生成器表达式:代码简洁易读。
使用dir()方法来查看可迭代对象,迭代器和生成器内部实现的方法
__iter__方法: 返回自身
__next__方法: 返回下一个元素
a = [1,2,3,4,5]
print(dir(a))
print('-'*20)
a = iter(a)
print(dir(a))
输出结果:
可迭代对象内部实现了__iter__
迭代器内部实现__iter__和__next__
生成器的内部也实现__iter__和__next__
一.可迭代对象
如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。如果没有实现__iter__而实现了__getitem__方法,并且其参数是从零开始的索引,这种对象如序列也是可迭代的
二.迭代器
通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。
三.生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
参考链接:
https://segmentfault.com/a/1190000013460584
https://blog.csdn.net/liangjisheng/article/details/79776008