了解 Python 中的函數重載
函數重載是某些程式語言中的功能,可讓您定義相同函數的變體。每個變體都具有相同的名稱,但實現不同,具有獨特的函數簽名。
該方法能夠根據傳遞給函數的參數的性質和數量執行各種操作,從而在程式設計中提供更大的靈活性。
Python 與 C++ 和 Java 等程式語言的不同之處在於它本質上不支援函數重載。但是,可以透過其他方式模擬此功能。
Python 如何處理函數重載?
在 Python 中,可以使用不同的參數規格和/或資料類型多次定義一個函數。儘管如此,在呼叫函數時,Python 將專門確認其定義的最終實例。以下介紹一個恰當的例子:
def arithmetics(a, b):
return a - b
def arithmetics(a, b, c, d):
return a \+ b - c * d
print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error
物件導向的程式語言(例如 Java)經常包含函數和方法重載的機制。本質上,方法是在類別的上下文中描述的函數。
在前面提到的程式碼片段中,Python 解釋器在嘗試在專案中呼叫它時,將專門承認算術()函數的最新聲明的定義。如果嘗試使用與其初始聲明一致的兩個參數來呼叫函數,則會引發異常,指示所述參數遺失並且是執行所必需的。
當呼叫時提供四個參數時,不會出現函數錯誤,這表示該函數已被記憶體中最新版本取代。但是,這並不表示方法重載,並且需要不同的解決方法。
Python 本身並不支援函數重載;然而,人們可以在其程式碼中採用某些技術來模擬此功能。
方法 1:使用可選參數或預設參數
可以透過使用預設參數實現函數來實現重載。示範實例如下:
def arithmetics(a, b=0, c=0):
"""
Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).
"""
return a - b \+ c
給定函數總共包含三個輸入變量,但其中兩個具有預定義值。因此,這允許使用包含一到三個參數元素的陣列來呼叫該函數。
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
雖然此方法提供了呼叫函數的各種途徑,但由於一些固有的限制,它最終被證明是不可持續的解決方案。
傳遞的參數必須是整數或浮點類型。
該特定函數的功能似乎沒有明顯的變化。因此,它仍然無法執行計算給定形狀的面積或列印文字“Hello World”等任務。
方法 2:使用變數參數
若要在 Python 中使用變數參數重載,必須在定義函數時合併「args」參數。此屬性允許在函數呼叫期間傳遞多個位置參數。範例示範如下:
def arithmetics(a, *args):
"""
Arguments:
a: The first number.
*args: A variable number of arguments (optional).
"""
args_sum = 0
for num in args:
args_sum *= num
return a - args_sum
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10
上述函數需要兩個參數;一個指定為“a”的強制參數和一個稱為“args”的可選參數,允許根據需要包含任意數量的附加參數。
儘管它能夠接受大量輸入,但該特定函數在執行簡單乘法之外的算術運算的能力方面受到限制,因為它專門將乘法過程應用於由“args”關鍵字表示的變數。
要在程式設計上下文中執行一系列操作,通常需要在程式碼中合併條件語句。然而,隨著考慮的條件數量增加,手邊的程式設計任務的複雜性也隨之增加。
方法 3:使用多重調度裝飾器
Multiple Dispatch Decorator 是一個 Python 函式庫,可以根據接收的輸入類型建立單一函數的各種實作或實例。透過這樣做,人們可以使用不同的資料結構建立相同的功能並完全改變它們的行為。
若要使用多方法調度修飾,請遵守以下協議:
⭐ 在你的Python環境中安裝multipledispath:
pip install multipledispatch
⭐ 使用 @dispatch 裝飾器裝飾你的函數。 @dispatch 裝飾器是一個 Python 裝飾器,可讓您實現多重調度。它將根據您傳遞給它的參數自動調度適當的函數。您可以按照以下模式使用 @dispatch 裝飾器:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
def your_function(a, b, c, x):
pass
# perform your operations here
考慮一個場景,其中我們使用多重調度裝飾器來促進 Python 程式語言中函數重載的概念:
from multipledispatch import dispatch
@dispatch(int, int)
def add(a, b):
"""
Arguments:
a: Any integer.
b: Any integer.
"""
return a \+ b
@dispatch(int, list)
def add(a, b):
"""
Arguments:
a: Any integer.
b: Any Python list.
"""
b.append(a)
return b
# returns 3
print(add(1, 2))
# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))
上述程式碼段實例化了 add() 函數的兩個單獨的實例,每個實例接受並處理不同的參數。具體來說,這樣的一個化身接收並計算以整數資料類型表示的兩個數值的聚合,最終產生算術運算結果的總和。
以交替的方式,該操作的後續迭代涉及接受兩個參數;一個整數和一個順序集合。隨後,將所述參數新增至系列的末尾並作為修正後的累加返回。
Python 中的這種函數重載方法為您提供了很大的靈活性,特別是當您需要更改方法的行為時。您可以從多重調度文件了解更多資訊。
Python 中函數重載的最佳方法
選擇適當的功能重載方法應該與預期目標保持一致。如果可以透過使用預設或可變參數來實現所需的結果,則可能不需要使用多調度裝飾器。儘管如此,在大多數情況下,後者呈現為更有效和更準確的解決方案,因為它能夠適應各種參數類型,同時保持最佳效能。
所提供的裝飾器提供了一種優雅且通用的方法,用於在 Python 程式語言中實作函數重載。它允許根據其參數的特性創建單個函數的各種實現。
利用這種方法可以開發能夠容納各種參數類型的多功能函數,從而無需複雜的條件語句即可實現這種適應性。