實參的類型 | Python從入門到精通:高階篇之四
不定長參數
定義一個函數,可以求任意個數字的和。
def sum(a,b):
print(a+b)
#sum(123,456)
sum(123,456,789)
執行結果:
此時可以發現只能計算2個數的和,3個數時程序出錯。我們發現,只有形參數量跟實參數量一致才能調用函數計算結果,否則程序就會出錯。這樣跟題目原本的意義不符合。
此時我們需要另外一種方式,在定義函數的時候,可以在形參前邊加上一個*,這樣這個形參將會獲取到所有的實參。它將會將所有的實參保存到一個元組中。
a,b,*c = (1,2,3,4,5,6),是指將1賦值給a,2賦值給b,3,4,5,6,,都賦值給c。
def fn(*a):
print("a =",a,type(a))
#fn()
fn(1,2,3,4,5)
執行結果:
此時,可以發現a是一個元組,*a會接收所有的位置實參,並且會將這些實參統一保存到一個元組中(裝包)優勢在於可以控制傳參的數量。
現在來實現上面所說的函數。
def sum(*nums):
# 定義一個變量,來保存結果
result = 0
# 遍歷元組,並將元組中的數進行累加
for n in nums :
result += n
print(result)
#sum(123)
#sum(123,456)
sum(123,456,789,10,20,30,40)
執行結果:
這就是不定長參數,帶星號的形參只能有一個,帶星號的參數,可以和其他參數配合使用。
def fn2(a,b,*c):
print('a =',a)
print('b =',b)
print('c =',c)
fn2(1,2,3,4,5)
執行結果:
第一個參數給a,第二個參數給b,剩下的都保存到c的元組中。
可變參數不是必須寫在最後,但是注意,帶*的參數後的所有參數,必須以關鍵字參數的形式傳遞。
def fn2(a,*b,c):
print('a =',a)
print('b =',b)
print('c =',c)
fn2(1,2,3,4,c=5)
執行結果:
第一個參數給a,剩下的位置參數給b的元組,c必須使用關鍵字參數。
def fn2(*a,b,c):
print('a =',a)
print('b =',b)
print('c =',c)
fn2(1,2,3,b=4,c=5)
所有的位置參數都給a,b和c必須使用關鍵字參數。
如果在形參的開頭直接寫一個*,則要求我們的所有的參數必須以關鍵字參數的形式傳遞。否則會報錯。
def fn2(*,a,b,c):
print('a =',a)
print('b =',b)
print('c =',c)
#fn2(1,2,3,b=4,c=5)
fn2(a=3,b=4,c=5)
執行結果:
*形參只能接收位置參數,而不能接收關鍵字參數。
def fn3(*a) :
print('a =',a)
fn3(b=1,d=2,c=3)
執行結果:
所以b,d,c三個參數沒有被接收。此時我們有另外一種解決方案。
**形參可以接收其他的關鍵字參數,它會將這些參數統一保存到一個字典中,字典的key就是參數的名字,字典的value就是參數的值。
def fn3(**a) :
print('a =',a,type(a))
fn3(b=1,d=2,c=3)
執行結果:
**形參只能有一個,並且必須寫在所有參數的最後。
def fn3(b,c,**a) :
print('a =',a,type(a))
print('b =',b)
print('c =',c)
fn3(b=1,d=2,c=3,e=10,f=20)
執行結果:
配套視頻課程,點擊這裡查看
獲取更多資源請訂閱Python學習站