Python 中的巢狀函式

Manav Narula 2023年10月10日
Python 中的巢狀函式

函式是可以在程式中反覆呼叫的程式碼塊。它可以接受不同的引數並且可以返回一些有用的值。在所有程式語言中,我們都有內建函式和使用者定義函式。

在本教程中,我們將學習如何在 Python 中建立和使用巢狀函式。

大多數語言都支援使用和建立巢狀函式。顧名思義,巢狀函式是函式內的函式。巢狀在裡面的函式稱為內函式,封閉的函式稱為外函式。

在下面的程式碼中,我們建立了一個基本的巢狀函式。

def outer_f(s):
    def inner_f(s):
        print(s)

    inner_f(s)


outer_f("Nested")

輸出:

Nested

使用上面的例子,我們可以對巢狀函式的使用有所瞭解。它們可用於對外界隱藏函式並實現資料封裝。

要知道的另一件事是巢狀函式可以使用外部函式中使用的變數。此類變數稱為非區域性變數。巢狀函式可以訪問它們,但是如果我們需要修改它們,我們必須使用 nonlocal 關鍵字。

讓我們看看下面的例子。

def outer_f():
    s = 5

    def inner_f():
        nonlocal s
        s = s + 1
        return s

    return inner_f()


print(outer_f())

輸出:

6

在這裡,如果不使用 nonlocal 關鍵字,我們將無法修改 s 變數。

現在想象一下巢狀函式是否返回某個值。這給我們帶來了巢狀函式的另一個有用特性,那就是閉包函式。這些函式是使用巢狀函式動態建立的。它可能是一種優雅而簡潔的方式來實現資料隱藏並將其用作類的替代方法。

請參考以下程式碼。

def incrementer(x):
    def inc(y):
        return x + y

    return inc


by4 = incrementer(4)
by5 = incrementer(5)

print(by4(5), by5(5))

輸出:

9 10

現在在上面的程式碼中,我們建立了一個動態方法來增加一個數字。by4by5 是使用巢狀函式建立的兩個閉包函式。這主要是由於巢狀函式能夠保持其狀態。當不涉及太多屬性時,它可能是類和全域性變數的不錯替代品。我們可以使用 __closure__ 屬性來確定一個函式是否是一個閉包。所有函式都有這個屬性,當與閉包函式一起使用時,它會返回一些單元格物件。

巢狀函式也用於裝飾器函式。裝飾器函式使用可呼叫物件,如類、函式,並返回另一個物件。我們使用@ 符號在任何此類可呼叫物件之前使用裝飾器。這樣,我們將可呼叫物件作為裝飾器函式的引數並使用它。

我們建立了一個非常簡單的裝飾器函式,以便在以下示例中更好地理解這一點。

def dec(func):
    def inner():
        print("Hello")
        func()

    return inner


@dec
def world():
    print("world")


world()

輸出:

Hello
world

在上面的例子中,我們建立了一個名為 dec() 的簡單裝飾器函式,它通過將 world() 函式用作引數並列印附加訊息來裝飾它。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相關文章 - Python Function