我正试图围绕我在野外遇到的一个常见的生成器习语。我已经注意到它(并使用它)很长时间了,但从来没有费心去质疑它。使用玩具函数的成语示例:
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
)
我知道这是一个有点愚蠢的问题,但答案对我来说并不是很直观。这只是“因为这是语法的工作方式”的情况,还是我遗漏了什么?