【问题标题】:What exactly constitutes an "output"?究竟什么是“输出”?
【发布时间】:2019-03-12 19:11:13
【问题描述】:

假设我们在 Python 或 IDLE shell 中运行了这行代码:

print("hai") 

屏幕上出现以下内容:

hai

这对我来说似乎违反直觉,因为 print(arg) 是一个 void 函数,因此在评估时总是返回 None; NoneType 是 python 中的一种数据类型,但是当表达式对其求值时它不会显示在窗口上,而整数是:

5

让它出现在屏幕上(在 shell 上运行):

5

这种不显示的行为是否被硬编码到 python 中,只是 NoneType 数据的一个特征?

我之所以问这个问题,是因为在什么被认为是“输出”方面似乎存在歧义,我担心这种歧义会让我的期中考试变得非常糟糕。例如,考虑这行代码……

…在 shell 中运行:

5

让它出现在屏幕上:

5

…编译并运行:

5

不让任何东西出现在屏幕上。

--

表达式 5 在 Python 中简单地计算为整数 5,但整数 5 是否以与...相同的方式输出...

print(5)

…在屏幕上输出“5”?以及 print(5) 函数调用评估为的 NoneType 数据对象怎么样?那也会是输出吗?

我想我的问题的实际影响是这样的;说有人问你这个问题:

这行代码的输出是什么?:

print(5)

正确答案是:

(一)。

5

(b).

5

(c).

无 ?

为了更好的衡量,这个问题怎么样:

这行代码的输出是什么?:

5

正确答案是:

(a).

(b).

5

上述两个问题的答案取决于几件事:

  • “究竟是什么构成了输出?评估值是输出吗? 或者输出只是字面意思:之后屏幕会是什么样子 我按回车键”

  • “我们如何运行代码重要吗?自从写 TextEdit中的代码行,编译它,然后运行它 与键入行相比,屏幕上出现的内容不同 shell 中的代码并点击返回。”

【问题讨论】:

  • 交互式解释器只是特例显示返回值None,因为作为一个单例值它不包含任何信息。
  • “输出”一般是指向特定的打开文件描述符写入东西,即fd 1(通常称为“标准输出”)。这是一个与返回值完全分开的概念,尽管解释器将非None 返回值写入标准输出的做法使两者之间的界限有些模糊。
  • 当我读到“这行代码的输出是什么?”时,我认为它的意思是“打印到屏幕上的是什么?”。如果他们想要返回值,他们(希望)会问“这行代码返回了什么?”。
  • @0x5453 我们经常用“这个函数的输入输出是什么”这句话来谈论参数和返回值。
  • 打印和日志记录通常对实际程序没有影响,只是向用户/管理员显示信息。对我来说,输出似乎是一个通用词,取决于您的参考点。例如,如果您是一个正在查看运行程序的控制台的人,那么输出可能是打印出来的任何内容。但是,如果您是程序的一部分,那么输出通常是函数的返回值。

标签: python python-idle


【解决方案1】:

正确答案取决于您在与谁交谈。如果这是期中考试,我建议你学究气。

实际上,输出可以是返回值、打印到屏幕上的内容或网络请求等。在行业中,我们通常会因为上下文而知道差异。

不过,这里有两个想法,一个是在堆栈中返回的东西,另一个是发出可见副作用的东西。

当您在期中看到问题 What is the output of this line of code?: print(5) 时,如果您想完成,可以说“这在标准输出上显示 5 并返回 None”。

如果您有多项选择题,则必须从上下文中推断出来。如果您有 '5' 和 'None' 作为两个不同的选项,请走到教授面前并在考试期间询问“您的意思是发送到标准输出的内容还是返回值是什么”。

【讨论】:

    【解决方案2】:

    这是一个有点 UNIX 的描述,但稍作调整也适用于 Windows。

    每个进程在第一次启动时,都有三个打开的​​文件描述符,它们由数字引用。文件描述符 0 是开放读取的,通常称为标准输入。文件描述符 1 和 2 是开放写的,一般分别称为标准输出和标准错误。

    “输出”通常是指“写入标准输出的东西”。对于print 函数,其目的是将一些数据写入打开的文件描述符,默认情况下是标准输出。这是否可见取决于为标准输出打开的文件。

    交互式解释器通常将您的终端作为其标准输出。 (请记住,Unix 中的许多东西都表示为文件,无论它们是否是存储在磁盘上的字节可寻址对象。)因此,当您执行 print 时,它会在您的屏幕上写入一些内容。

    但是,交互式解释器将您在提示符下键入的每个表达式的值写入标准输出,这使它成为交互式解释器而不仅仅是解释器。您在提示符处键入的任何表达式foo 都将被视为print(foo)。 (例外是如果返回值为None;作为NoneType的唯一值,函数返回None这一事实并没有真正提供任何信息,因此认为没有必要将其值打印到屏幕上.那个说法真的 仅当函数返回None时才适用,因为返回None1之间显然存在差异,但就输出而言,您仍然可以看到解释器在返回1None 时为foo(5) 输入1 或nothing 之间的区别。)

    当确定某物是否“有”输出时,最好将其输入到一个文件中,并执行该文件有一个脚本。像3 + 5 这样的简单表达式不会有任何隐式输出;该脚本会将其作为所谓的表达式语句进行评估,并产生但以其他方式丢弃 8 的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多