#python入門4#函數(shù)參數(shù)

參數(shù)種類:5, 必選參數(shù)技即,默認(rèn)參數(shù), 可變參數(shù)樟遣,關(guān)鍵字參數(shù)而叼,命名關(guān)鍵字參數(shù)

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

對(duì)于power(x)函數(shù),參數(shù)x就是一個(gè)位置參數(shù)

默認(rèn)參數(shù)
  • 默認(rèn)參數(shù)必須指向不變對(duì)象豹悬,可以用str葵陵、none來實(shí)現(xiàn), list是可變對(duì)象
    因?yàn)椴蛔儗?duì)象一旦創(chuàng)建瞻佛,對(duì)象內(nèi)部的數(shù)據(jù)就不能修改脱篙,這樣就減少了由于修改數(shù)據(jù)導(dǎo)致的錯(cuò)誤。此外伤柄,由于對(duì)象不變绊困,多任務(wù)環(huán)境下同時(shí)讀取對(duì)象不需要加鎖,同時(shí)讀一點(diǎn)問題都沒有适刀。我們?cè)诰帉懗绦驎r(shí)秤朗,如果可以設(shè)計(jì)一個(gè)不變對(duì)象,那就盡量設(shè)計(jì)成不變對(duì)象
  def add_end(L=none):
      if L is none:
          L=[]
      L.append('end')
      return L
可變參數(shù)

在Python函數(shù)中笔喉,還可以定義可變參數(shù)取视。顧名思義,可變參數(shù)就是傳入的參數(shù)個(gè)數(shù)是可變的常挚,可以是1個(gè)作谭、2個(gè)到任意個(gè),還可以是0個(gè)奄毡。
由于參數(shù)個(gè)數(shù)不確定折欠,我們首先想到可以把a(bǔ),b,c……作為一個(gè)listtuple傳進(jìn)來

  def calc(numbers):
      sum = 0
      for n in numbers:
            sum = sum + n 
      return sum 

  calc([1,3,4])

如果利用可變參數(shù)怨酝,調(diào)用函數(shù)的方式可以簡(jiǎn)化成這樣:

  def calc(*numbers):
      sum = 0
      for n in numbers:
          sum = sum + n
      return sum

calc(1,2)
calc(1,3,4)

定義可變參數(shù)和定義一個(gè)list或tuple參數(shù)相比傀缩,僅僅在參數(shù)前面加了一個(gè)*
號(hào)

如果已經(jīng)有一個(gè)list或者tuple,要調(diào)用一個(gè)可變參數(shù)怎么辦农猬?

  >>> nums = [1, 2, 3]
  >>> calc(nums[0], nums[1], nums[2])
  14

Python允許你在list或tuple前面加一個(gè)*號(hào)赡艰,把list或tuple的元素變成可變參數(shù)傳進(jìn)去

  >>> nums = [1, 2, 3]
  >>> calc(*nums)
  14

** nums表示把nums這個(gè)list的所有元素作為可變參數(shù)傳進(jìn)去。這種寫法相當(dāng)有用斤葱,而且很常見*

可變參數(shù)允許你傳入0個(gè)或任意個(gè)參數(shù)慷垮,這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple。而關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù)揍堕,這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict

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

 >>> person('bob', 35, city='Beijing')
 name: bob age:35, other:{'city':'Beijing'}

 >>> person('bob', 35, gender='M', job='Engineer')
 name: bob age:35 other:{'gender':'M', 'job': 'Engineer'}

和可變參數(shù)類似料身,也可以先組裝出一個(gè)dict,然后衩茸,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進(jìn)去

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

或者簡(jiǎn)化:

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

extra表示把extra這個(gè)dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的kw參數(shù)芹血,kw將獲得一個(gè)dict,注意kw獲得的dict是extra的一份拷貝楞慈,對(duì)kw的改動(dòng)不會(huì)影響到函數(shù)外的extra

命名關(guān)鍵字參數(shù)

如果要限制關(guān)鍵字參數(shù)的名字幔烛,就可以用命名關(guān)鍵字參數(shù),例如囊蓝,只接收city和job作為關(guān)鍵字參數(shù)

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

和關(guān)鍵字參數(shù)kw不同饿悬,命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符后面的參數(shù)被視為命名關(guān)鍵字參數(shù), 調(diào)用如下:

  >>>person('Jack', 24, city='Beijing', job='Engineer')
  jack 24 Beijing Engineer
參數(shù)組合

在Python中定義函數(shù)聚霜,可以用必選參數(shù)狡恬、默認(rèn)參數(shù)、可變參數(shù)蝎宇、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)弟劲,這5種參數(shù)都可以組合使用。但是請(qǐng)注意夫啊,參數(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)
  >>> f1(1, 2)
  a = 1 b = 2 c = 0 args = () kw = {}
  >>> f1(1, 2, c=3)
  a = 1 b = 2 c = 3 args = () kw = {}
  >>> f1(1, 2, 3, 'a', 'b')
  a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
  >>> f1(1, 2, 3, 'a', 'b', x=99)
  a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
  >>> f2(1, 2, d=99, ext=None)
  a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}

通過一個(gè)tuple和dict虱咧,你也可以調(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': '#'}

所以熊榛,對(duì)于任意函數(shù),都可以通過類似func(*args, **kw)的形式調(diào)用它腕巡,無論它的參數(shù)是如何定義的玄坦。

小結(jié)

  • Python的函數(shù)具有非常靈活的參數(shù)形態(tài),既可以實(shí)現(xiàn)簡(jiǎn)單的調(diào)用,又可以傳入非常復(fù)雜的參數(shù)煎楣。
  • 默認(rèn)參數(shù)一定要用不可變對(duì)象豺总,如果是可變對(duì)象,程序運(yùn)行時(shí)會(huì)有邏輯錯(cuò)誤择懂!
  • 要注意定義可變參數(shù)和關(guān)鍵字參數(shù)的語法:
  • *args是可變參數(shù)喻喳,args接收的是一個(gè)tuple;
  • **kw是關(guān)鍵字參數(shù)困曙,kw接收的是一個(gè)dict表伦。
    以及調(diào)用函數(shù)時(shí)如何傳入可變參數(shù)和關(guān)鍵字參數(shù)的語法:
  • 可變參數(shù)既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple慷丽,再通過*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ù)名,同時(shí)可以提供默認(rèn)值珊膜。
  • 定義命名的關(guān)鍵字參數(shù)在沒有可變參數(shù)的情況下不要忘了寫分隔符*容握,否則定義的將是位置參數(shù)。
學(xué)習(xí)來源于廖雪峰教程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末车柠,一起剝皮案震驚了整個(gè)濱河市剔氏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竹祷,老刑警劉巖谈跛,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塑陵,居然都是意外死亡感憾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門令花,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阻桅,“玉大人,你說我怎么就攤上這事兼都∩┏粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵扮碧,是天一觀的道長(zhǎng)趟章。 經(jīng)常有香客問我杏糙,道長(zhǎng),這世上最難降的妖魔是什么蚓土? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任宏侍,我火速辦了婚禮,結(jié)果婚禮上蜀漆,老公的妹妹穿的比我還像新娘负芋。我一直安慰自己,他們只是感情好嗜愈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布旧蛾。 她就那樣靜靜地躺著,像睡著了一般蠕嫁。 火紅的嫁衣襯著肌膚如雪锨天。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天剃毒,我揣著相機(jī)與錄音病袄,去河邊找鬼。 笑死赘阀,一個(gè)胖子當(dāng)著我的面吹牛益缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播基公,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼幅慌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了轰豆?” 一聲冷哼從身側(cè)響起胰伍,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤酸休,失蹤者是張志新(化名)和其女友劉穎骂租,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑司,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渗饮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宿刮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片互站。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糙置,靈堂內(nèi)的尸體忽然破棺而出云茸,到底是詐尸還是另有隱情,我是刑警寧澤谤饭,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響揉抵,放射性物質(zhì)發(fā)生泄漏亡容。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一冤今、第九天 我趴在偏房一處隱蔽的房頂上張望闺兢。 院中可真熱鬧,春花似錦戏罢、人聲如沸屋谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桐磁。三九已至,卻和暖如春讲岁,著一層夾襖步出監(jiān)牢的瞬間我擂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工缓艳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留校摩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓阶淘,卻偏偏與公主長(zhǎng)得像衙吩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溪窒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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