1. 程式人生 > 實用技巧 >python函式收集不確定數量的值

python函式收集不確定數量的值

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
12
for 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) #逆向呼叫方式