2

我正试图围绕我在野外遇到的一个常见的生成器习语。我已经注意到它(并使用它)很长时间了,但从来没有费心去质疑它。使用玩具函数的成语示例:

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

)

我知道这是一个有点愚蠢的问题,但答案对我来说并不是很直观。这只是“因为这是语法的工作方式”的情况,还是我遗漏了什么?

4

1 回答 1

3

我知道这(char in vowels)是一个生成器表达式,

事实上,它不是。在这种情况下,括号是完全多余的,因为只有一个 operator in。当您有更多运算符时,括号用于设置操作顺序。(1+2)*3 == 9

(char in vowels) for char in string不是函数调用之外的有效生成器。

实际上是的。在函数调用中,当生成器是唯一的参数时,您可以跳过额外的括号。因此,以下两行实际上是相同的。

any(char in vowels for char in string)
any((char in vowels for char in string))

在函数调用之外,生成器必须有括号。

(char in vowels for char in string)
于 2016-01-31T23:49:12.837 回答