[英]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)
我的意思是,當 Python 看到語句return
時,它不會停止代碼嗎? 我想知道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
函數只返回具有相同值的inner_factorial
(第 2 行)。 然后, inner_factorial
並返回自身,這意味着它是一個遞歸調用。 inner_factorial
將調用自身,直到number
小於或等於1
。
當我們運行factorial(4)
,值被存儲在 function 中,並且會有一個新的inner_factorial
函數,直到inner_factorial
返回1
。 要看到這一點,可以在inner_factorial
函數的返回語句中使用帶有斷點的調試器(我使用PyCharm 的)並使用step into按鈕。 因此,使用factorial(4)
,我們填充 4 個新的inner_factorials
。
如果我繼續單擊 step into 按鈕,這些inner_factorials
將被一一刪除。
另一件事是這種乘法是一次完成還是按順序完成。 為了測試這一點,我沒有使用乘法*
,而是創建了一個函數multiply
來揭示幕后發生的事情。 看起來乘法是這樣完成的: 2x1 → 3x2 → 4x6
。 這種行為可以通過運行下面的腳本來說明:
import time
def multiply(a, b):
print(f"multiplying {a} with {b}.")
time.sleep(1)
return a * b
def inner_factorial(number):
if number <= 1:
return 1
return multiply(number, inner_factorial(number - 1)) # <- change is in here.
# multiplying 2 with 1.
# multiplying 3 with 2.
# multiplying 4 with 6.
# 24
如果我誤解任何部分並解釋錯誤,請告訴我。
def inner_factorial(number):
if number <= 1:
return 1
return number * inner_factorial(number - 1)
return inner_factorial(number)
這部分做了兩件事:
如果你在函數 A 中定義了一個函數 B,Python 不會在看到內部函數 B 的 return 語句時才返回。我認為這回答了你的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.