为什么在交互式 Python 中返回打印到 sys.stdout?

Why does returning in Interactive Python print to sys.stdout?

我 运行 今天喜欢一些不同的东西。考虑这个简单的函数:

def hi():
    return 'hi'

如果我在 Python shell,

中调用它
>>> hi()
'hi'
>>> print hi()
hi

它打印出 'returned' 值,即使它只是 repr。这让我觉得很奇怪,返回怎么会打印到标准输出? 所以我把它改成了脚本 运行:

def hi():
    return 'hi'
hi()

我运行来自终端:

Last login: Mon Jun  1 23:21:25 on ttys000
imac:~ zinedine$ cd documents
imac:documents zinedine$ python hello.py
imac:documents zinedine$ 

貌似没有输出。然后,我开始认为这是一个空闲的事情,所以我尝试了这个:

Last login: Tue Jun  2 13:07:19 on ttys000
imac:~ zinedine$ cd documents
imac:documents zinedine$ idle -r hello.py

下面是 Idle 中显示的内容:

Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 
>>> 

因此在交互式 python shell 中返回打印 。这是一个功能吗?这应该发生吗?这有什么好处?

首先,它不是returnning,与功能无关。您只有一个计算结果为对象的表达式(大惊喜!Python 中的所有内容都是一个对象)。

在这种情况下,口译员可以选择要显示的内容。您使用的解释器显然使用 __repr__。如果你使用 IPython,你会看到有一个 whole protocol,取决于前端,确定将显示什么。

交互式解释器将打印您键入和执行的表达式返回的任何内容,以方便测试和调试。

>>> 5
5
>>> 42
42
>>> 'hello'
'hello'
>>> (lambda : 'hello')()
'hello'
>>> def f():
...     print 'this is printed'
...     return 'this is returned, and printed by the interpreter'
...
>>> f()
this is printed
'this is returned, and printed by the interpreter'
>>> None
>>>

有关此内容的更多信息,请参阅维基百科 Read–eval–print loop

这是互动的一个特点shell。是的,它应该发生。好处是让交互开发更方便

在 Python 的交互模式中,计算结果为某个值的表达式会打印其 repr()(表示)。这样你就可以做到:

4 + 4

不必做:

print(4 + 4)

表达式的计算结果为 None 时例外。这不是打印出来的。

您的函数调用是一个表达式,它的计算结果为函数的 return 值,而不是 None,因此它被打印出来。

有趣的是,这不仅仅适用于评估的 last 值! 任何 语句由一个计算结果为某个(非None)值的表达式组成,将打印该值。即使在循环中:

for x in range(5): x

不同的Python命令行可以用不同的方式处理这个问题;这就是标准 Python shell 所做的。

大多数交互 shell 使用 REPL 循环 - read-eval-print。

他们阅读了您的输入。他们评估它。然后他们打印结果。

非函数示例是(使用 ipython shell):

In [135]: 3+3
Out[135]: 6    # result of a math operation

In [136]: x=3    # no result from an assignment

In [137]: x
Out[137]: 3    # evaluate the variable, and print the result - its value