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 |
它打印出"返回"值,即使它只是
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中返回打印。这是一个功能吗?这应该发生吗?这有什么好处?
首先,它不是
在这种情况下,解释器可以选择要显示的内容。您使用的解释器显然使用了
交互式解释器将打印您键入和执行的表达式返回的任何内容,以方便测试和调试。
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的交互模式中,对某个值进行计算的表达式将打印它们的
1 | 4 + 4 |
而不是必须这样做:
1 | print(4 + 4) |
例外情况是表达式的计算结果为
您的函数调用是一个表达式,它计算的是函数的返回值,而不是
有趣的是,这不适用于最后一个评估值!任何包含计算为某个(非
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的一个特性。是的,应该是这样的。其好处是使交互开发更加方便。