python的生成器( generator ), 是一种特殊的迭代器
生成器, 会自动生成可迭代对象
()创建方式
生成器有多种创建方法, 第一种方法, 是把一个列表的[]改成()
L = [ x*2 for x in range(5)]
L
[0, 2, 4, 6, 8]
# 生成器
G = ( x*2 for x in range(5))
G
<generator object <genexpr> at 0x0000013B46D1AA98>
# 遍历对象
for temp in G:
print(temp)
0
2
4
6
8
yield创建方式
对于稍微复杂一点的生成器, 可以使用函数形式创建
这里使用的关键字是 yield, 只要函数中存在此关键字, 则会被当作是生成器, 不再是简单的方法调用, 而是返回一个可迭代对象
def fib(n):
current = 0
num1, num2 = 0, 1
while current < n:
num1, num2 = num2, num1 + num2
current += 1
yield num1
f = fib(5)
for temp in f:
print(temp)
程序执行结果:
1
1
2
3
5
send创建方式
要获取迭代器对象, 可以使用 iter(对象) 函数, 而获取一次迭代内容, 可以使用 next(可迭代对象) , 但 next 不能指定参数, 若希望灵活的传参, 可以使用 send 方式
send(参数)方式, 相当于 next(参数), 而无法直接 next(参数)
def fib(n):
current = 0
num1, num2 = 0, 1
while current < n:
num1, num2 = num2, num1 + num2
current += 1
res = yield num1
print("res="+str(res))
f = fib(5)
ret = next(f)
print(ret)
ret = next(f)
print(ret)
ret = f.send("abc")
print(ret)
程序结果如下:
1
res=None
1
res=abc
2
send 可以传递参数, 而next不可以传参, 而函数内通过 变量=yield得到, 若第一次就使用send必须传递None
此外, 生成器函数若有返回值, 可以在函数终止后, 即抛出了异常后, 通过异常.value获取到返回值