Python中的yield和send
创建生成器yield
1、第一种方法:
a = (x for x in range(5))
print(a)
print(next(a))
print(a.__next__())
for i in a:
print(i)
输出为:
<generator object <genexpr> at 0x108827410>
0
1
2
3
4
2、第二种方法
def fun(n):
for i in range(n):
yield i
b = fun(5)
print(b)
print(next(b))
print(b.__next__())
输出为:
<generator object fun at 0x107a21e60>
0
1
可以看到,调用next方法后输出第一个结果,然后进行for循环的后面的。
生成器的send方法
def fun(n):
for i in range(n):
k = yield i
print(k)
b = fun(5)
b.send(None) # 或者next(b)/b.__next__()
b.send('a')
b.send('b')
输出结果:
a
b
总结
yield的用法是:记住上一次返回时在函数体中的位置,调用此函数从上一次返回的位置开始执行。
send的用法时:send()方法返有一个参数,该参数指定的是上一次被挂起的yield语句的返回值。
区别:当send()的参数为None时,正好与next方法等价。在调用send()方法时,要么先调用一次next()到函数挂起的位置,或者直接send(None)。
yield form方法
yield from方法用于重构生成器
def fib(n):
for i in range(n):
k = yield i
print(k)
import random
def copyfib(n):
print('I am copy from stupid fib')
yield from fib(n)
print('Copy end')
N = 20
csfib = copyfib(N)
fib_res = next(csfib)
while True:
print(fib_res)
try:
fib_res = csfib.send(random.uniform(0, 0.5))
except StopIteration:
break
输出结果:
I am copy from stupid fib
0
0.05186524665169567
1
0.08687317431928088
2
0.2721640235628532
3
0.08568872335803795
4
0.15850810860489845
Copy end