1. 概念
生成器: 包含yield的函数就是一个generator
解释: 更确切地说是yield关键字将返回一个generator
>>> def test():
... yield 3
...
>>> type(test)
<class 'function'>
>>> type(test())
<class 'generator'>
可以看到type(test)是一个function, 而type(test())才是一个generator.
每通过next调用generator, generator就将执行一次yield
>>> def test1():
... yield 1
... yield 2
... yield 3
... yield 4
...
>>> g = test1()
>>> next(g)
1
>>> next(g)
2
>>> next(g)
3
>>> next(g)
4
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
2. 使用场景
极大的迭代中, 直接生成对象列表来迭代将会占用大量的内存, 此时可使用迭代器. 如斐波那契数列的前一千万项(不考虑超大数超出处理器位数), 直接生成将占用大量内存, 此时可使用generator, 只占用两个两个变量的内存即可达到目的.
3. 缺点
适用于做遍历而非获取特定位置的元素, 如斐波那契数列generator实现:
def fib(n):
"""
斐波那契数列前n项,默认n>=3,不做校验
1,1,2,3,5,8,13...
"""
a = 1
b = 1
# 第一次调用__next__
yield 1
# 第二次调用__next__
yield 1
for i in range(2,n):
a, b = b, a+b
yield b
if __name__ == '__main__':
g = fib(10)
try:
while True:
print(next(g), end=', ')
except StopIteration:
pass
该方法只适合用于获取斐波那契数列的前n项, 而无法用来获取第n项.