Python 3.x 中新的 print 函数相对于 Python 2 print 语句的优点是什么?

我曾多次听说 print 作为一个函数(3.x)比作为一个语句(2.x)要好,但是为什么呢?

我喜欢它是一个语句,主要是因为它允许我少输入两个字符(即括号)。

我很有兴趣看到一些情况,在这些情况下,print 语句不起作用,而函数更优越。

29161 次浏览

理由

Print 语句一直出现在 Python 3000中要删除的可疑语言特性列表中,比如 Guido 的“ Python Regrets”演示文稿 [1]。因此,这个 PEP 的目标并不新鲜,尽管它可能会在 Python 开发人员中引起很大争议。

Print ()函数的以下参数是 Guido 自己从 python-3000消息中提炼出来的:

  • Print 是唯一一个应用程序级别的功能,它有一个专用于它的语句。在 Python 的世界中,语法通常是作为最后的手段使用的,即在没有编译器帮助的情况下完成某些 不行操作。印刷品不符合这种例外情况。
  • 在应用程序开发的某个阶段,人们常常感到需要用一些更复杂的东西来替换打印输出,比如记录调用或调用其他 I/O 库。使用 print ()函数,这是一个简单的字符串替换,如今添加所有这些括号和可能转换 > > 流样式的语法是一团糟。
  • 使用特殊的 print 语法为进化设置了一个更大的障碍,例如,假设一个新的 printf ()函数与 print ()函数共存,这种情况并不遥远。
  • 如果需要不同的分隔符,不需要空格,或者根本不需要空格,要将 print 语句转换为另一个调用并不容易。此外,完全没有没有简单的方法可以方便地使用空格以外的其他分隔符来打印对象。
  • 如果 print ()是一个函数,那么在一个模块(只有 def print(*args):...)甚至整个程序(例如在 __builtin__.print中放入一个不同的函数)中替换它会容易得多。实际上,我们可以用 write ()方法编写一个类,然后把它赋值给 sys.stdout ——这并不坏,但绝对是一个更大的概念上的飞跃,而且它在一个不同于 print 的层次上工作。

PEP 3105-使打印一个功能

print作为函数的一个优点是一致性。没有理由让它成为一种声明。比较这两条线

2.x: print >> my_file, x
3.x: print(x, file=my_file)

新版本看起来更像 Python,不是吗?

函数版本的另一个优点是灵活性。例如,如果出于调试目的希望捕获所有 print调用,现在可以简单地重新定义 print:

def print(*args, **kwargs):
# whatever
__builtins__.print(*args, **kwargs)

您可以将内置的 print替换为自定义的 print:

import os
import sys


def print(s):
sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
sys.stdout.write(str(s) + os.linesep)


print(['A', 'list'])
# Output:
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']

你可以在 lambda 或者函数调用中使用 print:

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)

约亨的回答斯文的回答的所有内容,还有:

你可以在不能使用 print的地方使用 print(),比如:

[print(x) for x in range(10)]

我仔细考虑了这个问题,对 Python 3版本的优点一无所知。但是当我需要打印 pandas.DataFrame(没有 Index([...]))的列时,我发现

print *df.columns

throws an exception, while

print(*df.columns)

没问题!如果您希望在多个调用打印中具有相同的(可配置的)打印选项,则可以将它们保存到 dictionary 中并作为 **print_options传递

因此,至少 *args**kw_args技巧是一个很好的理由 print是一个功能!