首頁 > 軟體

Python 變數教學之打包和解包引數

2022-08-17 18:02:01

前言:

我們使用兩個運運算元 *(用於元組)和 **(用於字典)。

背景 

考慮這樣一種情況,我們有一個接收四個引數的函數。我們想呼叫這個函數,我們有一個大小為 4 的列表,其中包含函數的所有引數。如果我們只是將一個列表傳遞給函數,則呼叫不起作用。

# 一個演示打包和解包需求的 Python 程式

# 一個接受 4 個引數並列印它們的範例函數。
def fun(a, b, c, d):
	print(a, b, c, d)

# 驅動程式程式碼
my_list = [1, 2, 3, 4]

# 這不起作用
fun(my_list)

輸出 :

TypeError: fun() takes exactly 4 arguments (1 given)

解 

包我們可以使用 ***** 來解包列表,以便它的所有元素都可以作為不同的引數傳遞。

# 一個帶有 4 個引數並列印的範例函數,
def fun(a, b, c, d):
	print(a, b, c, d)

# 驅動程式程式碼
my_list = [1, 2, 3, 4]

# 將列表解壓縮為四個引數
fun(*my_list)

輸出 :

(1, 2, 3, 4)

我們需要記住,引數的數量必須與我們為引數解包的列表的長度相同。

# 當 len(args) != 函數所需的實際引數沒有時出錯

args = [0, 1, 4, 9]
def func(a, b, c):
	return a + b + c
# 使用解包引數呼叫函數
func(*args)

輸出:

Traceback (most recent call last):
  File "/home/592a8d2a568a0c12061950aa99d6dec3.py", line 10, in <module>
    func(*args)
TypeError: func() takes 3 positional arguments but 4 were given

作為另一個範例,考慮需要單獨的開始和停止引數的內建 range() 函數。如果它們不能單獨使用,請使用 *-operator 編寫函數呼叫以將引數從列表或元組中解包出來:

>>>
>>> range(3, 6) # 帶有單獨引數的正常呼叫
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # 使用從列表中解包的引數呼叫
[3, 4, 5]

Packing 

當我們不知道需要將多少個引數傳遞給 python 函數時,我們可以使用 Packing 將所有引數打包到一個元組中。

# 演示打包使用的 Python 程式

# 此函數使用打包來彙總未知數量的引數
def mySum(*args):
	return sum(args)

# 驅動程式程式碼
print(mySum(1, 2, 3, 4, 5))
print(mySum(10, 20))

輸出:

15 
30

上述函數 mySum() 執行“打包”以將此方法呼叫接收到的所有引數打包到一個變數中。一旦我們有了這個“打包”變數,我們就可以用它來做我們用普通元組做的事情。args[0] 和 args[1] 會分別給你第一個和第二個引數。由於我們的元組是不可變的,您可以將 args 元組轉換為列表,以便您還可以修改、刪除和重新排列 i 中的專案。

打包和拆包 

下面是一個顯示打包和拆包的範例。

# 一個 Python 程式,用於演示打包和解包。

# 一個範例 python 函數,它接受三個引數並列印它們
def fun1(a, b, c):
	print(a, b, c)

# 另一個範例函數。
# 這是包裝的一個例子。 傳遞給 fun2 的所有引數都打包到元組 *args 中。
def fun2(*args):

	# 將 args 元組轉換為列表,以便我們修改它
	args = list(args)

	# 修改引數
	args[0] = 'Haiyong'
	args[1] = 'awesome'

	# 拆包引數並呼叫 fun1()
	fun1(*args)

# 驅動程式程式碼
fun2('Hello', 'beautiful', 'world!')

輸出:

(Haiyong, awesome, world!)

用於字典

# 演示使用 ** 解包字典項的範例程式
def fun(a, b, c):
	print(a, b, c)

# 解包字典的呼叫
d = {'a':2, 'b':4, 'c':10}
fun(**d)

輸出:

2 4 10

這裡 ** 解壓了與它一起使用的字典,並將字典中的專案作為關鍵字引數傳遞給函數。所以寫“fun(1, **d)”就相當於寫“fun(1, b=4, c=10)”。

# 一個 Python 程式,用於演示使用 ** 打包字典項
def fun(**kwargs):

	# kwargs 是一個字典
	print(type(kwargs))

	# 列印字典專案
	for key in kwargs:
		print("%s = %s" % (key, kwargs[key]))

# 驅動程式程式碼
fun(name="geeks", ID="101", language="Python")

輸出:

<class 'dict'>
name = geeks
ID = 101
language = Python

應用和要點 :

  • 在通訊端程式設計中用於向伺服器傳送大量請求。
  • 在 Django 框架中用於將變數引數傳送到檢視函數。
  • 有些包裝函數需要我們傳入可變引數。
  • 引數的修改變得容易,但同時驗證不正確,因此必須小心使用它們。

到此這篇關於Python 變數教學之打包和解包引數的文章就介紹到這了,更多相關Python 打包解包引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com