Python 3.3中新出现的句法:yield from
如果生成器函数需要产出另一个生成器生成的值,传统的解决方法是使用嵌套的for循环。
ps: 另一个生成器这里没有看懂,哪来的另一个生成器。
标准库中有chain函数,假如自己实现chain生成器:
1 def chain(*iterables): 2 for it in iterables: 3 for i in it: 4 yield i 5 6 7 8 9 def chain_v2(*iterables): 10 for it in iterables: 11 yield from it # yield from it 完全代替了上面那种定义方式里内层的for循环 12 13 14 15 s = 'ABC' 16 t = tuple(range(3)) 17 18 r = list(chain(s, t)) 19 print(r) #['A', 'B', 'C', 0, 1, 2] 20 21 22 r2 = list(chain_v2(s,t)) 23 print(r2) #['A', 'B', 'C', 0, 1, 2]
作用:把不同的生成器结合在一起使用。
除了代替循环之外,yield from还会创建通道,把内层生成器直接与外层生成器的客户端联系起来。把生成器当成协程使用时,这个通道特别重要,不仅能为客户端代码生成值,还能使用客户端代码提供的值。
1