Python編程思想(21):原來函數內部還可以定義函數(局部函數)

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《Python編程思想》專欄

在前面的文章中所有的函數都是在全局範圍內定義的,這些函數都稱爲全局函數。 Python還支持在函數體內定義函數,這種被放在函數體內定義的函數稱爲局部函數。

在默認情況下,局部函數對外部是隱藏的,局部函數只能在函數體內調用。函數也可以返回局部函數,以便程序在其他作用域中使用局部數。

示例代碼:local_func_test.py

# 定義函數,該函數會返回局部函數的計算結果
def multi_math_func(type, value) :
    # 定義一個計算平方的局部函數
    def square(n) :
        return n * n
    # 定義一個計算立方的局部函數
    def cube(n) :
        return n * n * n
    # 定義一個計算階乘的局部函數
    def factorial(n) :
        result = 1
        for index in range(2, n + 1) :
            result *= index
        return result
    # 調用局部函數
    if type == "square" :
        return square(value)
    elif type == "cube":
        return cube(value)
    else:
        return factorial(value)
print(multi_math_func("square", 5)) # 輸出25
print(multi_math_func("cube", 7)) # 輸出343
print(multi_math_func("", 4)) # 輸出24

在這段代碼中定義了一個全局函數multi_math_func,在該函數中定義了3個局部函數,而 multi_math_func()函數則根據參數選擇調用不同的局部函數。

如果multi_math_func函數沒有返回局部函數,那麼局部函數只能在multi_math_func函數內部調用,如上面程序所示。

另外,還會出現一種情況,如果multi_math_func函數將局部函數返回,且程序使用變量保存了multi_math_func函數的返回值,那麼這些局部函數的作用域就會被擴大。因此程序完全可以自由地調用它們,就像它們都是全局函數一樣。下面就看一下如何使用局部函數。

示例代碼:return_func.py

# 定義函數,該函數會返回局部函數的計算結果
def multi_math_func(type) :
    # 定義一個計算平方的局部函數
    def square(n) :
        return n * n
    # 定義一個計算立方的局部函數
    def cube(n) :
        return n * n * n
    # 定義一個計算階乘的局部函數
    def factorial(n) :
        result = 1
        for index in range(2, n + 1) :
            result *= index
        return result
    # 調用局部函數
    if type == "square" :
        return square       # 返回square函數
    elif type == "cube":
        return cube         # 返回cube函數 
    else:
        return factorial    # 返回factorial函數  
# 調用get_math_func(),程序返回一個嵌套函數
math_func = multi_math_func("cube") # 得到cube函數
print(math_func(7)) # 輸出343
math_func = multi_math_func("square") # 得到square函數
print(math_func(3)) # 輸出9
math_func = multi_math_func("other") # 得到factorial函數
print(math_func(6)) # 輸出720

這段代碼中的multi_math_func函數根據type參數值返回了3個不同的函數,所以該函數的返回值就是函數本身,因此,不能直接輸出該函數的返回值,要按函數的方式調用後,才能得到計算結果。

-----------------支持作者請轉發本文,也可以加李寧老師微信:unitymarvel,或掃描下面二維碼加微信--------

歡迎關注  極客起源  微信公衆號,更多精彩視頻和文章等着你哦!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章