为什么在交互式 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 中返回打印 仅 。这是一个功能吗?这应该发生吗?这有什么好处?
首先,它不是return
ning,与功能无关。您只有一个计算结果为对象的表达式(大惊喜!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
我 运行 今天喜欢一些不同的东西。考虑这个简单的函数:
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 中返回打印 仅 。这是一个功能吗?这应该发生吗?这有什么好处?
首先,它不是return
ning,与功能无关。您只有一个计算结果为对象的表达式(大惊喜!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