【发布时间】:2016-01-31 23:41:10
【问题描述】:
我正试图围绕我在野外遇到的一个常见的生成器习语进行思考。我已经注意到它(并使用它)很长时间了,但从来没有费心去质疑它。使用玩具函数的成语示例:
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
)
我知道这是一个有点愚蠢的问题,但答案对我来说并不是很直观。这只是“因为这是语法的工作方式”的情况,还是我遗漏了什么?
【问题讨论】:
-
(char in vowels)不是生成器表达式。expression for i in seq是一个生成器表达式。x in foo正在检查收容措施。 -
我知道
x in foo会检查收容措施。我只是一直认为()表示生成器,因为这是我使用此模式的唯一上下文,尽管您所说的有道理。所以我想你可以在函数调用中定义不带括号的生成器表达式......但是例如,我知道这在具有多个参数的函数调用中不起作用。因此,更详尽的答案会很有用。 -
你也可以
return any(char in vowels for char in string),你不需要if/else -
当然帕德莱克,它只是一个玩具。
标签: python generator-expression