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

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

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

今天,咱就來聊聊 Python 函數(shù)參數(shù)中的兩個 “魔法參數(shù)”——*args 和 **kwargs,它們能讓你的函數(shù)變得超級靈活,輕松應對各種復雜情況。不過對于新接觸Python的同學來說是一個不好理解的概念,Up第一次接觸也覺得過于靈活而不好理解。今天,Up嘗試用通俗易懂的語言來說清楚。

提前劃重點

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

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

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

位置參數(shù),顧名思義,就是在調用函數(shù)時,按照參數(shù)的順序依次傳遞給函數(shù)的參數(shù),實參的位置和形參的位置要一一對應,就像排隊領東西,先來的先領,順序不能亂。比如說,咱們定義一個計算兩數(shù)之和的函數(shù):

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

這里的 a 和 b 就是位置參數(shù),當我們調用這個函數(shù)時,就得按照順序傳入兩個數(shù):

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

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

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

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

甚至還可以交換順序:

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

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

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

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

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

這樣寫沒問題,但要是寫成 greet(message=“你好”, “小明”),Python 就會報錯,因為違反了位置參數(shù)在前的原則。

*args 本質是個元組

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

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

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

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

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

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

**kwargs 本質是個字典

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

咱們來看個例子,假如你要寫一個函數(shù),用來展示一個人的詳細信息,你不知道用戶會提供哪些具體信息,這時候 **kwargs 就能派上用場啦:

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

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

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

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

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

如何結合使用 * args 和 **kwargs

了解了 * args 和 **kwargs 各自的特點,接下來咱們看看怎么把它們結合起來使用.

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

咱們來看個例子:

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}")

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

咱們這樣調用這個函數(shù):

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

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

[INFO]
程序啟動成功
time: 2023-09-15 10:00:00
line_number: 100

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

聊完了 * args 和 **kwargs 的基本用法,咱再來看看它們在裝飾器里如何使用!

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

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

咱們來看個例子,假設你要寫一個裝飾器,用來記錄函數(shù)的執(zhí)行時間,不管這個函數(shù)接收幾個參數(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í)行時間: {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}")

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

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

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

總結

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

相關文章

  • Python3.4實現(xiàn)遠程控制電腦開關機

    Python3.4實現(xiàn)遠程控制電腦開關機

    這篇文章主要為大家詳細介紹了Python3.4實現(xiàn)遠程控制電腦開關機的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • PHPMyAdmin及權限配置

    PHPMyAdmin及權限配置

    這篇文章主要介紹了PHPMyAdmin及權限配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2014-08-08
  • Python安裝pygit2失敗問題及解決

    Python安裝pygit2失敗問題及解決

    這篇文章主要介紹了Python安裝pygit2失敗問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • python文件讀取失敗怎么處理

    python文件讀取失敗怎么處理

    在本篇文章里小編給大家分享的是關于python文件讀取失敗怎么處理的相關文章,需要的朋友們參考下。
    2020-06-06
  • Python使用代理抓取網(wǎng)站圖片(多線程)

    Python使用代理抓取網(wǎng)站圖片(多線程)

    Python作為一門功能強大的腳本語言,經(jīng)常被用來寫爬蟲程序,下面是使用Python通過代理進行多線程抓取圖片,算是一個簡易的python多線程爬蟲
    2014-03-03
  • Python第三方常用模塊openpyxl的簡單介紹

    Python第三方常用模塊openpyxl的簡單介紹

    openpyxl模塊是一個讀寫Excel?2010文檔的Python庫,如果要處理更早格式的Excel文檔,需要用到額外的庫,openpyxl是一個比較綜合的工具,能夠同時讀取和修改Excel文檔,下面這篇文章主要給大家介紹了關于Python第三方常用模塊openpyxl的相關資料,需要的朋友可以參考下
    2022-08-08
  • Python優(yōu)化算法之遺傳算法案例代碼

    Python優(yōu)化算法之遺傳算法案例代碼

    優(yōu)化算法,尤其是啟發(fā)式的仿生智能算法在最近很火,它適用于解決管理學,運籌學,統(tǒng)計學里面的一些優(yōu)化問題,這篇文章主要介紹了Python優(yōu)化算法—遺傳算法,需要的朋友可以參考下
    2023-02-02
  • Python?CNN卷積神經(jīng)網(wǎng)絡實戰(zhàn)教程深入講解

    Python?CNN卷積神經(jīng)網(wǎng)絡實戰(zhàn)教程深入講解

    CNN,即卷積神經(jīng)網(wǎng)絡,主要用于圖像識別,分類。由輸入層,卷積層,池化層,全連接層(Affline層),Softmax層疊加而成。卷積神經(jīng)網(wǎng)絡中還有一個非常重要的結構:過濾器,它作用于層與層之間(卷積層與池化層),決定了怎樣對數(shù)據(jù)進行卷積和池化
    2022-12-12
  • python中的字典詳細介紹

    python中的字典詳細介紹

    這篇文章主要介紹了python中的字典詳細介紹,字典是Python中最強大的數(shù)據(jù)類型之一,本文講解了什么是字典、創(chuàng)建字典和給字典賦值 、字典的基本操作、映射類型操作符、映射相關的函數(shù)、字典的方法等內容,需要的朋友可以參考下
    2014-09-09
  • Python實現(xiàn)農(nóng)歷轉換教程詳解

    Python實現(xiàn)農(nóng)歷轉換教程詳解

    農(nóng)歷,是我國現(xiàn)行的傳統(tǒng)歷法。它是根據(jù)月相的變化周期,每一次月相朔望變化為一個月,參考太陽回歸年為一年的長度,并加入二十四節(jié)氣與設置閏月以使平均歷年與回歸年相適應。本文將用Python實現(xiàn)農(nóng)歷轉換,需要的可以參考一下
    2022-03-03

最新評論

邢台县| 江达县| 田东县| 青海省| 汝城县| 开鲁县| 三河市| 庐江县| 永城市| 古丈县| 宁乡县| 如皋市| 安达市| 乐亭县| 措勤县| 洛川县| 时尚| 股票| 湘潭县| 墨江| 万载县| 涞源县| 崇阳县| 前郭尔| 曲靖市| 成武县| 大荔县| 农安县| 宁河县| 祁阳县| 麦盖提县| 若羌县| 新民市| 哈密市| 黄冈市| 六盘水市| 荔波县| 贡觉县| 秦安县| 伊川县| 仁寿县|