標籤:運行 重複 傳參 情況 需要 函數 錯誤 用法 文章
Python中的函數(三)
在前面兩篇文章中已經探討了函數的一些相關用法,下面一起來瞭解一下函數參數類型的問題。在C語言中,調用函數時必須依照函數定義時的參數個數以及類型來傳遞參數,否則將會發生錯誤,這個是嚴格進行規定的。然而在Python中函數參數定義和傳遞的方式相比而言就靈活多了。
一.函數參數的類型
之前我們接觸到的那種函數參數定義和傳遞方式叫做位置參數,即參數是通過位置進行匹配的,從左至右,依次進行匹配,這個對參數的位置和個數都有嚴格的要求。在Python中是通過參數名字來匹配的,這樣一來,不需要嚴格按照參數定義時的位置來傳遞參數,這種參數叫做關鍵字參數。
下面舉兩個例子:
def display(a,b): print a print b display(‘hello‘,‘world‘) //這段程式是想輸出‘hello world‘,可以正常運行。
如果像下面這樣寫的話,結果可能就不是預期的樣子了:
def display(a,b): print a print b display(‘hello‘) //這樣會報錯display(‘world‘,‘hello‘) //這樣會輸出‘world hello‘
可以看出在Python中預設的是採用位置參數來傳參。這樣調用函數必須嚴格按照函數定義時的參數個數和位置來傳參,否則將會出現預想不到的結果。
下面這段代碼採用的就是關鍵字參數:
def display(a,b): print a print b//下面2句達到的效果是相同的display(a=‘world‘,b=‘hello‘)display(b=‘hello‘,a=‘world‘) //可以看到通過指定參數名字傳遞參數的時候,參數位置對結果是沒有影響的。
關鍵字參數最厲害的地方在於它能夠給函數參數提供預設值。比如:
def display(a=‘hello‘,b=‘wolrd‘): print a+bdisplay()display(b=‘world‘)display(a=‘hello‘)display(‘world‘)
在上面的代碼中,分別給a和b指定了預設參數,即如果不給a或者b傳遞參數時,它們就分別採用預設值。在給參數指定了預設值後,如果傳參時不指定參數名,則會從左至右依次進行傳參,比如display(‘world‘)沒有指定‘world‘是傳遞給a還是b,則預設從左向右匹配,即傳遞給a。
使用預設參數固然方便,但是有一點要非常注意,在重複調用函數時預設形參會繼承之前一次調用結束之後該形參的值。下面看一個例子:
def insert(a,L=[]): L.append(a) print Linsert(‘hello‘)insert(‘world‘)
其運行結果為:
//在重複調用函數時預設形參會繼承之前一次調用結束之後該形參的值。
二.任意個數參數
一般情況下我們在定義函數時,函數參數的個數是確定了的,然而某些情況下我們是不能確定參數的個數的,比如要儲存某個人的名字和它的小名,某些人小名可能有2個或者更多個,此時無法確定參數的個數,就可以使用收集參數了,使用收集參數只需在參數前面加上‘*‘或者‘**‘。
例1、
def storename(name,*nickName): print ‘real name is %s‘ %name for nickname in nickName: print nicknamestorename(‘jack‘)storename(u‘詹姆斯‘,u‘小皇帝‘)storename(u‘奧尼爾‘,u‘大鯊魚‘,u‘三不沾‘)
// ‘*‘和‘**‘表示能夠接受0到任意多個參數,‘*‘表示將沒有匹配的值都放在同一個元組中。
例2、
def printvalue(a,**d): print ‘a=%d‘ %a for x in d: print x+‘=%d‘ %d[x]printvalue(1,b=2,c=3)
// ‘*‘和‘**‘表示能夠接受0到任意多個參數,‘**‘表示將沒有匹配的值都放在一個dictionary中。
補充一點:Python中函數是可以返回多個值的,如果返回多個值,會將多個值放在一個元組或者其他類型的集合中來返回。
def function(): x=2 y=[3,4] return x,yprint function()
python-函數(三)