【问题标题】:What is the advantage of the new print function in Python 3.x over the Python 2 print statement?Python 3.x 中新的 print 函数相对于 Python 2 的 print 语句有什么优势?
【发布时间】:2011-09-08 13:17:12
【问题描述】:

我多次听说 print 作为函数 (3.x) 比作为语句 (2.x) 要好。但为什么呢?

我喜欢它是一个声明,主要是因为它允许我少输入两个字符(即括号)。

我很想看看 print 语句只是没有削减它的一些情况,并且功能更优越。

【问题讨论】:

  • @LennartRegebro:不仅仅是两个角色:整个流程感觉不同。不将其作为声明会产生成本 - 特别是对于那些习惯于声明的人。但它在极端情况下减轻了一些痛苦。
  • 是的,现在您必须跟踪额外的括号,如果您还使用元组嵌入内联字符串替换,则连接多个字符串会稍微烦人。因此,我肯定会在 Py3 中遇到更多拼写错误/无效语法错误!这导致我现在使用变量来生成打印文本。

标签: python function printing python-3.x python-2.x


【解决方案1】:

基本原理

print 语句长期以来一直出现在 Python 3000 中将被删除的可疑语言功能列表中,例如 Guido 的“Python Regrets”演示文稿[1]。因此,这个 PEP 的目标并不新鲜,尽管它可能会在 Python 开发人员中引起很大争议。

以下 print() 函数的参数是从 Guido 本人 [2] 的一条 python-3000 消息中提炼出来的:

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

——PEP 3105 – Make print a function

【讨论】:

  • 很好,但没有说明为什么 expression(函数调用)在语法方面比 statement 更容易处理构造,最值得注意的是一个简单的lambda
【解决方案2】:

来自Jochen's answerSven's answer 的所有内容,以及:

在不能使用print的地方可以使用print(),比如:

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

【讨论】:

  • 我故意没有提到这个,因为我想不出我会推荐使用print() 作为表达式而不是语句的任何用途。您的示例创建了一个 10 倍于值 None 的不需要列表,使用 for x in range(10): print(x) 肯定会更好。
  • @Sven:当然。我当然不希望它成为公认的答案。 :)
  • 我只是尝试在 lambda 中使用 print,其中一个类允许我传递一个函数来记录值。我想把它们打印出来。我不得不在别处定义一个函数,因为你不能写 lambda x: print x :(.
  • 它还让构建 Python 语言的聪明人更容易添加不同分隔符等功能
【解决方案3】:

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)

【讨论】:

  • re “新版本看起来更像 Python,不是吗?”:它们都是有效的 Python,不是吗?我相信你的意思是“pythonic”,但即使是“pythonic”也很模糊。我不同意您的回答,我只是发现您的问题对于 print 函数来说是一个不充分的论据。 (我认为 OP 的答案是针对心理学家和管理者的:)
  • ΤZΩΤZΙΟΥ:我说这是关于一致性。这不是一个铁定的事实,所以我必须最终将判断留给读者。如果您愿意,我可以将其设为“在我看来,新版本看起来更像 Python”。 :)
【解决方案4】:

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

打印 *df.columns

抛出异常,而

打印(*df.columns)

工作正常!如果您想在多个呼叫打印中具有相同(可配置)的打印选项,您可以将它们保存到字典并作为**print_options 传递给

所以至少*args**kw_args 技巧是print 成为函数的充分理由!

【讨论】:

    【解决方案5】:

    您可以将内置的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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多