函數2
1、函數傳入list或者tuple,可以一次傳入多個元素,由於list和tuple的組成元素可以不同,比如整數和字符串混合組成list或者tuple,因此可以達到輸入可變參數的目的
def test2(numbers):
print(‘本次一共傳入了%d個元素‘%len(numbers))
j=0
for i in numbers:
j+=1
print(‘第%d個元素是%s!‘%(j,i))
2、另一種可變參數的實現方式,函數可以支持形參個數可變,支持0個參數
def test(*numbers):
print(‘本次一共傳入了%d個參數‘%len(numbers))
j=0
for i in numbers:
j+=1
print(‘第%d個參數是%s!‘%(j,i))
如例子中所示在形參numbers前加*,調用時使用test(1,2,3,4)傳入4個參數,可以在test中使用這4個參數
3、如果調用時使用list或者tuple,而函數定義時使用的是可變參數,那麽在調用時在list前加*就可以實現將list或者tuple中的每個元素變成可變參數傳入。
例如test(*[1,2,3,4])
4、學習了上面的可變參數輸入,有個疑問,如果參數中有必輸參數,又該怎麽輸入呢?因為不可能在可變參數前再加兩個參數,這樣調用會出錯,這時我們引入了關鍵字參數概念
函數可以有必輸參數,還可以有關鍵字參數。
def person(name,age,**keyword):
print(‘name:‘,name,‘age:‘,age,‘other:‘,keyword)
person(‘Michell‘,30,city=‘beijing‘)
輸出為:name: Michell age: 30 other: {‘city‘: ‘beijing‘}
註意此時的第三個輸入項為key=value模式,輸入後變量變為了dict,keyword實際就是一個dict
同之前的可變參數調用類似,我們也可以先初始化一個dict,然後用dict轉換成關鍵字參數傳進去
extra={‘city‘:‘Suzhou‘,‘job‘:‘engineer‘}
person(‘kimi‘,‘28‘,**extra)
這樣就把extra的每一個元素當做關鍵字參數傳入了,輸出為:
name: kimi age: 28 other: {‘city‘: ‘Suzhou‘, ‘job‘: ‘engineer‘}
這樣使用關鍵字參數輸入有個問題,就是輸入參數不受控制,調用方可以隨意輸入任意的dict,如果要控制輸入的關鍵字參數,那麽需要使用命名關鍵字參數,只接受定義的關鍵字參數,在命名關鍵字參數的形參前添加*參數。
例如:
def person(name,age, *,city,job):
print(name,age,city,job)
調用時必須按如下格式調用,前面兩個是位置參數,後面兩個是命名關鍵字參數,調用時不能輸入city,job以外的關鍵字參數,如果定義時沒有設置默認值,那麽調用時也不能不寫該命名關鍵字參數。
person(‘Jack‘,24,city=‘Beijing‘,job=‘Engineer‘)
這可以理解為並非可變參數,而是必須輸入的,只不過前面的是位置參數,後面的是命名關鍵字參數。
如果定義時命名關鍵字參數設置了默認值, 那麽調用時可以不用輸入該命名關鍵字參數
def person(name,age, *,city=‘Beijing‘,job):
print(name,age,city,job)
調用時可以使用
person(‘Jack‘,24,job=‘Engineer‘),不需要輸入city,而默認值為‘Beijing‘
4、參數組合
學習了上述紛繁復雜的參數類型,在定義函數時該如何組合這些類型不同的參數呢,就需要按照一定的參數定義順序:必選參數、默認參數(如果默認參數後跟必選參數會出錯,因為無法知道調用時使用的值該賦值給必選參數還是賦值給默認參數) 、可變參數(可變參數也一定要在關鍵字參數之前)、命名關鍵字參數、關鍵字參數
例如:
def f1(a,b,c=0,*args,city,job,**kw):
print(‘a=‘,a,‘b=‘,b,‘c=‘,c,‘args=‘,args,‘city=‘,city,‘job=‘,job,‘kw=‘,kw)
調用使用:
f1(1,2,3,4,5,6,7,city=‘beijing‘,job=‘BOE‘,other=‘here‘)
輸出:
a= 1 b= 2 c= 3 args= (4, 5, 6, 7) city= beijing job= BOE kw= {‘other‘: ‘here‘}
還可以通過tuple和list調用函數
args=(1,2,3,4)
kw={‘city‘:‘Bejing‘,‘job‘:‘Eng‘,‘other‘:None}
f1(*args,**kw)
輸出為:
a= 1 b= 2 c= 3 args= (4,) city= Bejing job= Eng kw= {‘other‘: None}
函數2