与Python 2打印语句相比,Python 3.x中新的打印功能有何优势?


70

我已经多次听到,print作为函数(3.x)比作为语句(2.x)更好。但为什么?

我之所以喜欢这样的声明,主要是因为它允许我少键入两个字符(即括号)。

我很想看到一些情况,其中打印语句只是不能剪切它,而功能更出色。


7
@LennartRegebro:不只是两个字符:整个流程感觉不同。不将其用作语句会产生费用-特别是对于那些用于语句的人。但这减轻了极端情况下的许多麻烦。
Arne Babenhauserheide 2012年

2
是的,现在您必须跟踪多余的括号,如果您还使用元组嵌入行内字符串替换,则使串联多个字符串变得更加烦人。因此,我在Py3中肯定会遇到更多错别字/无效的语法错误!这导致我现在使用一个变量来生成打印的文本。
Demis

Answers:


44

JochenSven的答案,以及:

您可以print()在无法使用的地方使用它print,例如:

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

13
我故意没有提及这一点,因为我想不出我建议将其print()用作表达式而不是陈述的任何用法。您的示例将创建一个不必要的列表,该列表是值的10倍None,并且使用它肯定会更好for x in range(10): print(x)
Sven Marnach 2011年

7
@Sven:好的。我当然不希望它成为公认的答案。:)
Lennart Regebro 2011年

2
我只是尝试在lambda中使用打印,其中有一个类允许我传递一个函数来记录值。我只想打印出来。我只好到别处定义一个函数,因为你不能写lambda x: print x:(。
丹尼尔·巴克马斯特

这也使构建Python语言的聪明人更容易添加诸如不同的分隔符之类的功能
user1854182

57

基本原理

打印声明早已出现在要在Python 3000中删除的可疑语言功能列表中,例如Guido的“ Python Regrets”演示文稿[1]。因此,尽管在Python开发人员中可能引起很大争议,但该PEP的目标并不新。

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

  • print是唯一具有专用语句的应用程序级功能。在Python的世界里,如果没有编译器的帮助就无法完成某些事情,那么通常将语法用作最后的手段。打印不符合此类例外条件。
  • 在应用程序开发的某个时刻,人们常常感到需要用更复杂的东西来代替打印输出,例如将调用记录或对其他I / O库的调用记录下来。使用print()函数,这是一个简单的字符串替换,今天,添加所有这些括号并可能转换>> stream样式语法变得一团糟。
  • 具有用于print的特殊语法会给进化带来更大的障碍,例如,假设新的printf()函数将与print()函数并存时,并不会太高。
  • 如果需要不同的分隔符,空格或根本不需要分隔符,则没有简单的方法可以将打印语句转换为另一个调用。此外,有没有简单的方法可以方便地与其他一些分离不是空间打印对象。
  • 如果print()是一个函数,则在一个模块(仅def print(*args):...)内甚至整个程序中替换它(例如,通过在其中放入一个不同的函数__builtin__.print)会容易得多。实际上,可以通过使用write()方法编写一个类并将其分配给sys.stdout来做到这一点-不错,但绝对是一个很大的概念上的飞跃,并且它的工作方式与print不同。

PEP 3105 –使打印功能


1
不错,但是没有说明为什么就语法构造而言,比语句更容易处理表达式(函数调用),最著名的是简单语句lambda

36

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
关于“新版本看起来更像Python,不是吗?”:它们都是有效的Python,不是吗?我相信您的意思是“ pythonic”,但即使是“ pythonic”也相当模糊。我不同意您的回答,只是发现您的问题对于该print函数而言是一个不足的论点。(我认为对OP的回答是针对心理学家和管理人员的:)
tzot 2011年

2
ΤZΩΤZΙΟΥ:我说的是一致性。这不是一个困难的事实,因此我必须最终将判断力留给读者。如果愿意,我可以将其命名为“我认为新版本看起来更像Python”。:)
Sven Marnach 2011年

18

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

打印* df.columns

引发异常,而

打印(* df.columns)

工作良好!如果要在多个呼叫打印中使用相同(可配置)的打印选项,则可以将它们保存到字典中并作为**print_options

因此,至少*args**kw_args技巧是print成为函数的一个很好的理由!


12

您可以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']

您可以print在lambda或函数调用等内部使用:

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.