1. 程式人生 > >前言,復習想直接看源代碼,這裏先分享下,*args和**kwargs他們都是什麽意思

前言,復習想直接看源代碼,這裏先分享下,*args和**kwargs他們都是什麽意思

復習 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),分配給那個帶∗的形參。
    
‘‘‘ 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
View Code
拆分參數(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他們都是什麽意思