欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章徹底搞懂Python魔法參數(shù)args和kwargs(通俗易懂)

 更新時(shí)間:2025年02月05日 09:04:13   作者:蜘蛛俠在寫(xiě)碼  
這篇文章主要介紹了Python中的*args和**kwargs,它們分別是可變位置參數(shù)和可變關(guān)鍵字參數(shù),文章通過(guò)實(shí)際例子展示了如何在函數(shù)、裝飾器等場(chǎng)景中使用*args和**kwargs,幫助讀者理解并掌握這些靈活的參數(shù)處理方式,需要的朋友可以參考下

今天,咱就來(lái)聊聊 Python 函數(shù)參數(shù)中的兩個(gè) “魔法參數(shù)”——*args 和 **kwargs,它們能讓你的函數(shù)變得超級(jí)靈活,輕松應(yīng)對(duì)各種復(fù)雜情況。不過(guò)對(duì)于新接觸Python的同學(xué)來(lái)說(shuō)是一個(gè)不好理解的概念,Up第一次接觸也覺(jué)得過(guò)于靈活而不好理解。今天,Up嘗試用通俗易懂的語(yǔ)言來(lái)說(shuō)清楚。

提前劃重點(diǎn)

  • 什么是位置參數(shù)和關(guān)鍵字參數(shù)?
  • *args本質(zhì)是個(gè)元組
  • **kwargs本質(zhì)是個(gè)字典
  • 如何結(jié)合使用*args和**kwargs
  • 在裝飾器中使用 * args 和 **kwargs

位置參數(shù)和關(guān)鍵字參數(shù)

在深入了解 * args 和 **kwargs 之前,咱們得先熟悉一下 Python 函數(shù)參數(shù)中的兩個(gè) “常規(guī)軍”—— 位置參數(shù)和關(guān)鍵字參數(shù),它們可是函數(shù)傳參的基礎(chǔ)。

位置參數(shù),顧名思義,就是在調(diào)用函數(shù)時(shí),按照參數(shù)的順序依次傳遞給函數(shù)的參數(shù),實(shí)參的位置和形參的位置要一一對(duì)應(yīng),就像排隊(duì)領(lǐng)東西,先來(lái)的先領(lǐng),順序不能亂。比如說(shuō),咱們定義一個(gè)計(jì)算兩數(shù)之和的函數(shù):

def add_numbers(a, b):
    return a + b

這里的 a 和 b 就是位置參數(shù),當(dāng)我們調(diào)用這個(gè)函數(shù)時(shí),就得按照順序傳入兩個(gè)數(shù):

result = add_numbers(3, 5)
print(result)  

在這個(gè)例子中, 3 會(huì)被賦值給 a, 5 會(huì)被賦值給 b,函數(shù)返回它們的和 8。

關(guān)鍵字參數(shù)呢,就靈活多了。它是指在調(diào)用函數(shù)時(shí),通過(guò)指定參數(shù)名來(lái)為參數(shù)賦值,這樣就不用拘泥于參數(shù)的位置順序,讓代碼更加清晰易讀。還是用剛才的加法函數(shù)舉例,我們可以這樣調(diào)用:

result = add_numbers(a=3, b=5)

甚至還可以交換順序:

result = add_numbers(b=5, a=3)

不管順序如何,只要參數(shù)名寫(xiě)對(duì),就能準(zhǔn)確地把值賦給對(duì)應(yīng)的形參,是不是很方便?這在函數(shù)參數(shù)較多的時(shí)候特別有用,能讓你一眼就看明白每個(gè)參數(shù)的含義。

另外,位置參數(shù)和關(guān)鍵字參數(shù)還能混合使用,不過(guò)要記住一條規(guī)則:位置參數(shù)必須在關(guān)鍵字參數(shù)之前。比如:

def greet(name, message):
    print(f"{message}, {name}!")

greet("小明", message="你好") 

這樣寫(xiě)沒(méi)問(wèn)題,但要是寫(xiě)成 greet(message=“你好”, “小明”),Python 就會(huì)報(bào)錯(cuò),因?yàn)檫`反了位置參數(shù)在前的原則。

*args 本質(zhì)是個(gè)元組

*args 就像是一個(gè) “參數(shù)收集器”,它能夠把函數(shù)調(diào)用時(shí)多余的位置參數(shù)一股腦兒地收集起來(lái),然后打包成一個(gè)元組(tuple)。這里要注意哦,名字不一定非得是args,寫(xiě)成numbers、values 之類(lèi)的都沒(méi)問(wèn)題,關(guān)鍵是那個(gè)星號(hào),它就像是一個(gè) “魔法標(biāo)記”,告訴 Python:“嘿,我要收集多余的位置參數(shù)啦!”

咱們來(lái)看個(gè)例子,假如你要寫(xiě)一個(gè)函數(shù),計(jì)算任意多個(gè)數(shù)字的總和,你不確定用戶(hù)會(huì)輸入幾個(gè)數(shù)字,這時(shí)候 * args 就能大顯身手了:

def sum_numbers(*args):
    total = 0
    for number in args:
        total += number
    return total

在這個(gè)函數(shù)里,*args 就像一個(gè)口袋,不管你傳入多少個(gè)位置參數(shù),它都能接住,然后把這些參數(shù)變成一個(gè)元組。比如,咱們這樣調(diào)用這個(gè)函數(shù):

result = sum_numbers(1, 2, 3, 4, 5)
print(result)  

這里傳入的 1、2、3、4、5 就會(huì)被 * args 收集起來(lái),變成元組 (1, 2, 3, 4, 5),然后在函數(shù)內(nèi)部,通過(guò)循環(huán)遍歷這個(gè)元組,把每個(gè)數(shù)字相加,最終得到總和 15。

**kwargs 本質(zhì)是個(gè)字典

講完了*args,咱們?cè)賮?lái)看看另一位主角 ——**kwargs。它同樣有個(gè)神奇的 “魔法標(biāo)記”—— 兩個(gè)星號(hào)**,有了它,函數(shù)就能把調(diào)用時(shí)傳入的任意數(shù)量的關(guān)鍵字參數(shù)統(tǒng)統(tǒng)收集起來(lái),整理成一個(gè)字典(dict)。和 * args 一樣,名字不固定,寫(xiě)成 **params、**options 之類(lèi)的都行,關(guān)鍵是那兩個(gè)星號(hào)。

咱們來(lái)看個(gè)例子,假如你要寫(xiě)一個(gè)函數(shù),用來(lái)展示一個(gè)人的詳細(xì)信息,你不知道用戶(hù)會(huì)提供哪些具體信息,這時(shí)候 **kwargs 就能派上用場(chǎng)啦:

def show_person_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

在這個(gè)函數(shù)里,**kwargs 就像一個(gè)萬(wàn)能的信息收納盒,不管你傳入多少個(gè)關(guān)鍵字參數(shù),它都能接住,然后把這些參數(shù)變成一個(gè)字典。比如,咱們這樣調(diào)用這個(gè)函數(shù):

show_person_info(name="小明", age=20, city="北京")

這里傳入的 name=“小明”、age=20、city=“北京” 就會(huì)被 **kwargs 收集起來(lái),變成字典 {“name”: “小明”, “age”: 20, “city”: “北京”},然后在函數(shù)內(nèi)部,通過(guò)遍歷這個(gè)字典,把每個(gè)鍵值對(duì)都打印出來(lái),展示出這個(gè)人的詳細(xì)信息。

從函數(shù)定義的角度來(lái)看,**kwargs 也必須放在參數(shù)列表的最后面,這是為了讓 Python 解釋器能正確地識(shí)別參數(shù)。要是你把它放在前面,后面的參數(shù)就可能會(huì)被誤認(rèn)成關(guān)鍵字參數(shù),導(dǎo)致程序出錯(cuò)。

如何結(jié)合使用 * args 和 **kwargs

了解了 * args 和 **kwargs 各自的特點(diǎn),接下來(lái)咱們看看怎么把它們結(jié)合起來(lái)使用.

在實(shí)際編程中,有很多場(chǎng)景需要同時(shí)處理位置參數(shù)和關(guān)鍵字參數(shù),而且數(shù)量還不確定。比如說(shuō),你要寫(xiě)一個(gè)函數(shù)來(lái)記錄日志信息,日志可能包含一些固定的格式信息(類(lèi)似關(guān)鍵字參數(shù)),還可能有一些額外的描述信息(類(lèi)似位置參數(shù)),這時(shí)候 * args 和 **kwargs 就能完美配合。

咱們來(lái)看個(gè)例子:

def log_message(message_type, *args, **kwargs):
    print(f"[{message_type}]")
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

在這個(gè) log_message 函數(shù)中, message_type 是一個(gè)固定的位置參數(shù),用來(lái)指定日志的類(lèi)型,比如 “ERROR”、“INFO” 之類(lèi)的。而 *args 用來(lái)接收一些額外的描述信息,**kwargs 則用來(lái)接收一些帶有特定名稱(chēng)的詳細(xì)信息,像日志發(fā)生的時(shí)間、代碼行數(shù)等。

咱們這樣調(diào)用這個(gè)函數(shù):

log_message("INFO", "程序啟動(dòng)成功", time="2023-09-15 10:00:00", line_number=100)

這里,“程序啟動(dòng)成功” 會(huì)被args 收集,變成元組 (“程序啟動(dòng)成功”,),而 time=“2023-09-15 10:00:00” 和 line_number=100 會(huì)被**kwargs 收集,變成字典 {“time”: “2023-09-15 10:00:00”, “line_number”: 100}。函數(shù)內(nèi)部先打印日志類(lèi)型 “INFO”,接著遍歷*args 打印額外描述,再遍歷 **kwargs 打印詳細(xì)信息,輸出就會(huì)像這樣:

[INFO]
程序啟動(dòng)成功
time: 2023-09-15 10:00:00
line_number: 100

在裝飾器中使用 * args 和 **kwargs

聊完了 * args 和 **kwargs 的基本用法,咱再來(lái)看看它們?cè)谘b飾器里如何使用!

對(duì)于裝飾器不太熟悉的小伙伴,可以看一下Up上期的文章哦!

那*args 和 **kwargs 在裝飾器里起什么作用呢?想象一下,如果被裝飾的函數(shù)可能接收不定數(shù)量的參數(shù),就像咱們之前講的*args 和**kwargs 的用法,這時(shí)候裝飾器里的內(nèi)部函數(shù)就得用 *args 和**kwargs 來(lái)接收這些參數(shù),然后原封不動(dòng)地傳給原函數(shù),否則參數(shù)就傳遞不進(jìn)去,會(huì)導(dǎo)致報(bào)錯(cuò)。

咱們來(lái)看個(gè)例子,假設(shè)你要寫(xiě)一個(gè)裝飾器,用來(lái)記錄函數(shù)的執(zhí)行時(shí)間,不管這個(gè)函數(shù)接收幾個(gè)參數(shù),都能正常工作:

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 函數(shù)執(zhí)行時(shí)間: {end_time - start_time} 秒")
        return result
    return wrapper

@timeit
def add_numbers(*args):
    return sum(args)

@timeit
def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

在這個(gè)例子中, timeit 是裝飾器函數(shù),它的內(nèi)部函數(shù) wrapper 使用 * args 和 **kwargs 接收任意數(shù)量的參數(shù),然后把這些參數(shù)傳給原函數(shù) func,不管是 add_numbers 函數(shù)接收不定數(shù)量的位置參數(shù),還是 show_info 函數(shù)接收不定數(shù)量的關(guān)鍵字參數(shù),都能被 wrapper 函數(shù)正確接收并傳遞,同時(shí)還能記錄下函數(shù)的執(zhí)行時(shí)間。比如,咱們調(diào)用 add_numbers(1, 2, 3, 4, 5),會(huì)先記錄開(kāi)始時(shí)間,執(zhí)行 add_numbers 函數(shù)計(jì)算總和,再記錄結(jié)束時(shí)間,打印出函數(shù)執(zhí)行時(shí)間,最后返回總和;調(diào)用 show_info(name=“小明”, age=20) 也是類(lèi)似,先記錄時(shí)間,打印信息,再返回 None(因?yàn)?show_info 函數(shù)沒(méi)有返回值)。

要是裝飾器里的內(nèi)部函數(shù)不使用 * args 和 *kwargs,而是寫(xiě)死了固定的參數(shù),那這個(gè)裝飾器就只能用于特定參數(shù)數(shù)量和類(lèi)型的函數(shù),靈活性就大打折扣了。比如說(shuō),你把 wrapper 函數(shù)寫(xiě)成 def wrapper(a, b),那它就只能裝飾接收兩個(gè)位置參數(shù)的函數(shù),要是用來(lái)裝飾 add_numbers(args) 這種不定參數(shù)的函數(shù),就會(huì)報(bào)錯(cuò),提示參數(shù)數(shù)量不匹配。

所以說(shuō),args 和 **kwargs 在裝飾器里就像是兩座 “橋梁”,讓裝飾器能夠無(wú)縫對(duì)接各種不同參數(shù)的函數(shù),極大地拓展了裝飾器的應(yīng)用范圍,讓你的代碼復(fù)用性更強(qiáng),不管是簡(jiǎn)單的函數(shù)增強(qiáng),還是復(fù)雜的框架開(kāi)發(fā),都離不開(kāi)它們的身影,掌握了在裝飾器中使用args 和 **kwargs 的技巧,你就能在 Python 編程的世界里更加游刃有余啦!

總結(jié)

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

相關(guān)文章

  • python解析庫(kù)Beautiful?Soup安裝的詳細(xì)步驟

    python解析庫(kù)Beautiful?Soup安裝的詳細(xì)步驟

    Beautiful?Soup是python的一個(gè)庫(kù),最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python解析庫(kù)Beautiful?Soup安裝的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 在Django的模型和公用函數(shù)中使用惰性翻譯對(duì)象

    在Django的模型和公用函數(shù)中使用惰性翻譯對(duì)象

    這篇文章主要介紹了在Django的模型和公用函數(shù)中使用惰性翻譯對(duì)象,Django是豐富多彩的Python框架中人氣最高的一個(gè),需要的朋友可以參考下
    2015-07-07
  • Python實(shí)現(xiàn)讀取txt文件并轉(zhuǎn)換為excel的方法示例

    Python實(shí)現(xiàn)讀取txt文件并轉(zhuǎn)換為excel的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)讀取txt文件并轉(zhuǎn)換為excel的方法,涉及Python針對(duì)txt文件的讀取及Excel格式文件生成相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Python打印詳細(xì)報(bào)錯(cuò)日志logging問(wèn)題

    Python打印詳細(xì)報(bào)錯(cuò)日志logging問(wèn)題

    這篇文章主要介紹了Python打印詳細(xì)報(bào)錯(cuò)日志logging問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 如何將寫(xiě)好的.py/.java程序變成.exe文件詳解

    如何將寫(xiě)好的.py/.java程序變成.exe文件詳解

    有時(shí)候我們需要將自己寫(xiě)的代碼打包成exe文件,給別人使用需要怎么辦呢,下面這篇文章主要給大家介紹了關(guān)于如何將寫(xiě)好的.py/.java程序變成.exe文件的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python計(jì)算波峰波谷值的方法(極值點(diǎn))

    python計(jì)算波峰波谷值的方法(極值點(diǎn))

    這篇文章主要介紹了python求極值點(diǎn)(波峰波谷)求極值點(diǎn)主要用到了scipy庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    Python OpenCV基于霍夫圈變換算法檢測(cè)圖像中的圓形

    這篇文章主要介紹了通過(guò)霍夫圈變換算法檢測(cè)圖像中的圓形,文中用到的函數(shù)為cv2.HoughCircles(),該函數(shù)可以很好地檢測(cè)圓心。感興趣的小伙伴可以了解一下
    2021-12-12
  • python+pytest接口自動(dòng)化參數(shù)關(guān)聯(lián)

    python+pytest接口自動(dòng)化參數(shù)關(guān)聯(lián)

    這篇文章主要介紹了python+pytest接口自動(dòng)化參數(shù)關(guān)聯(lián),參數(shù)關(guān)聯(lián),也叫接口關(guān)聯(lián),即接口之間存在參數(shù)的聯(lián)系或依賴(lài),更多相關(guān)內(nèi)容需要的小伙伴可可以參考一下
    2022-06-06
  • Python 隨機(jī)生成測(cè)試數(shù)據(jù)的模塊:faker基本使用方法詳解

    Python 隨機(jī)生成測(cè)試數(shù)據(jù)的模塊:faker基本使用方法詳解

    這篇文章主要介紹了Python 隨機(jī)生成測(cè)試數(shù)據(jù)的模塊:faker基本使用方法,結(jié)合實(shí)例形式詳細(xì)分析了Python 隨機(jī)生成測(cè)試數(shù)據(jù)的模塊faker基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • 輕松掌握python的dataclass讓你的代碼更簡(jiǎn)潔優(yōu)雅

    輕松掌握python的dataclass讓你的代碼更簡(jiǎn)潔優(yōu)雅

    本文總結(jié)了幾個(gè)我在使用Python的dataclass時(shí)常用的技巧,dataclass裝飾器可以幫助我們簡(jiǎn)化數(shù)據(jù)類(lèi)的定義過(guò)程,包括設(shè)置默認(rèn)值、隱藏敏感信息、設(shè)置只讀對(duì)象以及將其轉(zhuǎn)化為元組和字典,通過(guò)使用dataclass,我們可以更高效地進(jìn)行數(shù)據(jù)分析和處理,感興趣的朋友跟隨小編一起看看吧
    2025-01-01

最新評(píng)論