簡介
Python 是全球最受歡迎的程式語言之一。在 Python 中,參數是函式定義的一部分。它們使您能夠為函式指定特定的引數。該引數可以被函式接收並應用。
然而,在編寫程式碼時,您不可能知道您的程式碼具體會被應用在哪些使用場景中。因此,為了未來的程式設計師和您程式的使用者著想,建議向函式傳遞可變數量的引數。為此,您必須使用特殊的參數。這些是 *args 和 **kwargs。在本教學中,我們將 深入學習關於 *args 和 **kwargs 參數在 Python 中的應用。我們還將學習如何對引數進行排序,以及如何在函式呼叫中應用它們。
先決條件
為了能夠按照本教學中的步驟進行操作,您需要準備一些先決條件。首先,您需要 在您的伺服器上安裝 Python 3,並讓程式設計環境正常運行。您還需要安裝適用於您特定作業系統的程式(Ubuntu, CentOS、Debian 等)。
什麼是 *args?它是如何運作的?
讓我們首先來了解 *args 是如何運作的。單星號版本的參數用於向函式傳送不具關鍵字的非固定長度引數列表。請記住,星號是該參數中最關鍵的元素。
為了更好地理解,讓我們來看一個例子。以下是您可能會在程式碼中看到的典型函式,它使用了兩個引數:
|
1 2 |
def multiply(x, y): print (x * y) |
如您所見,我們在上述函式中的引數是 x 和 y。呼叫該函式時,您將使用對應於 x 和 y 的數字。假設我們分別傳遞整數 5 和 4 給 x 和 y :
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
現在我們可以執行程式碼:
|
1 |
python lets_multiply.py |
我們將會得到如下的輸出結果:
|
1 2 3 |
輸出: 20 |
輸出顯示整數 5 和 4 已經相乘。這意味著 multiply(x, y) 函式正常運作。
現在,假設我們最終想將三個數字相乘,而不僅僅是兩個。不幸的是,在上述函式中增加一個額外的數字會產生如下錯誤:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
輸出: TypeError: multiply() takes 2 positional arguments but 3 were given |
因此,如果您預期稍後可能需要新增更多引數,那麼為了方便起見,請套用 *args 參數。您可以像這樣使用它:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
我們只需將 x 和 y 函式參數替換為 *args。執行此程式碼將為您提供每個函式呼叫的乘積,如下所示:
|
1 2 3 4 5 6 |
輸出: 20 90 24 900 |
因此, *args 非常適合在您想要向函式傳送可變長度引數列表時使用。由於它的功能,您可以向函式呼叫傳遞任意數量的引數。因此,此參數允許您構建更具彈性的程式碼,從而可以接受大量可變的、不具關鍵字的引數到函式中。
什麼是 **kwargs?它是如何運作的?
接下來,我們有雙星號版本的參數,即 **kwargs。與前一種形式不同,此參數允許您將具關鍵字的可變長度引數字典傳遞到函式中。類似於 *args,雙星號是該參數最關鍵的元素。
正如我們在上一節中所做的那樣,您可以根據需要添加任意數量的引數。不同之處在於您必須指定關鍵字。為了更好地理解,請考慮以下範例。在這裡,我們將首先列印出 **kwargs 我們想要傳遞給函數的引數:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
現在,讓我們呼叫該函數。如您所見,我們添加了關鍵字引數:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
此時執行程式將顯示以下輸出:
|
1 |
python print_kwargs.py |
|
1 2 3 |
輸出: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
然而,您的字典資料類型有可能是無序的。這很大程度上取決於您使用的 Python 3 版本。例如,Python 3.6 之後的任何版本都會按順序為您提供鍵值對。在此之前的任何版本都將以隨機順序顯示輸出。您建立的字典將被命名為 kwargs。請注意,您可以像系統上的任何其他字典一樣使用和操作它。讓我們看看如何將 **kwargs 參數發揮更大的用途和應用。
在以下範例中,我們將嘗試建立一個新函數,該函數將向含有名字的字典進行問候。我們的範例字典將包含兩個名字:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
執行程式將為您提供以下輸出:
|
1 |
python print_values.py |
|
1 2 3 4 |
輸出: The value of your_name is Casey The value of my_name is Sammy |
與前面的範例類似,字典可能顯得無序。因此,在某些情況下,名字 Casey 和 Sammy 的順序可能會顛倒。
接下來,我們將向函數傳遞額外的引數。這將證明您可以讓 **kwargs 接受您想要的任意數量的引數:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
執行程式將顯示以下輸出:
|
1 2 3 4 5 6 7 8 |
輸出: The value of name_2 is Gray The value of name_6 is Val The value of name_4 is Phoenix The value of name_5 is Remy The value of name_3 is Harper The value of name_1 is Alex |
此輸出也可能是無序的。無論如何,這些範例表明 **kwargs 讓您的程式能夠靈活地使用多個關鍵字引數。
如何為引數排序
在函數或函數呼叫中為引數排序時,請務必記住設定的順序。如下所示:
-
正式位置引數
-
*args
-
關鍵字引數
-
**kwargs
假設您正在使用 *args 和 **kwargs 搭配明確的位置參數。這意味著您的函數將如下所示:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
另一方面,將這些參數與具名關鍵字參數(keyword parameters)一起使用,會使您的函式具有以下的一般結構:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
如果不遵守設定的順序,在執行程式碼時會出現語法錯誤(syntax error)。因此,最好從一開始就避免犯這個錯誤。
如何在函式呼叫中使用 *args 和 **kwargs
最後,我們將向您展示如何使用這兩個參數將引數傳遞到函式中。我們將從一個範例開始,該範例顯示 *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
此函式中有三個參數: arg_1, arg_2,以及 arg_3。您必須建立一個變數並將其設定為可迭代對象(iterable)。在這種情況下,它將是一個 tuple。然後,您可以使用星號語法將該變數傳遞到函式中。
當您使用 python some_args.py 命令執行程式時,請觀察輸出:
|
1 2 3 4 5 |
輸出: arg_1: Sammy arg_2: Casey arg_3: Alex |
也可以將程式更改為可迭代的列表(list)資料型態,並使用不同的變數名稱。以下程式碼結合了 *args 與具名參數:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
執行程式時的輸出如下:
|
1 2 3 4 5 |
輸出: arg_1: 1 arg_2: 2 arg_3: 3 |
另一方面,您可以使用 **kwargs 來套用關鍵字引數。請確保建立一個等於字典(dictionary)的變數。它應該有 2 個鍵值對。以下是我們如何將該變數傳遞給具有 3 個引數的函式:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
使用 python some_kwargs.py 命令再次執行程式:
|
1 2 3 4 5 |
輸出: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
結論
在本教學結束時,您應該已經非常熟悉什麼是 *args 以及 **kwargs,以及它們是如何運作的。您現在可以將這些參數應用到您自己的程式碼中,使您的程式對未來的使用者更具彈性。這些非常適合您不知道會使用多少個引數的情況。只需確保注意函式和參數的關鍵要素即可。
最後,這裡有更多來自我們部落格的資源,將幫助您順利使用 Python:
- txt 檔案格式:在 Python 3 中處理純文字檔案
- Python 3 中的迴圈:使用 Break、Continue 和 Pass 語句
- 在 Python 3 中匯入模組:完整指南
- 使用 Python 3 字串格式化工具
- 使用 Python 3 進行程式設計:如何建構類別和定義物件?
祝您程式設計愉快!
留言
目前尚無留言。成為第一個留言的人吧。