关于return:为什么在Interactive Python中返回打印到sys.stdout?

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

我今天遇到了不同的事情。考虑这个简单的函数:

1
2
def hi():
    return 'hi'

如果我称之为python shell,

1
2
3
4
>>> hi()
'hi'
>>> print hi()
hi

它打印出"返回"值,即使它只是repr。这让我觉得很奇怪,怎么能回到打印到stdout?所以我把它改成了要运行的脚本:

1
2
3
def hi():
    return 'hi'
hi()

我从终端运行这个:

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

似乎没有输出。然后,我开始认为这是一件无聊的事情,所以我尝试了一下:

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

以下是空闲状态下的情况:

1
2
3
4
5
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,你会看到有一个完整的协议,取决于前端,决定将显示什么。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 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。


在python的交互模式中,对某个值进行计算的表达式将打印它们的repr()(表示)。这样你就可以:

1
4 + 4

而不是必须这样做:

1
print(4 + 4)

例外情况是表达式的计算结果为None。这不是印刷品。

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

有趣的是,这不适用于最后一个评估值!任何包含计算为某个(非None值)的表达式的语句都将打印该值。即使在一个循环中:

1
for x in range(5): x

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


大多数交互式shell使用repl loop-read eval print。

他们阅读你的输入。他们评估它。他们打印结果。

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

1
2
3
4
5
6
7
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

它是交互式shell的一个特性。是的,应该是这样的。其好处是使交互开发更加方便。