溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python基礎(chǔ)之 函數(shù)的參數(shù)

發(fā)布時(shí)間:2020-08-08 13:17:36 來源:ITPUB博客 閱讀:167 作者:ckxllf 欄目:編程語言

  一、形參和實(shí)參是什么?

  函數(shù)的參數(shù)分為形式參數(shù)和實(shí)際參數(shù),簡(jiǎn)稱形參和實(shí)參:

  形參即在定義函數(shù)時(shí),括號(hào)內(nèi)聲明的參數(shù)。形參本質(zhì)就是一個(gè)變量名,用來接收外部傳來的值。

  def func(x,y): #x和y為形參

  print(x,y)

  實(shí)參即在調(diào)用函數(shù)時(shí),括號(hào)內(nèi)傳入的值,值可以是常量、變量、表達(dá)式或三者的組合。

  func(1,2) #1和2為實(shí)參

  形參和實(shí)參的關(guān)系:

  在調(diào)用階段,實(shí)參(變量值)會(huì)賦值給形參(變量名)

  二、形參與實(shí)參的具體使用

  1、兩種形參的區(qū)別

  (1)位置形參

  在定義函數(shù)時(shí),按照從左到右的順序依次定義形參,稱為位置形參,凡是按照這種形式定義的形參都必須被傳值

  def register(name,age,sex): #定義位置形參:name,age,sex,三者都必須被傳值

  print('Name:{} Age:{} Sex:{}'.format(name,age,sex))

  (2)默認(rèn)形參

  默認(rèn)形參調(diào)用時(shí),可以不傳值,那么就是默認(rèn)值,傳值就覆蓋默認(rèn)值。

  >>> def register(name,age,sex='male'): #默認(rèn)sex的值為male

  ... print('Name:{} Age:{} Sex:{}'.format(name,age,sex))

  ...

  需要注意:

  默認(rèn)參數(shù)必須在位置參數(shù)之后

  默認(rèn)參數(shù)的值僅在函數(shù)定義階段被賦值一次

  默認(rèn)參數(shù)的值通常應(yīng)設(shè)為不可變類型

  def foo(n,arg=[]):

  arg.append(n)

  return arg

  foo(1)

  [1]

  foo(2)

  [1, 2]

  foo(3)

  [1, 2, 3]

  每次調(diào)用是在上一次的基礎(chǔ)上向同一列表增加值,修改如下

  def foo(n,arg=None):

  if arg is None:

  arg=[]

  arg.append(n)

  return arg

  foo(1)

  [1]

  foo(2)

  [2]

  foo(3)

  [3]

  2、兩種實(shí)參的區(qū)別

  (1)位置實(shí)參

  在調(diào)用函數(shù)時(shí),按照從左到右的順序依次定義實(shí)參,稱為位置實(shí)參,凡是按照這種形式定義的實(shí)參會(huì)按照從左到右的順序與形參一一對(duì)應(yīng)

  def register(name,age,sex): #定義位置形參:name,age,sex,三者都必須被傳值

  print('Name:{} Age:{} Sex:{}'.format(name,age,sex))

  register('吳晉丞',18,'男') #定義位置實(shí)參:'吳晉丞',18,'男',按照順序和形參相對(duì)應(yīng)

  (2)關(guān)鍵字實(shí)參

  在調(diào)用函數(shù)時(shí),實(shí)參可以是key=value的形式,稱為關(guān)鍵字參數(shù),凡是按照這種形式定義的實(shí)參,可以完全不按照從左到右的順序定義,但仍能為指定的形參賦值

  >>> register(sex='male',name='lili',age=18)

  Name:lili Age:18 Sex:male

  需要注意在調(diào)用函數(shù)時(shí),實(shí)參也可以是按位置或按關(guān)鍵字的混合使用,但必須保證關(guān)鍵字參數(shù)在位置參數(shù)后面,且不可以對(duì)一個(gè)形參重復(fù)賦值

  >>> register('lili',sex='male',age=18) #正確使用

  #錯(cuò)誤示例:

  >>> register(name='lili',18,sex='male') #SyntaxError:關(guān)鍵字參數(shù)name=‘lili’在位置參數(shù)18之前

  >>> register('lili',sex='male',age=18,name='jack') #TypeError:形參name被重復(fù)賦值

  3、可變長參數(shù)

  參數(shù)的長度可變指的是在調(diào)用函數(shù)時(shí),實(shí)參的個(gè)數(shù)可以不固定,而在調(diào)用函數(shù)時(shí),實(shí)參的定義無非是按位置或者按關(guān)鍵字兩種形式,這就要求形參提供兩種解決方案來分別處理兩種形式的可變長度的參數(shù)

  (1)可變長位置參數(shù)在形參和實(shí)參中的應(yīng)用

  形參中的應(yīng)用

  如果在最后一個(gè)形參名前加*號(hào),那么在調(diào)用函數(shù)時(shí),溢出的位置實(shí)參,都會(huì)被接收,以元組的形式保存下來賦值給該形參

  >>> def foo(x,y,z=1,*args): #在最后一個(gè)形參名args前加*號(hào)

  ... print(x)

  ... print(y)

  ... print(z)

  ... print(args)

  ...

  >>> foo(1,2,3,4,5,6,7) #實(shí)參1、2、3按位置為形參x、y、z賦值,多余的位置實(shí)參4、5、6、7都被*接收,以元組的形式保存下來,賦值給args,即args=(4, 5, 6,7)

  1

  2

  3

  (4, 5, 6, 7)

  實(shí)參中的應(yīng)用

  如果我們事先生成了一個(gè)列表(也可以是元組、字符串),仍然是可以傳值給*args的

  >>> def foo(x,y,*args):

  ... print(x)

  ... print(y)

  ... print(args)

  ...

  >>> L=[3,4,5]

  >>> foo(1,2,*L) # *L就相當(dāng)于位置參數(shù)3,4,5。foo(1,2,*L)就等同于foo(1,2,3,4,5)

  1

  2

  (3, 4, 5)

  (2)可變長關(guān)鍵字參數(shù)在形參和實(shí)參中的應(yīng)用

  形參中的應(yīng)用

  如果在最后一個(gè)形參名前加**號(hào),那么在調(diào)用函數(shù)時(shí),溢出的關(guān)鍵字參數(shù),都會(huì)被接收,以字典的形式保存下來賦值給該形參

  >>> def foo(x,**kwargs): #在最后一個(gè)參數(shù)kwargs前加**

  ... print(x)

  ... print(kwargs)

  ...

  >>> foo(y=2,x=1,z=3) #溢出的關(guān)鍵字實(shí)參y=2,z=3都被**接收,以字典的形式保存下來,賦值給kwargs

  1

  {'z': 3, 'y': 2}

  實(shí)參中的應(yīng)用

  如果我們事先生成了一個(gè)字典,仍然是可以傳值給**kwargs的

  >>> def foo(x,y,**kwargs):

  ... print(x)

  ... print(y)

  ... print(kwargs)

  ...

  >>> dic={'a':1,'b':2}

  >>> foo(1,2,**dic) #**dic就相當(dāng)于關(guān)鍵字參數(shù)a=1,b=2。foo(1,2,**dic)等同foo(1,2,a=1,b=2)

  1

  2

  {'a': 1, 'b': 2}

  4、命名關(guān)鍵字參數(shù)(了解)

  想要限定函數(shù)的調(diào)用者必須以key=value的形式傳值,Python3提供了專門的語法:需要在定義形參時(shí),用*號(hào)作為一個(gè)分隔符號(hào),*號(hào)之后的形參稱為命名關(guān)鍵字參數(shù)。對(duì)于這類參數(shù),在函數(shù)調(diào)用時(shí),必須按照key=value的形式為其傳值,且必須被傳值。

  >>> def register(name,age,*,sex,height): #sex,height為命名關(guān)鍵字參數(shù)

  ... pass

  ...

  >>> register('lili',18,sex='male',height='1.8m') #正確使用

  #錯(cuò)誤示例:

  >>> register('lili',18,'male','1.8m') # TypeError:未使用關(guān)鍵字的形式為sex和height傳值

  >>> register('lili',18,height='1.8m') # TypeError沒有為命名關(guān)鍵字參數(shù)height傳值。

  命名關(guān)鍵字參數(shù)也可以有默認(rèn)值(注意:這個(gè)不叫默認(rèn)形參),從而簡(jiǎn)化調(diào)用

  >>> def register(name,age,*,sex='male',height):

  pass

  如果形參中已經(jīng)有一個(gè)*args了,命名關(guān)鍵字參數(shù)就不再需要一個(gè)單獨(dú)的*作為分隔符號(hào)了,而是\*args作為分隔符號(hào),后面是命名關(guān)鍵字參數(shù)

  >>> def register(name,age,*args,sex='male',height):#sex,height仍然為命名關(guān)鍵字參數(shù)

  有人可能還會(huì)問如果是**kwargs呢?是不是以**kwargs為分隔符?

  答:這樣會(huì)報(bào)錯(cuò),這樣也沒有什么用,因?yàn)?*kwargs就是用來接收多余的關(guān)鍵字實(shí)參的,如果多余的不是關(guān)鍵字實(shí)參,會(huì)報(bào)錯(cuò)。你再用命名關(guān)鍵字參數(shù),限制必須關(guān)鍵字實(shí)參傳值,沒有意義。

    鄭州較好的婦科醫(yī)院 http://www.kd0371.com/

python基礎(chǔ)之 函數(shù)的參數(shù)

  5、組合使用

  綜上所述所有參數(shù)可任意組合使用,但形參定義順序必須是:位置參數(shù)、默認(rèn)參數(shù)、\*args、命名關(guān)鍵字參數(shù)、**kwargs.

  實(shí)參的定義順序可以是:位置實(shí)參、*、關(guān)鍵字參數(shù)、**:

  func(111,*(333,444),y=222,**{'a':555,'b':666})

  #只要*和**打散之后遵循位置實(shí)參在關(guān)鍵字參數(shù)左邊即可。*相當(dāng)于一堆位置實(shí)參,**相當(dāng)于一堆關(guān)鍵字參數(shù)

  可變參數(shù)*args與關(guān)鍵字參數(shù)**kwargs通常是組合在一起使用的,如果一個(gè)函數(shù)的形參為*args與**kwargs,那么代表該函數(shù)可以接收任何形式、任意長度的參數(shù)

  >>> def wrapper(*args,**kwargs):

  ... pass

  在該函數(shù)內(nèi)部還可以把接收到的參數(shù)傳給另外一個(gè)函數(shù)(這在4.6小節(jié)裝飾器的實(shí)現(xiàn)中大有用處)

  >>> def func(x,y,z):

  ... print(x,y,z)

  ...

  >>> def wrapper(*args,**kwargs): #(1,)元組 {'z':3,'y':2}字典

  ... func(*args,**kwargs) # *(1,) **{'z':3,'y':2},實(shí)參使用*和**,打散元組、字典

  ...

  >>> wrapper(1,z=3,y=2)

  1 2 3

  提示: *args、**kwargs中的args和kwargs被替換成其他名字并無語法錯(cuò)誤,但使用args、kwargs是約定俗成的。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI