Python的args和kwargs理解

本文通过实例详细解析了Python中args和kwargs的使用方法,展示了如何正确地传递不定长参数和关键字参数,以及它们在函数调用过程中的行为。

众所周知,python的args是用来接收不定长的参数,而kwargs是用来接收不定长的关键字参数。

下面通过实例来看看如何真正的理解这两个的用法。

def test2(a, b, *args, **kwargs):
    print("------test2---------")
    print(a)
    print(b)
    print(args)
    print(kwargs)

def test1(a, b, *args, **kwargs):
    print("-------test1---------")
    print(a)
    print(b)
    print(args)
    print(kwargs)
    print("The output of a, b, args, kwargs")
    test2(a, b, args, kwargs)
    print("The output of a, b, *args, kwargs")
    test2(a, b, *args, kwargs)
    print("The output of a, b, *args, **kwargs")
    test2(a, b, *args, **kwargs)


test1(11,22,33,44,55,66, name="zhangsan", age=18)

The output of the test code like following:

-------test1---------
11
22
(33, 44, 55, 66)
{‘name’: ‘zhangsan’, ‘age’: 18}

The output of a, b, args, kwargs
------test2---------
11
22
((33, 44, 55, 66), {'name': 'zhangsan', 'age': 18})
{}

从这个结果来看,(33, 44, 55, 66), {‘name’: ‘zhangsan’, ‘age’: 18}被作为一个整体传给了test2函数的args对象;然后kwargs没有实参。

 The output of a, b, *args, kwargs
    ------test2---------
    11
    22
    (33, 44, 55, 66, {'name': 'zhangsan', 'age': 18})
    {}

从这个结果来看,(33, 44, 55, 66, {‘name’: ‘zhangsan’, ‘age’: 18})被作为一个整体传给了test2函数的args对象;然后kwargs没有实参。

The output of a, b, *args, **kwargs
    ------test2---------
    11
    22
    (33, 44, 55, 66)
    {'name': 'zhangsan', 'age': 18}

从这个结果来看,(33, 44, 55, 66)被作为一个整体传给了test2函数的args对象; {‘name’: ‘zhangsan’, ‘age’: 18}传给了kwargs参数,这个才是我们期待的结果。

总结起来,可以这么理解,*args可以理解为对实参的一个拆包,**args也是对实参的拆包。不带星花就不拆包,会被当做一个整体

Python 中,`*args` `**kwargs` 是用于处理可变数量参数的强大功能,尤其在函数定义调用中非常有用。它们允许函数接收任意数量的位置参数关键字参数。 ### `*args` 的用法 `*args` 用于接收任意数量的位置参数。在函数定义中,`*args` 会将传入的所有位置参数打包成一个元组。这在不确定参数数量的情况下非常有用。 #### 示例代码: ```python def my_function(*args): for arg in args: print(arg) my_function(1, 2, 3) ``` 输出: ``` 1 2 3 ``` ### `**kwargs` 的用法 `**kwargs` 用于接收任意数量的关键字参数。在函数定义中,`**kwargs` 会将传入的所有关键字参数打包成一个字典。 #### 示例代码: ```python def my_function(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") my_function(name="Alice", age=30) ``` 输出: ``` name: Alice age: 30 ``` ### `*args` `**kwargs` 的区别 1. **数据类型**:`*args` 将参数打包成一个元组,而 `**kwargs` 将参数打包成一个字典。 2. **参数传递方式**:`*args` 用于处理位置参数,而 `**kwargs` 用于处理关键字参数。 3. **灵活性**:`*args` `**kwargs` 都提供了灵活性,但 `**kwargs` 更适合处理具有名称的参数,使得代码更具可读性[^1]。 ### 使用场景 1. **函数装饰器**:在装饰器中,`*args` `**kwargs` 可以用于传递任意参数给被装饰的函数。 ```python def logger(func): def wrapper(*args, **kwargs): print("函数被调用") return func(*args, **kwargs) return wrapper @logger def add(a, b): return a + b ``` 2. **多级函数调用**:在需要将参数从一个函数传递到另一个函数的场景中,`*args` `**kwargs` 可以简化代码。 3. **灵活性可维护性**:使用 `*args` `**kwargs` 可以使函数设计更加灵活,能够接受未来可能增加的新参数而无需修改函数定义[^4]。 ### 注意事项 - **命名规范**:虽然 `args` `kwargs` 是约定俗成的名称,但为了代码的可读性,建议使用这两个名称。 - **性能考虑**:在处理极大量数据时,应注意使用 `*args` `**kwargs` 可能带来的性能开销。 - **避免命名冲突**:当使用 `**kwargs` 解包字典为关键字参数时,需要确保字典的键与函数参数的名称匹配,且不会导致冲突[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值