4

在学习 Python 和浏览互联网时,我偶然发现了 w3schools.com 上的一段代码。我尝试使用他们的内置站点 Python IDLE 并使用我自己的Python 3.9.0Shell 来运行它。我得到的是两个不同的输出。

我想知道哪个输出是正确的输出,为什么它提供两个不同的输出。

代码及其输出

内置站点 Python IDLE 内置站点 Python IDLE

Python 3.9.0 外壳 Python 3.9.0 外壳

请注意,数字 21 仅在使用内置站点 Python IDLE 运行代码时打印(输出)一次,而在使用 Python 3.9.0 Shell 运行代码时它被打印(输出)两次。

我自己的调试

我尝试了一个简单的打印语句调试。检查结果只有一个不同,使用 Python 3.9.0 Shell 执行最后一个返回行并输出最后一个结果,而使用内置站点 Python IDLE 最后一个返回要么不执行,要么不输出,在这种情况下,我相信是前者,而且我相信正确的输出是 Python 3.9.0 Shell,但我不知道为什么会有两个不同的输出。

使用 Python 3.9.0 Shell 结果打印语句第 1 部分结果第 2 部分

使用内置站点 Python IDLE 结果打印语句第 1 部分结果第 2 部分

源代码

def tri_recursion(k):
    if(k>0):
           result = k + tri_recursion(k-1)
           print(result)
    else:
           result = 0
    return result

tri_recursion(6)
4

3 回答 3

2

return result在末尾添加了一条语句。对于任何 IDE,除非您打印该值,否则它不会显示。但是,IDLE 也会打印返回值。从技术上讲,两个输出都是正确的,因为两个解释器都配置为执行不同的操作。举个小例子,

def foo():
    return(1)

foo()在 IDLE 上运行会给出>>> 1,而在其他 IDE 上什么也不给出,因为没有打印语句

于 2020-10-21T06:38:30.010 回答
1

两者都是正确的。

该站点上的内置 python 正在向您显示程序执行的输出。这相当于运行以下程序:

if __name__ == '__main__':
    tri_recursion(6)

在代码末尾添加这个,将其保存为 test.py 并像这样运行它:

python test.py

结果将是相同的

python shell正在向您显示REPL(Read-Eval-Print-Loop)的输出,print语句将打印到屏幕上,但函数的返回值也被打印出来,因为REPL,没有办法避免这种情况,这是设计使然。

您可以将函数设计为不返回任何内容,但它不再是递归的。

于 2020-10-21T06:40:48.540 回答
1

两者都是正确的,您需要了解 python shell 正在打印语句的输出。当你写:

>>> tri_recursion(6)

它将首先执行所有 print 内部函数,然后打印最后一次调用返回的值。

于 2020-10-21T06:41:42.877 回答