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

iva*_*van 29 python for-loop

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

for c in "word":
    print c
Run Code Online (Sandbox Code Playgroud)

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

sum(x*x for x in range(10))
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 26

你指的是GeneratorPython.看一眼: -

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

从文件: -

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

发电机类似List Comprehension,你用用square brackets的,而不是brackets,但他们更多的内存效率.它们不会同时返回list结果的完整,但它们返回生成器对象.每次调用next()上的generator对象,生成器使用yield返回下一个值.

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

[x * x for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

您还可以添加条件以在for的结尾处过滤掉结果.

[x * x for x in range(10) if x % 2 != 0]
Run Code Online (Sandbox Code Playgroud)

numbers如果数字不能被2整除,这将返回1到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
Run Code Online (Sandbox Code Playgroud)

所以,你看到的是,每次调用next()执行下一个yield()generator.最后它抛出StopIteration.


Mat*_*att 8

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

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

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

但相反,你可以使用列表理解:

squares = [x**2 for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

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