迭代器、生成器
容器:把多个元素组织在一起的数据结构。List/dict/set/tuples….都是容器对象
大多数容器提供某种方式获取获取每一个元素,而是可迭代对象(iterable)赋予了容器这种能力,当然并不是所有的容器都是可迭代的。迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> x = [1, 2, 3] >>> y = iter(x) >>> z = iter(x) >>> next(y) 1 >>> next(y) 2 >>> next(z) 1 >>> type(x) <class 'list'> >>> type(y) <class 'list_iterator'> |
这里x是一个可迭代对象,y和z是两个独立的迭代器(iterator)
,可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
Fib既是一个可迭代对象(因为它实现了__iter__方法),又是一个迭代器(因为实现了__next__方法)
任何实现了__iter__
和__next__()
(python2中next()
)方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如
生成器其实是一种特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法.函数有yield关键字就是生成器。
生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。
本文来自博客园,作者:Iving,转载请注明原文链接:https://www.cnblogs.com/SAS-T/p/9397938.html