Python中函數的參數定義和可變參數用法實例分析
本文實例講述了Python中函數的參數定義和可變參數用法。分享給大家供大家參考。具體如下:
剛學用Python的時候,特別是看一些庫的源碼時,經常會看到func(*args, **kwargs)這樣的函數定義,這個*和**讓人有點費解。其實只要把函數參數定義搞清楚了,就不難理解了。
先說說函數定義,我們都知道,下面的代碼定義了一個函數funcA
def funcA(): pass
顯然,函數funcA沒有參數(同時啥也不干:D)。
下面這個函數funcB就有兩個參數了,
def funcB(a, b): print a print b
調用的時候,我們需要使用函數名,加上圓括號擴起來的參數列表,比如 funcB(100, 99),執(zhí)行結果是:
100
99
很明顯,參數的順序和個數要和函數定義中一致,如果執(zhí)行funcB(100),Python會報錯的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數定義中使用參數默認值,比如
def funcC(a, b=0): print a print b
在函數funcC的定義中,參數b有默認值,是一個可選參數,如果我們調用funcC(100),b會自動賦值為0。
OK,目前為止,我們要定義一個函數的時候,必須要預先定義這個函數需要多少個參數(或者說可以接受多少個參數)。一般情況下這是沒問題的,但是也有在定義函數的時候,不能知道參數個數的情況(想一想C語言里的printf函數),在Python里,帶*的參數就是用來接受可變數量參數的??匆粋€例子
def funcD(a, b, *c): print a print b print "length of c is: %d " % len(c) print c
調用funcD(1, 2, 3, 4, 5, 6)結果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個參數被a、b接受了,剩下的4個參數,全部被c接受了,c在這里是一個tuple。我們在調用funcD的時候,至少要傳遞2個參數,2個以上的參數,都放到c里了,如果只有兩個參數,那么c就是一個empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調用函數的時候,傳遞的參數都是根據位置來跟函數定義里的參數表匹配的,比如funcB(100, 99)和funcB(99, 100)的執(zhí)行結果是不一樣的。在Python里,還支持一種用關鍵字參數(keyword argument)調用函數的辦法,也就是在調用函數的時候,明確指定參數值付給那個形參。比如還是上面的funcB(a, b),我們通過這兩種方式調用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結果跟funcB(100, 99)都是一樣的,因為我們在使用關鍵字參數調用的時候,指定了把100賦值給a,99賦值給b。也就是說,關鍵字參數可以讓我們在調用函數的時候打亂參數傳遞的順序!
另外,在函數調用中,可以混合使用基于位置匹配的參數和關鍵字參數,前題是先給出固定位置的參數,比如
def funcE(a, b, c): print a print b print c
調用funcE(100, 99, 98)和調用funcE(100, c=98, b=99)的結果是一樣的。
好了,經過以上鋪墊,兩顆星總算可以出場了:
如果一個函數定義中的最后一個形參有 ** (雙星號)前綴,所有正常形參之外的其他的關鍵字參數都將被放置在一個字典中傳遞給函數,比如:
def funcF(a, **b): print a for x in b: print x + ": " + str(b[x])
調用funcF(100, c='你好', b=200),執(zhí)行結果
100
c: 你好
b: 200
大家可以看到,b是一個dict對象實例,它接受了關鍵字參數b和c。
常規(guī)參數,*參數及**參數可以同時使用,具體怎么用?看看Python Reference Manual吧,關于Function definitions的那些章節(jié)。其實,笨想也能猜出來啊,o(∩_∩)o...
希望本文所述對大家的Python程序設計有所幫助。
相關文章
Python實戰(zhàn)項目之MySQL tkinter pyinstaller實現(xiàn)學生管理系統(tǒng)
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用MySQL、tkinter、 pyinstaller實現(xiàn)一個學生管理系統(tǒng),大家可以通過案例查缺補漏,提升水平2021-10-10淺談Python numpy創(chuàng)建空數組的問題
今天遇到一個小小的問題,是關于numpy創(chuàng)建空數組,今天特地整理了這篇文章,文中作出了非常詳細的介紹,對正在學習python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Python+Matplotlib實現(xiàn)給圖像添加文本標簽與注釋
這篇文章主要為大家分享一下如何使用python+matplotlib給繪制的圖像添加文本標簽與注釋。文中的示例代碼講解詳細,感興趣的可以了解一下2022-04-04Django3.2 自動發(fā)現(xiàn)所有路由代碼詳解
這篇文章主要為大家介紹了Django自動發(fā)現(xiàn)所有路由的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12