【问题标题】:Creating a generator in a Python function call - why does this work? [duplicate]在 Python 函数调用中创建生成器 - 为什么会这样? [复制]
【发布时间】:2019-12-28 22:35:42
【问题描述】:

我很困惑为什么这段代码有效。在对 all() 的调用中,我可以使用看起来像代码的语法来生成列表理解,但除了参数列表的对之外没有任何括号。在参数列表之外执行相同的代码会导致语法错误。 在同一代码上调用 print 会导致创建生成器,但不使用 yield 或 (生成器理解括号)?

这种特殊语法是否仅适用于函数调用,还是我遗漏了什么?

all(i for i in range(1, 11)) 
# True

print(i for i in range(1, 11))
# the syntax is creating a generator?
# <generator object <genexpr> at 0x00000000CDD7CC00>

i for i in range(1,11)
#   ^
# SyntaxError: invalid syntax

【问题讨论】:

  • all 将采用可迭代对象,而生成器是可迭代对象。如果要打印,请使用 print(*(i for i in range(1, 11))) 之类的 arg 解包,或者更简洁地使用 print(*range(1,11))
  • 生成器表达式需要(...),但当表达式是调用表达式的唯一参数时,您可以省略额外的括号。
  • 另见文档中的Generator expressions

标签: python syntax iterator generator


【解决方案1】:

这就是明确定义语法的方式,请参阅the original PEP

如果一个函数调用有一个位置参数,它可以是一个没有额外括号的生成器表达式,但在所有其他情况下,你必须给它加上括号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多