Python 中的引數打包和解包?
如果你在 Python 中進行了一些程式設計,你可能在 Python 函式中見過 “**args” 和 “**kwargs” 這些詞。但它們到底是什麼呢?
* 和 ** 運算子執行不同的操作,根據使用場景,它們是互補的。
因此,當我們在方法定義中使用它們時,例如 -
def __init__(self, *args, **kwargs): pass
上述操作稱為“打包”,因為它將所有引數打包到一個接收該方法呼叫的單個變數中,該變數是一個名為 args 的元組。我們可以使用除 args 之外的其他名稱,但 args 是最常見且最符合 Python 風格的做法。要了解為什麼將其放入單個變數中,請考慮以下示例
假設我們有一個函式,它接受三個引數,並且我們有一個大小為 3 的列表,其中包含函式的所有引數。現在,如果我們簡單地嘗試將列表傳遞給函式,則呼叫不會生效並會丟擲錯誤。
示例 1
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(lst)
結果
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
一旦我們有了 'picked' 變數,就可以執行元組無法執行的操作。args[0]、args[1] 和 args[2] 分別會返回第一個、第二個和第三個引數。如果將 args 元組轉換為列表,則可以修改、刪除和更改列表中的項。
要將這些打包的引數傳遞給另一個方法,我們需要進行解包 -
def __init__(self, *args, **kwargs): #some code here car(VehicleClass, self).__init__(self, *args, **kwargs) #some code below
我們再次使用 * 運算子,但這次是在方法呼叫的上下文中。它現在所做的是展開 args 陣列,並像每個變數都是獨立的一樣呼叫該方法。以下是一個更清晰的示例 -
示例 2
def func1(x, y, z): print(x) print(y) print(z) def func2(*args): #Convert args tuple to a list so we can do modification. args = list(args) args[0] = 'HTML' args[1] = 'CSS' args[2] = 'JavaScript' func1(*args) func2('Python', 'Java', 'CSharp')
結果
HTML CSS JavaScript
從上面的輸出可以看出,我們能夠在將所有三個引數傳遞給 func1 之前修改它們。
類似地,我們可以解決示例 1 中發現的 TypeError 訊息。
示例:1_1
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(*lst)
結果
python java csharp
因此,如果我們不知道需要傳遞多少個引數給 Python 函式,我們可以使用打包將所有引數打包到一個元組中。
#Below function uses packing to sum unknown number of arguments def Sum(*args): sum = 0 for i in range(0, len(args)): sum = sum + args[i] return sum #Driver code print("Function with 2 arguments & Sum is: \n",Sum(9, 12)) print("Function with 5 arguments & Sum is: \n",Sum(2, 3, 4, 5, 6)) print("Function with 6 arguments & Sum is: \n",Sum(20, 30, 40, 12, 40, 54))
結果
Function with 2 arguments & Sum is: 21 Function with 5 arguments & Sum is: 20 Function with 6 arguments & Sum is: 196
下面是另一個演示打包和解包用法的程式
#function with three arguments def func1(x,y,z): print("Argument One: ",x) print("\nArgument Two: ",y) print("\nArgument Three: ",z) #Packing- All arguments passed to func2 are packed into tuple *args def func2(*args): #To do some modification, we need to convert args tuple to list args = list(args) #Modifying args[0] & args[1] args[0] = 'Hello' args[1] = 'TutorialsPoint' #Unpacking args and calling func1() func1(*args) #Driver code func2("I", "Love", "Coding")
結果
Argument One: Hello Argument Two: TutorialsPoint Argument Three: Coding
對字典使用 **
# Program to demonstrate unpacking of dictionary items using ** def func(x,y,z): print("Dicionary first item: ",x) print("\nDictionary second item: ",y) print("\nDictionary third item: ",z) d = {'x': 27, 'y': 54, 'z': 81} func(**d)
結果
Dicionary first item: 27 Dictionary second item: 54 Dictionary third item: 81
應用場景
用於套接字程式設計,我們需要向伺服器傳送未知(無限)數量的請求。
用於 Django 等 Web 框架,將可變引數傳送到檢視函式。
用於需要我們傳入可變引數的包裝器函式。