迭代器(iterator)与生成器(generator)
-
迭代器
迭代器:它是一个带状态的对象,调用next()方法的时候返回容器中的下一个值,任何实现了iter和next()(python2中实现next())方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
容器:把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这些数据结构直接把所有元素存放在内存中。
可迭代对象(iterable):但凡是可以返回一个迭代器的对象都可称之为可迭代对象。例如内置的list、dict、set等数据结构属于可迭代对象。
实现一个迭代器的方法- 为容器对象添加 iter() 和 next() 方法(Python 2.7 中是 next());iter() 返回迭代器对象本身 self,next() 则返回每次调用 next() 或迭代时的元素;
- 内置函数 iter() 将可迭代对象转化为迭代器
- 生成器(generator)。特殊的迭代器,生成器通过 yield 语句(即通过 yield 语句将普通函数变成生成器)快速生成迭代器,省略了复杂的 iter() & next() 方式。
#简单示例
>>> list1=[1,2,3,4]
>>> list_iterator=iter(list1)
>>> list1
[1, 2, 3, 4]
>>> list_iterator
<list_iterator object at 0x0227B7F0>
>>> next(list_iterator)
1
>>> next(list_iterator)
2
>>> next(list_iterator)
3
>>> next(list_iterator)
4
>>> next(list_iterator)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
next(list_iterator)
StopIteration
>>>
示例2:自定义迭代器:实现斐波那契数列
在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
>>> from itertools import islice
>>> class Fibonacci:
def __init__(self):
self.f0=0
self.f1=1
def __iter__(self):
return self
def __next__(self):
value=self.f1
self.f1+=self.f0
self.f0=value
return value
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>>
示例3:用生成器的方式实现斐波那契数列
>>> def Fibonacci():
f0,f1=0,1
while True:
yield f1
f0,f1=f1,f0+f1
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>>
迭代器不会预先将所有元素加载在内存中,只有当它被调用时,才会真正返回值