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这是否会否定生成器的一些惰性属性,即将其输出转换为列表?绝对如此。通过转换为列表,您正在分配存储生成器“生成”的数据所需的所有内存。此外,如果生成器未完成上述语句,则该语句将永远不会终止。不,这是将生成器转换为内存表示的巨大成本。我建议您考虑一下为什么要从生成器转换为列表;在大多数情况下,您不希望在必要时强制生成器求值。