我有一个生成器函数,我想从另一个函数调用并返回获得的生成器。我可以在这看到两种方法 -
请注意,下面的函数是简单的虚函数来说明目的。请不要提出更好的方法来实现这些功能。
方法1def fun_a(n):
for i in range(n):
yield i+10
def fun_b(n):
if n < 0:
yield None
return
yield fun_a(n)
并将其用作list(list(fun_b(10))[0])
来获取[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
def fun_b(n):
if n < 0:
yield None
return
for i in fun_a(n):
yield i
然后list(fun_b(10))
可以给我[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
。
虽然方法1似乎没问题,但我不想返回列表清单,因为在其他情况下我会返回一个清单而我不想搞砸我的代码。方法2效率低下。
处理这种情况会有什么好办法?
答案 0 :(得分:11)
我使用的是Python 3.3或更高版本,您可以使用PEP 380中引入的yield from
语法:
PEP 380从表达式中添加了yield,允许生成器将其部分操作委托给另一个生成器。这允许将包含yield的一段代码分解出来并放在另一个生成器中。此外,允许子生成器返回一个值,该值可供委派生成器使用。
>>> def fun_a(n):
for i in range(n):
yield i+10
>>> def fun_b(n):
if n < 0:
yield None
return
yield from fun_a(n)
>>> list(fun_b(10))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>>
如果没有,那么您只需使用for item in iterable:
语法。