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

rec*_*gle 69 python printing function python-2.x python-3.x

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

我很喜欢它是一个声明,主要是因为它允许我键入两个较少的字符(即括号).

我有兴趣看到一些情况,其中print语句不会削减它,并且功能更优越.

Joc*_*zel 55

合理

print语句长期出现在Python 3000中要删除的可疑语言特性列表中,例如Guido的"Python遗憾"演示文稿[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来实现这一点 - 这不是坏事,但绝对是一个更大的概念上的飞跃,它的工作方式与打印不同.

- PEP 3105 - 打印功能


Len*_*bro 43

一切从约亨的答案埃里克森的回答,再加上:

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

[print(x) for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

  • 我故意没有提到这一个,因为我想不出任何使用我建议使用`print()`作为表达而不是语句.您的示例创建了一个不需要的列表,其值为"None"的10倍,并且在范围(10)中使用`for x肯定会更好:print(x)`. (10认同)
  • @Sven:好的.我当然不打算成为公认的答案.:) (7认同)
  • 我只是尝试在lambda中使用print,其中一个类允许我传递一个函数来记录值.我想把它们打印出来.我必须在别处定义一个函数,因为你不能写`lambda x:print x` :(. (2认同)

Sve*_*ach 34

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

2.x: print >> my_file, x
3.x: print(x, file=my_file)
Run Code Online (Sandbox Code Playgroud)

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

功能版本的另一个优点是灵活性.例如,如果要捕获所有print调用以进行调试,现在只需重新定义print:

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • "新版本看起来更像Python,不是吗?":它们都是有效的Python,不是吗?我相信你的意思是"pythonic",但即使是"pythonic"也很模糊.我不同意你的回答,我发现你的问题对于'print`函数来说是一个不充分的论据.(对于心理学家和经理来说,OP的答案是代表:)我认为:) (3认同)
  • ΤΖΩΤΖΙΟΥ:我说这是关于一致性的.这不是一个很难的事实,所以我必须最终将判断留给读者.我可以做到"在我看来,新版本看起来更像Python",如果你愿意的话.:) (2认同)

All*_*leo 18

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

print *df.columns

抛出异常,而

print(*df.columns)

工作良好!如果你想在几个调用打印中有相同的(可配置的)打印选项,你可以将它们保存到字典并传递为**print_options

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

  • Upvote,因为我可以与之相关的一个例子 (2认同)

Art*_*par 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']
Run Code Online (Sandbox Code Playgroud)

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

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
Run Code Online (Sandbox Code Playgroud)