我多次听说打印是一个函数(3.x)比它是一个声明(2.x)更好。但为什么呢?
我很喜欢它是一个声明,主要是因为它允许我输入两个较少的字符(即括号)。
我有兴趣看到一些情况,其中print语句不会削减它,并且功能更优越。
答案 0 :(得分:52)
原理
print语句早已出现在Python 3000中要删除的可疑语言功能列表中,例如Guido的“Python Regrets”演示文稿[1]。因此,这个PEP的目标并不新鲜,尽管它可能在Python开发人员中引起很大争议。
对于print()函数的以下参数是由Guido自己[2]从python-3000消息中提取的:
- print是唯一具有专用语句的应用程序级功能。在Python的世界中,语法通常被用作最后的手段,当没有编译器帮助无法时。打印不符合此类例外的条件。
- 在应用程序开发的某个时刻,人们经常感到需要用更复杂的东西来替换打印输出,比如记录调用或调用其他I / O库。使用print()函数,这是一个简单的字符串替换,今天它是一个混乱添加所有这些括号,并可能转换>>流样式语法。
- 具有特殊的印刷语法为进化提供了更大的障碍,例如:一个假设的新printf()函数与print()函数共存时不太远。
- 如果需要不同的分隔符,而不是空格,或者根本不需要空格,则没有简单的方法将print语句转换为另一个调用。此外,根本没有简单的方法方便地使用除空格之外的其他分隔符来打印对象。
- 如果print()是一个函数,则在一个模块(仅
def print(*args):...
)内或甚至整个程序中更换它会更容易(例如,通过在__builtin__.print
中放置一个不同的函数)。实际上,人们可以通过使用write()方法编写一个类并将其分配给sys.stdout来实现这一点 - 这不是坏事,但绝对是一个更大的概念上的飞跃,它的工作方式与打印不同。
答案 1 :(得分:41)
答案 2 :(得分:32)
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)
答案 3 :(得分:18)
我想过这个问题并且不知道python 3版本的优点。但是当我需要打印pandas.DataFrame
列(没有Index([...])
)时,我发现了
print *df.columns
抛出异常,而
print(*df.columns)
工作正常!如果您想在多个通话打印中使用相同(可配置)的打印选项,您可以将它们保存到字典中并传递为**print_options
所以至少*args
,**kw_args
技巧是print
成为函数的一个很好的理由!
答案 4 :(得分:11)
您可以使用自定义版本替换内置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)