python动态参数_python动态参数
Python的動(dòng)態(tài)參數(shù)有兩種,分別是*args和**kwargs,這里面的關(guān)鍵是一個(gè)和兩個(gè)星號(hào)的區(qū)別,而不是args和kwargs在名字上的區(qū)別,實(shí)際上你可以使用*any或**whatever的方式。但就如self一樣,默認(rèn)大家都使用*args和**kwargs。
注意:動(dòng)態(tài)參數(shù),必須放在所有的位置參數(shù)和默認(rèn)參數(shù)后面!
def func(name, age, sex='male', *args, **kwargs): # 位置參數(shù) 默認(rèn)參數(shù) 動(dòng)態(tài)參數(shù)
pass
*args
一個(gè)星號(hào)表示接收任意個(gè)參數(shù)。調(diào)用時(shí),會(huì)將實(shí)際參數(shù)打包成一個(gè)元組傳入形式參數(shù)。如果參數(shù)是個(gè)列表,會(huì)將整個(gè)列表當(dāng)做一個(gè)參數(shù)傳入。例如:
def func(*args):
for arg in args:
print(arg)
func('a', 'b', 'c')
li = [1, 2, 3]
func(li)
運(yùn)行結(jié)果是:
a
b
c
[1, 2, 3]
重要知識(shí)點(diǎn) *
通過(guò)循環(huán)args,我們可以獲得傳遞的每個(gè)參數(shù)。但是li這個(gè)列表,我們本意是讓它內(nèi)部的1,2,3分別當(dāng)做參數(shù)傳遞進(jìn)去,但實(shí)際情況是列表本身被當(dāng)做一個(gè)整體給傳遞進(jìn)去了。怎么辦呢?使用一個(gè)星號(hào)!調(diào)用函數(shù),傳遞實(shí)參時(shí),在列表前面添加一個(gè)星號(hào)就可以達(dá)到目的了。實(shí)際情況是,不光列表,任何序列類型數(shù)據(jù)對(duì)象,比如字符串、元組都可以通過(guò)這種方式將內(nèi)部元素逐一作為參數(shù),傳遞給函數(shù)。而字典,則會(huì)將所有的key逐一傳遞進(jìn)去。
def func(*args):
for arg in args:
print(arg)
li = [1, 2, 3]
func(*li)
**kwargs
def func(**kwargs):
for kwg in kwargs:
print(kwg, kwargs[kwg])
dic = {
'k1': 'v1',
'k2': 'v2'
}
func(**dic)
兩個(gè)星號(hào)能將字典內(nèi)部的鍵值對(duì)逐一傳入**kwargs。
“萬(wàn)能”參數(shù)
當(dāng)*args和**kwargs組合起來(lái)使用,理論上能接受任何形式和任意數(shù)量的參數(shù),需要注意的是,*args必須出現(xiàn)在**kwargs之前。
def func(a, b, c=1, *args, **kwargs):
print('c的值是:', c)
for arg in args:
print(arg)
for kwg in kwargs:
print(kwg, kwargs[kwg])
lis = ['aaa', 'bbb', 'ccc']
dic = {
'k1': 'v1',
'k2': 'v2'
}
func(1, 2, *lis, **dic)
打印結(jié)果為:
c的值是: aaa
bbb
ccc
k1 v1
k2 v2
原來(lái),lis的第一個(gè)元素被傳遞給參數(shù)c了!這就是Python的參數(shù)傳遞規(guī)則之一。
關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)前面需要一個(gè)特殊分隔符*和位置參數(shù)及默認(rèn)參數(shù)分隔開(kāi)來(lái),*后面的參數(shù)被視為關(guān)鍵字參數(shù)。在函數(shù)調(diào)用時(shí),關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒(méi)有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)。不同于默認(rèn)參數(shù),關(guān)鍵字參數(shù)必須傳遞,但是關(guān)鍵字參數(shù)也可以有缺省值,這時(shí)就可以不傳遞了,從而簡(jiǎn)化調(diào)用。
def student(name, age, *, sex):
print(name,age,sex)
student(name="jack", age=18, sex='male')
如果函數(shù)定義中已經(jīng)有了一個(gè)*args參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了。
def student(name, age=10, *args, sex, classroom, **kwargs):
pass
student(name="jack", age=18, sex='male', classroom="202", k1="v1")
總結(jié)
以上是生活随笔為你收集整理的python动态参数_python动态参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 臭氧天气属于1类致癌物清单中的室外空气污
- 下一篇: scrapy的name变量_python