python3教程:*和**的打包和解包的用法

一. 打包參數

1. * 的作用:在函數定義中,收集所有的位置參數到一個新的元組,并將這個元組賦值給變量args

>>> def f(*args):
    print(args)

    
>>> f()
()
>>> f(1)
(1,)
>>> f(1, 2, 3, 4)
(1, 2, 3, 4)
>>> 

2. ** 的作用:在函數定義中,收集關鍵字參數傳遞給一個字典,并將這個字典賦值給變量kwargs

>>> def f(**kwargs):
    print(kwargs)

    
>>> f()
{}
>>> f(a=1, b=2)
{'a': 1, 'b': 2}
>>> 

二. 解包參數

1. * 的作用:在函數調用中,* 能夠將元組或者列表解包成不同的參數

>>> def func(a, b, c, d):
    print(a, b, c, d)

    
>>> args = (1, 2, 3, 4)
>>> func(*args)
1 2 3 4

>>> args = [1, 2, 3, 4]
>>> func(*args)
1 2 3 4

2. **的作用:在函數調用中,**會以鍵/值的形式解包一個字典,使其成為獨立的關鍵字參數

>>> def func(a, b, c, d):
    print(a, b, c, d)

    
>>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
>>> func(**kwargs)
1 2 3 4

三. 注意

1. 在函數定義時,*表示打包,在函數體內部, * 仍然表示解包(print(*args)實際上也算是調用了print函數)

>>> def foo(*args, **kwargs):
    print(args)       #未解包參數
    print(*args)      #解包參數

    
>>> v = (1, 2, 4)
>>> d = {'a':1, 'b':12}
>>> foo(v, d)
((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}

2. 打包和解包并不能脫離函數而存在

表面上看并沒有什么函數,實際上是有的,用的就是format的函數調用

成都創新互聯公司專注于封丘企業網站建設,響應式網站設計,商城網站開發。封丘網站建設公司,為封丘等地區提供建站服務。全流程按需網站制作,專業設計,全程項目跟蹤,成都創新互聯公司專業和態度為您提供的服務

>>> c = {"name": 'zhang', "age": 2}
>>> **c
SyntaxError: invalid syntax
>>> 
>>> "Name:{name}, Age:{age}".format(**c)
'Name:zhang, Age:2'

參考源碼中對format函數的定義

但是這個字典解包不能用print函數輸出

'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
>>> print(**c)
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    print(**c)
TypeError: 'age' is an invalid keyword argument for this function
>>> 

因為上述字典解出來的形式是這樣的:

**c = name='zhang',age=2

3. 在ddt中的應用

@ddt.data(*all_caseDatas)中,data是一個函數,調用函數的時候,參數*all_caseDatas自動將參數列表[{}, {}, {}...]解包為{},{},{}...,在def data(*values)函數中,*會自動將各個位置參數打包成新的元組({}, {}, {}...),然后@ddt.data就可以獲取每一條數據作為測試用例了

@ddt.data(*all_caseDatas)
    def test_my_request(self, case_data):
        global global_var
        if len(global_var) != 0 and case_data["request_data"] is not None:
            for key, value in global_var.items():
                if case_data["request_data"].find(key) != -1:
                    case_data["request_data"] = case_data["request_data"].replace(key, value)

四. 練習

請寫出下列代碼的運行結果

def f(str1, *args, **kwargs):
    print(str1, args, kwargs)

l = [1, 2, 3]
t = [4, 5, 6]
d = {"a":7, "b":8, "c":9}

f(1, 2)
f(1, 2, 3, "python")
f("python", a=1, b=2, c=3)

print("================")

f("python", l, d)
f("python", *t)
f("python", *l, **d)
f("python", q="winning", **d)


運行結果:
1 (2,) {}
1 (2, 3, 'python') {}
python () {'a': 1, 'b': 2, 'c': 3}
================
python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {}
python (4, 5, 6) {}
python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9}
python () {'a': 7, 'b': 8, 'q': 'winning', 'c': 9}

需要注意的是f("python", *t)是把列表t先解包成 4, 5, 6,然后在def f(str1, *args, **kwargs):中將4, 5, 6重新打包成新的元組(4, 5, 6)再傳遞給變量args

分享文章:python3教程:*和**的打包和解包的用法
路徑分享:http://m.kartarina.com/article32/dsogjsc.html

成都網站建設公司_創新互聯,為您提供手機網站建設企業網站制作App設計微信小程序網站設計網站營銷

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 无码少妇一区二区浪潮免费| 久久久久亚洲av无码专区| 国产精品无码DVD在线观看| 亚洲中文字幕伊人久久无码| 久久久久亚洲av无码专区蜜芽| 人妻无码αv中文字幕久久| 国产精品无码MV在线观看| 久久精品中文字幕无码| 国产日产欧洲无码视频| 色综合久久久无码网中文| 中文字幕无码毛片免费看| 亚洲精品久久无码| 精品无码人妻夜人多侵犯18| 国产精品无码不卡一区二区三区| 亚洲午夜无码久久久久小说 | a级毛片无码免费真人| 中文无码喷潮在线播放| 免费无码肉片在线观看| 亚洲AV日韩AV高潮无码专区| 久久久人妻精品无码一区| 亚洲αⅴ无码乱码在线观看性色| 亚洲日韩乱码中文无码蜜桃臀网站 | 久久久久亚洲AV片无码| 亚洲精品无码久久久| 精品无码综合一区二区三区| 久热中文字幕无码视频| 亚洲AV无码成人精品区天堂| 国产AⅤ无码专区亚洲AV| 无码的免费不卡毛片视频| 人妻无码精品久久亚瑟影视| 亚洲av无码成人精品国产| 国产乱人伦中文无无码视频试看| 中文字幕亚洲精品无码| 日韩精品无码AV成人观看| 色AV永久无码影院AV| 免费无遮挡无码永久视频| 无码人妻精品中文字幕免费东京热| 久久亚洲精品无码AV红樱桃| 亚洲精品无码中文久久字幕| 无码中文字幕一区二区三区| 成年男人裸j照无遮挡无码|