使用打散(splat)运算符与print一起使用

6

我经常使用Python的print语句来显示数据。是的,我知道有'%s %d' % ('abc', 123)方法,'{} {}'.format('abc', 123)方法和' '.join(('abc', str(123)))方法。我也知道星号运算符(*)可以用于将可迭代对象展开为函数参数。然而,我似乎无法在print语句中使用它。使用列表:

>>> l = [1, 2, 3]
>>> l
[1, 2, 3]
>>> print l
[1, 2, 3]
>>> '{} {} {}'.format(*l)
'1 2 3'
>>> print *l
  File "<stdin>", line 1
    print *l
          ^
SyntaxError: invalid syntax

使用元组:

>>> t = (4, 5, 6)
>>> t
(4, 5, 6)
>>> print t
(4, 5, 6)
>>> '%d %d %d' % t
'4 5 6'
>>> '{} {} {}'.format(*t)
'4 5 6'
>>> print *t
  File "<stdin>", line 1
    print *t
          ^
SyntaxError: invalid syntax

我有点不明白,这是否不可能?紧随print关键字后面的东西是什么?文档说,逗号分隔的表达式列表跟着print关键字,但我猜这并不是同一个列表数据类型。我在SO和网上进行了大量挖掘,没有找到清晰的解释。
我正在使用Python 2.7.6。
1个回答

12

print是Python 2.x中的语句,不支持*语法。您可以从文档中列出的print语法中看到这一点:

print_stmt ::=  "print" ([expression ("," expression)* [","]]
                | ">>" expression [("," expression)+ [","]])

请注意,在print关键字后没有使用*的选项。


然而,在函数调用内部支持*语法,恰好在Python 3.x中print是一个函数。这意味着你可以从__future__导入它:

from __future__ import print_function

然后使用:

print(*l)

演示:

>>> # Python 2.x interpreter
>>> from __future__ import print_function
>>> l = [1, 2, 3]
>>> print(*l)
1 2 3
>>>

好的,看起来这在语言定义上是不被允许的。我原本以为自己漏掉了什么,希望*操作符会作为评估print表达式的一部分而被应用,并且结果与print兼容。换句话说,我希望*iterableprint解释为逗号分隔的表达式列表,其中每个表达式都是可迭代对象的一个元素。我猜这意味着这些表达式中的每一个都将被评估,这可能会导致代码注入或更糟的情况。也许这就是原因。 - Randall Cook
2
* 语法实际上是 函数调用语法 的一部分;它不是一个独立的运算符。 print 不支持它,只是因为语言设计者没有决定以这种方式进行修改。 最近有一个提议将 * 语法扩展到 Python 的更多领域,但尚未实施。 - user2555451
啊,这解释了很多问题。谢谢。+1。 - Randall Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接