Python3筆記027 – 6.2 參數傳遞

第6章 函數

6.2 參數傳遞

在理解形參和實參的基礎上,理解位置參數、關鍵字參數、可變參數這三種情形,以及這三種的混合情形。

6.2.1 形式參數和實際參數

形式參數:在定義函數時,函數名後面括弧中的參數稱為「形式參數」,簡稱「形參」

# 定義plus函數, a和b是形參
def plus(a, b):
    result = a - b
    return result

實際參數:在調用一個函數時,函數名後面括弧中的參數為「實際參數」,簡稱「實參」

# 調用plus函數,4和3是實參
result1 = plus(4, 3)
print(result1)

6.2.2 位置參數

調用函數時,實參的數量和位置必須和定義函數時形參的數量和位置是一致的;

'''
定義函數時,定義了兩個參數a和b。調用函數時,傳入兩個實參3和4,完全滿足函數調用時參數要求。
'''
# 定義plus函數
def plus(a, b):
    result = a - b
    return result
# 調用plus函數,傳入2個參數,正常
result1 = plus(4, 3)
print(result1)
output:1
# 調用plus函數時傳入1個實參,報錯
result1 = plus(4)
print(result1)
output:
TypeError: plus() missing 1 required positional argument: 'b'
# 調用plus函數時傳入3個實參,報錯
result1 = plus(4, 3, 5)
print(result1)
output:
TypeError: plus() takes 2 positional arguments but 3 were given

6.2.3 關鍵字參數

關鍵字參數是指使用形式參數的名字來確定輸入的參數值。通過這種方式指定實際參數時,不再需要與形式參數的位置完全一致,只要將參數名寫正確即可。

'''
調用函數時,傳入實參(b=3, a=4),可不與函數定義時的參數位置一致。
'''
# 定義plus函數
def plus(a, b):
    result = a - b
    return result
# 調用plus函數
result1 = plus(b=3, a=4)
print(result1)
output:1

6.2.4 定義函數時為形式參數設置默認值,稱之為預設參數

調用函數時,如果沒有傳入某個參數將拋出異常,則要求在定義時函數時,直接指定形式參數的默認值,當沒有傳入參數時, 則直接使用定義函數時設置的默認值。預設參數必須寫在函數形參的末尾

def functionname(...,[parameter1 = defaultvalue1]):
    [functionbody]
# 在定義函數時,指定默認的形式參數必須在所有參數的最後,否則將產生語法錯誤
'''
定義函數時,形參設置默認值,調用函數時,有預設參數可不傳參,函數使用默認值處理。
'''
# 定義plus函數
def plus(a, b=1):
    result = a - b
    return result
# 調用plus函數
result1 = plus(a=4)
print(result1)
output:1

另外,使用可變對象作為函數參數的默認值時,多次調用可能會導致異常的情況。

def f(b=[]):  # NO!
    print(b)
    return b

ret = f(1)
ret.append(1)
ret.append(2)
# 當再調用f(1)時,預計列印為 []
f(1)
# 但是卻為 [1,2]

解決上面的問題,最好使用None作為可變對象的默認值,再加上必要的檢查程式碼。

def f(a,b=None):  # NO!
    if b==None:
    	b = []
    print(b)
    return b

ret = f(1,2)
ret.append(1)
ret.append(2)
# 當再調用f(1)時,預計列印為 []
f(1)
output:
[]
[]

定義函數時,為形式參數設置默認值要牢記一點:默認參數必須指向不可變對象

6.2.5 可變參數

函數定義時,可定義可變參數,即傳入函數中的實際參數可以是任意個。

1、*parameter

這種形式表示接收任意多個實際參數並將其放到一個元組中。

'''
定義函數時,定義形參為*args。調用函數時,可傳任意個參數,函數將實參添加到一個元組中。
'''
def avg(*args):
    print(args)
    print(type(args))
    total = 0
    for i in args:
        total += i
    return total / len(args)


print('平均分是:', avg(60, 70, 80, 90, 100))
output:
(60, 70, 80, 90, 100)
<class 'tuple'>
平均分是: 80.0

2、**parameter

這種形式表示接收任意多個類似關鍵字參數一樣顯示賦值的實際參數並將其放到一個字典中。

'''
定義函數時,定義形參為**kwargs。調用函數時,傳入關鍵參數形式,函數將實參添加到一個字典中。
'''
def avg(**kwargs):
    print(kwargs)
    print(type(kwargs))
    total = 0
    for i in kwargs.values():
        total += i
    return total / len(kwargs)


print('平均分是:', avg(a=60, b=70, c=80, d=90, e=100))
output:
{'a': 60, 'b': 70, 'c': 80, 'd': 90, 'e': 100}
<class 'dict'>
平均分是: 80.0

3、*parameter和**parameter組合

# 萬能傳參,args在前,kwargs在後。
def function_print(*args,**kwargs): # 傳遞不定長參數,即參數個數不固定
    print(args)
    print(kwargs)
function_print()
function_print(1,True,"string",(1,),{"list1"},{"月份":7},Tuesday="星期二")
output:
()
{}
(1, True, 'string', (1,), {'list1'}, {'月份': 7})
{'Tuesday': '星期二'}
Tags: