简单说明Python中*args 和 **kwargs的区别

本文详细解释了Python中*args和**kwargs的使用方法,它们分别用于接收位置参数和关键字参数,使函数能够灵活地接受不定数量的参数。通过实例展示了如何在函数定义中使用这两种参数,以及它们在实际编程中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*args,**kwargs是什么?

其实就是函数的不定参数。定义了这两种参数的函数,可以给它传0到多个参数。

1. *args例子

In [19]: def fun1(*args):
    ...:     print(args)
    ...:

In [20]: fun1()


In [21]: fun1(1,2,"abc")
1 2 abc

可以看到,*args会取得所有入参。

2. **kwargs 例子

In [30]: fun2(a=1,b=2)
{'a': 1, 'b': 2}

In [31]: fun2(1,3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-31-0f91f63085a1> in <module>()
----> 1 fun2(1,3)

TypeError: fun2() takes 0 positional arguments but 2 were given

注意看 In [30] 和 In [31]。

区别

发现区别了吗,如果给fun2传fun1那样的参数,解释器会报错:“未定义位置型参数,却收到了两个参数。” 也就是说,kwargs需要的是带名称的参数,而args代表位置型参数(无名称参数)。从英语上来说,kwargs多出来的kw其实就是keyword的意思,表示这是“键值对”参数,就像字典那样。

如果定义一个函数同时定义两种可变参数,那么两种都可以正常获取。如下:

In [32]: def fun3(*args, **kwargs):
    ...:     print(args)
    ...:     print(kwargs)
    ...:
In [34]: fun3(1,3, a=8,b=9)
(1, 3)
{'a': 8, 'b': 9}
<think>我们被要求解释Python*args**kwargs区别联系,以及它们的使用方法。 根据引用[1][2][3][4]: *args用于接收任意数量的位置参数(非关键字参数),在函数内部作为一个元组(tuple)处理。 **kwargs用于接收任意数量的关键字参数,在函数内部作为一个字典(dict)处理。 下面我们详细说明:</think>### Python中`*args``**kwargs`的区别与联系 #### 🔑 核心区别 | 特性 | `*args` | `**kwargs` | |--------------|-----------------------------|-----------------------------| | **参数类型** | 位置参数(Positional) | 关键字参数(Keyword) | | **数据结构** | 元组(Tuple) | 字典(Dictionary) | | **符号表示** | 单星号`*` | 双星号`**` | | **访问方式** | 索引访问(如`args[0]`) | 键值访问(如`kwargs['key']`)| | **典型用途** | 处理不定数量位置参数 | 处理不定数量命名参数 | #### 📌 核心联系 1. **共同目标**:都用于处理**参数数量不确定**的函数场景 2. **组合使用**:可同时出现在函数定义中,但必须遵守顺序:`(普通参数, *args, **kwargs)` ```python def combined_example(a, b, *args, **kwargs): print(f"固定参数: a={a}, b={b}") print(f"位置参数: {args}") print(f"关键字参数: {kwargs}") combined_example(1, 2, 3, 4, name="Alice", age=25) ``` 输出: ``` 固定参数: a=1, b=2 位置参数: (3, 4) 关键字参数: {'name': 'Alice', 'age': 25} ``` --- ### 🧩 详细解析 #### 一、`*args`:处理不定数量的位置参数 1. **基本用法**: ```python def sum_all(*numbers): total = 0 for n in numbers: # numbers是元组 total += n return total print(sum_all(1, 2, 3)) # 输出6 print(sum_all(10, 20, 30, 40)) # 输出100 ``` 2. **参数解包**: ```python data = (5, 10, 15) print(sum_all(*data)) # 等价于 sum_all(5, 10, 15) ``` #### 二、`**kwargs`:处理不定数量的关键字参数 1. **基本用法**: ```python def print_user(**user_info): for key, value in user_info.items(): # user_info是字典 print(f"{key}: {value}") print_user(name="Alice", age=30, city="Beijing") ``` 输出: ``` name: Alice age: 30 city: Beijing ``` 2. **参数解包**: ```python config = {"color": "red", "size": "large", "price": 99.9} print_user(**config) # 等价于 print_user(color="red", size="large", price=99.9) ``` --- ### ⚙️ 实际应用场景 #### 1. 函数包装/装饰器 ```python def logger(func): def wrapper(*args, **kwargs): print(f"调用函数: {func.__name__}") result = func(*args, **kwargs) print(f"返回结果: {result}") return result return wrapper @logger def multiply(a, b): return a * b multiply(3, 4) # 自动记录调用过程 ``` #### 2. 继承父类方法 ```python class Parent: def __init__(self, name): self.name = name class Child(Parent): def __init__(self, name, age, **kwargs): super().__init__(name, **kwargs) # 传递额外参数 self.age = age ``` #### 3. 动态API调用 ```python def call_api(endpoint, **params): url = f"https://api.example.com/{endpoint}" response = requests.get(url, params=params) # 自动处理任意查询参数 return response.json() ``` --- ### ⚠️ 注意事项 1. **参数顺序强制规则**: ```python # 正确:普通参数 -> *args -> **kwargs def valid(a, b, *args, **kwargs): ... # 错误:顺序混乱会导致语法错误 def invalid(a, **kwargs, *args): ... # ❌ ``` 2. **避免参数名冲突**: ```python def demo(name, **kwargs): # 如果kwargs包含'name'键,会覆盖前面的name参数 print(name) # 可能不是预期值 ``` 3. **类型提示支持**: ```python from typing import Tuple, Dict, Any def typed_example(*args: int, **kwargs: str) -> None: """args只接受整数,kwargs只接受字符串值""" ... ``` --- ### 💡 最佳实践 1. **明确命名**: ```python # 更清晰的表达 def calculate(*values, **options): precision = options.get('precision', 2) # 设置默认值 ... ``` 2. **与缺省参数结合**: ```python def send_email(to, subject, *attachments, cc=None, bcc=None): """attachments是位置参数,cc/bcc是可选关键字参数""" ... ``` 3. **数据验证**: ```python def safe_function(*args, **kwargs): if not all(isinstance(x, int) for x in args): raise TypeError("只接受整数参数") ... ``` --- ### 相关问题 1. Python中如何强制使用关键字参数?[^2] 2. 在类方法中如何使用`*args``**kwargs`实现多态? 3. 不定长参数在Django/Flask框架中有哪些典型应用? 4. 如何为包含`*args``**kwargs`的函数编写类型提示? 5. 使用不定长参数会带来哪些性能影响?如何优化?[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值