【问题标题】:Use `for` in `print()` will give a generator on Python 3.x? [duplicate]在 `print()` 中使用 `for` 会在 Python 3.x 上生成生成器? [复制]
【发布时间】:2016-01-08 04:41:38
【问题描述】:

为什么以及如何工作?例如,我正在编写这样的列表理解:

>>> a = (10, 30, 20)
>>> print([q for q in a])
[10, 30, 20]

现在,如果我删除 [],这也可以,但是:

>>> a = (10, 30, 20)
>>> print(q for q in a)
<generator object <genexpr> at 0x7fe527d1dca8>

Python 在这里制作生成器吗?如果我在没有print() 的情况下这样做:

>>> a = (10, 30, 20)
>>> b = q for q in a

File "<input>", line 1
  b = q for q in a
          ^
SyntaxError: invalid syntax

我在考虑因为(q for q in a) 会做一个生成器,但那是不可能的,但是我没有使用两对(),比如:

>>> a = (10, 30, 20)
>>> print((q for q in a)) # here is two pair of `()`
<generator object <genexpr> at 0x7fe527d1dca8>

【问题讨论】:

  • 如果您想打印项目,而不是生成它们的生成器对象,请尝试print(*(q for q in a))* 将项目解包为函数的参数。 (不过,对于这个特定的生成器,您只需执行 print(*a) 并完成它。)
  • 它的工作原理与任何其他函数完全相同,sum, max, min ....

标签: python python-3.x list-comprehension


【解决方案1】:

Python 会在这里制作生成器吗?

是的。引用Generator expressions的官方文档,

只有一个参数的调用可以省略括号。


请注意,这是实际语法的唯一例外

generator_expression ::=  "(" expression comp_for ")"

所以,当你这样做时

b = q for q in a

Python 无法解析它,因为它不是有效的 Python 表达式。这就是你收到SyntaxError 的原因。


如果你真的想打印生成器表达式中的所有元素,你可以按照 Blckknght 的建议,将它的结果解包到 print 函数中,就像这样

>>> a = (10, 30, 20)
>>> print(*(q for q in a))
10 30 20

【讨论】:

    【解决方案2】:

    在 Python 3.x 中,print 是一个函数。

    通常,当您尝试创建生成器表达式并将其存储在变量中(或其他一些地方)时,您需要将其括在 () 中。示例 -

    b = (q for q in a)
    

    但是,如果您将生成器表达式作为伪参数传递给函数,并且它是唯一的参数,那么您不需要封闭的()

    PEP 0289 -中有解释

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

    the documentation(也由其他答案给出)-

    只有一个参数的调用可以省略括号。

    【讨论】:

      【解决方案3】:

      括号不是生成器的组成部分,就像它们不是tuple 的组成部分一样。 return 2,3 之类的东西将是 return tuple(2, 3)

      >>> def f():
      ...     return 2,3
      ...
      >>> f()
      (2, 3)
      >>> type(f())
      <class 'tuple'>
      

      您可以只用逗号创建一个带有单个字符的tuple

      >>> 2,
      (2,)
      >>> a = 2,
      >>> type(a)
      <class 'tuple'>
      

      只有当括号为语法提供歧义时才需要括号,例如[(a,b) for a,b in zip([1,2], [1,2])]

      >>> [a,b for a,b in zip([1,2], [1,2])]
        File "<stdin>", line 1
          [a,b for a,b in zip([1,2], [1,2])]
                 ^
      SyntaxError: invalid syntax
      >>> [(a,b) for a,b in zip([1,2], [1,2])]
      [(1, 1), (2, 2)]
      

      关于print() 调用,如果包含括号,则可以使用* 运算符解压缩生成器:

      >>> a = (10, 30, 20)
      >>> print([q for q in a])
      [10, 30, 20]
      >>> print(q for q in a)
      <generator object <genexpr> at 0x0000000003B84B88>
      >>> print(*(q for q in a))
      10 30 20
      >>> print(*(q for q in a if q<25))
      10 20
      >>> print(*a)
      10 30 20
      

      这有时会节省一些输入。

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 2015-10-28
        • 2014-02-14
        • 2016-07-08
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 2016-12-16
        • 2019-07-14
        相关资源
        最近更新 更多