Python中*args和**kwargs的區別
阿新 • • 發佈:2018-11-09
注:《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)
...