Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有';从生成器';产生所有输出;?_Python_Python 2.7_Generator_Yield - Fatal编程技术网

Python 有没有';从生成器';产生所有输出;?

Python 有没有';从生成器';产生所有输出;?,python,python-2.7,generator,yield,Python,Python 2.7,Generator,Yield,是否有一行表达式表示: for thing in generator: yield thing 我尝试了yield generator,但没有成功。在Python 3.3+中,您可以使用。比如说, >>> def get_squares(): ... yield from (num ** 2 for num in range(10)) ... >>> list(get_squares()) [0, 1, 4, 9, 16, 25, 36,

是否有一行表达式表示:

for thing in generator:
    yield thing

我尝试了
yield generator
,但没有成功。

在Python 3.3+中,您可以使用。比如说,

>>> 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]
它实际上可以与任何iterable一起使用。比如说,

>>> 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]


不幸的是,Python2.7没有等效的构造:'(

您可以使用列表理解从生成器中获取所有元素(假设生成器结束):


下面是一个简单的单行程序,根据要求在Python 2.5+中有效;-):


答案是否定的。我不认为辅助函数在Py2.7中的作用与Py3.3中的
产生的功能完全相同。调用此函数只返回另一个生成器对象,因此它与内置的
iter
非常相似。如果在函数中调用
yield\u from()
,此函数不会自动成为生成器函数,就像
yield from
一样。就我而言,在Py2.7中,您需要编写OP所示的显式for循环。@BasSwinckels是的,helper函数不同。但是,您可以将生成器委托给该函数,这将使代码更简单,不是吗?不是,我认为helper函数是无用的,因为它不会从调用函数中产生。如PEP所示,发电机中i的
:产量i
不能分解为单独的函数。您刚刚重写了iter这是否会否定生成器的一些惰性属性,即将其输出转换为列表?绝对如此。通过转换为列表,您正在分配存储生成器“生成”的数据所需的所有内存。此外,如果生成器未完成上述语句,则该语句将永远不会终止。不,这是将生成器转换为内存表示的巨大成本。我建议您考虑一下为什么要从生成器转换为列表;在大多数情况下,您不希望在必要时强制生成器求值。