生成器函数_yield_yield from_send

时间:2022-02-18 00:05:01

生成器函数

 '''
yield类似于return 相同:
都返回出去一个值 不同:
yield每次返回时, 会记录当前执行的位置
等下次调用生成器, 会从该位置向下走 return 直接终止函数
''' # 2. 生成器函数
def mygen():
print('one')
yield 1 print('two')
yield 2 print('three')
yield 3 # 创建生成器对象
gen = mygen() # 使用next
res = next(gen) '''
首先初始化生成器, 返回一个生成器对象 第一次调用: 执行print('one'), yield返回1,
暂停记录当前位置 第二次调用: 执行print('two'), yield返回2,
暂停记录当前位置 第三次调用: 执行print('three'), yield返回3,
暂停记录当前位置, 此时生成器已经不能在返回数据, 再次调用就会报错 '''

生成器写斐波那契数列?

 def fbnq(max_len):
a = 0
b = 1 i = 0
while i < max_len:
yield b
a, b = b, a + b
# yield a
i += 1 gen = fbnq(10)
for i in gen:
print(i)

send

 '''
next和send的区别:
next: 只能取值
send: 能取本次yield的返回值,
也能给上次yield传入值. send注意点:
第一个send不能给yield传值, 默认写None
最后一个yield接收不到send的发送值
'''
 def mygen():
print('start')
res = yield 1
print(res) # res是send第二次的传入值, yield把2返回给send
res = yield 2
print(res) res = yield 3
print(res) # 初始化生成器, 获得生成器对象
gen = mygen() # 第一次调用, send传入None
yield_res = gen.send(None)
yield_res = gen.send('send1')
yield_res = gen.send('send2')
# 此时生成器已经没有数据, 再次调用就会报错
# yield_res = gen.send('send3')
 # send和next可以混合使用
gen = mygen()
yield_res = gen.send(None)
yield_res = next(gen)
yield_res = next(gen)

yield from

把可迭代对象变成一个迭代器返回

 def mygen():
listvar = ["鼎泰亚", "李楠", "陈根基", "陈元勇"] yield from listvar gen = mygen() for i in gen:
print(i)