Python中函數的參數-arguments

概括起來,Python中函數的定義形式和調用形式主要有以下幾種形式:數組

# 函數的定義形式
def func(name)               # 匹配positional參數或者keyword參數
def func(name=value)    # 若是不傳,有默認參數
def func(*name)        # 將額外的positional參數轉換成一個tuple,而後賦給name
def func(**name)     # 將額外的keyword參數轉換成一個dictionary,而後賦給name
def func(*other, name)  # Python 3.X中定義keyword-only參數的形式,Python 2.X中不支持,此時,name必定要以keyword的形式傳遞
def func(*, name)     # Python 3.X中定義keyword-only參數的形式, Python 2.X中不支持,此時, name必定要以keyword的形式傳遞


# 函數的調用
func(name)        # 以positional參數調用
func(name=value)   # 以keyword參數調用
func(*iterable)     # 將iterable對象轉換成一連串單個positional參數進行調用
func(**dictionary) # 將dictionary轉換成keywrod參數進行調用

這裏須要注意3點:app

1 在Python 2.X中(在Python 3.X中,這種形式已經不容許了),還有一種定義函數的方式,就是將函數的參數定義成一個tuple,那麼,當調用函數的時候,傳遞一個結構同樣的tuple參數,這個tuple參數就會被unpack:函數

# 定義
def func((a, (b, c)) # 調用
func((1, (2, 3))   # a=1, b=2, c=3
func((1, [2, 3]))  # a=1, b=2, c=3,這樣調用也是能夠的
func((1, 'mn'))   # a=1, b='m', c='n', 這樣也能夠,也就是說調用的時候只要是序列均可以

# 可是定義的時候只能是tuple,不能出現其餘序列,好比數組,下面的情形是不對的
def func((a, [b, c]))

2 對於調用形式func(*name)和func(**name),也可使用apply函數達到一樣的效果,可是apply函數只能在Python 2.X中使用,在Python 3.X中被移除了,使用形式爲:spa

def func(*a, **b) a=(1, 2) b={'c':3, 'd':4} func(*a, **b)      # Python 2.X和Python 3.X均支持
 apply(func, a, b) # 僅Python 2.X支持,效果同樣

3 對於默認參數,尤爲要注意可變對象,每一次以默認形式象調用函數,這個默認的參數會被重用,而不會重置:code

def func(a=[]): a += [1] print(a) >>>func() [1] >>>func()  # 此時a的值是[1]
[1, 1] >>>func()  # 此時a的值是[1, 1]
[1, 1, 1]

 

函數定義時參數的順序以及函數調用時參數的順序對象

Python中,定義函數和調用函數時,參數的順序有必定的規則,若是不符合規則,Python會報錯:blog

1 在定義函數時,參數的順序爲:positional參數(name),默認參數(name=value),*name形式(或者只有一個*,可是隻在Python 3.X中支持),name或者name=value形式(都只在Python 3.X中支持,叫keyword-only參數,後面name=value是賦默認值),**name形式;it

2 在調用函數時,參數的順序爲:positional參數(name),keyword參數(name=value)或者*name形式,**name形式io

總之,**name不管在定義函數時,仍是在調用函數時,都只應出如今最後。class

 

函數參數的匹配步驟

Python內部,對於函數參數的匹配大體分爲5步:

1 首先匹配positional參數(name)

2 匹配keywrod參數(name=value)

3 將額外的非keyword參數匹配給*name形式

4 將額外的keyword參數匹配給**name形式

5 若是有默認值,給未傳遞的參數賦默認值

通過上述步驟以後,Python還須要確保,每個參數,只匹配了一個值,不然,就會報錯。

相關文章
相關標籤/搜索