【python基础知识】 *args, **kwargs介绍
文章目录
- 1. `*args`:可变数量的位置参数
- 2. `**kwargs`:可变数量的关键字参数
- 3. 组合使用 `*args` 和 `**kwargs`
- 4. 参数解包(Unpacking)
- 5. 常见应用场景
- (1)装饰器
- (2)继承中传递参数
- 总结
在 Python 中,
*args
和
**kwargs
是函数定义时用于处理可变数量参数的特殊语法。它们允许函数接受任意数量的位置参数(
*args
)和关键字参数(
**kwargs
),提供了极大的灵活性。以下是详细介绍:
1. *args
:可变数量的位置参数
作用:
- 允许函数接受任意数量的位置参数(即不带关键字的参数)。
- 这些参数在函数内部被封装为一个元组(tuple)。
语法:
def function(*args):# args 是一个包含所有位置参数的元组for arg in args:print(arg)# 调用示例
function(1, 2, 3) # 输出: 1 2 3
示例:
def sum_numbers(*args):total = 0for num in args:total += numreturn totalprint(sum_numbers(1, 2, 3)) # 输出: 6
print(sum_numbers(10, 20, 30, 40)) # 输出: 100
2. **kwargs
:可变数量的关键字参数
作用:
- 允许函数接受任意数量的关键字参数(即带有关键字的参数)。
- 这些参数在函数内部被封装为一个字典(dict)。
语法:
def function(**kwargs):# kwargs 是一个包含所有关键字参数的字典for key, value in kwargs.items():print(f"{key}: {value}")# 调用示例
function(name="Alice", age=30) # 输出: name: Alice, age: 30
示例:
def print_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_info(name="Bob", city="New York", job="Engineer")
# 输出:
# name: Bob
# city: New York
# job: Engineer
3. 组合使用 *args
和 **kwargs
函数可以同时使用 *args
和 **kwargs
,但顺序必须是:
- 普通参数
*args
**kwargs
示例:
def example(a, b, *args, **kwargs):print(f"a: {a}, b: {b}") # 普通参数print(f"args: {args}") # 位置参数元组print(f"kwargs: {kwargs}") # 关键字参数字典example(1, 2, 3, 4, name="Charlie", age=25)
# 输出:
# a: 1, b: 2
# args: (3, 4)
# kwargs: {'name': 'Charlie', 'age': 25}
4. 参数解包(Unpacking)
*
和 **
也可以在函数调用时用于解包可迭代对象或字典:
*
用于解包列表、元组或其他可迭代对象为位置参数。**
用于解包字典为关键字参数。
示例:
def add(a, b, c):return a + b + cnumbers = [1, 2, 3]
print(add(*numbers)) # 等价于 add(1, 2, 3),输出: 6person = {"name": "Dave", "age": 35}
def greet(name, age):print(f"Hello, {name}! You are {age}.")greet(**person) # 等价于 greet(name="Dave", age=35)
5. 常见应用场景
(1)装饰器
捕获被装饰函数的所有参数:
def my_decorator(func):def wrapper(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return resultreturn wrapper@my_decorator
def say_hello(name):print(f"Hello, {name}!")say_hello("Eve") # 输出: Before, Hello Eve, After
(2)继承中传递参数
子类调用父类的 __init__
方法:
class Parent:def __init__(self, name, **kwargs):self.name = nameclass Child(Parent):def __init__(self, age, *args, **kwargs):super().__init__(*args, **kwargs) # 传递所有参数给父类self.age = agec = Child(age=10, name="Frank")
print(c.name, c.age) # 输出: Frank 10
总结
语法 | 作用 | 函数内部类型 | 调用时的作用 |
---|---|---|---|
*args | 接收任意数量的位置参数 | 元组(tuple) | 解包可迭代对象为位置参数 |
**kwargs | 接收任意数量的关键字参数 | 字典(dict) | 解包字典为关键字参数 |
注意:
args
和kwargs
只是约定俗成的名称,实际可使用任意合法变量名(如*params
、**options
)。*args
和**kwargs
使函数更加灵活,但过度使用会降低代码可读性。建议根据实际需求合理使用。