Python 2.7中print和print()有什么区别?

15

我是Python的新手。

我在Python 2.7上运行以下代码时,发现使用print或print()会产生不同的结果。这两个函数之间有什么区别?我阅读过其他类似问题的答案,例如这个问题,但没有找到我的答案。

class Rectangle:
    def __init__(self, w, h):
        self.width = w
        self.height = h
    def __str__(self):
        return "(The width is: {0}, and the height is: {1})".format(self.width, self.height)

box = Rectangle(100, 200)
print ("box: ", box)
print "box: ", box

结果是:

('box: ', <__main__.Rectangle instance at 0x0293BDC8>)
box:  (The width is: 100, and the height is: 200)

4
如果你正在学习Python,我建议你使用Python 3版本,它具有更少的令人惊讶的行为。 - Andrea Corbellini
5个回答

31
在Python 2.7(以及之前的版本)中,print是一个语句,它需要一些参数。它会在这些参数之间打印一个空格。
所以如果你执行以下代码:
print "box:", box

它首先打印字符串 "box:",然后是一个空格,接着是 box 打印的内容(即其 __str__ 函数的结果)。

如果你这样做:

print ("box:", box)

您提供了一个参数,一个由两个元素("box:"和对象box)组成的元组。

元组以其表示形式打印(通常用于调试),因此它调用其元素的__repr__而不是它们的__str__(后者应该给出用户友好的消息)。

这就是您看到的区别:(The width is: 100, and the height is: 200)是您的盒子__str__的结果,但<__main__.Rectangle instance at 0x0293BDC8>是其__repr__

在Python 3及更高版本中,print()是与其他函数相同的普通函数(因此print(2, 3)会打印"2 3",而print 2, 3则是语法错误)。如果您想在Python 2.7中实现这一点,请使用:

from __future__ import print_function

在您的源文件顶部添加此代码,使其更适合现在的使用。


从 https://stackoverflow.com/questions/23034078/what-is-the-difference-between-a-statement-and-a-keyword 打印不是一个语句,而是一个关键字。 - Pierre ALBARÈDE

4

这主要是对其他答案的补充。

在Python 2脚本中,您会看到print (var),而正常用法应该是print var

它利用了Python 2中(var)只是一个带括号的表达式,实际上被视为var,因此print(var)print var在Python 2中的行为完全相同 - 但仅适用于打印一个单一变量

有趣的是,当您考虑迁移到Python 3时,print(var)(这里调用了函数print)已经是正确的语法。

TL/DR:在Python 2中,print(var)只是一种技巧,利用了(var)只是一个表达式 - 元组形式应该是(var,),以便更轻松地迁移到Python 3。


1
在第一个示例中,您打印了元组,但未调用打印函数。 因此,以下代码是相同的:
a = ("box: ", box)
print a

换句话说,在第一个例子中,您创建了一个元组并将其打印出来。不同的数据类型会有不同的输出。

对于您的情况,函数和语句之间应该没有显着差异,但是为了将来,请始终使用函数(print())。然而,如果您仍然对差异感兴趣(与您的情况无关),则可以使用打印函数指定分隔符、结束位置以及输出位置,如文档所述。


谢谢,但为什么会有这两个不同的输出? - Tail of Godzilla
第一个来自repr(box),第二个来自str(box)。当您打印元组时,所有元素都使用repr(...)版本。 - viraptor

1
在Python 2.7中:print不是一个函数,它是一个关键字并且作为一个特殊语句。
在此之前,我们需要更多地了解Python2中的元组和表达式。
如果我们写('hello'):它被视为一个表达式,而不是一个元组,只有在引入","时才能被视为元组。
例如:
print("hello")
>>> hello
a=("hello")
>>>'hello'
a=("hello", "world")
>>>('hello', "world")
print("hello", "world")
>>> ('hello', 'world')

在Python2.7中,当我们使用带括号的print语句时,它仍被视为语句而不是Python函数,并且带括号的值被视为元组或表达式;而在Python 3中,print不再是语句,而被视为函数。
为了在Python2中使用Python 3的print函数,请使用以下导入语句:
from __future__ import print_function

0
在Python 2.7中,print()比print更快。这里是一个使用Repl.it Python Console Online进行的测试:
import time

start_time = time.time()
print "lol"
end_time = time.time()
print(end_time - start_time)

start_time_2 = time.time()
print ("lol")
end_time_2 = time.time()
print(end_time_2 - start_time_2)

print((end_time_2 - start_time_2) > (end_time - start_time))

Python 2.7.10
[GCC 4.8.2] on linux
lol
7.08103179932e-05
lol
1.00135803223e-05
False

缓存会以任何方式影响这个实验吗? - Samarth S
好的观点,但我不这么认为!出于好奇,我在Repl.it上尝试了不带括号的打印测试,并在https://www.tutorialspoint.com/execute_python_online.php上尝试了带括号的打印测试。结果,后者仍然更快。 - Trop Freshloïc

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