找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1745

积分

0

好友

235

主题
发表于 17 小时前 | 查看: 3| 回复: 0

在编写Python函数时,你是否遇到过需要处理不确定数量参数的情况?这正是 *args**kwargs 大显身手的地方。作为Python中一项强大且常用的特性,理解它们能显著提升你编写灵活、通用代码的能力。

一、核心概念与用法

简单来讲,*args 用于接收任意数量的位置参数**kwargs 用于接收任意数量的关键字参数。它们本质上是一种语法约定(名字可以改,但 *** 是核心),目的是让函数能处理不确定数量的参数。

1. *args:可变位置参数

  • 作用:将传入的多个位置参数打包成一个元组 (tuple),函数内部可以像操作元组一样使用 args
  • 示例代码
    
    def print_args(*args):
    # 打印args的类型(是元组)
    print("args的类型:", type(args))
    # 遍历输出所有位置参数
    for index, value in enumerate(args):
        print(f"第{index+1}个位置参数: {value}")

调用函数,传入任意数量的位置参数

print_args(10, "Python", [1,2,3], True)
print_args("单独一个参数")  # 也可以只传1个,甚至不传

*   **输出结果**:

args的类型: <class 'tuple'>
第1个位置参数: 10
第2个位置参数: Python
第3个位置参数: [1,2,3]
第4个位置参数: True
args的类型: <class 'tuple'>
第1个位置参数: 单独一个参数


### 2. `**kwargs`:可变关键字参数
*   **作用**:将传入的多个关键字参数打包成一个**字典 (dict)**,函数内部可以像操作字典一样使用 `kwargs`。
```python
def print_kwargs(**kwargs):
    # 打印kwargs的类型(是字典)
    print("kwargs的类型:", type(kwargs))
    # 遍历输出所有关键字参数(键值对)
    for key, value in kwargs.items():
        print(f"关键字参数 {key} = {value}")

# 调用函数,传入任意数量的关键字参数
print_kwargs(name="小明", age=18, city="北京")
print_kwargs(subject="数学", score=95)  # 不同的关键字参数也可以
  • 输出结果
    kwargs的类型: <class 'dict'>
    关键字参数 name = 小明
    关键字参数 age = 18
    关键字参数 city = 北京
    kwargs的类型: <class 'dict'>
    关键字参数 subject = 数学
    关键字参数 score = 95

3. 结合使用(顺序很重要)

当函数同时有普通参数、*args**kwargs 时,必须按以下顺序定义普通参数 → *args → **kwargs

def mix_params(name, *args, **kwargs):
    print(f"固定参数: {name}")
    print("位置参数列表:", args)
    print("关键字参数字典:", kwargs)

# 调用示例
mix_params("小红", 18, 170, city="上海", hobby="读书")
  • 输出结果
    固定参数: 小红
    位置参数列表: (18, 170)
    关键字参数字典: {'city': '上海', 'hobby': '读书'}

二、实际应用场景

  1. 函数扩展:比如封装一个通用的打印或日志记录函数,支持传入任意数量和类型的参数。
  2. 装饰器:装饰器需要适配被装饰函数的各种参数形式,*args**kwargs 是必备工具,可以确保参数被正确传递。
  3. 调用其他函数:在需要将参数动态传递给另一个函数时,可以用 *args 解包位置参数元组,用 **kwargs 解包关键字参数字典,这非常灵活。
    
    def add(a, b):
    return a + b

用*args解包元组作为位置参数

params = (3, 5)
print(add(*params))  # 输出 8

用**kwargs解包字典作为关键字参数

kwargs = {"a": 4, "b": 6}
print(add(**kwargs))  # 输出 10



## 总结
1.  `*args` 接收**任意数量的位置参数**,打包成元组;`**kwargs` 接收**任意数量的关键字参数**,打包成字典。
2.  `*args`、`**kwargs` 名称可以修改,只要前面带 `*` 或 `**` 就行。但**强烈推荐使用**`*args`和`**kwargs`—— 这是 [Python](https://yunpan.plus/f/26-1) 开发者社区中通用的约定,有助于提高代码的可读性。
3.  函数定义时,参数顺序必须是:普通参数 → `*args` → `**kwargs`。
4.  它们的核心价值是让函数支持**可变数量的参数**,从而提升代码的灵活性和通用性,这在编写装饰器、中间件、通用工具函数或API包装器等场景中尤为常见。

希望这篇梳理能帮助你更清晰地理解和使用这两个重要的[Python](https://yunpan.plus/f/26-1)语法特性。如果在实际开发中遇到了有趣的应用场景或问题,欢迎在[云栈社区](https://yunpan.plus)与大家分享讨论。



上一篇:Kotlin Compose 状态管理实战架构:MVI与状态提升核心原则解析
下一篇:数据资产如何金融化?2025年三大主流模式与核心挑战解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-1 21:00 , Processed in 0.502114 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表