python函式收集不確定數量的值
阿新 • • 發佈:2020-08-15
python寫函式的時候,有時候會不確定到底傳入多少值。
首先是,*args,單星號引數收集引數:
1 #!usr/bin/python 2 #-*-coding:utf-8-*- 3 4 #定義一個簡單的引數收集的函式; 5 def functionx(x,*args): 6 print(x) #列印收集到的變數x 7 8 results = x #將變數x賦值給results 9 print(args) #列印收集到的不確定數量的變數args 10 11 #迴圈讀取args,必須是可讀取的嘛,因為args是可迭代的資料型別tuple 12for i in args: 13 results += i #將程式碼results = x獲得的值與迴圈得到的i相加再賦值給results 14 return results #函式的返回值 15 16 test = functionx(1,2,3,4,5,6,7,8,9) #將1-9之間所有的數作為引數傳遞給functionx 17 print(test) #列印是否符合預期.
上例可以看出,值1傳遞給了x,值2,3,4,5,6,7,8,9作為元組傳遞給了args。再來一個:
1 #定義函式並只讓*args作為引數; 2 def foo(*args):3 print(args) #在函式體內列印 4 print(type(args)) #在函式體內列印資料型別 5 6 foo(1,2,3) #呼叫函式傳值1,2,3。輸出:第一個print,(1, 2, 3);第二個print,<class 'tuple'> 7 foo('baidu','google','facebook') #再次呼叫函式傳值。輸出:第一個print,('baidu', 'google', 'facebook');第二個print,<class 'tuple'>
第三是*args只有一個值的情況,列印的時候還是以元組分解符()封閉,但是print出來的是(x,)這種形式,其中x是值,後面的逗號是元組在只有一個值的時候表示元組的方式(我的理解)。
1 def foo(x,*args): 2 print("x: ", x) 3 print("Args: ", args) 4 5 foo(1,2) #傳入1,2,1會對應x,而2則會對應*args,那麼輸出是Args: (2,)
最後一種是空tuple的情況,也就是在傳值的過程中,*args收集不到值。
1 def foo(x,*args): 2 print("x: ", x) 3 print("args: ", args) 4 5 foo(1); #呼叫函式,第一個print輸出1,第二個print輸出:args: ()
再有一種是**kargs,雙星號引數收集:
1 def foo(**kargs): 2 print("Kargs: ", kargs); 3 4 foo(a=1,b=2,c=3); #呼叫函式,第一個print輸出:Kargs: {'a': 1, 'b': 2, 'c': 3};第二個print輸出:<class 'dict'>
一個綜合例子:
1 def functionx(x,y,z,*args,**kargs): 2 print(x) 3 print(y) 4 print(z) 5 6 print(args) 7 print(kargs) 8 9 functionx(1,2,3,4,name='baidu');
輸出結果如下:
1 2 3 (4,) {'name': 'baidu'}
----------------------------------------------總結----------------------------------------------
1,*args收集到的引數是tuple型別,可以為空;
2,**kargs收集到的引數是dict型別,可以為空,但是傳值的時候要注意一定是類似:a='a', b='b'這樣子的形式。其他的方式會報錯。
寫在最後,另外一種函式的傳值方式。有點類似逆向傳值:
1 def add(x,y): 2 return x+y 3 4 print(add(2,3)) #輸出5 5 6 bars = (2,3) #定義元組bars 7 print(type(bars)) #輸出:<class 'tuple'> 8 print(add(*bars)); #輸出5
先把要傳入的值放到一個元組bars中,然後呼叫函式add並傳入元組,add(*bars)這樣子的方式,把值傳入到函式內。這有點類似引數收集的逆過程,但是要求元組中的個數要求和函式的引數個數一致。要不然會報錯。
再來一個例子加深印象:
1 def book(reader,bookname): 2 print("%s is reading book %s" %(reader,bookname)) 3 4 book(reader='Eric',bookname='Easy for PHP') #正常函式呼叫方式 5 6 bars = {'reader':'Mary', 'bookname':'Easy for python'} 7 book(**bars) #逆向呼叫方式