国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python如何定義有默認(rèn)參數(shù)的函數(shù)

瀏覽:19日期:2022-07-14 15:55:13

問(wèn)題

你想定義一個(gè)函數(shù)或者方法,它的一個(gè)或多個(gè)參數(shù)是可選的并且有一個(gè)默認(rèn)值。

解決方案

定義一個(gè)有可選參數(shù)的函數(shù)是非常簡(jiǎn)單的,直接在函數(shù)定義中給參數(shù)指定一個(gè)默認(rèn)值,并放到參數(shù)列表最后就行了。例如:

def spam(a, b=42): print(a, b)spam(1) # Ok. a=1, b=42spam(1, 2) # Ok. a=1, b=2

如果默認(rèn)參數(shù)是一個(gè)可修改的容器比如一個(gè)列表、集合或者字典,可以使用None作為默認(rèn)值,就像下面這樣:

# Using a list as a default valuedef spam(a, b=None): if b is None: b = [] ...

如果你并不想提供一個(gè)默認(rèn)值,而是想僅僅測(cè)試下某個(gè)默認(rèn)參數(shù)是不是有傳遞進(jìn)來(lái),可以像下面這樣寫:

_no_value = object()def spam(a, b=_no_value): if b is _no_value: print(’No b value supplied’) ...

我們測(cè)試下這個(gè)函數(shù):

>>> spam(1)No b value supplied>>> spam(1, 2) # b = 2>>> spam(1, None) # b = None>>>

仔細(xì)觀察可以發(fā)現(xiàn)到傳遞一個(gè)None值和不傳值兩種情況是有差別的。

討論

定義帶默認(rèn)值參數(shù)的函數(shù)是很簡(jiǎn)單的,但絕不僅僅只是這個(gè),還有一些東西在這里也深入討論下。

首先,默認(rèn)參數(shù)的值僅僅在函數(shù)定義的時(shí)候賦值一次。試著運(yùn)行下面這個(gè)例子:

>>> x = 42>>> def spam(a, b=x):... print(a, b)...>>> spam(1)1 42>>> x = 23 # Has no effect>>> spam(1)1 42>>>

注意到當(dāng)我們改變x的值的時(shí)候?qū)δJ(rèn)參數(shù)值并沒(méi)有影響,這是因?yàn)樵诤瘮?shù)定義的時(shí)候就已經(jīng)確定了它的默認(rèn)值了。

其次,默認(rèn)參數(shù)的值應(yīng)該是不可變的對(duì)象,比如None、True、False、數(shù)字或字符串。 特別的,千萬(wàn)不要像下面這樣寫代碼:

def spam(a, b=[]): # NO! ...

如果你這么做了,當(dāng)默認(rèn)值在其他地方被修改后你將會(huì)遇到各種麻煩。這些修改會(huì)影響到下次調(diào)用這個(gè)函數(shù)時(shí)的默認(rèn)值。比如:

>>> def spam(a, b=[]):... print(b)... return b...>>> x = spam(1)>>> x[]>>> x.append(99)>>> x.append(’Yow!’)>>> x[99, ’Yow!’]>>> spam(1) # Modified list gets returned![99, ’Yow!’]>>>

這種結(jié)果應(yīng)該不是你想要的。為了避免這種情況的發(fā)生,最好是將默認(rèn)值設(shè)為None, 然后在函數(shù)里面檢查它,前面的例子就是這樣做的。

在測(cè)試None值時(shí)使用 is 操作符是很重要的,也是這種方案的關(guān)鍵點(diǎn)。 有時(shí)候大家會(huì)犯下下面這樣的錯(cuò)誤:

def spam(a, b=None): if not b: # NO! Use ’b is None’ instead b = [] ...

這么寫的問(wèn)題在于盡管None值確實(shí)是被當(dāng)成False, 但是還有其他的對(duì)象(比如長(zhǎng)度為0的字符串、列表、元組、字典等)都會(huì)被當(dāng)做False。 因此,上面的代碼會(huì)誤將一些其他輸入也當(dāng)成是沒(méi)有輸入。比如:

>>> spam(1) # OK>>> x = []>>> spam(1, x) # Silent error. x value overwritten by default>>> spam(1, 0) # Silent error. 0 ignored>>> spam(1, ’’) # Silent error. ’’ ignored>>>

最后一個(gè)問(wèn)題比較微妙,那就是一個(gè)函數(shù)需要測(cè)試某個(gè)可選參數(shù)是否被使用者傳遞進(jìn)來(lái)。 這時(shí)候需要小心的是你不能用某個(gè)默認(rèn)值比如None、 0或者False值來(lái)測(cè)試用戶提供的值(因?yàn)檫@些值都是合法的值,是可能被用戶傳遞進(jìn)來(lái)的)。 因此,你需要其他的解決方案了。

為了解決這個(gè)問(wèn)題,你可以創(chuàng)建一個(gè)獨(dú)一無(wú)二的私有對(duì)象實(shí)例,就像上面的_no_value變量那樣。 在函數(shù)里面,你可以通過(guò)檢查被傳遞參數(shù)值跟這個(gè)實(shí)例是否一樣來(lái)判斷。 這里的思路是用戶不可能去傳遞這個(gè)_no_value實(shí)例作為輸入。 因此,這里通過(guò)檢查這個(gè)值就能確定某個(gè)參數(shù)是否被傳遞進(jìn)來(lái)了。

這里對(duì) object() 的使用看上去有點(diǎn)不太常見(jiàn)。object 是python中所有類的基類。 你可以創(chuàng)建 object 類的實(shí)例,但是這些實(shí)例沒(méi)什么實(shí)際用處,因?yàn)樗](méi)有任何有用的方法, 也沒(méi)有任何實(shí)例數(shù)據(jù)(因?yàn)樗鼪](méi)有任何的實(shí)例字典,你甚至都不能設(shè)置任何屬性值)。 你唯一能做的就是測(cè)試同一性。這個(gè)剛好符合我的要求,因?yàn)槲以诤瘮?shù)中就只是需要一個(gè)同一性的測(cè)試而已。

以上就是Python如何定義有默認(rèn)參數(shù)的函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于Python定義有默認(rèn)參數(shù)的函數(shù)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 成人免费视频日本 | 亚洲精品高清国产一线久久97 | 免费特黄一区二区三区视频一 | 免费观看a毛片一区二区不卡 | 热99re久久精品香蕉 | 日韩经典视频 | 中国国产成人精品久久 | 久久毛片免费看一区二区三区 | 国产黄色大片网站 | 国产精品成人久久久久久久 | 中文字幕日韩精品有码视频 | 亚洲一区二区精品视频 | 久久综合精品国产一区二区三区无 | 亚洲欧美片 | 国产午夜亚洲精品国产 | 亚洲欧美综合视频 | 国产乱淫a∨片免费视频 | 国产精品久久国产三级国电话系列 | 亚洲欧美一级视频 | 男同黄网站 | 中文字幕乱码系列免费 | 精品视频亚洲 | 美女视频网站永久免费观看软件 | 久草手机视频在线观看 | 美女喷水网站 | 国产乱子伦露脸对白在线小说 | 中文字幕一区二区三区精彩视频 | 一级毛片在线免费观看 | 久久看片网 | 99精品视频在线观看re | 国产乱码精品一区二区三区四川人 | 男操女视频网站 | 亚洲国产欧美一区二区欧美 | 日韩一级特黄 | 久久久久依人综合影院 | 99热精品在线观看 | 亚洲一区在线观看视频 | 91精品网站 | 在线看片 在线播放 | 国产日韩欧美一区二区 | 一级毛片免费观看不卡视频 |