Python`for`语法:块代码与单行生成器表达式

时间:2012-10-16 17:25:29

标签: python for-loop

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

for c in "word":
    print c

我刚刚看到一些使用for的示例。它们不是以for语句开头,而是在表达式的末尾标记它(并且不涉及缩进的代码块)。例如:

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

有人能指出一些概述for使用情况的文档吗?我已经找到了例子,但没有解释。我能够找到的所有for文档都描述了之前的用法(块代码示例)。我甚至不确定该怎么称呼这个用法,所以如果我的问题标题不清楚,我会道歉。

4 个答案:

答案 0 :(得分:24)

你指的是Python中的Generator。看看: -

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

从文档中: -

  

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

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

上述代码的

yield如下所示: -

List Comprehension

您还可以添加条件以在for。

结尾处过滤掉结果
[x * x for x in range(10)]

如果数字不能被2整除,这将返回[x * x for x in range(10) if x % 2 != 0] 的列表,在1到5的范围内乘以2。

描述使用numbers的{​​{1}}示例可以是: -

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()

答案 1 :(得分:8)

这些是generator expressions,它们与list comprehensions

相关

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

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

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

答案 2 :(得分:0)

您的具体示例称为generator expressionList comprehensionsdictionary comprehensionsset comprehensions在含义上相似(不同的结果类型,生成器表达式是惰性的)并且具有相同的语法,模数在其他类型的括号内,并且在具有expr1: expr2而不是单个表达式(在您的示例中为x * x)的字典理解情况。

答案 3 :(得分:0)

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

list(x**2 for x in range(0,10))