为什么遇到'return'语句不停止执行?
Why doesn't execution stop when 'return' statement is encountered?
当我阅读这段代码时:
def factorial(number):
if not isinstance(number, int):
raise TypeError("Sorry. 'number' must be an integer.")
if number < 0:
raise ValueError("Sorry. 'number' must be zero or positive.")
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
我无法理解这部分代码:
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
我的意思是,当代码看到语句 return
时,Python 不会停止代码吗?我想知道 return number * inner_factorial(number - 1)
代码行是如何工作的。
您突出显示的行属于内部函数。如果有帮助,可以分开思考,如下
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1) # 1
def factorial(number):
if not isinstance(number, int):
raise TypeError("Sorry. 'number' must be an integer.")
if number < 0:
raise ValueError("Sorry. 'number' must be zero or positive.")
return inner_factorial(number) # 2
factorial
函数只是 returns inner_factorial
具有相同的传入值(第 2 行)。然后,inner_factorial
被调用并且它 return 是 自身 ,这意味着它是一个 递归调用 。 inner_factorial
将调用自身,直到 number
变得小于或等于 1
。
递归如何工作?
当我们 运行 factorial(4)
时,值被推送到调用堆栈(调用堆栈是堆栈数据结构,用于存储有关计算机程序的活动子例程的信息。调用堆栈很重要,因为每个任务都可以有自己独立的堆栈。这意味着每个被调用的函数可以同时为不同的任务激活,做不同的事情。另一个优点是调用堆栈支持自动递归调用。)在程序中并且会有一个新的 inner_factorial
函数被推送到调用堆栈,直到 inner_factorial
returns 1
。要看到这一点,可以在 inner_factorial
函数的 return 语句中使用带有断点的调试器(我使用 PyCharm's)并使用 step into 按钮。
因此,使用 factorial(4)
,我们填充 4 个新的 inner_factorials
.
如果我继续单击进入按钮,这些 inner_factorials
将被一一删除。 (被弹出调用堆栈,这就是为什么它以与被推入调用堆栈时相反的顺序发生)
另一件事是这个乘法是一次完成还是顺序执行。为了测试这一点,我没有使用 *
的乘法,而是创建了一个函数 multiply
来揭示幕后发生的事情。看起来乘法是这样完成的:
2x1 → 3x2 → 4x6
。 运行宁下面的脚本可以说明这种行为:
import time
def inner_factorial(number):
if number <= 1:
return 1
time.sleep(1)
def multiply(a, b):
print(f"multiplying {a} with {b}.")
time.sleep(1)
return a * b
return multiply(number, inner_factorial(number - 1)) # <- change is in here.
# where multiply (number being popped of the call stack, return a*b)
# multiplying 2 with 1.
# multiplying 3 with 2.
# multiplying 4 with 6.
# 24
inner_factorial(4)
如果我误解了任何部分并解释错误,请告诉我。
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
这部分做了两件事:
- 它定义了一个函数 inner_factorial,但没有 运行 它。
- 是returns inner_factorial(number),这里inner_factorial其实就是运行.
如果你在函数 A 中定义了一个函数 B,当它看到内部函数 B 的 return 语句时,Python 不只是 return。我认为这回答了你的问题问题。
当我阅读这段代码时:
def factorial(number):
if not isinstance(number, int):
raise TypeError("Sorry. 'number' must be an integer.")
if number < 0:
raise ValueError("Sorry. 'number' must be zero or positive.")
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
我无法理解这部分代码:
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
我的意思是,当代码看到语句 return
时,Python 不会停止代码吗?我想知道 return number * inner_factorial(number - 1)
代码行是如何工作的。
您突出显示的行属于内部函数。如果有帮助,可以分开思考,如下
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1) # 1
def factorial(number):
if not isinstance(number, int):
raise TypeError("Sorry. 'number' must be an integer.")
if number < 0:
raise ValueError("Sorry. 'number' must be zero or positive.")
return inner_factorial(number) # 2
factorial
函数只是 returns inner_factorial
具有相同的传入值(第 2 行)。然后,inner_factorial
被调用并且它 return 是 自身 ,这意味着它是一个 递归调用 。 inner_factorial
将调用自身,直到 number
变得小于或等于 1
。
递归如何工作?
当我们 运行 factorial(4)
时,值被推送到调用堆栈(调用堆栈是堆栈数据结构,用于存储有关计算机程序的活动子例程的信息。调用堆栈很重要,因为每个任务都可以有自己独立的堆栈。这意味着每个被调用的函数可以同时为不同的任务激活,做不同的事情。另一个优点是调用堆栈支持自动递归调用。)在程序中并且会有一个新的 inner_factorial
函数被推送到调用堆栈,直到 inner_factorial
returns 1
。要看到这一点,可以在 inner_factorial
函数的 return 语句中使用带有断点的调试器(我使用 PyCharm's)并使用 step into 按钮。
因此,使用 factorial(4)
,我们填充 4 个新的 inner_factorials
.
如果我继续单击进入按钮,这些 inner_factorials
将被一一删除。 (被弹出调用堆栈,这就是为什么它以与被推入调用堆栈时相反的顺序发生)
另一件事是这个乘法是一次完成还是顺序执行。为了测试这一点,我没有使用 *
的乘法,而是创建了一个函数 multiply
来揭示幕后发生的事情。看起来乘法是这样完成的:
2x1 → 3x2 → 4x6
。 运行宁下面的脚本可以说明这种行为:
import time
def inner_factorial(number):
if number <= 1:
return 1
time.sleep(1)
def multiply(a, b):
print(f"multiplying {a} with {b}.")
time.sleep(1)
return a * b
return multiply(number, inner_factorial(number - 1)) # <- change is in here.
# where multiply (number being popped of the call stack, return a*b)
# multiplying 2 with 1.
# multiplying 3 with 2.
# multiplying 4 with 6.
# 24
inner_factorial(4)
如果我误解了任何部分并解释错误,请告诉我。
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
这部分做了两件事:
- 它定义了一个函数 inner_factorial,但没有 运行 它。
- 是returns inner_factorial(number),这里inner_factorial其实就是运行.
如果你在函数 A 中定义了一个函数 B,当它看到内部函数 B 的 return 语句时,Python 不只是 return。我认为这回答了你的问题问题。