函數(shù)的參數(shù)

Python Learning

2017-6-15

函數(shù)的參數(shù)

  • 位置參數(shù)
def power(x)
    return x*x

調(diào)用函數(shù)時,參數(shù)有且只有一個。

  • 默認(rèn)參數(shù)
def power(x,n=2):
    s=1
    while n>0:
        n=n-1
        s=s*x
    return s

調(diào)用函數(shù)時友扰,可以只賦值第一個參數(shù),第二個參數(shù)默認(rèn)為2庶柿;當(dāng)然也可以賦值兩個參數(shù)村怪。

Example:
def eroll(name,gender,age=6,city='Beijing'):
    print('name:',name)
    print('gender:',gender)
    print('age:',age)
    print('city:',city)

調(diào)用函數(shù)時后兩個參數(shù)可以賦值,也可以不賦值浮庐。
默認(rèn)參數(shù)存在大坑

Example:
def add_end(L=[]):
    L.append('END')
    return L

正常賦值調(diào)用時甚负,結(jié)果正確。
第一次使用默認(rèn)參數(shù)調(diào)用時审残,結(jié)果也正確梭域。
但接著使用默認(rèn)參數(shù)調(diào)用時,結(jié)果卻出現(xiàn)了錯誤搅轿。

>>>add_end()
['END']
>>>add_end()
['END','END']

出現(xiàn)這樣的錯誤病涨,是因為Python在定義函數(shù)時,默認(rèn)的參數(shù)L的值就被計算出來了璧坟,即[],因為默認(rèn)參數(shù)L也是一個變量既穆,它指向?qū)ο?code>[],每次調(diào)用該函數(shù)雀鹃,如果改變了L的內(nèi)容幻工,則下次調(diào)用時,默認(rèn)參數(shù)的內(nèi)容就變了褐澎,不再是函數(shù)定義時的[]了会钝。
所以,定義默認(rèn)參數(shù)要牢記一點:默認(rèn)參數(shù)必須指向不變對象!

def add_end(L=None):
    if L is None:
        L=[]
    L.append('END')
    return L

現(xiàn)在無論調(diào)用多少次迁酸,都不會出問題了先鱼。

  • 可變參數(shù)

Python中還可以定義可變參數(shù),傳入的參數(shù)是可變的奸鬓。

def cale(*number):
    sum=0
    for n in number:
        sum=sum+n*n
    return sum

定義可變參數(shù)和定義一個list或tuple參數(shù)相比焙畔,僅僅在參數(shù)前面加了一個*號。在函數(shù)內(nèi)部串远,參數(shù)numbers接收到的是一個tuple宏多,因此,函數(shù)代碼完全不變澡罚。但是伸但,調(diào)用該函數(shù)時,可以傳入任意個參數(shù)留搔,包括0個參數(shù)更胖。

  • 關(guān)鍵字參數(shù)
def person(name,age,**kw):
    print('name:',name,'age:'age,'other:',kw)

函數(shù)person除了必選參數(shù)nameage外,還接受關(guān)鍵字參數(shù)kw隔显。在調(diào)用該函數(shù)時却妨,可以只傳入必選參數(shù),也可以傳入任意個關(guān)鍵字參數(shù):

>>>person('Bob',35,city='Beijing')
name:Bob age:35 other:{'city':'Beijing'}
>>>person('Adam',45,gender='M',job='Engineer')
name:Adam age:45 other:{'gender':'M','job':'Engneer'}

關(guān)鍵字參數(shù)可以擴(kuò)展函數(shù)的功能括眠。調(diào)用者愿意提供更多的參數(shù)彪标,我們也可以收到。用戶注冊功能很適用掷豺,能滿足這個需求捞烟。
當(dāng)參數(shù)是dict時同樣適用關(guān)鍵字參數(shù)。

>>>extra={'city':'Beijing','job':'Engineer'}
>>>person('Jack',24,**extra)
name:Jack age:24 other:{'city':'Beijing','job':'Engineer'}

此時kw獲得的是extra的一份拷貝当船,對kw的改動并不會影響到函數(shù)外的extra坷襟。

  • 命名關(guān)鍵字

對于關(guān)鍵字參數(shù),函數(shù)的調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù)生年。至于到底傳入了哪些,就需要在函數(shù)內(nèi)部通過kw檢查廓奕。
仍以person()函數(shù)為例抱婉,我們希望檢查是否有cityjob參數(shù)。
但調(diào)用者仍然可以傳入不受限制的關(guān)鍵字參數(shù)桌粉。
要限制關(guān)鍵字參數(shù)的名字蒸绩,就可以用命名關(guān)鍵字參數(shù):

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

使用命名關(guān)鍵字參數(shù)時,要特別注意铃肯,如果沒有可變參數(shù)患亿,就必須加一個*作為特殊分隔符。
命名關(guān)鍵字參數(shù)可以有缺省,簡化調(diào)用

命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名步藕,這和位置參數(shù)不同惦界。如果沒有傳入?yún)?shù)名,調(diào)用將報錯咙冗。

  • 組合參數(shù)
    可以將位置參數(shù)沾歪、默認(rèn)參數(shù)、可變參數(shù)雾消、關(guān)鍵字參數(shù)灾搏、命名關(guān)鍵字參數(shù)組合使用。

順序是:
位置參數(shù)立润、 默認(rèn)參數(shù)狂窑、可變參數(shù)、命名關(guān)鍵字參數(shù)桑腮、關(guān)鍵字參數(shù)

def f1(a,b,c=0,*args,**kw):
    print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)

def f2(a,b,c=0,*,d,**kw):
    print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw_)

在函數(shù)調(diào)用的時候泉哈,Python解釋器自動按照參數(shù)位置和參數(shù)名把對應(yīng)的參數(shù)傳進(jìn)去。
最神奇的是通過一個tupledict到旦,你也可以調(diào)用上述函數(shù):

>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

要注意定義可變參數(shù)和關(guān)鍵字參數(shù)的語法:

*args是可變參數(shù)旨巷,args接收的是一個tuple

**kw是關(guān)鍵字參數(shù)添忘,kw接收的是一個dict采呐。

以及調(diào)用函數(shù)時如何傳入可變參數(shù)和關(guān)鍵字參數(shù)的語法:

可變參數(shù)既可以直接傳入:func(1, 2, 3),又可以先組裝listtuple搁骑,再通過*args傳入:func(*(1, 2, 3))斧吐;

關(guān)鍵字參數(shù)既可以直接傳入:func(a=1, b=2),又可以先組裝dict仲器,再通過**kw傳入:func(**{'a': 1, 'b': 2})煤率。

使用*args**kw是Python的習(xí)慣寫法,當(dāng)然也可以用其他參數(shù)名乏冀,但最好使用習(xí)慣用法蝶糯。

命名的關(guān)鍵字參數(shù)是為了限制調(diào)用者可以傳入的參數(shù)名,同時可以提供默認(rèn)值辆沦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昼捍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肢扯,更是在濱河造成了極大的恐慌妒茬,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚晨,死亡現(xiàn)場離奇詭異乍钻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門银择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來多糠,“玉大人,你說我怎么就攤上這事欢摄“旧ィ” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵怀挠,是天一觀的道長析蝴。 經(jīng)常有香客問我,道長绿淋,這世上最難降的妖魔是什么闷畸? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮吞滞,結(jié)果婚禮上佑菩,老公的妹妹穿的比我還像新娘。我一直安慰自己裁赠,他們只是感情好殿漠,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佩捞,像睡著了一般绞幌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上一忱,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天莲蜘,我揣著相機(jī)與錄音,去河邊找鬼帘营。 笑死票渠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芬迄。 我是一名探鬼主播问顷,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼禀梳!你這毒婦竟也來了择诈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤出皇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哗戈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郊艘,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纱注。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏浆。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狞贱,靈堂內(nèi)的尸體忽然破棺而出刻获,到底是詐尸還是另有隱情,我是刑警寧澤瞎嬉,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布蝎毡,位于F島的核電站,受9級特大地震影響氧枣,放射性物質(zhì)發(fā)生泄漏沐兵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一便监、第九天 我趴在偏房一處隱蔽的房頂上張望扎谎。 院中可真熱鬧,春花似錦烧董、人聲如沸毁靶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽预吆。三九已至,卻和暖如春螟左,著一層夾襖步出監(jiān)牢的瞬間啡浊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工胶背, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留巷嚣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓钳吟,卻偏偏與公主長得像廷粒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子红且,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

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

  • 定義函數(shù)的時候坝茎,我們把參數(shù)的名字和位置確定下來,函數(shù)的接口定義就完成了暇番。對于函數(shù)的調(diào)用者來說嗤放,只需要知道如何傳遞正...
    JasonStack閱讀 334評論 0 0
  • 1.函數(shù)參數(shù) 1.1 位置參數(shù) 我們先寫一個計算x2的函數(shù): 對于power(x)函數(shù),參數(shù)x就是一個位置參數(shù)壁酬。當(dāng)...
    時間之友閱讀 371評論 0 2
  • 位置參數(shù) power(x, n)函數(shù)有兩個參數(shù):x和n次酌,這兩個參數(shù)都是位置參數(shù)恨课,調(diào)用函數(shù)時,傳入的兩個值按照位置順...
    牛崽兒酷閱讀 224評論 0 0
  • 作者 姜蘇 我邊走邊說:“奇怪岳服,剛才還能看見那個山頭剂公,現(xiàn)在再看,沒了吊宋「倭桑” “就是啊,剛剛還能看見璃搜⊥虾穑”他們都說。不...
    姜蘇閱讀 242評論 0 0
  • 你是 夜里的一片 黑 卻擁有了 世間 所有的光明 耀眼的 不是 你太陽般的心臟 而是 你把星星擁入懷里 卻從不隨意棄落
    Pan一一1984閱讀 328評論 0 0