作为函数参数的一行 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)
它的工作方式就像列表推导式(但会延迟评估迭代对象而不是从中构建新列表),但您使用圆括号而不是方括号来创建它们。您可以在只有一个参数的函数调用中去掉括号。
在您的特定情况下,不需要生成器表达式(如您所述)- (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
因为不清楚你是想创建一个生成器,还是执行一个常规循环。在这种情况下,您必须使用外部 ()
.
def strange_syntax(stuff):
return ".".join(item for item in stuff)
此代码如何(以及为什么)工作?这里发生了什么?通常我不能使用这种语法。此外,如果不在某些 函数 中作为参数,则此语法不存在。
我知道,我也可以这样做:
def normal_syntax(stuff):
return ".".join(stuff)
它的工作方式就像列表推导式(但会延迟评估迭代对象而不是从中构建新列表),但您使用圆括号而不是方括号来创建它们。您可以在只有一个参数的函数调用中去掉括号。
在您的特定情况下,不需要生成器表达式(如您所述)- (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
因为不清楚你是想创建一个生成器,还是执行一个常规循环。在这种情况下,您必须使用外部 ()
.