我熟悉块代码上下文中的for
循环。例如:
for c in "word":
print c
我刚刚看到一些使用for
的示例。它们不是以for
语句开头,而是在表达式的末尾标记它(并且不涉及缩进的代码块)。例如:
sum(x*x for x in range(10))
有人能指出一些概述for
使用情况的文档吗?我已经找到了例子,但没有解释。我能够找到的所有for
文档都描述了之前的用法(块代码示例)。我甚至不确定该怎么称呼这个用法,所以如果我的问题标题不清楚,我会道歉。
答案 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 expression。 List comprehensions,dictionary comprehensions和set comprehensions在含义上相似(不同的结果类型,生成器表达式是惰性的)并且具有相同的语法,模数在其他类型的括号内,并且在具有expr1: expr2
而不是单个表达式(在您的示例中为x * x)的字典理解情况。
答案 3 :(得分:0)
生成器表达式的文档在这里https://www.python.org/dev/peps/pep-0289/
以下是使用生成器表达式的代码。
list(x**2 for x in range(0,10))