Python | *args & **kwargs

本文详细介绍了Python中*args与**kwargs的功能及使用方法,包括它们如何作为元组和字典来处理可变数量的参数,以及在定义函数时的正确顺序。

Python | *args & **kwargs

*args和**kwargs主要是为了方便传递参数,*args是一个元组,**kwargs是一个词典,都支持类似可变参数传参。

注意

  • *args和**kwargs同时出现,*args必须在前面
def demo_args(first, *args):
    print(first)
    print(type(args))
    for arg in args:
        print(arg)


def demo_kwargs(first, **kwargs):
    print(first)
    print(type(kwargs))
    for key, val in kwargs.items():
        print(key, val)


def demo_args_kwargs(first, *args, **kwargs):
    print(first)

    print(type(args))
    for arg in args:
        print(arg)

    print(type(kwargs))
    for key, val in kwargs.items():
        print(key, val)


if __name__ == '__main__':
    demo_args("This is *args", 1, 2, 3, 4)

    print("--------------------------------")
    demo_kwargs("This is **kwargs", name="yimt", age=123)

    print("--------------------------------")
    demo_args_kwargs("This is *args and **kwargs", 1, 2, 3, name="yimt", age=123)

Output

This is *args
<class 'tuple'>
1
2
3
4
--------------------------------
This is **kwargs
<class 'dict'>
name yimt
age 123
--------------------------------
This is *args and **kwargs
<class 'tuple'>
1
2
3
<class 'dict'>
name yimt
age 123
&lt;think&gt;我们被要求解析Python函数中的*args**kwargs。根据引用内容,我们可以总结如下: *args: - 用于函数定义,接收任意数量的非关键字参数(位置参数) - 将传入的位置参数打包成一个元组(tuple) - 示例:`def func(*args):` 然后可以在函数体内遍历args元组 **kwargs: - 用于函数定义,接收任意数量的关键字参数(keyword arguments) - 将传入的关键字参数打包成一个字典(dictionary) - 示例:`def func(**kwargs):` 然后在函数体内可以访问关键字参数组成的字典 另外,我们还注意到: 1. *args**kwargs可以同时使用,但顺序必须是*args**kwargs之前。 2. 它们也可以普通参数混合使用,但顺序必须是:普通参数、*args**kwargs。 混合使用示例: ```python def func(a, b, *args, **kwargs): print(f&quot;a={a}, b={b}&quot;) print(&quot;args:&quot;, args) # 元组 print(&quot;kwargs:&quot;, kwargs) # 字典 ``` 我们还注意到,它们不仅可以用于打包参数(pack),还可以用于拆分参数(unpack): - 在函数调用时,使用*可以拆分一个可迭代对象为多个位置参数。 - 使用**可以拆分一个字典为多个关键字参数。 例如: ```python def func(a, b, c): print(a, b, c) args_list = [1, 2, 3] func(*args_list) # 相当于 func(1,2,3) kwargs_dict = {&#39;a&#39;:1, &#39;b&#39;:2, &#39;c&#39;:3} func(**kwargs_dict) # 相当于 func(a=1, b=2, c=3) ``` 根据以上理解,我们可以组织答案如下: &lt;/think&gt;### Python函数中`*args``**kwargs`深度解析 在Python函数中,`*args``**kwargs`是处理可变数量参数的强大工具,它们通过参数打包拆包机制实现灵活传参。以下是核心解析: #### 1. `*args`:处理可变位置参数 - **功能**:接收任意数量的**非关键字参数**(位置参数),打包成元组(tuple) - **语法**:参数名前加星号`*`(名称`args`仅为约定) - **本质**:解决预先未知参数数量的场景 ```python def sum_values(*args): total = 0 for num in args: # args是元组 (1, 3, 5) total += num return total print(sum_values(1, 3, 5)) # 输出 9 print(sum_values(2, 4, 6, 8)) # 输出 20 ``` - **混合使用**:可与普通参数组合(普通参数必须在前) ```python def greet(greeting, *names): for name in names: print(f&quot;{greeting}, {name}!&quot;) greet(&quot;Hello&quot;, &quot;Alice&quot;, &quot;Bob&quot;) # 输出: # Hello, Alice! # Hello, Bob! ``` #### 2. `**kwargs`:处理可变关键字参数 - **功能**:接收任意数量的**关键字参数**,打包成字典(dict) - **语法**:参数名前加双星号`**`(名称`kwargs`仅为约定) - **本质**:灵活处理键值对形式的命名参数 ```python def print_info(**kwargs): for key, value in kwargs.items(): print(f&quot;{key}: {value}&quot;) print_info(name=&quot;Alice&quot;, age=30, city=&quot;Paris&quot;) # 输出: # name: Alice # age: 30 # city: Paris ``` #### 3. 参数拆包(Unpacking) - **函数调用时**:使用`*``**`将集合拆分为单个参数 ```python def func(a, b, c): print(a, b, c) # 位置参数拆包 args_list = [1, 2, 3] func(*args_list) # 等价于 func(1, 2, 3) # 关键字参数拆包 kwargs_dict = {&#39;a&#39;: 10, &#39;b&#39;: 20, &#39;c&#39;: 30} func(**kwargs_dict) # 等价于 func(a=10, b=20, c=30) ``` #### 4. 混合使用规则 - **顺序强制要求**:普通参数 &rarr; `*args` &rarr; `**kwargs` ```python def advanced_func(a, b, *args, option=True, **kwargs): print(f&quot;固定参数: {a}, {b}&quot;) print(f&quot;可变位置: {args}&quot;) print(f&quot;关键字参数: option={option}&quot;) print(f&quot;可变关键字: {kwargs}&quot;) advanced_func(1, 2, 3, 4, option=False, x=10, y=20) # 输出: # 固定参数: 1, 2 # 可变位置: (3, 4) # 关键字参数: option=False # 可变关键字: {&#39;x&#39;: 10, &#39;y&#39;: 20} ``` #### 5. 关键区别总结 | 特性 | `*args` | `**kwargs` | |--------------|-----------------------------|-----------------------------| | **参数类型** | 位置参数 | 关键字参数 | | **打包形式** | 元组(tuple) | 字典(dict) | | **符号** | 单星号`*` | 双星号`**` | | **访问方式** | 索引访问`args[0]` | 键访问`kwargs[&#39;key&#39;]` | | **典型用途** | 数学运算、批量处理 | 配置选项、属性设置 | &gt; **最佳实践**:在编写通用库函数、装饰器或需高度可扩展性的API时优先使用[^3]。但避免过度使用导致代码可读性下降。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值