作为函数参数的一行 for 循环

One-line for loop as a function argument

def strange_syntax(stuff):
    return ".".join(item for item in stuff)

此代码如何(以及为什么)工作?这里发生了什么?通常我不能使用这种语法。此外,如果不在某些 函数 中作为参数,则此语法不存在。

我知道,我也可以这样做:

def normal_syntax(stuff):
    return ".".join(stuff)

这叫做generator expression

它的工作方式就像列表推导式(但会延迟评估迭代对象而不是从中构建新列表),但您使用圆括号而不是方括号来创建它们。您可以在只有一个参数的函数调用中去掉括号。

在您的特定情况下,不需要生成器表达式(如您所述)- (item for item in stuff) 给出与 stuff 相同的结果。当对 (item.strip() for item in stuff)(地图)或 (item for item in stuff if item.isdigit())(过滤器)等项进行操作时,这些表达式开始变得有意义。

在函数调用中使用时,语法:

f(a for a in b)

隐式编译为生成器,意思是

f((a for a in b))

这只是语法糖,让程序看起来更漂亮。直接在控制台写意义不大

>>>a for a in b

因为不清楚你是想创建一个生成器,还是执行一个常规循环。在这种情况下,您必须使用外部 ().