【问题标题】:Why does the following Python generator expression work?为什么以下 Python 生成器表达式有效?
【发布时间】: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


【解决方案1】:

我 知道(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)

【讨论】:

  • 所以单参数函数调用中的生成器表达式只是一个特例。我想我一直都知道这个问题的答案,但觉得隐式生成器语法与我的预期不一致。
  • 是的,这是个特例。
  • 如果没有 use python for functional programming,在文档中可能会有点难以找到 - 搜索 表示函数调用的括号也算在内
猜你喜欢
  • 2020-12-01
  • 2017-12-08
  • 1970-01-01
  • 2013-10-15
  • 2021-11-12
  • 2014-04-02
  • 2021-12-27
  • 2019-11-17
  • 2010-11-03
相关资源
最近更新 更多