1. 程式人生 > 實用技巧 >Python3筆記027 - 6.2 引數傳遞

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': '星期二'}