我正试图绕着我在野外遇到的一种常见的生成器习语。我已经注意到了(并且已经使用了很长时间),但从来没有费心去质疑它。使用玩具功能的习语的一个例子:
def contains_vowels(string):
vowels = set('aeiou')
if any((char in vowels) for char in string):
return True
return False
为什么any((char in vowels) for char in string)
按预期工作?我知道(char in vowels)
是一个生成器表达式,但是(char in vowels) for char in string
不是函数调用之外的有效生成器。
换句话说,鉴于以上代码有效,为什么以下代码不有效:
for b in (char in vowels) for char in string:
print b
(显然,使整个表达式生成器 按预期工作:
for b in (char in vowels for char in string):
print b
)
我认为这是一个有点愚蠢的问题,但答案对我来说并不是直观的。它只是“因为这是语法的工作方式”或是否存在我缺少的东西?
答案 0 :(得分:3)
我 得到
(char in vowels)
是一个生成器表达式,
实际上,事实并非如此。在这种情况下,括号完全是多余的,因为只有一个运算符in
。当您有更多运算符时,括号用于设置运算顺序。 (1+2)*3 == 9
(char in vowels) for char in string
不是a之外的有效生成器 功能调用。
实际上是。在函数调用内部,当生成器是唯一的参数时,您可以跳过额外的括号。所以以下两行实际上是相同的。
any(char in vowels for char in string)
any((char in vowels for char in string))
在函数调用之外,生成器必须有括号。
(char in vowels for char in string)