Python使用函數(shù)默認(rèn)值實(shí)現(xiàn)函數(shù)靜態(tài)變量的方法,具體方法如下:
成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元尉犁做網(wǎng)站,已為上家服務(wù),為尉犁各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
一、Python函數(shù)默認(rèn)值
Python函數(shù)默認(rèn)值的使用可以在函數(shù)調(diào)用時(shí)寫代碼提供方便,很多時(shí)候我們只要使用默認(rèn)值就可以了。 所以函數(shù)默認(rèn)值在python中用到的很多,尤其是在類中間,類的初始化函數(shù)中一幫都會用到默認(rèn)值。 使用類時(shí)能夠方便的創(chuàng)建類,而不需要傳遞一堆參數(shù)。
只要在函數(shù)參數(shù)名后面加上 ”=defalut_value”,函數(shù)默認(rèn)值就定義好了。有一個(gè)地方需要注意的是,有默認(rèn)值的參數(shù)必須在函數(shù)參數(shù)列表的最后,不允許將沒有默認(rèn)值的參數(shù)放在有默認(rèn)值的參數(shù)后,因?yàn)槿绻隳菢佣x的話,解釋器將不知道如何去傳遞參數(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í),可以修改重試次數(shù)和輸出的提示語言,如果你比較懶得話,那么什么都不用改。
二、python使用函數(shù)默認(rèn)值來實(shí)現(xiàn)函數(shù)靜態(tài)變量的功能
Python中是不支持靜態(tài)變量的,但是我們可以通過函數(shù)的默認(rèn)值來實(shí)現(xiàn)靜態(tài)變量的功能。
當(dāng)函數(shù)的默認(rèn)值是內(nèi)容是可變的類時(shí),類的內(nèi)容可變,而類的名字沒變。(相當(dāng)于開辟的內(nèi)存區(qū)域沒有變,而其中內(nèi)容可以變化)。
這是因?yàn)閜ython中函數(shù)的默認(rèn)值只會被執(zhí)行一次,(和靜態(tài)變量一樣,靜態(tài)變量初始化也是被執(zhí)行一次。)這就是他們的共同點(diǎn)。
再來看下面的程序片段:
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]”呢?
這是因?yàn)?“print f(4,['x'])”時(shí),默認(rèn)變量并沒有被改變,因?yàn)槟J(rèn)變量的初始化只是被執(zhí)行了一次(第一次使用默認(rèn)值調(diào)用),初始化執(zhí)行開辟的內(nèi)存區(qū)(我們可以稱之為默認(rèn)變量)沒有被改變,所以最后的輸出結(jié)果是“[1, 2, 3, 5]”。
剛學(xué)用Python的時(shí)候,特別是看一些庫的源碼時(shí),經(jīng)常會看到func(*args, **kwargs)這樣的函數(shù)定義,這個(gè)*和**讓人有點(diǎn)費(fèi)解。其實(shí)只要把函數(shù)參數(shù)定義搞清楚了,就不難理解了。
先說說函數(shù)定義,我們都知道,下面的代碼定義了一個(gè)函數(shù)funcA
def funcA():
pass
顯然,函數(shù)funcA沒有參數(shù)(同時(shí)啥也不干:D)。
下面這個(gè)函數(shù)funcB就有兩個(gè)參數(shù)了,
def funcB(a, b):
print a
print b
調(diào)用的時(shí)候,我們需要使用函數(shù)名,加上圓括號擴(kuò)起來的參數(shù)列表,比如 funcB(100, 99),執(zhí)行結(jié)果是:
100
99
很明顯,參數(shù)的順序和個(gè)數(shù)要和函數(shù)定義中一致,如果執(zhí)行funcB(100),Python會報(bào)錯(cuò)的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數(shù)定義中使用參數(shù)默認(rèn)值,比如
def funcC(a, b=0):
print a
print b
在函數(shù)funcC的定義中,參數(shù)b有默認(rèn)值,是一個(gè)可選參數(shù),如果我們調(diào)用funcC(100),b會自動賦值為0。
OK,目前為止,我們要定義一個(gè)函數(shù)的時(shí)候,必須要預(yù)先定義這個(gè)函數(shù)需要多少個(gè)參數(shù)(或者說可以接受多少個(gè)參數(shù))。一般情況下這是沒問題的,但是也有在定義函數(shù)的時(shí)候,不能知道參數(shù)個(gè)數(shù)的情況(想一想C語言里的printf函數(shù)),在Python里,帶*的參數(shù)就是用來接受可變數(shù)量參數(shù)的??匆粋€(gè)例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
調(diào)用funcD(1, 2, 3, 4, 5, 6)結(jié)果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個(gè)參數(shù)被a、b接受了,剩下的4個(gè)參數(shù),全部被c接受了,c在這里是一個(gè)tuple。我們在調(diào)用funcD的時(shí)候,至少要傳遞2個(gè)參數(shù),2個(gè)以上的參數(shù),都放到c里了,如果只有兩個(gè)參數(shù),那么c就是一個(gè)empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調(diào)用函數(shù)的時(shí)候,傳遞的參數(shù)都是根據(jù)位置來跟函數(shù)定義里的參數(shù)表匹配的,比如funcB(100, 99)和funcB(99, 100)的執(zhí)行結(jié)果是不一樣的。在Python里,還支持一種用關(guān)鍵字參數(shù)(keyword argument)調(diào)用函數(shù)的辦法,也就是在調(diào)用函數(shù)的時(shí)候,明確指定參數(shù)值付給那個(gè)形參。比如還是上面的funcB(a, b),我們通過這兩種方式調(diào)用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結(jié)果跟funcB(100, 99)都是一樣的,因?yàn)槲覀冊谑褂藐P(guān)鍵字參數(shù)調(diào)用的時(shí)候,指定了把100賦值給a,99賦值給b。也就是說,關(guān)鍵字參數(shù)可以讓我們在調(diào)用函數(shù)的時(shí)候打亂參數(shù)傳遞的順序!
另外,在函數(shù)調(diào)用中,可以混合使用基于位置匹配的參數(shù)和關(guān)鍵字參數(shù),前題是先給出固定位置的參數(shù),比如
def funcE(a, b, c):
print a
print b
print c
調(diào)用funcE(100, 99, 98)和調(diào)用funcE(100, c=98, b=99)的結(jié)果是一樣的。
好了,經(jīng)過以上鋪墊,兩顆星總算可以出場了:
如果一個(gè)函數(shù)定義中的最后一個(gè)形參有 ** (雙星號)前綴,所有正常形參之外的其他的關(guān)鍵字參數(shù)都將被放置在一個(gè)字典中傳遞給函數(shù),比如:
def funcF(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
調(diào)用funcF(100, c='你好', b=200),執(zhí)行結(jié)果
100
c: 你好
b: 200
大家可以看到,b是一個(gè)dict對象實(shí)例,它接受了關(guān)鍵字參數(shù)b和c。
def 函數(shù)名():? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ?函數(shù)體? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?return? 返回值? ? ? ? ? ? ? ? ? ? ? ? ? ??
def 函數(shù)名(非可選參數(shù),可選參數(shù)):
???函數(shù)體?
return 返回值
def 函數(shù)名(參數(shù),*b):
? ? 函數(shù)體
? ? return 返回值
函數(shù)名 = lambda 參數(shù) : 表達(dá)式
例1:f = lambda x , y? :? x + y? ? ? ? ? ? ? ? ? ? ? ??
調(diào)用:f(6 + 8)? ? ?輸出:14? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
例2:?f = lambda : "沒有參數(shù)的lambda函數(shù)!"
調(diào)用:?print(f())? ? 輸出: 沒有參數(shù)的lambda函數(shù)!
(1)簡單數(shù)據(jù)類型變量無論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放,如有全局同名變量,其值不變。
(2)簡單數(shù)據(jù)類型變量在用global保留字聲明后,作為全局變量使用,函數(shù)退出后該變量保留且值被函數(shù)改變。
(3)對于組合數(shù)據(jù)類型的全局變量,如果在函數(shù)內(nèi)部沒有被真實(shí)創(chuàng)建的同名變量,則函數(shù)內(nèi)部可以直接使用并修改全局變量的值。
(4)如果函數(shù)內(nèi)部真實(shí)創(chuàng)建了組合數(shù)據(jù)類型變量,無論是否有同名全局變量,函數(shù)僅對局部變量進(jìn)行操作,函數(shù)退出后局部變量被釋放,全局變量值不變。
*《python語言程序設(shè)計(jì)基礎(chǔ)》.高等教育出版社
網(wǎng)頁標(biāo)題:python函數(shù)變量設(shè)計(jì) python函數(shù)對變量的作用
分享路徑:http://jinyejixie.com/article6/dosccog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、品牌網(wǎng)站設(shè)計(jì)、做網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)