Python使用函數(shù)默認值實現(xiàn)函數(shù)靜態(tài)變量的方法,具體方法如下:
成都創(chuàng)新互聯(lián)公司是專業(yè)的西秀網(wǎng)站建設(shè)公司,西秀接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行西秀網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
一、Python函數(shù)默認值
Python函數(shù)默認值的使用可以在函數(shù)調(diào)用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數(shù)默認值在python中用到的很多,尤其是在類中間,類的初始化函數(shù)中一幫都會用到默認值。 使用類時能夠方便的創(chuàng)建類,而不需要傳遞一堆參數(shù)。
只要在函數(shù)參數(shù)名后面加上 ”=defalut_value”,函數(shù)默認值就定義好了。有一個地方需要注意的是,有默認值的參數(shù)必須在函數(shù)參數(shù)列表的最后,不允許將沒有默認值的參數(shù)放在有默認值的參數(shù)后,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數(shù)。
先來看一段示例代碼:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = raw_input(prompt)
if ok in ('y', 'ye', 'yes'): return True
if ok in ('n', 'no', 'nop', 'nope'): return False
retries = retries - 1
if retries 0: raise IOError, 'refusenik user'
print complaint
你調(diào)用上面的函數(shù)時,可以修改重試次數(shù)和輸出的提示語言,如果你比較懶得話,那么什么都不用改。
二、python使用函數(shù)默認值來實現(xiàn)函數(shù)靜態(tài)變量的功能
Python中是不支持靜態(tài)變量的,但是我們可以通過函數(shù)的默認值來實現(xiàn)靜態(tài)變量的功能。
當函數(shù)的默認值是內(nèi)容是可變的類時,類的內(nèi)容可變,而類的名字沒變。(相當于開辟的內(nèi)存區(qū)域沒有變,而其中內(nèi)容可以變化)。
這是因為python中函數(shù)的默認值只會被執(zhí)行一次,(和靜態(tài)變量一樣,靜態(tài)變量初始化也是被執(zhí)行一次。)這就是他們的共同點。
再來看下面的程序片段:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
print f(4,['x'])
print f(5)
其輸出結(jié)果是:
[1]
[1, 2]
[1, 2, 3]
['x', 4]
[1, 2, 3, 5]
前面的好理解,為什么最后 “print f(5)”的輸出是 “[1, 2, 3, 5]”呢?
這是因為 “print f(4,['x'])”時,默認變量并沒有被改變,因為默認變量的初始化只是被執(zhí)行了一次(第一次使用默認值調(diào)用),初始化執(zhí)行開辟的內(nèi)存區(qū)(我們可以稱之為默認變量)沒有被改變,所以最后的輸出結(jié)果是“[1, 2, 3, 5]”。
第一個那個*x是*args的意思,就是任意個參數(shù),C++里的 va_arg,...符號這種,python函數(shù)里可以有*args和**kwargs。
*args之后可以隨便放有默認值的和沒有默認值的。
因為這之后的任何東西都得用”y=1“”z=1“這種來賦值。
比如說第一個函數(shù),def fun(*x, y=4, z),我寫fun(1,2,3,4,5),這五個數(shù)全跑到*x里了。我想給y和z賦值必須要寫fun(1,2,3,4,5,y=6,z=7)。相當于z跟有默認值的那種也差不多了。所以規(guī)定可以把z放在*x后面的任何位置,包括y=4后面,它們的位置關(guān)系已經(jīng)沒有用了。
規(guī)定def fun(x=4, y) y必須放在x前,就是要保留這種位置關(guān)系,要不我寫fun(1),你說這個1是給x的還是y的?就有了歧義。所以必須要有正確的位置關(guān)系。但是*x后面所有東西都是用參數(shù)名賦值的,位置關(guān)系不起作用了,所以可以任意順序了。
要理解規(guī)定背后的原因。同理,**kwargs放在最后,也是這個原因。消除歧義性。
default是你傳遞進去的函數(shù)參數(shù)。是一個帶有默認值的參數(shù),也就是在調(diào)用這個函數(shù)的時候可以不用給它賦值。
沒有默認值,你不設(shè)置就是了,如:
def GetLibraryGroup(name, groupKey='month', orderBy = ’name’):
上面的函數(shù)定義中,name沒有給默認值,其余的都給了,調(diào)用時,相應(yīng)的參數(shù)如果你不給值,那么函數(shù)會以默認值來運行,比如
GetLibraryGroup('filetable'),這個調(diào)用沒有給groupKey,orderBy 兩個參數(shù),但是函數(shù)定義時,給了默認的值,就相當于GetLibraryGroup('filetable','month',,’name’)了,當然如果你調(diào)用時給默認的參數(shù)賦了其他值,那么以你的調(diào)用為準,如
GetLibraryGroup('filetable','year',,’createTime’),這個調(diào)用groupKey,orderBy兩個參數(shù)就會是你調(diào)用時給的'year',,’createTime’。
4.7.1. 默認參數(shù)值
最常用的一種形式是為一個或多個參數(shù)指定默認值。這會創(chuàng)建一個可以使用比定義是允許的參數(shù)更少的參數(shù)調(diào)用的函數(shù),例如:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries 0:
raise OSError('uncooperative user')
print(complaint)
這個函數(shù)可以通過幾種不同的方式調(diào)用:
只給出必要的參數(shù):
ask_ok('Do you really want to quit?')
給出一個可選的參數(shù):
ask_ok('OK to overwrite the file?', 2)
或者給出所有的參數(shù):
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
這個例子還介紹了 in 關(guān)鍵字。它測定序列中是否包含某個確定的值。
默認值在函數(shù) 定義 作用域被解析,如下所示:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
將會輸出 5。
重要警告: 默認值只被賦值一次。這使得當默認值是可變對象時會有所不同,比如列表、字典或者大多數(shù)類的實例。例如,下面的函數(shù)在后續(xù)調(diào)用過程中會累積(前面)傳給它的參數(shù):
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
這將輸出:
[1]
[1, 2]
[1, 2, 3]
如果你不想讓默認值在后續(xù)調(diào)用中累積,你可以像下面一樣定義函數(shù):
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L