【问题标题】:Why does returning in Interactive Python print to sys.stdout?为什么在交互式 Python 中返回打印到 sys.stdout?
【发布时间】:2023-03-16 15:30:01
【问题描述】:

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

def hi():
    return 'hi'

如果我在 Python shell 中调用它,

>>> hi()
'hi'
>>> print hi()
hi

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

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

我从终端运行这个:

上次登录时间:周一 6 月 1 日 23:21:25 在 ttys000 imac:~ zinedine$ cd 文件 imac:documents zinedine$ python hello.py imac:文件 zinedine$

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

最后登录时间:Tue Jun 2 13:07:19 on ttys000 imac:~ zinedine$ cd 文件 imac:documents zinedine$ idle -r hello.py

这是空闲时显示的内容:

Python 2.7.6(v2.7.6:3a1db0d2747e,2013 年 11 月 10 日,00:42:54) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 在 darwin 键入“copyright”、“credits”或“license()”以获取更多信息。 >>> >>>

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

【问题讨论】:

    标签: python return stdout python-idle


    【解决方案1】:

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

    >>> 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
    >>>
    

    请参阅 Wikipedia 上的 Read–eval–print loop 了解更多信息。

    【讨论】:

      【解决方案2】:

      首先,它不是returnning,和功能无关。你只需要一个计算结果为对象的表达式(大惊喜!Python 中的一切都是对象)。

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

      【讨论】:

      • 如果它没有返回,那么它到底在做什么?
      • 不是没有返回。你在解释器中评估的任何东西,包括从函数返回的对象,都会通过解释器的协议来确定如何处理它。从理论上讲,您可以编写一个解释器,在评估字符串时显示跳舞的小丑。
      【解决方案3】:

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

      4 + 4
      

      不必做:

      print(4 + 4)
      

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

      你的函数调用是一个表达式,它的计算结果是函数的返回值,它不是None,所以它被打印出来了。

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

      for x in range(5): x
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          大多数交互式 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
          

          【讨论】:

            猜你喜欢
            • 2019-01-31
            • 2018-11-26
            • 2014-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-18
            • 2015-03-13
            相关资源
            最近更新 更多