单行python for循环作为函数参数

时间:2018-01-11 10:57:59

标签: python syntactic-sugar

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

这段代码的工作原理(和原因)如何?这里发生了什么?通常我不能使用这种语法。如果它不在某个 function 中作为参数,则该语法也不存在。

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

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

2 个答案:

答案 0 :(得分:3)

这称为generator expression

它就像列表理解一样(但是懒惰地评估迭代的对象而不是从它们构建新的列表),但是使用括号而不是括号来创建它们。你可以在一个只有一个参数的函数调用中删除括号。

在您的特定情况下,不需要生成器表达式(如您所述) - (item for item in stuff)提供与stuff相同的结果。使用(item.strip() for item in stuff)(地图)或(item for item in stuff if item.isdigit())(过滤器​​)等项目时,这些表达式开始有意义。

答案 1 :(得分:2)

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

f(a for a in b)

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

f((a for a in b))

这只是语法糖,使程序看起来更好。直接在控制台中编写

并没有多大意义
>>>a for a in b

因为您不清楚是否要创建生成器或执行常规循环。在这种情况下,您必须使用外部()