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)