为什么以下 Python 生成器表达式有效?
Why does the following Python generator expression work?
我正在努力思考我在野外遇到的一个常见的生成器习语。我注意到它(并使用它)很长时间了,但从来没有费心去质疑它。使用玩具函数的成语示例:
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
)
我知道这是一个有点愚蠢的问题,但答案对我来说不是很直观。这只是 "because that's the way the syntax works" 的情况还是我遗漏了什么?
I
get that (char in vowels)
is a generator expression,
其实不然。在这种情况下括号是完全多余的,因为只有一个运算符 in
。当您有更多运算符时,括号用于设置运算顺序。 (1+2)*3 == 9
(char in vowels) for char in string
is not a valid generator outside of a
function call.
原来如此。在函数调用中,当生成器是唯一参数时,您可以跳过额外的括号。所以下面两行实际上是一样的。
any(char in vowels for char in string)
any((char in vowels for char in string))
在函数调用之外,生成器必须有括号。
(char in vowels for char in string)
我正在努力思考我在野外遇到的一个常见的生成器习语。我注意到它(并使用它)很长时间了,但从来没有费心去质疑它。使用玩具函数的成语示例:
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
)
我知道这是一个有点愚蠢的问题,但答案对我来说不是很直观。这只是 "because that's the way the syntax works" 的情况还是我遗漏了什么?
I get that
(char in vowels)
is a generator expression,
其实不然。在这种情况下括号是完全多余的,因为只有一个运算符 in
。当您有更多运算符时,括号用于设置运算顺序。 (1+2)*3 == 9
(char in vowels) for char in string
is not a valid generator outside of a function call.
原来如此。在函数调用中,当生成器是唯一参数时,您可以跳过额外的括号。所以下面两行实际上是一样的。
any(char in vowels for char in string)
any((char in vowels for char in string))
在函数调用之外,生成器必须有括号。
(char in vowels for char in string)