前言,復習想直接看源代碼,這裏先分享下,*args和**kwargs他們都是什麽意思
阿新 • • 發佈:2019-04-06
復習 spl pen 地方 code class 裏的 區別 pri
本文來自:https://blog.csdn.net/lllxxq141592654/article/details/81288741
在源碼中,基本都有這種含*args和**kwargs的表達那麽他們都是什麽意思呢?
前言:
*args
打包參數(pack)
拆分參數(unpack)(pack)
**kwargs
打包參數(pack)
拆分參數(unpack)
這裏先看三個小函數:
def foo3(*args): print(args) print(type(args)) foo3(1, 2, 3, 4, 5)def foo4(a, *args): print(‘a:‘, a) print(‘args:‘, args) foo4(1, 2, 3, 4, 5) def bar1(a,b,c): print(a,b,c) bar1(*[1,2,3]) def bar2(deal): a,b,*_, = deal _, _, *c, _, _, = deal d, *_, e = deal
*args有兩部分構成為——∗和args。這裏的重點是∗。
所以為了講清楚*args,我們要追根溯源——理解∗的作用。這裏敲黑板,重點來了,這也是很多博客寫的沒有寫到的地方:∗的作用,有2個—— 打包參數(pack)和拆分參數(unpack)!
打包參數(pack)
def foo(*number): ‘‘‘ ∗ 把函數foo()接受到的多個參數如1,2,3,4,5,打包成了元組(1,2,3,4,5),賦值給了形參number。 ‘‘‘ print(number) print(type(number)) def foo1(a, *number): ‘‘‘ ∗ 的作用:函數接受實參時,按順序分配給函數形參,如果遇到帶∗的形參,那麽就把還未分配出去的實 參以元組形式打包(pack),分配給那個帶∗的形參。View Code‘‘‘ print(‘a:‘, a) print(‘number:‘, number) for i in number: print(i) print(type(number)) def foo2(a, b, *number, c): ‘‘‘ c前面的參數帶∗,把剩下的實參都接受走了,c沒有傳入實參!這個函數的c參數得不到任何的傳值 ‘‘‘ pass
拆分參數(unpack)(pack)
def bar(a,b,c):
‘‘‘
把打包了的實參(元組或列表),拆分(unpack)成單個的,依次賦值給函數的形參。
這裏的雖然進行打包,但是參數的個數記得需要對應,不然會報錯,
‘‘‘
pass
bar(*[1,2,3])
**kwargs也有兩部分構成為——∗∗和kwargs。這裏的重點是∗∗。沒錯,kwargs僅僅是一個約定俗成的寫法,
沒有其他特殊含義,換成其他的也照用不誤,但是為了代碼可讀性,最好還是用約定俗成的。
∗∗ 的作用同樣也有兩個—— 打包參數(pack)和拆分參數(unpack)!
但是區別還是有的,簡單來說就是:
打包(pack):*args是把多個位置參數打包成元組,**kwargs是把多個關鍵字參數打包成字典。
拆分(unpack):*args是把打包了的參數拆成單個的,依次賦值給函數的形參,**kwargs是把字典的鍵值拆成單個的,依次賦值給函數的形參。
打包參數(pack)
def bar(**number): ‘‘‘ 把傳遞來的參數打包成一個字典 ‘‘‘ print(number) print(type(number)) bar(a=1, b=2, c=3)
拆分參數(unpack)(pack)
def bar(a, b, c): ‘‘‘ 把字典拆分,根據鍵值賦值 ‘‘‘ print(a,b,c) bar(**{‘a‘: 1, ‘c‘: 3,‘b‘: 2})
位置參數,關鍵字參數,*args,**kwargs混用是要有一定順序的待修正
前言,復習想直接看源代碼,這裏先分享下,*args和**kwargs他們都是什麽意思