在Python2.x中使用print()(函数版本)

57

我了解语句(statement)和表达式(expression)之间的区别,并且知道Python3将print()变成了一个函数。

然而,当我在不同的Python2.x解释器上运行用括号包裹的print()语句时,它都可以完美地运行,而我甚至不需要导入任何模块。

我的问题是:在Python2.x中,下面的代码print("Hello SO!")被评估为语句还是表达式?

3个回答

64

考虑以下表达式:

a = ("Hello SO!")
a = "Hello SO!"

它们是等效的。同样地,使用语句:

statement_keyword("foo")
statement_keyword "foo"

也是等价的。

请注意,如果您将打印函数更改为:

print("Hello","SO!")
你会注意到Python 2和Python 3之间有所不同。在Python 2中,(...,...)被解释为元组,因为“print”是一个语句,而在Python 3中,它是一个带有多个参数的函数调用。
因此,为了回答手头的问题,在Python 2.x中,“print”被解析为语句,除非你使用from __future__ import print_function(在Python 2.6中引入)。

2
在Python3中使用from future import print_function会有影响吗?它不会出现导入错误。 - sgoblin
2
@sgoblin -- 不是的。__future__ 模块保证了其中的任何内容都不会被删除。在 Python3.x 中,它实际上是一个无操作(no-op)。 - mgilson

22

print("Hello SO!") 被解释为语句 print ("Hello SO!"),其中 print 语句的参数是表达式 ("Hello SO!")

如果要打印多个值,这可能会有所不同;例如 print("Hello", "world") 将打印 2 元组 ('Hello', 'world'),而不是两个字符串 "Hello""world"

为了与 Python 3 兼容,请使用 from __future__ import print_function

>>> print("Hello", "world")
('Hello', 'world')
>>> from __future__ import print_function
>>> print("Hello", "world")
Hello world

如果你想要兼容Python2.5和Python3.x,你可以使用字符串插值(虽然我认为现在不太多人提倡这种方法...)。 - mgilson
7
这也很有趣。请注意,如果您将此放入脚本中,则会失败,因为__future__导入必须出现在文件的开头,但是通过某些深层的Python魔法,在交互式解释器中它可以工作。 - mgilson

2

它仍然被视为语句,你只是打印 ("Hello SO!"),这只会评估为 "Hello SO!",因为它不是元组(如delnan所述)。


3
而且要明确的是,("Hello SO!")恰好等价于"Hello SO!" - 它不是一个元组。 - user395760
谢谢@delnan,我在发布关于1元组的好答案之前看到了你的评论。 - Matthew Adams
4
补充delnan的评论,要创建一个包含一个元素的元组(1-tuple),需要使用逗号(例如:("Hello SO!",))。请注意,逗号是必需的,即使只有一个元素也是如此。 - mgilson

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