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 框架,將可變引數傳送到檢視函式。

  • 用於需要我們傳入可變引數的包裝器函式。

更新於: 2019-07-30

938 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告