2015-04-04 49 views
5

是否有一个行表达式为:是否有'产生发电机的所有输出'的简写?

for thing in generator: 
    yield thing 

我试图yield generator无济于事。

+0

答案是**否**。 – 2015-04-04 11:08:41

+1

http://stackoverflow.com/questions/17581332/converting-yield-from-statement-to-python-2-7-code是相关的 – 2015-04-04 11:11:07

+1

那些低估了这个问题的人会关心澄清吗?这个问题非常清楚,如果它是重复的,你应该已经链接到原始。 – Tibor 2015-04-04 11:13:20

回答

9

在Python 3.3+中,您可以使用yield from。例如,

>>> def get_squares(): 
...  yield from (num ** 2 for num in range(10)) 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

它实际上可以用于任何迭代。例如,

>>> def get_numbers(): 
...  yield from range(10) 
... 
>>> list(get_numbers()) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> def get_squares(): 
...  yield from [num ** 2 for num in range(10)] 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

不幸的是,Python 2.7版没有等价的结构:'(

+0

我不认为辅助函数在Py2.7中的功能与Py3.3中的“yield from”的功能完全相同。调用这个函数只是返回另一个生成器对象,所以它和内建的iter非常相似。如果你在一个函数内调用你的'yield_from()',这个函数不会自动变成一个生成函数,就像'yield from'那样。就我[理解](https://www.python.org/dev/peps/pep-0380/#motivation)而言,在Py2.7中,您需要编写显式的for-loop,如OP所示。 – 2015-04-04 11:47:38

+0

@BasSwinckels是的,帮助函数是不一样的。但是,您可以将生成器委托给该函数,它会使代码更简单,不是吗? – thefourtheye 2015-04-04 11:49:49

+0

不,我认为辅助函数没用,因为它不会从调用函数中产生。正如PEP所显示的那样,这个'for i in generator:yield i'不能被分解为单独的函数。你只是重写'iter' ... :) – 2015-04-04 11:51:48

2

您可以使用列表解析让所有的元素出来发生器(假设发电机结束) :

[x for x in generator] 
+0

这会否定发生器的一些惰性属性,即将其输出转换为列表? – 2015-04-04 12:12:58

+0

当然。通过转换为列表,您可以分配所有必要的内存来存储生成器“生成”的数据。另外,如果生成器没有完成上述语句将永不终止。 – 2015-04-04 12:14:51

+0

单线成本很高...... – 2015-04-04 12:17:04

1

这里是Python中简单的一行有效2.5+的要求;-):

for thing in generator: yield thing