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

posted @ 2023-05-20 21:49  limalove  阅读(14)  评论(0)    收藏  举报