多個參數(shù)的函數(shù)
既然有很多不確定性曙求,那么函數(shù)的參數(shù)的個數(shù)束昵,也當然有不確定性绍载,函數(shù)怎么解決這個問題呢?python用這樣的方式解決參數(shù)個數(shù)的不確定性:
def func(x,*arg):
print x #輸出參數(shù)x的值
result = x
print arg #輸出通過*arg方式得到的值
for i in arg:
result +=i
return result
print func(1,2,3,4,5,6,7,8,9) #賦給函數(shù)的參數(shù)個數(shù)不僅僅是2個
運行此代碼后两波,得到如下結果:
1 #這是函數(shù)體內的第一個print瞳步,參數(shù)x得到的值是1
(2, 3, 4, 5, 6, 7, 8, 9) #這是函數(shù)內的第二個print,參數(shù)arg得到的是一個元組
45 #最后的計算結果
從上面例子可以看出腰奋,如果輸入的參數(shù)個數(shù)不確定单起,其它參數(shù)全部通過*arg,以元組的形式由arg收集起來劣坊。對照上面的例子不難發(fā)現(xiàn):
- 值1傳給了參數(shù)x
- 值2,3,4,5,6.7.8.9被塞入一個tuple里面嘀倒,傳給了arg
為了能夠更明顯地看出args(名稱可以不一樣,但是符號必須要有),可以用下面的一個簡單函數(shù)來演示:
>>> def foo(*args):
... print args #打印通過這個參數(shù)得到的對象
...
下面演示分別傳入不同的值测蘑,通過參數(shù)*args得到的結果:
>>> foo(1,2,3)
(1, 2, 3)
>>> foo("qiwsir","qiwsir.github.io","python")
('qiwsir', 'qiwsir.github.io', 'python')
>>> foo("qiwsir",307,["qiwsir",2],{"name":"qiwsir","lang":"python"})
('qiwsir', 307, ['qiwsir', 2], {'lang': 'python', 'name': 'qiwsir'})
>>> foo("python")
('python',)
即使只有一個值灌危,也是用tuple收集它。特別注意帮寻,在tuple中乍狐,如果只有一個元素,后面要有一個逗號固逗。
還有一種可能浅蚪,就是不給那個*args傳值,也是許可的烫罩。例如:
>>> def foo(x, *args):
... print "x:",x
... print "tuple:",args
...
>>> foo(7)
x: 7
tuple: ()
除了用args這種形式的參數(shù)接收多個值之外惜傲,還可以用*kargs的形式接收數(shù)值,不過這次有點不一樣:
>>> def foo(**kargs):
... print kargs
...
>>> foo(a=1,b=2,c=3) #注意觀察這次賦值的方式和打印的結果
{'a': 1, 'c': 3, 'b': 2}
如果這次還用foo(1,2,3)的方式贝攒,會有什么結果呢盗誊?
>>> foo(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 0 arguments (3 given)
如果用**kargs的形式收集值,會得到dict類型的數(shù)據(jù)隘弊,但是哈踱,需要在傳值的時候說明“鍵”和“值”,因為在字典中是以鍵值對形式出現(xiàn)的梨熙。
另一種傳值方式
>>> def add(x,y):
... return x + y
...
>>> add(2,3)
5
這是通常的函數(shù)調用方法开镣,在前面已經(jīng)屢次用到。這種方法簡單明快咽扇,很容易理解邪财。但是,世界總是多樣性的质欲,有時候你秀出下面的方式树埠,甚至在某種情況用下面的方法可能更優(yōu)雅。
>>> bars = (2,3)
>>> add(*bars)
5
先把要傳的值放到元組中嘶伟,賦值給一個變量bars怎憋,然后用add(*bars)的方式,把值傳到函數(shù)內奋早。這有點像前面收集參數(shù)的逆過程盛霎。注意的是,元組中元素的個數(shù)耽装,要跟函數(shù)所要求的變量個數(shù)一致。如果這樣就報錯了:
>>> bars = (2,3,4)
>>> add(*bars)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (3 given)
這是使用一個星號*期揪,是以元組形式傳值掉奄,如果用**的方式,是不是應該以字典的形式呢?理當如此姓建。
>>> def book(author,name):
... print "%s is writing %s" % (author,name)
...
>>> bars = {"name":"Starter learning Python","author":"Kivi"}
>>> book(**bars)
Kivi is writing Starter learning Python