Python 函數(shù)參數(shù)詳解

[TOC]

Python 函數(shù)參數(shù)

前言

最近在跟同事討論一個(gè)方法的調(diào)用時(shí)涉及到了 Python 函數(shù)的位置參數(shù)和關(guān)鍵字參數(shù)的相關(guān)知識(shí)璧针,發(fā)現(xiàn)之前學(xué)習(xí) Python 時(shí)對(duì)函數(shù)參數(shù)研究的并不透徹诫给,且很多地方已經(jīng)有些生疏了,故而查閱了一下 Python 官方文檔和廖雪峰的官網(wǎng)中的相關(guān)知識(shí)陋桂,并記錄總結(jié)如下。

Argument 和 Parameter

Python 函數(shù)參數(shù)根據(jù)使用情況的不同需要分為 Parameter 和 Argument 兩部分進(jìn)行討論。

Argument

Argument 指的是函數(shù)調(diào)用時(shí)的實(shí)際參數(shù)杨箭,即實(shí)參 (actual parameter),也可以稱為引數(shù)储狭。
Python 中有兩種 Argument互婿,分別是「位置參數(shù)」和「關(guān)鍵字參數(shù)」

位置參數(shù) [positional argument]

位置參數(shù)使用時(shí)可以放在參數(shù)列表的開(kāi)頭,和/或是以一個(gè)帶有 * 前綴的可迭代的元素表示辽狈,以內(nèi)置函數(shù) complex() 的調(diào)用為例:

complex(3, 5)
complex(*(3, 5))

==* 表示將可迭代對(duì)象擴(kuò)展為函數(shù)的參數(shù)列表==

關(guān)鍵字參數(shù) [keyword argument]

關(guān)鍵字參數(shù)使用時(shí)需要用標(biāo)識(shí)符指明(name= 的形式)慈参,或是以一個(gè)帶有 ** 前綴的字典表示,以內(nèi)置函數(shù) complex() 的調(diào)用為例:

complex(real=3, imag=5)
complex(**{'real': 3, 'imag': 5})

==** 表示將字典擴(kuò)展為函數(shù)的關(guān)鍵字參數(shù)==

Parameter

Parameter 指的是函數(shù)定義時(shí)的形式參數(shù)刮萌,即形參 (formal parameter)驮配。Python 中有五種 Parameter,分別是「位置或關(guān)鍵字參數(shù)」着茸、「僅位置參數(shù)」壮锻、「僅關(guān)鍵字參數(shù)」、「可變位置參數(shù)」元扔、「可變關(guān)鍵字參數(shù)」

位置或關(guān)鍵字參數(shù) [positional-or-keyword]

位置或關(guān)鍵字參數(shù)在函數(shù)調(diào)用時(shí)可以以位置參數(shù) (positional argument) 或關(guān)鍵字參數(shù) (keyword argument) 的形式提供躯保。它是默認(rèn)的參數(shù)類型。

def func(foo1, foo2=None): ...

其中 foo1 也可稱為非默認(rèn)參數(shù) [non-default parameter]澎语;foo2 可稱為默認(rèn)參數(shù) [default parameter]途事,默認(rèn)參數(shù)帶有默認(rèn)值验懊,可以簡(jiǎn)化函數(shù)調(diào)用。

注意尸变,在函數(shù)定義時(shí)非默認(rèn)參數(shù)必須在默認(rèn)參數(shù)之前义图。

僅位置參數(shù) [positional-only]

僅位置參數(shù)在函數(shù)調(diào)用時(shí)只能由位置參數(shù) (positional argument) 提供。Python 沒(méi)有提供定義該參數(shù)的語(yǔ)法召烂,它只在一些內(nèi)置函數(shù)中存在碱工,例如 abs()

僅關(guān)鍵字參數(shù) [keyword-only]

僅關(guān)鍵字參數(shù)在函數(shù)調(diào)用時(shí)只能由關(guān)鍵字參數(shù) (keyword argument) 提供奏夫,它可以對(duì)函數(shù)傳入的關(guān)鍵字參數(shù)進(jìn)行限制怕篷。
僅關(guān)鍵字參數(shù)定義時(shí)需要在其之前緊鄰一個(gè)可變位置參數(shù)或增加一個(gè)特殊分割符 *

  1. 含有可變位置參數(shù)時(shí)以可變位置參數(shù)為分割酗昼,可變位置參數(shù)后都是僅關(guān)鍵字參數(shù)
def person(name, age, *args, city, job):
    print(name, age, args, city, job)

可以這樣調(diào)用他

test_arg('beijin','wfp',age='25',job='hoker')
test_arg('beijin','wfp',addr='shanghai',age='25',job='hoker')

但是不能這樣調(diào)用他

test_arg('beijin','wfp','25',job='hoker')

會(huì)提示缺少一個(gè)參數(shù)廊谓,定義了命名關(guān)鍵字參數(shù)的話,必須要把全部的關(guān)鍵字參數(shù)傳入進(jìn)去

  1. 沒(méi)有可變位置參數(shù)時(shí)麻削,增加一個(gè) * 作為特殊分隔符蒸痹,* 后面的都是僅關(guān)鍵字參數(shù)
def test_arg(city,name,*,age,job):
    print(name, age, args, city, job)

==* 作為特殊分割符使用==

僅關(guān)鍵字參數(shù)可以設(shè)置默認(rèn)值,從而簡(jiǎn)化調(diào)用:

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)

由于參數(shù) city 具有默認(rèn)值呛哟,調(diào)用時(shí)叠荠,可不傳入 city 參數(shù):

>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

使用命名關(guān)鍵字參數(shù)時(shí),要特別注意扫责,如果沒(méi)有可變參數(shù)榛鼎,就必須加一個(gè) 。如果缺少 * Python 解釋器將無(wú)法識(shí)別 positional-or-keyword 和 keyword-only

可變位置參數(shù) [var-positional]

可變參數(shù)很簡(jiǎn)單公给,在 C/C++ 和 Java 等語(yǔ)言中都有借帘,就是用 *args 號(hào)來(lái)表示,例如

def test_arg(*arg): ...

==* 表示將函數(shù)調(diào)用時(shí)的多個(gè)參數(shù)打包成一個(gè)元組==

你可以傳入任意多個(gè)元素(包括0)到參數(shù)中淌铐,在函數(shù)調(diào)用時(shí)會(huì)自動(dòng)被認(rèn)為是一個(gè)元組

可變關(guān)鍵字參數(shù) [var-keyword]

可變關(guān)鍵字參數(shù)在 python 中習(xí)慣用 **kwargs 表示肺然,可以傳入0到任意多個(gè)“關(guān)鍵字-值”,參數(shù)在函數(shù)內(nèi)部被當(dāng)做一個(gè)字典

def test_arg(**kwargs): ...
def test_arg(city, **kwargs): ...

==** 表示將函數(shù)調(diào)用時(shí)的多個(gè)關(guān)鍵字參數(shù)打包成一個(gè)字典==

可以這樣調(diào)用它

test_arg(name='John', job='hoker')
test_arg('beijin', name='john')

關(guān)鍵字參數(shù)可以用來(lái)后期擴(kuò)充函數(shù)的功能腿准,例如:先設(shè)定必要的參數(shù)际起,之后選擇性的增加可選參數(shù)。

Parameter 組合使用時(shí)的順序

位置或關(guān)鍵字參數(shù)-非默認(rèn)參數(shù) > 位置或關(guān)鍵字參數(shù)-默認(rèn)參數(shù) > 可變位置參數(shù) > 僅關(guān)鍵字參數(shù) > 可變關(guān)鍵字參數(shù)

參考來(lái)源

https://docs.python.org/3.6/glossary.html#term-parameter

https://docs.python.org/3.6/glossary.html#term-argument

https://docs.python.org/3.6/faq/programming.html#faq-argument-vs-parameter

https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吐葱,一起剝皮案震驚了整個(gè)濱河市街望,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟跑,老刑警劉巖灾前,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孟辑,居然都是意外死亡哎甲,警方通過(guò)查閱死者的電腦和手機(jī)蔫敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炭玫,“玉大人奈嘿,你說(shuō)我怎么就攤上這事⊥碳樱” “怎么了裙犹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衔憨。 經(jīng)常有香客問(wèn)我叶圃,道長(zhǎng),這世上最難降的妖魔是什么巫财? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任盗似,我火速辦了婚禮,結(jié)果婚禮上平项,老公的妹妹穿的比我還像新娘。我一直安慰自己悍及,他們只是感情好闽瓢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著心赶,像睡著了一般扣讼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缨叫,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天椭符,我揣著相機(jī)與錄音,去河邊找鬼耻姥。 笑死销钝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琐簇。 我是一名探鬼主播蒸健,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼婉商!你這毒婦竟也來(lái)了似忧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丈秩,失蹤者是張志新(化名)和其女友劉穎盯捌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蘑秽,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饺著,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年箫攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶籽。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匠童,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塑顺,到底是詐尸還是另有隱情汤求,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布严拒,位于F島的核電站扬绪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裤唠。R本人自食惡果不足惜挤牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望种蘸。 院中可真熱鬧墓赴,春花似錦、人聲如沸航瞭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刊侯。三九已至章办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滨彻,已是汗流浹背藕届。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭饵,地道東北人休偶。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冬骚,于是被迫代替她去往敵國(guó)和親椅贱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • ??Python函數(shù)定義時(shí)參數(shù)靈活只冻,使用不同參數(shù)的組合不僅可以簡(jiǎn)化調(diào)用者的代碼庇麦,還可以處理復(fù)雜的參數(shù)。函數(shù)的參數(shù)除...
    liangruifeng閱讀 527評(píng)論 0 2
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,694評(píng)論 0 3
  • 4. More Control Flow Tools 控制流工具 Besides the while statem...
    linyk3閱讀 695評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評(píng)論 0 5
  • 二喜德、函數(shù)的參數(shù) 形參只有在被調(diào)用時(shí)才分配內(nèi)存單元山橄,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元舍悯。因此形參只在函數(shù)內(nèi)部有效...
    常大鵬閱讀 1,484評(píng)論 0 5