当前位置: 首页 > 面试题库 >

为什么print语句不是pythonic?[关闭]

陆和泰
2023-03-14
问题内容

已关闭 。这个问题是基于观点的。它当前不接受答案。

想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。

7年前关闭。

改善这个问题

这个问题困扰了我很长时间(正如我之前的问题所证明的):为什么print(x)比(确切地说是更pythonic的)更好print x

对于那些不知道的人,该print语句已更改为Python 3.0中的函数。正式文档在PEP
3105中
,动机在Guido van
Rossum的电子邮件中

对于这些问题,我想提出一个反对意见:

  1. 还有其他运算符,例如import我们写为语句的运算符,尽管它们的功能实际上与某个功能重复__import__
    • 对于初学者来说,运算符print不属于一般的应用程序逻辑。对他们来说,神秘的运算符是他们程序的顶峰。他们希望它看起来有所不同。
    • 现在 保证 所有描述基本Python 2.x的初学者书籍都 与第一个示例无关 。当然,语言有时会发生变化,但是对于新手来说,这些变化通常较不明显。
    • 对我而言,立即print可以在应用程序级别上复制功能并不是很明显。例如,有时我想从控制台将打印重定向为模式OS对话框。
    • 人们说很难将所有print语句重写为一个函数,但他们已迫使每个Python 2.x开发人员为所有项目完全做到这一点。很好,使用自动转换器并不难。
    • print如果print拥有语句包装功能,那么喜欢操纵功能的每个人都会得到同样的服务__print__

那么,我们能否在Stack Overflow页面上对这个问题有一个规范的答案?


问题答案:

在我看来,您的辩论是一场辩论,而不是一个问题,您是否真的要接受一个答案,表明您在主张中的错误和严重程度?

关于您的辩论要点:

还有其他运算符,例如import,我们将其作为语句编写,尽管它们的功能实际上与某个函数重复 __import__

绝对错误:函数__import__(如 每隔 其他功能-和运营商,为此事)结合 没有 在“来电者”的范围的名称(含其代码)
-任何“的thingie”结合的名字在“来电者的范围” 必须
是一条语句(就像赋值def,和一样call)。您的“观点”似乎完全错过了Python在语句和表达式之间绘制的极其深刻而关键的区别-人们可能会
不喜欢 这种区别,但是 忽略 它是最明显的错误。

Python语句是Python编译器必须特别意识到的事情-
它们可能会更改名称的绑定,可能会更改控制流,并且/或者在某些情况下可能需要从生成的字节码中完全删除(后者适用于assert)。print是Python
2中此断言的 唯一 例外;通过从语句表中删除它,Python 3删除了一个异常,使一般的断言“成立”,因此是一种更常规的语言。
特殊情况还不足以打破规则 ,长期以来一直是Pythonic的宗旨(import this在交互式解释器的>>> 提示以查看显示的“
Python的禅”),并且对语言的这种更改消除了由于早期,错误的设计决定而不得不保留多年的这一原则。

对于初学者来说,操作员打印不属于常规应用程序逻辑。对他们来说,神秘的运算符是他们程序的顶峰。他们希望它看起来有所不同。

尽早治愈初学者的误解是一件好事。

现在保证所有描述基本Python 2.x的初学者书都脱离了第一个例子。当然,语言有时会更改,但是对于新手来说,更改通常较不明显。

语言很少以深度和向后不兼容的方式进行更改(Python大约每十年进行一次),并且很少有语言功能“对于新手来说是高度可见的”,因此观察的总数很小,但是即使在这个很小的指南针中,我们也可以轻松地实现查找反例,对于初学者来说,高可见度的功能设计得很糟糕,以至于删除它是值得的。例如,现代的Basic语言(例如Microsoft的Visual
Basic)不使用用户输入的明确的行号,这是一个可怕且对所有人几乎都可见的“功能”,因为它在Basic的早期方言中是必需的。Lisp的现代变体(从Scheme开始)不使用动态作用域,

对我来说,立即可以在应用程序级别上复制打印功能并不是很明显。例如,有时我想从控制台将打印重定向为模式OS对话框。

不知道我遵循这个“要点”。只需更改sys.stdout为您喜欢的伪文件对象并重定向到您内心的内容即可-您可以 选择
对内置函数进行猴子补丁print(在Python 2中是从未有过的),但是没有人会扭曲您的手臂并强迫您这样做。

人们说很难将所有打印语句重写为一个函数,但他们已迫使每个Python 2.x开发人员为所有项目完全做到这一点。很好,使用自动转换器并不难。

2to3工具确实可以解决所有这些容易产生的表面不兼容性-
避免汗水(无论如何都需要运行它以照顾更多的灰尘print,因此人们确实在广泛使用它)。那么,您的“重点”是什么?

如果print是一个声明包装功能 print, 那么每个喜欢操纵功能print的人都会受到同样的照顾。

这样的安排本身不会删除不必要的关键字(最重要的是,消除不合理的 不规则性 ,正如我在上文中解释的那样: 没有 充分理由 成为
语句的语句,因为绝对不需要专门编译器以任何方式,形状或形式意识到它!)。对我而言,拥有这样一个基础函数会增加任何真正的价值还远远不够,但是如果您有真正的用例,那么您当然可以在Python
Ideas邮件列表中提出该案例-这样的基础函数,如果被证明确实很宝贵的话可以进行改进,以供printPython
2.7中的语句以及printPython 3.2中的函数使用。

但是,请考虑一种典型的情况,在这种情况下,可能需要猴子内置的猴子补丁print:添加关键字参数以允许花哨的调整。__print__您显然建议使用的函数将如何从__print__语句中生成那些KW参数?比恐怖>> myfile和尾随逗号还有趣的语法…?!随着print作为一个功能,关键字参数遵循这一点适用于完全正常的,普通的规则 每个
函数和函数调用-幸福!

因此,总而言之,print将其作为函数更像是Pythonic,因为它消除了异常,特殊情况以及对怪异的特殊语法的任何需要-
简单,规则和统一是Python的商标。



 类似资料:
  • 我在最后一行中找不到错误。我是这门语言的初学者。提前谢谢。 我的输出说最后一行。

  • 问题内容: 我已经看到了两种方式,但是哪种方式更适合Python? 哪种方法被认为是更好的Python? 问题答案: 第二个选项是Pythonic,原因有两个: 它是 一个 运算符,转换为一个字节码操作数。另一行是真的; 两个操作员。 碰巧的是,Python会 优化 后一种情况 并转换成任何情况,但这是CPython编译器的实现细节。 这接近于您在英语中使用相同逻辑的方式。

  • 问题内容: 我正在我的VirtualBoxed Ubuntu 11.4上测试此Go代码 Ubuntu可以访问我所有的4个内核。我通过同时运行几个可执行文件和系统监视器来检查这一点。但是,当我尝试运行此代码时,它仅使用一个内核,并且没有从并行处理中获得任何收益。 我做错了什么? 问题答案: 您可能需要查看Go FAQ 的Concurrency部分,特别是以下两个问题,并确定哪个(如果不是两个)适用于

  • 我目前正在修复别人的Java代码中的一个bug,但我无法解释这个bug。所讨论的代码是下面的if语句: 其中初始化为和函数如下所示: 令我困惑的是,即使被设置为false,代码仍然调用并执行函数。我一直认为这是不应该发生的短路。if语句本身总体上仍然被计算为false,因为只有第一个代码段中的else-block中的代码被执行。 那么,这个if语句为什么会有这样的行为呢?是短路失败,还是我误解了原

  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 问题内容: 我惊讶地发现Go带有“ goto”语句。我一直被教导说,“ goto”语句已经成为过去,并且因为它阻塞了程序的实际流程,所以它变得邪恶,而函数或方法始终是控制流程的更好方法。 我肯定错过了什么。Google为什么要包含它? 问题答案: 当我们实际检查Go标准库的源代码时,我们可以看到s在哪些地方得到了很好的应用。 例如,在文件中,使用以下语句: 在从导入只是控制流使用的另一(布尔值)的