生成器
在 Python 中,一边循环一边计算的机制,称为 生成器(generator)
可以通过 next() 函数获得 generator 的下一个返回值
生成器 的两种表示方法:
1、将列表生成式的 [ ] 改为 ( )
[2*x for x in range(10)] => (2*x for x in range(10))
2、使用 yield 关键字
以裴波拉切数列为例
In [1]: def fib(max): # fib 是生成器函数
...: n, a, b = 0, 0, 1
...: while n < max:
...: yield b
...: a, b = b, a + b
...: n = n + 1
...: return 'done'
...:
In [2]: fib(5) # 具体的 fib(5) 才是生成器
Out[2]: <generator object fib at 0x05098CF0>
In [3]: g = fib(5)
In [4]: next(g)
Out[4]: 1
In [5]: next(g)
Out[5]: 1
In [6]: next(g)
Out[6]: 2
In [7]: next(g)
Out[7]: 3
In [8]: next(g)
Out[8]: 5
In [9]: from inspect import isgeneratorfunction
In [10]: isgeneratorfunction(fib) # 判断是否是 generator function
Out[10]: True
In [11]: import types
In [12]: isinstance(fib(5), types.GeneratorType) # 判断是否是 generator
Out[12]: True
迭代器,可迭代对象
能作用于 for 循环的都是 可迭代对象(Iterable),包括内置的 集合数据类型 和 生成器
可以被 next() 函数调用并不断返回下一个值的对象称为 迭代器(Iterator)
生成器都是 Iterator对象,但 list、dict、str 虽然是 Iterable,却不是 Iterator
可以使用 iter() 将 Iterable 转换为 Iterator
In [13]: import collections
In [14]: isinstance('abc', collections.Iterable) # 判断是否是 Iterable
Out[14]: True
In [15]: isinstance('abc', collections.Iterator) # 判断是否是 Iterator
Out[15]: False
In [16]: isinstance(iter('abc'), collections.Iterator)
Out[16]: True