37

我熟悉for块代码上下文中的循环。例如:

for c in "word":
    print c

我刚刚遇到了一些使用for不同的例子。他们不是从for语句开始,而是在表达式的末尾标记它(并且不涉及缩进的代码块)。例如:

sum(x*x for x in range(10))

谁能给我指出一些概述这种用法的文档for?我已经能够找到示例,但找不到解释。for我能找到的所有文档都描述了以前的使用(块代码示例)。我什至不知道该怎么称呼这种用途,所以如果我的问题标题不清楚,我深表歉意。

4

4 回答 4

31

你所指的是GeneratorPython。看一眼: -

请参阅文档: -Generator Expression其中包含您发布的完全相同的示例

从文档中: -

生成器是用于创建迭代器的简单而强大的工具。它们像常规函数一样编写,但只要它们想要返回数据就使用 yield 语句。每次调用 next() 时,生成器都会从它停止的地方恢复(它会记住所有数据值以及最后执行的语句)

生成器类似于List Comprehension您使用 withsquare brackets而不是brackets,但它们的内存效率更高。它们不会同时返回完整list的结果,而是返回生成器对象。每当您next()generator对象上调用时,生成器都会使用它yield来返回下一个值。

List Comprehension对于上面的代码看起来像: -

[x * x for x in range(10)]

您还可以在 for 末尾添加条件以过滤掉结果。

[x * x for x in range(10) if x % 2 != 0]

如果数字不能被 2 整除,这将返回numbers1 到 5 范围内的乘以 2 的列表。

Generators描述使用的示例yield可以是:-

def city_generator():
    yield("Konstanz")
    yield("Zurich")
    yield("Schaffhausen")
    yield("Stuttgart")

>>> x = city_generator()
>>> x.next()
Konstanz
>>> x.next()
Zurich
>>> x.next()
Schaffhausen
>>> x.next()
Stuttgart
>>> x.next()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
StopIteration

所以,你看,每次调用都会next()执行下一个yield()in generator。最后它抛出StopIteration

于 2012-10-16T17:27:41.083 回答
9

这些是生成器表达式,它们与列表推导有关

列表推导允许轻松创建列表。例如,如果你想创建一个完美正方形列表,你可以这样做:

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

但是,您可以使用列表推导:

squares = [x**2 for x in range(10)]

生成器表达式类似于列表推导,除了它们返回生成器对象而不是列表。您可以以与列表推导类似的方式迭代此生成器对象,但您不必一次将整个列表存储在内存中,就像您在列表推导中创建列表一样。

于 2012-10-16T17:35:44.607 回答
0

您的具体示例称为生成器表达式列表推导字典推导集合推导在含义上相似(不同的结果类型,并且生成器表达式是惰性的)并且具有相同的语法,模数位于其他类型的括号内,并且在 dict 推导的情况下,使用expr1: expr2而不是单个表达式(在您的示例中为 x*x)。

于 2012-10-16T17:30:44.300 回答
0

生成器表达式的文档在这里https://www.python.org/dev/peps/pep-0289/ 以下是使用生成器表达式的代码。

list(x**2 for x in range(0,10))
于 2018-04-01T06:24:11.497 回答