最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中*args和**kwargs的作用

 更新時間:2023年11月03日 15:16:47   作者:云淡丶風輕  
*args和**kwargs,以及單獨的*,**到底是啥作用呢?原理是啥呢?讀完這篇文章你就徹底明白了,感興趣的朋友跟隨小編一起看看吧

寫在前面

讀代碼的過程中經(jīng)常見到這種含*args**kwargs的表達:
比如這個該輸出什么呢?

def foo(*args):
    print(args)
foo(1, 2, 3, 4, 5)

這個呢?

def foo(a, *args):
    print('a:', a)
    print('args:', args)
foo(1, 2, 3, 4, 5)

還有這個呢?

def bar(a,b,c):
    print(a,b,c)
bar(*[1,2,3])

咦?∗號怎么出現(xiàn)在了一個列表前面?這樣對嗎?

*args**kwargs,以及單獨的*,**到底是啥作用呢?原理是啥呢?讀完這篇文章你就徹底明白了!

*args有兩部分構(gòu)成為——*args。這里的重點是*。
所以為了講清楚*args,我們要追根溯源——理解*的作用。
這里敲黑板,重點來了,這也是很多博客寫的沒有寫到的地方:∗的作用,有2個——打包參數(shù)(pack)和拆分參數(shù)(unpack)!

*argc

打包參數(shù)

例1:

def foo(*number):
    print(number)
foo(1, 2, 3, 4, 5)

(1, 2, 3, 4, 5)

我們看到了什么?給函數(shù)5個參數(shù),成功運行了,而且輸出是參數(shù)構(gòu)成的元組
我們知道,如果number前不加∗號,那么很明顯foo()只能接受1個參數(shù),參數(shù)給多了少了都要報錯。而加上∗,就能成功運行。
那么原理是什么呢?
答案是:∗把函數(shù)foo()接受到的多個參數(shù)1,2,3,4,5,打包成了元組(1,2,3,4,5),賦值給了形參number。
我們可以驗證一下:
例2:

def foo(*number):
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)

1
2
3
4
5
<class 'tuple'>

從例2可以看出,number確實被賦予了(1,2,3,4,5)這個實參。
說話要講道理,詳情參見python官方文檔,這里粘個圖過來:

例3:

def foo(a, *number):
    print('a:', a)
    print('number:', number)
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)
a: 1
number (2, 3, 4, 5)
2
3
4
5
<class 'tuple'>

從例3可以看出,number接受到的實參變成了(2,3,4,5),第一個參數(shù)1被形參a接受走了。
所以這里我們可以給出∗作用的完整版:

∗的作用:函數(shù)接受實參時,按順序分配給函數(shù)形參,如果遇到帶∗的形參,那么就把還未分配出去的實參以元組形式打包(pack),分配給那個帶∗的形參。

可以再多幾個例子驗證:
例4:

def foo(a, b, *number):
    print('a:', a)
    print('b:', b)
    print('number:', number)
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)
a: 1
b: 2
number: (3, 4, 5)
3
4
5
<class 'tuple'>

例5:

def foo(a, b, *number, c):
    print('a:', a)
    print('b:', b)
    print('c:', c)
    print('number:', number)
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)
Traceback (most recent call last):
  File "C:/Users/PycharmProjects/untitled10/test19.py", line 11, in <module>
    foo(1, 2, 3, 4, 5)
TypeError: foo() missing 1 required keyword-only argument: 'c'

注意例5我特地找了個報錯的例子。自己分析一下為啥會報錯。答案是:c前面的參數(shù)帶∗,把剩下的實參都接受走了,c沒有傳入實參!

到這里,∗的打包(pack)就解釋清楚了。
還留一個小尾巴:args是啥?
答案是:args僅僅是一個約定俗成的形參的寫法,你寫成把別的也沒事,但是不利于統(tǒng)一形式。就像我們的例子里,一直用的number,也照樣運行正確。

拆分參數(shù)

例6:

def bar(a,b,c):
    print(a,b,c)
bar(*[1,2,3])

1 2 3

可以看出,∗這次沒有用在函數(shù)定義中,而是用在了函數(shù)調(diào)用中。在本例中的作用是啥呢?
答案是:把打包了的實參(元組或列表),拆分(unpack)成單個的,依次賦值給函數(shù)的形參。
在本例中,打包了的實參[1,2,3]被拆分,1賦值給了形參a,2賦值給了形參b,3賦值給了形參c。

∗拆分的作用就這么簡單。理解了原理,其他的萬變不離其宗。出兩個題,練習一下:
練習:以下3段程序中,哪個可以正常運行?
例7:

def bar(a,b):
    print(a,b)
bar(*[1, 2, 3])

例8:

def bar(a, b, c, d):
    print(a, b, c, d)
bar(*[1, 2, 3])

例9:

def bar(a, b, c, d=10):
    print(a, b, c, d)
bar(*[1, 2, 3])

答案是只有例9可以正常運行。因為按照我們講的原理,例7的實參3沒有對應(yīng)的形參接受,例8的形參d沒有實參賦值。

**kwargs

打包參數(shù)

上邊*args學懂了**kwargs也就很容易明白了。
**kwargs也有兩部分構(gòu)成為——**kwargs。這里的重點是∗∗。沒錯,kwargs僅僅是一個約定俗成的寫法,沒有其他特殊含義,換成其他的也照用不誤,但是為了代碼可讀性,最好還是用約定俗成的。
∗∗的作用同樣也有兩個——打包參數(shù)(pack)和拆分參數(shù)(unpack)!
但是區(qū)別還是有的,簡單來說就是:
打包(pack)*args是把多個位置參數(shù)打包成元組,**kwargs是把多個關(guān)鍵字參數(shù)打包成字典。
拆分(unpack)*args是把打包了的參數(shù)拆成單個的,依次賦值給函數(shù)的形參,**kwargs是把字典的鍵值拆成單個的,依次賦值給函數(shù)的形參。
例10

def bar(**number):
    print(number)
bar(a=1, b=2, c=3)

{'a': 1, 'b': 2, 'c': 3}

拆分參數(shù)

例11

def bar(a, b, c):
    print(a,b,c)
bar(**{'a': 1, 'b': 2, 'c': 3})

1 2 3

注意這里有個需要注意的地方,就是用∗∗方式拆解字典給形參賦值時,需要字典的鍵名和函數(shù)形參一直,否則會報錯,自己試試就知道了。

位置參數(shù),關(guān)鍵字參數(shù),*args,**kwargs混用是要有一定順序的,這里我特地不寫了。因為這問題本身應(yīng)該不是個問題,是學習函數(shù)時應(yīng)該打下的基本功。如果真的需要,可以自己再查一下,加深印象,也比在我這伸手就拿來的好。

到此這篇關(guān)于Python中*args和**kwargs的理解的文章就介紹到這了,更多相關(guān)Python *args和**kwargs內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • NumPy中的實用函數(shù)clip詳解

    NumPy中的實用函數(shù)clip詳解

    這篇文章主要介紹了NumPy中的實用函數(shù)clip詳解,NumPy函數(shù)clip()用于保留數(shù)組中在間隔范圍內(nèi)的值,給定一個范圍,范圍外的值將剪裁到范圍邊界,需要的朋友可以參考下的相關(guān)資料
    2023-08-08
  • 淺談Python中threading join和setDaemon用法及區(qū)別說明

    淺談Python中threading join和setDaemon用法及區(qū)別說明

    這篇文章主要介紹了淺談Python中threading join和setDaemon用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes)

    Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes)

    這篇文章主要介紹了Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • pytorch 批次遍歷數(shù)據(jù)集打印數(shù)據(jù)的例子

    pytorch 批次遍歷數(shù)據(jù)集打印數(shù)據(jù)的例子

    今天小編就為大家分享一篇pytorch 批次遍歷數(shù)據(jù)集打印數(shù)據(jù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 簡單了解python關(guān)系(比較)運算符

    簡單了解python關(guān)系(比較)運算符

    這篇文章主要介紹了簡單了解python關(guān)系(比較)運算符,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python中if語句的使用方法詳解

    Python中if語句的使用方法詳解

    if語句用來表示某種可能的情況,并如何處理該情況。if語句可以用來表示一種可能性、兩種可能性或者多種可能性,這篇文章主要介紹了Python中if語句的使用方法,需要的朋友可以參考下
    2023-03-03
  • Python實現(xiàn)翻轉(zhuǎn)數(shù)組功能示例

    Python實現(xiàn)翻轉(zhuǎn)數(shù)組功能示例

    這篇文章主要介紹了Python實現(xiàn)翻轉(zhuǎn)數(shù)組功能,涉及Python針對數(shù)組的遍歷、判斷、排序等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 詳解Python中的正斜杠與反斜杠

    詳解Python中的正斜杠與反斜杠

    這篇文章主要介紹了詳解Python中的正斜杠與反斜杠,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 解決Jupyter因卸載重裝導(dǎo)致的問題修復(fù)

    解決Jupyter因卸載重裝導(dǎo)致的問題修復(fù)

    這篇文章主要介紹了解決Jupyter因卸載重裝導(dǎo)致的問題修復(fù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python使用Flet打造跨平臺文本編輯器

    Python使用Flet打造跨平臺文本編輯器

    在Python生態(tài)中,構(gòu)建圖形界面應(yīng)用常面臨兩難選擇,Flet框架的出現(xiàn)打破了這一僵局,本文將通過實戰(zhàn)案例,手把手教你用Flet開發(fā)一個支持自動保存、多端適配的文本編輯器,希望對大家有所幫助
    2025-09-09

最新評論

巴马| 天等县| 集安市| 无棣县| 卢湾区| 洛南县| 东莞市| 涿州市| 平度市| 会同县| 合水县| 拜泉县| 株洲市| 北辰区| 深泽县| 绥中县| 沧源| 偏关县| 曲阳县| 蒲城县| 鱼台县| 安顺市| 许昌市| 邳州市| 隆化县| 晋宁县| 松原市| 左贡县| 兰考县| 中西区| 延庆县| 嘉兴市| 永川市| 汾阳市| 辽宁省| 五河县| 绍兴市| 龙江县| 安平县| 喀什市| 隆化县|