簡體   English   中英

為什么在遇到“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)

我的意思是,當 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)

這部分做了兩件事:

  1. 它定義了一個函數inner_factorial,但不運行它。
  2. 它返回inner_factorial(number),這里是inner_factorial 實際運行的地方。

如果你在函數 A 中定義了一個函數 B,Python 不會在看到內部函數 B 的 return 語句時才返回。我認為這回答了你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM