1. 程式人生 > >Python進階04 函式的引數傳遞

Python進階04 函式的引數傳遞

def func(a, b, c):
    return a + b + c


# 位置傳遞
print(func(1, 2, 3))
# 關鍵字傳遞
print(func(c=3, b=2, a=1))

# 關鍵字傳遞可以和位置傳遞混用
print(func(1, c=3, b=2))


# 引數預設值
def f(a, b, c=10):
    return a + b + c


print(f(3, 2))  # 我們並沒有足夠的值,c沒有被賦值,c將使用預設值10
print(f(3, 2, 1))  # c被賦值為1,不再使用預設值

''' 包裹傳遞
在定義函式時,我們有時候並不知道呼叫的時候會傳遞多少個引數。這時候,包裹(packing)位置引數,或者包裹關鍵字引數,來進行引數傳遞,會非常有用。'''


def func(*name):
    print(type(name))
    print(name)


func(1, 4, 6)
func(5, 6, 7, 1, 2, 3)


# 包裹關鍵字傳遞
def func(**dict):
    print(type(dict))
    print(dict)


func(a=1, b=9)
func(m=2, n=1, c=11)
'''dict是一個字典,收集所有的關鍵字,傳遞給函式func。為了提醒Python,引數dict是包裹關鍵字傳遞所用的字典,在dict前加**。

包裹傳遞的關鍵在於定義函式時,在相應元組或字典前加*或**。'''


# 解包裹 *和**,也可以在呼叫的時候使用,即解包裹(unpacking)
def func_un_package(a, b, c):
    print(a, b, c)


args = (1, 3, 4)
func_un_package(*args)
'''所謂的解包裹,就是在傳遞tuple時,讓tuple的每一個元素對應一個位置引數。
在呼叫func時使用*,是為了提醒Python:我想要把args拆成分散的三個元素,分別傳遞給a,b,c。'''
# 相應的,也存在對詞典的解包裹,使用相同的func_un_package定義
dict = {'a': 1, 'b': 2, 'c': 3}
func_un_package(**dict)
# 在傳遞詞典dict時,讓詞典的每個鍵值對作為一個關鍵字傳遞給func。

'''混合: 在定義或者呼叫引數時,引數的幾種傳遞方式可以混合。但在過程中要小心前後順序。
基本原則是,先位置,再關鍵字,再包裹位置,再包裹關鍵字,並且根據上面所說的原理細細分辨。'''