启动生成器可以用 next 方法,但是它不能够向其中传递数据
启动生成器的第二种方法, send 可以向其中传入数据
重点:send 方式 可以向生成器中传入值,但是接收的值还是 yield 之后的值,起到的作用是改变生成器中变量的值的作用
# 重点:send 可以向生成器中传入值,但时接收的值还是 yield 后面的值,起到的作用是改变生成器中变量的值的作用
def create_num(all_num):
a = 0
b = 1
current_num = 0
a, b = b, a + b
while current_num < all_num:
ret = yield a
print("ret--------->", ret)
a, b = b, a + b
current_num += 1
# 实例化一个生成器
obj = create_num(10)
# next后面的结果为 yield 后面的值
ret = next(obj)
print("next1", ret)
ret = next(obj)
print("next2", ret)
ret = next(obj)
print("next3", ret)
# send后面的结果为 yield 后面的值
# 注意:send 不要在第一次使用 send,除非使用 send(None)
ret = obj.send('你好')
print("send1", ret)
ret = obj.send('你好')
print("send2", ret)
ret = obj.send('你好')
print("send3", ret)
执行结果
send 和 next 结果都是实现生成器的功能,区别是 send 能够传入值
此处只返回两个 None值, 因为 send 执行时是接着上一个 next 执行的,将值传入,并没有返回 send 第一次的值,之后再执行到 yield 返回一次值才算 send 结束
next1 1
ret---------> None
next2 1
ret---------> None
next3 2
ret---------> 你好
send1 3
ret---------> 你好
send2 5
ret---------> 你好
send3 8
Process finished with exit code 0