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

Python的函數(shù)定義非常簡單,但靈活度卻非常大嚷狞。除了正常定義的必選參數(shù)外感耙,還可以使用默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù),使得函數(shù)定義出來的接口只酥,不但能處理復(fù)雜的參數(shù),還可以簡化調(diào)用者的代碼损离。

位置參數(shù)

位置參數(shù):必須傳入的參數(shù)為位置參數(shù).

eg:

def power(n):
  return n * n

#n就是位置參數(shù),有且必須傳入的參數(shù)

如果要算某個數(shù)的某次方,eg.

def power(x , n):
  sum = 1
  while n > 0:
    n = n - 1
    sum = x * sum
  return sum

#n和x都是位置參數(shù)

默認(rèn)參數(shù)

默認(rèn)參數(shù)是指,給參數(shù)一個初始值,如果外部不傳入這個參數(shù),那么系統(tǒng)會自動使用該默認(rèn)值

以上面的例子為例,當(dāng)power必須傳入兩個參數(shù)以后,想計算某個數(shù)的平方,會出錯,修改如下

def power(x, n = 2):
  sum = 1
  while n > 0:
    n = n - 1
    sum = sum *  x
    return sum
#在這里x就是位置參數(shù),n為默認(rèn)參數(shù)
#這樣绝编,當(dāng)我們調(diào)用power(5)時十饥,相當(dāng)于調(diào)用power(5, 2)

默認(rèn)參數(shù)雖然好,但是用的不好也會出現(xiàn)很大的問題.eg.

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

當(dāng)你正常調(diào)用時,結(jié)果似乎不錯:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

但是秉氧,再次調(diào)用add_end()時汁咏,結(jié)果就不對了:

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

為什么?

Python函數(shù)在定義的時候作媚,默認(rèn)參數(shù)L的值就被計算出來了,即[]
轰驳,因為默認(rèn)參數(shù)L也是一個變量弟灼,它指向?qū)ο骩]田绑,每次調(diào)用該函數(shù),如果改變了L的內(nèi)容芒划,則下次調(diào)用時欧穴,默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時的[]了拼苍。

所以必須記住默認(rèn)參數(shù)必須指向不變對象调缨!

修改:

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

可變參數(shù)

可變參數(shù):參數(shù)的個數(shù)不確定.帶有*號的就是可變參數(shù).

eg.計算a2+ b2 + c2 + ……

def calc(*numbers):
  sum = 0 
  for n in numbers: 
    sum = sum + n * n 
    return sum
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84

如果已經(jīng)有一個list或者tuple,要調(diào)用一個可變參數(shù)怎么辦妇多?可以這樣做:

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

但是太繁瑣了,簡單示例:

>>> nums = [1, 2, 3]
>>> calc(*nums)
14
#*nums表示把nums這個list的所有元素作為可變參數(shù)傳進去。這種寫法相當(dāng)有用号坡,而且很常見。

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

可變參數(shù)允許你傳入0個或任意個參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple烂瘫。而關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù)奇适,這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict嚷往。

eg.

def person(name, age, **kw):
 print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> 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': 'Engineer'}

和可變參數(shù)類似,也可以先組裝出一個dict籍琳,然后贷祈,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進去:

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

簡單寫法:

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

extra
表示把extra這個dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的
kw參數(shù)势誊,kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝查近,對kw的改動不會影響到函數(shù)外的extra挤忙。

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

命名關(guān)鍵字參數(shù):如果要限制關(guān)鍵字參數(shù)的名字册烈,就可以用命名關(guān)鍵字參數(shù).
1.和關(guān)鍵字參數(shù)kw不同,命名關(guān)鍵字參數(shù)需要一個特殊分隔符矮冬,后面的參數(shù)被視為命名關(guān)鍵字參數(shù)次哈。

def person(name, age, *, city, job):
 print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

2.如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符*了

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

參數(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}

最神奇的是通過一個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': '#'}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琼牧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哀卫,更是在濱河造成了極大的恐慌巨坊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件此改,死亡現(xiàn)場離奇詭異趾撵,居然都是意外死亡,警方通過查閱死者的電腦和手機共啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門占调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移剪,“玉大人究珊,你說我怎么就攤上這事∽菘粒” “怎么了剿涮?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攻人。 經(jīng)常有香客問我取试,道長,這世上最難降的妖魔是什么怀吻? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任瞬浓,我火速辦了婚禮,結(jié)果婚禮上烙博,老公的妹妹穿的比我還像新娘瑟蜈。我一直安慰自己,他們只是感情好渣窜,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布铺根。 她就那樣靜靜地躺著,像睡著了一般乔宿。 火紅的嫁衣襯著肌膚如雪位迂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音掂林,去河邊找鬼臣缀。 笑死,一個胖子當(dāng)著我的面吹牛泻帮,可吹牛的內(nèi)容都是我干的精置。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼锣杂,長吁一口氣:“原來是場噩夢啊……” “哼脂倦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起元莫,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赖阻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踱蠢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體火欧,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年茎截,在試婚紗的時候發(fā)現(xiàn)自己被綠了苇侵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡稼虎,死狀恐怖衅檀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霎俩,我是刑警寧澤哀军,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站打却,受9級特大地震影響杉适,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柳击,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一猿推、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捌肴,春花似錦蹬叭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饥悴,卻和暖如春坦喘,著一層夾襖步出監(jiān)牢的瞬間盲再,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工瓣铣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留答朋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓棠笑,卻偏偏與公主長得像梦碗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腐晾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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