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

Python函數(shù)參數(shù)*args和**kwargs的區(qū)別與使用指南

 更新時間:2025年07月18日 08:40:19   作者:北辰alk  
在Python函數(shù)定義中,args和kwargs是兩個非常重要的參數(shù)收集機制,它們?yōu)楹瘮?shù)提供了極大的靈活性,本文將全面解析它們的區(qū)別、工作原理以及實際應(yīng)用場景,需要的朋友可以參考下

一、基本概念與區(qū)別概述

1.1 *args(非關(guān)鍵字參數(shù)收集)

  • 用于收集任意數(shù)量的位置參數(shù)
  • 將傳入的位置參數(shù)打包成元組(tuple)
  • 名稱不一定是args,但約定俗成使用args*才是關(guān)鍵)

1.2 **kwargs(關(guān)鍵字參數(shù)收集)

  • 用于收集任意數(shù)量的關(guān)鍵字參數(shù)
  • 將傳入的關(guān)鍵字參數(shù)打包成字典(dict)
  • 名稱不一定是kwargs,但約定俗成使用kwargs**才是關(guān)鍵)

1.3 主要區(qū)別對比表

特性*args**kwargs
參數(shù)類型收集位置參數(shù)收集關(guān)鍵字參數(shù)
數(shù)據(jù)結(jié)構(gòu)打包為元組打包為字典
符號單星號*雙星號**
參數(shù)順序必須出現(xiàn)在關(guān)鍵字參數(shù)之前必須出現(xiàn)在*args之后
典型用途處理可變數(shù)量的位置參數(shù)處理可變數(shù)量的關(guān)鍵字參數(shù)
解包操作可用于解包序列可用于解包字典

二、深入理解*args

2.1 基本用法

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

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

2.2 工作原理

當函數(shù)被調(diào)用時:

  1. 所有未匹配的位置參數(shù)會被收集
  2. 這些參數(shù)被打包成一個元組
  3. 這個元組被賦值給args(或你指定的參數(shù)名)

2.3 與其他參數(shù)配合使用

*args必須出現(xiàn)在位置參數(shù)之后,關(guān)鍵字參數(shù)之前:

def func(a, b, *args, option=True):
    print(f"a: {a}, b: , args: {args}, option: {option}")

func(1, 2, 3, 4, 5, option=False)
# 輸出: a: 1, b: 2, args: (3, 4, 5), option: False

2.4 解包序列作為參數(shù)

*也可用于調(diào)用時解包序列:

numbers = [1, 2, 3, 4]
print(sum_numbers(*numbers))  # 輸出: 10

三、深入理解**kwargs

3.1 基本用法

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

print_info(name="Alice", age=30, city="New York")
# 輸出:
# name: Alice
# age: 30
# city: New York

3.2 工作原理

當函數(shù)被調(diào)用時:

  1. 所有未匹配的關(guān)鍵字參數(shù)會被收集
  2. 這些參數(shù)被打包成一個字典
  3. 這個字典被賦值給kwargs(或你指定的參數(shù)名)

3.3 與其他參數(shù)配合使用

**kwargs必須出現(xiàn)在所有參數(shù)之后:

def func(a, b, *args, option=True, **kwargs):
    print(f"a: {a}, b: , args: {args}, option: {option}, kwargs: {kwargs}")

func(1, 2, 3, 4, 5, option=False, name="Alice", age=30)
# 輸出: a: 1, b: 2, args: (3, 4, 5), option: False, kwargs: {'name': 'Alice', 'age': 30}

3.4 解包字典作為參數(shù)

**也可用于調(diào)用時解包字典:

info = {"name": "Bob", "age": 25, "job": "Developer"}
print_info(**info)
# 輸出:
# name: Bob
# age: 25
# job: Developer

四、組合使用*args和**kwargs

4.1 完整參數(shù)順序規(guī)則

Python函數(shù)的參數(shù)順序必須遵循以下規(guī)則:

  1. 標準位置參數(shù)
  2. *args(收集剩余位置參數(shù))
  3. 關(guān)鍵字參數(shù)(有默認值的參數(shù))
  4. **kwargs(收集剩余關(guān)鍵字參數(shù))
def func(a, b, *args, c=10, d=20, **kwargs):
    pass

4.2 實際示例

def process_data(name, *scores, report=False, **metadata):
    print(f"Student: {name}")
    print(f"Scores: {scores}")
    print(f"Report: {'Yes' if report else 'No'}")
    print("Metadata:")
    for k, v in metadata.items():
        print(f"  {k}: {v}")

process_data("Alice", 85, 90, 78, report=True, 
            school="Harvard", year=2023, major="CS")
# 輸出:
# Student: Alice
# Scores: (85, 90, 78)
# Report: Yes
# Metadata:
#   school: Harvard
#   year: 2023
#   major: CS

五、高級應(yīng)用場景

5.1 裝飾器中的參數(shù)傳遞

def debug(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@debug
def add(a, b):
    return a + b

add(3, 5)
# 輸出:
# Calling add with args: (3, 5), kwargs: {}
# add returned: 8

5.2 子類化與super()調(diào)用

class Parent:
    def __init__(self, name, *args, **kwargs):
        self.name = name
        print(f"Parent args: {args}, kwargs: {kwargs}")

class Child(Parent):
    def __init__(self, age, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.age = age

child = Child(10, "Alice", school="Harvard")
# 輸出: Parent args: (), kwargs: {'school': 'Harvard'}

5.3 函數(shù)包裝與轉(zhuǎn)發(fā)

def call_with_log(func):
    def wrapped(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapped

@call_with_log
def complex_operation(x, y, option=False):
    return x * y if option else x + y

complex_operation(3, 4, option=True)
# 輸出:
# Calling complex_operation
# 返回: 12

六、常見問題與陷阱

6.1 參數(shù)順序錯誤

# 錯誤示例
def wrong_func(**kwargs, *args):
    pass
# SyntaxError: invalid syntax

6.2 重復參數(shù)名

def func(a, *args, a=10):  # 錯誤: a重復
    pass
# SyntaxError: duplicate argument 'a' in function definition

6.3 解包時的鍵沖突

def func(a, b, **kwargs):
    print(a, b, kwargs)

params = {'a': 1, 'b': 2, 'c': 3}
func(**params)  # 正常工作
# 輸出: 1 2 {'c': 3}

params = {'a': 1, 'b': 2, 'a': 100}  # 重復鍵
func(**params)  # 會使用最后的值
# 輸出: 100 2 {}

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

7.1 數(shù)據(jù)庫查詢構(gòu)建器

def build_query(table, *conditions, **filters):
    query = f"SELECT * FROM {table}"
    if conditions:
        query += " WHERE " + " AND ".join(conditions)
    if filters:
        if not conditions:
            query += " WHERE "
        else:
            query += " AND "
        query += " AND ".join(f"{k} = {v!r}" for k, v in filters.items())
    return query

print(build_query("users", "age > 18", "status = 'active'", country="USA"))
# 輸出: SELECT * FROM users WHERE age > 18 AND status = 'active' AND country = 'USA'

7.2 配置合并工具

def merge_configs(*configs, **overrides):
    result = {}
    for config in configs:
        result.update(config)
    result.update(overrides)
    return result

default = {'color': 'red', 'size': 10}
user = {'size': 12, 'opacity': 0.8}
final = merge_configs(default, user, color='blue', speed='fast')
print(final)
# 輸出: {'color': 'blue', 'size': 12, 'opacity': 0.8, 'speed': 'fast'}

7.3 數(shù)學計算函數(shù)

def calculate(operation, *numbers, round_result=False, **options):
    if operation == 'sum':
        result = sum(numbers)
    elif operation == 'product':
        result = 1
        for n in numbers:
            result *= n
    elif operation == 'average':
        result = sum(numbers) / len(numbers) if numbers else 0
    else:
        raise ValueError("Unknown operation")
    
    if round_result:
        decimals = options.get('decimals', 2)
        result = round(result, decimals)
    return result

print(calculate('average', 1, 2, 3, 4, round_result=True))
# 輸出: 2.5
print(calculate('product', 2, 3, 4, round_result=True, decimals=1))
# 輸出: 24.0

八、總結(jié)與最佳實踐

8.1 何時使用*args

  • 函數(shù)需要接受任意數(shù)量的位置參數(shù)時
  • 包裝或轉(zhuǎn)發(fā)函數(shù)調(diào)用時
  • 實現(xiàn)可變參數(shù)的數(shù)學運算函數(shù)時
  • 創(chuàng)建裝飾器時

8.2 何時使用**kwargs

  • 函數(shù)需要接受任意數(shù)量的關(guān)鍵字參數(shù)時
  • 實現(xiàn)配置選項或參數(shù)傳遞時
  • 創(chuàng)建靈活的API或DSL時
  • 子類化需要傳遞額外參數(shù)給父類時

8.3 最佳實踐建議

  1. 遵循參數(shù)順序規(guī)則:位置參數(shù) → *args → 關(guān)鍵字參數(shù) → **kwargs
  2. 使用描述性的參數(shù)名而不僅僅是args/kwargs(如*paths, **options
  3. 在文檔字符串中清楚地記錄接受的參數(shù)
  4. 考慮使用類型注解提高代碼可讀性:
def func(*args: int, **kwargs: str) -> float:
    pass
  1. 避免過度使用,當參數(shù)結(jié)構(gòu)明確時,使用顯式參數(shù)更好

*args**kwargs是Python靈活參數(shù)處理機制的核心,合理使用它們可以寫出更通用、更靈活的代碼,但同時也要注意不要濫用,以保持代碼的可讀性和可維護性。

以上就是Python函數(shù)參數(shù)*args和**kwargs區(qū)別與使用指南的詳細內(nèi)容,更多關(guān)于Python args和kwargs區(qū)別與使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python的變量與賦值詳細分析

    python的變量與賦值詳細分析

    這篇文章主要介紹了python的變量與賦值詳細分析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 使用Python在PDF中繪制多種圖形的操作示例

    使用Python在PDF中繪制多種圖形的操作示例

    在進行PDF自動化處理時,人們往往首先想到的是文本生成、圖片嵌入或表格繪制等常規(guī)需求,然而在許多實際業(yè)務(wù)場景中,能夠在PDF中靈活繪制圖形同樣至關(guān)重要,本文將基于免費的Free?Spire.PDF?for?Python,一步步示范如何在同一頁PDF中繪制多種常見圖形,需要的朋友可以參考下
    2025-11-11
  • pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    這篇文章主要介紹了pandas將多個dataframe以多個sheet的形式保存到一個excel文件中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 使用Python處理PDF文件的實踐分享

    使用Python處理PDF文件的實踐分享

    在現(xiàn)代數(shù)字化時代,PDF(Portable?Document?Format)文件已經(jīng)成為廣泛使用的電子文檔格式,這篇文章主要為分享了Python處理PDF文件的簡介與實踐,需要的可以參考下
    2023-06-06
  • 如何解決Visdom全藍,不顯示內(nèi)容問題

    如何解決Visdom全藍,不顯示內(nèi)容問題

    這篇文章主要介紹了如何解決Visdom全藍,不顯示內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Pandas實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧匯總

    Pandas實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧匯總

    這篇文章主要給大家匯總介紹了關(guān)于Pandas實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的一些小技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • 如何驗證python安裝成功

    如何驗證python安裝成功

    在本篇文章中小編給大家整理的是關(guān)于python安裝成功檢驗方法,需要的朋友們可以參考下。
    2020-07-07
  • Python Pandas讀寫txt和csv文件的方法詳解

    Python Pandas讀寫txt和csv文件的方法詳解

    這篇文章主要為大家詳細介紹了Python Pandas實現(xiàn)讀寫txt和csv文件查找的方法,文中的示例代碼積極性,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • 基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換

    基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換

    這篇文章主要介紹了基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • python數(shù)組排序方法之sort、sorted和argsort詳解

    python數(shù)組排序方法之sort、sorted和argsort詳解

    這篇文章主要給大家介紹了關(guān)于python數(shù)組排序方法之sort、sorted和argsort的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03

最新評論

梁河县| 景洪市| 高州市| 通榆县| 东阿县| 安乡县| 井研县| 桃源县| 奉贤区| 元谋县| 乌什县| 永康市| 洛浦县| 故城县| 翁源县| 神农架林区| 攀枝花市| 诸暨市| 兖州市| 内黄县| 乌拉特后旗| 巴楚县| 五指山市| 葫芦岛市| 阿鲁科尔沁旗| 桐梓县| 江永县| 双鸭山市| 甘南县| 通化市| 西青区| 蕉岭县| 沾益县| 高尔夫| 郴州市| 武强县| 彰化市| 常山县| 巴林左旗| 宁乡县| 唐河县|