Python 3.x中新的打印函数在Python 2打印语句中的优点是什么?

我已经多次听说打印是一个函数(3.x)比它是一个声明(2.x)好。 但为什么?

我是一个声明,因为它允许我键入两个less字符(即括号)。

我有兴趣看到一些情况下,打印语句只是不削减它,function是优越的。

所有的Jochen + Sven都说,再加上:

您可以在不能使用print地方使用print() ,例如:

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

以下内容来自http://www.python.org/dev/peps/pep-3105/

打印语句长期出现在Python 3000中要删除的可疑语言特性列表上,例如Guido的“Python遗憾”演示文稿[1]。 因此,这个PEP的目标并不新鲜,尽pipe在Python开发者中可能会引起很大的争议。

下面的print()函数的参数是从Guido自己的python-3000消息中提取的[2]:

  • 打印是唯一具有专用于此的声明的应用程序级function。 在Python的世界里,语法通常被当作最后的手段,当没有编译器的帮助时,某些事情是不可能完成的。 打印不符合这种例外。
  • 在应用程序开发的某个时刻,人们经常会觉得需要用更复杂的东西来取代打印输出,比如将调用或调用logging到其他I / O库中。 使用print()函数,这是一个直接的stringreplace,今天它是一个混乱添加所有这些括号,并可能转换>>stream风格的语法。
  • 具有特殊的打印语法为进化提供了一个更大的障碍,例如,假设的新的printf()函数与print()函数共存时不会太过分。
  • 如果需要使用不同的分隔符,而不是空格,或者根本没有,则没有简单的方法可以将打印语句转换为另一个调用。 而且,用一些其他的分隔符而不是空格方便地打印对象。
  • 如果print()是一个函数,那么在一个模块(只是def print(*args):...)甚至整个程序中(例如,通过在__builtin__.print放置一个不同的函数def print(*args):...)将会更容易。 实际上,可以通过使用write()方法编写一个类并将其分配给sys.stdout来实现这一点 – 这并不坏,但绝对是一个更大的概念上的飞跃,它的工作方式与打印不同。

print作为功​​能的一个优点是一致性。 这没有理由成为一个声明。 比较这两行

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

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

function版本的另一个优点是灵活性。 例如,如果您想要捕获所有print调用以进行debugging,现在可以简单地重新定义print

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

我想过这个问题,并不知道python 3版本的优点。 但是当我需要打印pandas.DataFrame的列(没有Index([...]) )时,我发现

 打印* df.columns 

抛出一个exception,而

 打印(* df.columns) 

工作正常! 如果要在多个调用打印中使用相同(可configuration)的打印选项,则可以将它们保存为字典并作为**print_options

所以至less*args**kw_args技巧是print成为一个function的一个很好的理由!

您可以用自定义的内容replace内置的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)