1. 程式人生 > >Python中*args和**kwargs的區別

Python中*args和**kwargs的區別

注:《python核心程式設計第2版》的11.6可變長度的引數—章節中有詳細介紹。
python中我們經常見到,有些函式的引數中有*args和kwargs,那這兩個引數是什麼意思呢?
沒錯,*args和
kwargs就是python中的可變引數

可能很多人用了幾年的 Python 都沒真正使用過可變引數,就比如我,為了學寫通用模組,就會對它有需求;或許你經常看 Python 模組庫程式碼,會發現很多函式的引數定義,都會跟上 *args 和 **kwargs(不定引數的另一種形式,後面會講到)。

在計算機程式設計,一個可變引數函式是指一個函式擁有不定引數,即是它接受一個可變數目的引數。 - 來自 wikipedia

通俗的將,就是函式可以處理不同數量的引數。

一、*args的使用方

  *args 用來將引數打包成tuple給函式體呼叫

例子:
定義一個函式,傳一個不定引數*args,輸出結果以元祖的方式顯示
在這裡插入圖片描述
在比如

def argsFunc(a, *args):
	print a
	print args
	
>>> argsFunc(1, 2, 3, 4)
1
(2, 3, 4)

argsFunc 中匹配完定義好的引數,剩餘的引數以元組的形式儲存在 args(args 名稱你可以自行定義),因此在上述程式中只要你傳入不小於 1 個引數,該函式都會接受,當然你也可以直接定義只接受可變引數,你就可以自由傳遞你的引數:

def argsFunc(*my_args):
	print my_args
	
>>> argsFunc(1, 2, 3, 4)
(1, 2, 3, 4)
>>> argsFunc()
()

二、**kwargs的使用方法

形參名前加兩個*表示,引數在函式內部將被存放在以形式名為識別符號的 dictionary 中,這時呼叫函式的方法則需要採用 arg1=value1,arg2=value2 這樣的形式。

為了區分,我把 *args 稱作為陣列引數,**kwargs 稱作為字典引數

>>> def a(**x):print x
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中

注意一,採用 **kwargs 傳遞引數的時候,你不能傳遞陣列引數

>>> a(1,2,3) #這種呼叫則報錯
Traceback (most recent call last):
  		File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)

注意二: 引數arg、*args、**kwargs三個引數的位置必須是一定的。必須是(arg,*args,**kwargs)這個順序,否則程式會報錯。

同樣很簡單,但是我們什麼時候可以用到他呢?

import mysql.connector  

db_conf = {
	user='xx',
	password='yy', 
	host='xxx.xxx.xxx.xxx',
	database='zz'
}

cnx = mysql.connector.connect(
	user=db_conf['user'],
	password=db_conf['password'], 
	host=db_conf['host'],
	database=db_conf['database']
	)

...

相比,使用 Mysql Python 庫時候,經常看到這個樣子的程式碼,db_conf 一般都從配置檔案讀取,這是優雅的不定字典引數就派上用途了!

import mysql.connector  

db_conf = {
	user='xx',
	password='yy', 
	host='xxx.xxx.xxx.xxx',
	database='zz'
}

cnx = mysql.connector.connect(**db_conf)

...