函數的動態傳參
*args 將所有的實參的位置參數聚合到一個元組,並將這個元組賦值給args
有些時候,對於函數,傳入的實參數量可能是不固定的,也就是動態的,這個時候我們就需要用到函數的動態傳參。下面舉個個列子,我需要一個函數,無論我給他任意個數字參數,他都能返回我所有數字的和。
def count(*args): sum0 = 0 for i in args: sum0 += i return sum0 print(count(1,2,3,4,5)) #運行結果:15
這樣無論我在函數count中輸入多少個數字,都能返回和。*args就是動態傳參,實質上是函數會將接受到的值打包成元祖的形式賦值給args,不信你可以在函數值用type去判斷。總結:*在函數的定義時,在 *位置參數,聚合
**kwargs 將所有的關鍵字實參作為字典的鍵值對聚合到一個字典,並賦值給kwargs
有時候,需要接受任意數量的實參,但預先不知道傳遞給函數的會是什么樣的信息。在這種情況下,可將函數編寫成能夠接受任意數量的鍵 — 值對 —— 調用語句提供了多少就接
受多少。
def func1(**kwargs): print(kwargs) func1(name = 'king',age = 24) 運行結果:{'name': 'king', 'age': 24}
可以看出**是將接收到的關鍵字參數作為鍵值對賦值給,kwargs。
編寫一個函數,將一輛汽車的信息存儲在一個字典中。這個函數總是接受制造商和型號,還接受任意數量的關鍵字實參。這樣調用這個函數:提供必不可少的信息,以及兩個名稱 — 值對,如顏色和選裝配件。這個函數必須能夠像下面這樣進行調用:
car = make_car('subaru', 'outback', color='blue', tow_package=True)
分析要求,題目要求函數總是接受制造商和型號,也就是這2個參數是必須填的,我們可以設置成位置參數,而其他還接受任意數量的關鍵字實參。所以需要用到**方法:
def make_car(name,producter,**kwargs): dic = {} dic['車型'] = name dic['生產商']=producter for i in kwargs: dic[i] = kwargs[i] return dic car = make_car('subaru', 'outback', color='blue', tow_package=True) print(car) #運行結果: {'車型': 'subaru', '生產商': 'outback', 'color': 'blue', 'tow_package': True}
#如果只輸入car = make_car('subaru', 'outback')
則會打印 {'車型': 'subaru', '生產商': 'outback'}
函數形參的順序
位置參數,*args, 默認參數 **kwargs我們在定義形參時,必須遵循這樣的原則位置參數,默認參數
def func(a,b,sex='男'): # print(a) print(sex) func(100,200,) 位置參數,*args, 默認參數 def func(a,b,*args,sex='男',): # print(a) print(a,b) print(sex) print(args) func(100,200,1,2,34,5,6)
位置參數,*args, 默認參數 **kwargs def func(a,b,*args,sex='男',**kwargs,): print(a,b) print(sex) print(args) print(kwargs) func(100,200,1,2,34,5,6,sex='nv',name='alex',age=1000)