Python 函數(shù)3

多個(gè)參數(shù)的函數(shù)

既然有很多不確定性,那么函數(shù)的參數(shù)的個(gè)數(shù),也當(dāng)然有不確定性,函數(shù)怎么解決這個(gè)問(wèn)題呢?python用這樣的方式解決參數(shù)個(gè)數(shù)的不確定性:

def func(x,*arg):
    print x         #輸出參數(shù)x的值
    result = x
    print arg       #輸出通過(guò)*arg方式得到的值
    for i in arg:
        result +=i
    return result

print func(1,2,3,4,5,6,7,8,9)    #賦給函數(shù)的參數(shù)個(gè)數(shù)不僅僅是2個(gè)

運(yùn)行此代碼后,得到如下結(jié)果:

1                       #這是函數(shù)體內(nèi)的第一個(gè)print,參數(shù)x得到的值是1
(2, 3, 4, 5, 6, 7, 8, 9) #這是函數(shù)內(nèi)的第二個(gè)print,參數(shù)arg得到的是一個(gè)元組
45                      #最后的計(jì)算結(jié)果

從上面例子可以看出,如果輸入的參數(shù)個(gè)數(shù)不確定,其它參數(shù)全部通過(guò)*arg,以元組的形式由arg收集起來(lái)。對(duì)照上面的例子不難發(fā)現(xiàn):

  • 值1傳給了參數(shù)x
  • 值2,3,4,5,6.7.8.9被塞入一個(gè)tuple里面,傳給了arg

為了能夠更明顯地看出args(名稱可以不一樣,但是符號(hào)必須要有),可以用下面的一個(gè)簡(jiǎn)單函數(shù)來(lái)演示:

>>> def foo(*args):
...     print args      #打印通過(guò)這個(gè)參數(shù)得到的對(duì)象
...

下面演示分別傳入不同的值,通過(guò)參數(shù)*args得到的結(jié)果:

>>> 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',)

即使只有一個(gè)值,也是用tuple收集它。特別注意,在tuple中,如果只有一個(gè)元素,后面要有一個(gè)逗號(hào)。

還有一種可能,就是不給那個(gè)*args傳值,也是許可的。例如:

>>> def foo(x, *args):
...     print "x:",x
...     print "tuple:",args
... 
>>> foo(7)
x: 7
tuple: ()

除了用args這種形式的參數(shù)接收多個(gè)值之外,還可以用*kargs的形式接收數(shù)值,不過(guò)這次有點(diǎn)不一樣:

>>> def foo(**kargs):
...     print kargs
...
>>> foo(a=1,b=2,c=3)    #注意觀察這次賦值的方式和打印的結(jié)果
{'a': 1, 'c': 3, 'b': 2}

如果這次還用foo(1,2,3)的方式,會(huì)有什么結(jié)果呢?

>>> foo(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 0 arguments (3 given)

如果用**kargs的形式收集值,會(huì)得到dict類型的數(shù)據(jù),但是,需要在傳值的時(shí)候說(shuō)明“鍵”和“值”,因?yàn)樵谧值渲惺且枣I值對(duì)形式出現(xiàn)的。

另一種傳值方式

>>> def add(x,y):
...     return x + y
... 
>>> add(2,3)
5

這是通常的函數(shù)調(diào)用方法,在前面已經(jīng)屢次用到。這種方法簡(jiǎn)單明快,很容易理解。但是,世界總是多樣性的,有時(shí)候你秀出下面的方式,甚至在某種情況用下面的方法可能更優(yōu)雅。

>>> bars = (2,3)
>>> add(*bars)
5

先把要傳的值放到元組中,賦值給一個(gè)變量bars,然后用add(*bars)的方式,把值傳到函數(shù)內(nèi)。這有點(diǎn)像前面收集參數(shù)的逆過(guò)程。注意的是,元組中元素的個(gè)數(shù),要跟函數(shù)所要求的變量個(gè)數(shù)一致。如果這樣就報(bào)錯(cuò)了:

>>> 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)

這是使用一個(gè)星號(hào)*,是以元組形式傳值,如果用**的方式,是不是應(yīng)該以字典的形式呢?理當(dāng)如此。

>>> 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容