为什么Python中的print不是一个函数?

14

为什么在Python中print是关键字而非函数?


2
请查看 http://www.python.org/dev/peps/pep-3105/ 上的相关编程内容。 - jfs
有趣的问题,我从未考虑过它是个问题,但这是一个好问题。 - Frank V
readln和writeln在Turbo Pascal中也是内置的。我从来没有理解为什么要这样做,而且我更喜欢将它们作为函数来使用C语言。 - sashoalm
@JFSebastian:这解释了为什么打印函数会更好,但并没有解释为什么一开始不是打印函数。 - steffen
6个回答

13
因为Guido已经决定他犯了一个错误。 :)
之后已经进行了更正:请尝试Python 3,它将一个版本的发布说明专门用于描述转换为函数的更改
有关完整背景,请参见PEP 3105和其参考文献部分提供的其他链接!

我还没有尝试过Python 3。print关键字还有效吗? - user538442
2
不是了。现在它是一个函数了。在简单的情况下,print "foo"变成了 print("foo") - Bill Lynch
已更正为“现在是一个函数” :) - Marcus Borkenhagen
@steffen — 我已经添加了PEP的直接链接,并修正了第一个链接的名称,以更清楚地表明我正在直接链接到变更的发布说明。 - Brandon Rhodes
@BrandonRhodes:我的困惑更多是因为问题提问者接受了您的答案作为正确答案,而不是您的答案本身。我倾向于同意您的看法,认为这一开始就是一个错误,并在Python3中得到了纠正。但最初的问题是“为什么”首先将print作为语句制定。 - steffen

8

print在Python中曾经是一种语句,因为它在ABC语言中也是一种语句,而ABC语言是Python的主要灵感来源(尽管在那里它被称为WRITE)。这可能反过来又有一个语句而不是函数,因为它是一种教学语言,因此受到基础语言的启发。然而,Python最终成为了一种不仅仅是教学语言的语言(尽管它也很适合用于教学)。

然而,现在的print是一个函数。是的,在Python 2中,您可以这样做:

from __future__ import print_function

然后你就可以使用了。从Python 2.6版本开始支持。


2

现在,在Python 3中它是一个函数。


2
@用户:这不仅仅是时间问题,更多的是向前和向后的兼容性问题。 - Mark Rushakoff

1
在Python 2.x中,print语句具有一些特殊的语法,这些语法对于普通函数是不可用的。例如,您可以使用尾随的,来抑制最后一个换行符的输出,或者您可以使用>>将输出重定向到文件中。但即使对于Guido van Rossum本人来说,所有这些也不足以使他相信它应该保留为语句——在Python 3.x中,他将print转换为了一个函数。

嗯,现在开始有点明白了。 - user538442
那么现在额外的功能都丢失了吗?比如尾随的逗号和>>。 - user538442
6
现在你需要使用 end=file= 关键字参数来替代原来的特殊语法,但是它仍然存在。 - dan04

1

这个答案并不一定要来自于官方 Python 历史,而是从我对 print 语句的欣赏中得出的结论。

Python 在某种程度上可以被称为一种脚本语言。现在有很多关于“脚本语言”的定义,但我在这里采用的是:一种专门设计用于编写短小或者交互式程序的语言。这种语言通常允许编写一行代码而无需过多的模板代码;通过避免过多的标点符号使得键盘输入更加便捷;并且提供内置的语法用于完成常见任务(虽然可能牺牲了一些纯粹性)。在 Python 中,打印一个值是非常常见的操作,尤其是在交互模式下。在此要求使用函数形式的 print 似乎是没有必要的。使用特殊语法进行打印操作的风险相对较低,并且能够正确地处理 99% 的情况。


根据这个参数,input 也需要是一个语句。 - steffen

0

我会谈一下我的想法:

在Python 2.x中,print不是一个语句,这并非出于错误或因为向stdout打印是一件基本的事情。其他所有东西都经过深思熟虑或至少有可以理解的原因,那么这样的错误似乎很奇怪。如果与stdout通信被认为是如此基本的话,那么与stdin通信也必须同样重要,但input()是一个函数。

如果您查看保留关键字列表语句列表,其中不是表达式的语句,print显然很突出,这是另一个提示,说明必须有非常具体的原因。

我认为print必须是一个语句而不是表达式,以避免在input()中发生安全漏洞。请记住,在Python2中,input()会评估用户键入到stdin中的任何内容。如果用户键入print a并且a包含所有密码的列表,那将是非常灾难性的。

显然,input()评估表达式的能力被认为比print作为普通内置函数更重要。


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