生成器函数
1 ''' 2 yield类似于return 3 4 相同: 5 都返回出去一个值 6 7 不同: 8 yield每次返回时, 会记录当前执行的位置 9 等下次调用生成器, 会从该位置向下走 10 11 return 直接终止函数 12 ''' 13 14 15 # 2. 生成器函数 16 def mygen(): 17 print('one') 18 yield 1 19 20 print('two') 21 yield 2 22 23 print('three') 24 yield 3 25 26 27 # 创建生成器对象 28 gen = mygen() 29 30 31 # 使用next 32 res = next(gen) 33 34 ''' 35 首先初始化生成器, 返回一个生成器对象 36 37 第一次调用: 执行print('one'), yield返回1, 38 暂停记录当前位置 39 40 第二次调用: 执行print('two'), yield返回2, 41 暂停记录当前位置 42 43 第三次调用: 执行print('three'), yield返回3, 44 暂停记录当前位置, 45 46 此时生成器已经不能在返回数据, 再次调用就会报错 47 48 '''
生成器写斐波那契数列?
1 def fbnq(max_len): 2 a = 0 3 b = 1 4 5 i = 0 6 while i < max_len: 7 yield b 8 a, b = b, a + b 9 # yield a 10 i += 1 11 12 13 gen = fbnq(10) 14 for i in gen: 15 print(i)
send
1 ''' 2 next和send的区别: 3 next: 只能取值 4 send: 能取本次yield的返回值, 5 也能给上次yield传入值. 6 7 send注意点: 8 第一个send不能给yield传值, 默认写None 9 最后一个yield接收不到send的发送值 10 '''
1 def mygen(): 2 print('start') 3 res = yield 1 4 print(res) 5 6 # res是send第二次的传入值, yield把2返回给send 7 res = yield 2 8 print(res) 9 10 res = yield 3 11 print(res) 12 13 14 # 初始化生成器, 获得生成器对象 15 gen = mygen() 16 17 # 第一次调用, send传入None 18 yield_res = gen.send(None) 19 yield_res = gen.send('send1') 20 yield_res = gen.send('send2') 21 # 此时生成器已经没有数据, 再次调用就会报错 22 # yield_res = gen.send('send3')
1 # send和next可以混合使用 2 gen = mygen() 3 yield_res = gen.send(None) 4 yield_res = next(gen) 5 yield_res = next(gen)
yield from
把可迭代对象变成一个迭代器返回
1 def mygen(): 2 listvar = ["鼎泰亚", "李楠", "陈根基", "陈元勇"] 3 4 yield from listvar 5 6 7 gen = mygen() 8 9 for i in gen: 10 print(i)