我熟悉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.
列表推导允许轻松创建列表.例如,如果您想创建一个完美正方形列表,您可以这样做:
>>> 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)
生成器表达式类似于列表推导,除了它们返回生成器对象而不是列表.您可以以与列表推导类似的方式迭代此生成器对象,但您不必一次将整个列表存储在内存中,就像在列表推导中创建列表一样.