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

Python中魔法參數(shù)?*args?和?**kwargs使用詳細(xì)講解

 更新時(shí)間:2024年12月07日 09:42:19   作者:DATA無(wú)界  
這篇文章主要介紹了Python中魔法參數(shù)?*args?和?**kwargs使用的相關(guān)資料,*args和**kwargs是Python中實(shí)現(xiàn)函數(shù)參數(shù)可變性的重要工具,分別用于接受任意數(shù)量的位置參數(shù)和關(guān)鍵字參數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

在Python編程中,函數(shù)的靈活性是其強(qiáng)大之處之一。其中,*args 和 **kwargs 是實(shí)現(xiàn)函數(shù)參數(shù)可變性的重要工具。

無(wú)論我們是Python初學(xué)者還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,充分理解這兩個(gè)概念都有助于編寫(xiě)更加靈活、高效的代碼。

本文將深入探討*args和**kwargs的用法、原理和應(yīng)用場(chǎng)景,以全面掌握它們。

一、初識(shí) *args 和 **kwargs

*args 和 **kwargs 都是python中的可變參數(shù)。

*args可以用來(lái)表示任何多個(gè)無(wú)名參數(shù),本質(zhì)上是元組類(lèi)型。

**kwargs可以用來(lái)表示關(guān)鍵字參數(shù),本質(zhì)上是字典類(lèi)型。

1. 什么是 *args?

*args 允許函數(shù)接受任意數(shù)量的位置參數(shù),這些參數(shù)會(huì)以元組的形式傳入函數(shù)內(nèi)部。

args是“arguments”(參數(shù))的縮寫(xiě),但名稱(chēng)并非固定,關(guān)鍵在于星號(hào)*。

示例:

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

print(sum_numbers(1, 2, 3))  # 輸出:6

2. 什么是 **kwargs?

**kwargs 允許函數(shù)接受任意數(shù)量的關(guān)鍵字參數(shù),這些參數(shù)會(huì)以字典的形式傳入函數(shù)內(nèi)部。

kwargs是“keyword arguments”(關(guān)鍵字參數(shù))的縮寫(xiě),同樣,名稱(chēng)不固定,關(guān)鍵在于雙星號(hào)**。

示例:

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

greet(name='Alice', age=30)
# 輸出:
# name = Alice
# age = 30

二、深入理解 *args

1. 使用場(chǎng)景

參數(shù)數(shù)量未知:當(dāng)您定義的函數(shù)需要接受不定數(shù)量的位置參數(shù)時(shí),*args非常有用。

函數(shù)包裝器:在編寫(xiě)裝飾器或高階函數(shù)時(shí),需要傳遞參數(shù)給被裝飾函數(shù)。

2. 工作原理

當(dāng)函數(shù)定義中包含*args時(shí),傳入的所有位置參數(shù)都會(huì)被收集到一個(gè)元組中,您可以像處理元組一樣處理args。

示例:

def display_args(first_arg, *args):
    print("第一個(gè)參數(shù):", first_arg)
    print("其他參數(shù):", args)

display_args(10, 20, 30, 40)
# 輸出:
# 第一個(gè)參數(shù): 10
# 其他參數(shù): (20, 30, 40)

3. 注意事項(xiàng)

*args必須放在函數(shù)定義參數(shù)列表的最后,除非還有**kwargs。

在調(diào)用函數(shù)時(shí),不能使用關(guān)鍵字參數(shù)傳遞給*args。

三、深入理解 **kwargs

1. 使用場(chǎng)景

參數(shù)名未知:當(dāng)函數(shù)需要接受任意數(shù)量的關(guān)鍵字參數(shù),且參數(shù)名在定義時(shí)未知。

配置參數(shù):處理配置項(xiàng)或可選參數(shù)。

2. 工作原理

函數(shù)定義中包含**kwargs時(shí),所有的關(guān)鍵字參數(shù)都會(huì)被收集到一個(gè)字典中,您可以像處理字典一樣處理kwargs。

示例:

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

display_kwargs(name='祖沖之', age=25, country='China')
# 輸出:
# name : 祖沖之
# age : 25
# country : China

3. 注意事項(xiàng)

**kwargs必須放在函數(shù)定義參數(shù)列表的最后。

在函數(shù)調(diào)用時(shí),關(guān)鍵字參數(shù)的名稱(chēng)必須是有效的Python標(biāo)識(shí)符。

四、同時(shí)使用 *args 和 **kwargs

1. 函數(shù)定義順序

在函數(shù)定義中,參數(shù)的順序必須為:

  • 位置參數(shù)(必需參數(shù))

  • 默認(rèn)參數(shù)(可選參數(shù))

  • *args(可變位置參數(shù))

  • **kwargs(可變關(guān)鍵字參數(shù))

示例:

def func(a, b=2, *args, **kwargs):
    print("a =", a)
    print("b =", b)
    print("args =", args)
    print("kwargs =", kwargs)

func(1, 3, 5, 7, x=10, y=20)
# 輸出:
# a = 1
# b = 3
# args = (5, 7)
# kwargs = {'x': 10, 'y': 20}

2. 應(yīng)用場(chǎng)景

最大化函數(shù)的靈活性:允許函數(shù)接受任意類(lèi)型和數(shù)量的參數(shù)。

編寫(xiě)通用代碼:如裝飾器、日志記錄器等,需要處理不同的函數(shù)簽名。

五、參數(shù)解包與傳遞

1. 位置參數(shù)的解包(*)

將序列(如列表、元組)中的元素解包為單獨(dú)的參數(shù)傳遞給函數(shù)。

示例:

def add(a, b, c):
    return a + b + c

numbers = [1, 2, 3]
result = add(*numbers)  # 等價(jià)于 add(1, 2, 3)
print(result)  # 輸出:6

2. 關(guān)鍵字參數(shù)的解包(**)

將字典中的鍵值對(duì)解包為關(guān)鍵字參數(shù)傳遞給函數(shù)。

示例:

def introduce(name, age, country):
    print(f"我叫{name},今年{age}歲,來(lái)自{country}。")

info = {'name': 'Charlie', 'age': 28, 'country': 'China'}
introduce(**info)
# 輸出:我叫Charlie,今年28歲,來(lái)自China。

3. 同時(shí)解包

示例:

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

args = (1, 2)
kwargs = {'c': 3, 'd': 4}
func(*args, **kwargs)
# 輸出:1 2 3 4

六、在裝飾器中的應(yīng)用

1. 為什么在裝飾器中使用?

裝飾器需要能夠裝飾任意函數(shù),無(wú)論其參數(shù)如何定義。

使用*args和**kwargs,可以編寫(xiě)一個(gè)通用的裝飾器,適用于所有函數(shù)。

2. 編寫(xiě)通用裝飾器

示例:

def logger(fn):
    def wrapper(*args, **kwargs):
        print(f"正在調(diào)用函數(shù) {fn.__name__},參數(shù):args={args}, kwargs={kwargs}")
        result = fn(*args, **kwargs)
        print(f"函數(shù) {fn.__name__} 調(diào)用完畢,返回值:{result}")
        return result
    return wrapper

@logger
def multiply(a, b):
    return a * b

@logger
def greet(name, message='Hello'):
    return f"{message}, {name}!"

multiply(3, 4)
# 輸出:
# 正在調(diào)用函數(shù) multiply,參數(shù):args=(3, 4), kwargs={}
# 函數(shù) multiply 調(diào)用完畢,返回值:12

greet(name='Alice')
# 輸出:
# 正在調(diào)用函數(shù) greet,參數(shù):args=(), kwargs={'name': 'Alice'}
# 函數(shù) greet 調(diào)用完畢,返回值:Hello, Alice!

3. 深入理解

*args和**kwargs的傳遞:裝飾器內(nèi)部的wrapper函數(shù)接受*args和**kwargs,并將其傳遞給被裝飾的函數(shù)fn。

保持函數(shù)簽名:這樣,裝飾器不會(huì)改變?cè)瘮?shù)的參數(shù)要求。

七、實(shí)際應(yīng)用案例

1. 參數(shù)校驗(yàn)

使用*args和**kwargs,可以編寫(xiě)裝飾器來(lái)檢查參數(shù)的類(lèi)型或值。

示例:

def type_check(fn):
    def wrapper(*args, **kwargs):
        for arg in args:
            if not isinstance(arg, int):
                raise TypeError("所有參數(shù)必須是整數(shù)")
        return fn(*args, **kwargs)
    return wrapper

@type_check
def add_integers(*args):
    return sum(args)

print(add_integers(1, 2, 3))  # 輸出:6
# add_integers(1, '2', 3)  # 拋出 TypeError: 所有參數(shù)必須是整數(shù)

2. 緩存函數(shù)結(jié)果(Memoization)

示例:

def memoize(fn):
    cache = {}
    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = fn(*args)
        cache[args] = result
        return result
    return wrapper

@memoize
def fibonacci(n):
    if n <= 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 輸出:55

3. 統(tǒng)一接口的API設(shè)計(jì)

設(shè)計(jì)可接受各種參數(shù)的API,提高靈活性。

示例:

def api_request(endpoint, *args, **kwargs):
    url = f"https://api.example.com/{endpoint}"
    print(f"請(qǐng)求URL:{url}")
    print(f"位置參數(shù):{args}")
    print(f"關(guān)鍵字參數(shù):{kwargs}")
    # 這里可以添加實(shí)際的請(qǐng)求邏輯

api_request('get-data', 1, 2, key='value', token='abcd1234')
# 輸出:
# 請(qǐng)求URL:https://api.example.com/get-data
# 位置參數(shù):(1, 2)
# 關(guān)鍵字參數(shù):{'key': 'value', 'token': 'abcd1234'}

八、總結(jié)

靈活性: *args和**kwargs使函數(shù)能夠接受可變數(shù)量和類(lèi)型的參數(shù),增加了函數(shù)的靈活性。

代碼復(fù)用: 在裝飾器和高階函數(shù)中使用,能編寫(xiě)更加通用的代碼。

注意事項(xiàng): 使用時(shí)要注意參數(shù)的順序和解包的正確性,避免參數(shù)沖突。

通過(guò)深入理解和靈活運(yùn)用*args和**kwargs,我們可以編寫(xiě)出更加高效、靈活的Python代碼。

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

相關(guān)文章

  • Python?pytorch實(shí)現(xiàn)繪制一維熱力圖

    Python?pytorch實(shí)現(xiàn)繪制一維熱力圖

    熱力圖是非常特殊的一種圖,可以顯示不可點(diǎn)擊區(qū)域發(fā)生的事情,這篇文章主要為大家介紹了如何利用pytorch實(shí)現(xiàn)繪制一維熱力圖,感興趣的可以了解一下
    2023-05-05
  • Python Unittest原理及基本使用方法

    Python Unittest原理及基本使用方法

    這篇文章主要介紹了Python Unittest原理及基本使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python中sys模塊常用方法與變量實(shí)例探究

    Python中sys模塊常用方法與變量實(shí)例探究

    sys?模塊是 Python 標(biāo)準(zhǔn)庫(kù)中的一個(gè)核心模塊,提供了與解釋器進(jìn)行交互的功能,了解?sys?模塊的方法和變量對(duì)于更有效地管理和調(diào)試 Python 程序至關(guān)重要,本文將深入探討?sys?模塊的常用方法和變量,通過(guò)詳細(xì)的示例代碼,幫助大家更全面地了解并靈活運(yùn)用這一關(guān)鍵模塊
    2024-01-01
  • Python雙版本計(jì)算器詳解

    Python雙版本計(jì)算器詳解

    這篇文章主要介紹了如何用Python制作計(jì)算器,文章中有兩個(gè)版本,代碼詳細(xì),適合絕大部分朋友,如果你對(duì)python如何制作計(jì)算器有興趣,可以參考下這篇文章
    2021-04-04
  • Pycharm如何添加源與添加庫(kù)

    Pycharm如何添加源與添加庫(kù)

    這篇文章主要介紹了Pycharm如何添加源與添加庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python利用Matplotlib繪圖無(wú)法顯示中文字體的兩種解決方案

    Python利用Matplotlib繪圖無(wú)法顯示中文字體的兩種解決方案

    matplotlib 是python最著名的繪圖庫(kù),它提供了一整套和matlab相似的命令A(yù)PI,這篇文章主要給大家介紹了關(guān)于Python利用Matplotlib繪圖無(wú)法顯示中文字體的兩種解決方案,需要的朋友可以參考下
    2024-03-03
  • Python學(xué)習(xí)之pip包管理工具的使用

    Python學(xué)習(xí)之pip包管理工具的使用

    學(xué)習(xí)?Python?的過(guò)程中,經(jīng)常會(huì)使用?pip?命令去安裝第三方模塊。pip?是?Python?默認(rèn)集成的包管理工具,而其本質(zhì)就是?Python?標(biāo)準(zhǔn)庫(kù)中的一個(gè)包,只是比較特殊一些。本文就來(lái)為你你全面揭示一下?pip?包管理工具的使用
    2022-08-08
  • Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法

    Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法

    這篇文章主要介紹了Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法,本文在命令行中獲取操作系統(tǒng)信息,介紹了platform模塊的使用,需要的朋友可以參考下
    2015-04-04
  • 利用python對(duì)mysql表做全局模糊搜索并分頁(yè)實(shí)例

    利用python對(duì)mysql表做全局模糊搜索并分頁(yè)實(shí)例

    這篇文章主要介紹了利用python對(duì)mysql表做全局模糊搜索并分頁(yè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 在django中,關(guān)于session的通用設(shè)置方法

    在django中,關(guān)于session的通用設(shè)置方法

    今天小編就為大家分享一篇在django中,關(guān)于session的通用設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論