1. 程式人生 > >Python 3.X | 一文看懂不懵圈:位置引數(必選引數)、預設引數、可變引數、關鍵字引數、形參、實參...

Python 3.X | 一文看懂不懵圈:位置引數(必選引數)、預設引數、可變引數、關鍵字引數、形參、實參...

Win 10+Python 3.6.3

不管是什麼引數,它們身處環境是:函式(function)引數讓函式如虎添翼,靈活、強大。
1、概念釋義:

def func(x, y=2, *arg, *, z, **kwargs):
	#print(x, y)
	#print(len(arg), arg[0])
	print(kwargs)

#func(1)
#func(y=3, x=4)
#func(1, 3, 4, 5)
d = {'a':1, 'b':2}
func(1, **d)

上述程式碼中:

  • 函式定義過程中的如 xy,稱之為:形參(parameter)
  • 呼叫函式時(如 func(1))分別傳遞給xy的值 12,稱之為:實參(argument)。是具體、實際的值;
  • 在函式呼叫(如 func(1))時,根據函式定義的引數位置來傳遞的引數 x,稱之為:位置引數(也稱 必選引數);它是缺一不可的,如果有多個位置引數,順序得一一對應。
  • 在函式定義時,為形參 y賦 初始值,稱之為:預設引數。即 定義了預設的值的引數。在呼叫函式時,可傳也可不傳該已賦初值的引數。不管在函式定義、還是呼叫,所有位置引數必須出現在預設引數之前。預設引數一定要用不可變物件,否則執行時報錯。使用預設引數能降低呼叫函式的難度。
  • 在函式定義時,帶一個*
    號的引數(如 args),稱之為:可變引數(傳入的引數個數的可變的,0~n個)。它用於收集引數,接收的是一個元組 tuple(或列表 list)。如果可變引數後面還要加上其他定製的引數,那麼在定義函式時,必須使用關鍵字引數(如 kwargs,前面帶了兩個 **號,接收的是一個字典 dict。在呼叫時,對其賦值,採用“鍵-值”形式,如d)來定製,否則Python會認為這些是可變引數。In other words,關鍵字引數引數允許傳入0~n個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict
  • 關鍵字引數的命名是不受限制的,但若要限制呼叫者傳入的引數名,同時也可以提供預設值(可選的),這就是命名關鍵字引數
    (如 z)。在沒有可變引數的情況下(有,則不用加*),必須加一個*號作為特殊分隔符,否則Python直譯器無法識別位置引數和命名關鍵字引數。

2、引數組合:
在Python定義函式時,可使用位置引數、預設引數、可變引數、關鍵字引數、命名關鍵字引數,這5種都可以組合使用。但是,引數定義的順序必須如下:呼叫時也得遵循
在這裡插入圖片描述
儘管可以組合多達5種引數,但是,不要同時使用太多組合,否則函式介面的可理解性將很差。

小結:
Python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。定義函式時,將引數的名字、位置確定後,函式的介面定義就完成了。對於函式呼叫者而言,只需知道如何傳遞正確的引數、返回什麼樣的值就足夠了,至於函式內部封裝的複雜邏輯,呼叫者無需瞭解。