最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年08月10日 08:36:52   作者:David Beazley  
這篇文章主要介紹了Python如何定義有默認(rèn)參數(shù)的函數(shù),幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下

問(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=42
spam(1, 2) # Ok. a=1, b=2

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

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

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

_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)不要像下面這樣寫(xiě)代碼:

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 = []
  ...

這么寫(xiě)的問(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è)試用戶(hù)提供的值(因?yàn)檫@些值都是合法的值,是可能被用戶(hù)傳遞進(jìn)來(lái)的)。 因此,你需要其他的解決方案了。

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

這里對(duì) object() 的使用看上去有點(diǎn)不太常見(jiàn)。object 是python中所有類(lèi)的基類(lèi)。 你可以創(chuàng)建 object 類(lèi)的實(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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python 中文字符串的處理實(shí)現(xiàn)代碼

    python 中文字符串的處理實(shí)現(xiàn)代碼

    python中直接將一個(gè)中文字符串賦值給一個(gè)變量使用的是utf-8格式的編碼,以下為證.
    2009-10-10
  • 整理Python中常用的conda命令操作

    整理Python中常用的conda命令操作

    今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python中常用的conda命令行操作展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python 利用matplotlib在3D空間中繪制平面的案例

    python 利用matplotlib在3D空間中繪制平面的案例

    這篇文章主要介紹了python 利用matplotlib在3D空間中繪制平面的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • python中的_和__用法及說(shuō)明

    python中的_和__用法及說(shuō)明

    這篇文章主要介紹了python中的_和__用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Python基于SSE實(shí)現(xiàn)流式模式

    Python基于SSE實(shí)現(xiàn)流式模式

    流式模式,顧名思義,即通過(guò)流的方式持續(xù)發(fā)送數(shù)據(jù)而不是一次性全部返回,與傳統(tǒng)的 HTTP 請(qǐng)求模式不同,流式模式的特點(diǎn)在于服務(wù)器可以在連接打開(kāi)后持續(xù)地向客戶(hù)端發(fā)送數(shù)據(jù),本文給大家介紹了Python如何基于SSE實(shí)現(xiàn)流式模式,需要的朋友可以參考下
    2024-11-11
  • python爬取王者榮耀全皮膚的簡(jiǎn)單實(shí)現(xiàn)代碼

    python爬取王者榮耀全皮膚的簡(jiǎn)單實(shí)現(xiàn)代碼

    在本篇文章里小編給大家分享的是一篇關(guān)于16行python代碼 爬取王者榮耀全皮膚的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2020-01-01
  • vscode搭建之python?Django環(huán)境配置方式

    vscode搭建之python?Django環(huán)境配置方式

    這篇文章主要介紹了vscode搭建之python?Django環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn)

    Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn)

    這篇文章主要介紹了Python 3.6打包成EXE可執(zhí)行程序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 在 Python 中解析 ISO 8601 日期的詳細(xì)過(guò)程

    在 Python 中解析 ISO 8601 日期的詳細(xì)過(guò)程

    這篇文章主要介紹了在 Python 中解析 ISO 8601 日期,我們將討論典型的 ISO 8601 日期的結(jié)構(gòu),并向您展示如何將典型的 DateTime 對(duì)象解析為可以在所有地方使用的標(biāo)準(zhǔn)化 DateTime,需要的朋友可以參考下
    2023-08-08
  • python和php學(xué)習(xí)哪個(gè)更有發(fā)展

    python和php學(xué)習(xí)哪個(gè)更有發(fā)展

    在本篇內(nèi)容里小編給大家分析了關(guān)于python和php學(xué)習(xí)哪個(gè)更有發(fā)展相關(guān)論點(diǎn),有興趣的朋友們參考下。
    2020-06-06

最新評(píng)論

游戏| 淮南市| 社会| 三穗县| 丰宁| 始兴县| 祁阳县| 从江县| 都昌县| SHOW| 虞城县| 吉林市| 东兴市| 辽源市| 永新县| 曲松县| 固安县| 许昌县| 铁岭市| 南平市| 南召县| 郑州市| 民乐县| 沛县| 乐清市| 茂名市| 威信县| 工布江达县| 诸暨市| 东宁县| 吉木萨尔县| 兰溪市| 武乡县| 梁河县| 灵璧县| 昌黎县| 桐梓县| 扎赉特旗| 商都县| 遵义市| 亳州市|