Python函数中 *args 和 **kwargs
·
在 Python 里,*args 和 **kwargs 都是用于接收不定数量参数 的语法,但它们接收的参数类型不同。
一、*args 的含义
*args 用来接收 任意数量的位置参数,在函数内部会变成一个 tuple(元组)。
示例1:接收多个参数
def add(*args):
print(args)
add(1, 2, 3, 4)
输出:
(1, 2, 3, 4)
示例2:求和
def add(*args):
total = 0
for num in args:
total += num
return total
print(add(1, 2, 3))
print(add(10, 20, 30, 40))
示例3:遍历参数
def show_args(*args):
for arg in args:
print(arg)
show_args("apple", "banana", "orange")
二、**kwargs 的含义
**kwargs 用来接收任意数量的关键字参数(key=value),在函数内部会变成一个dict(字典)。
示例1:接收多个 key-value
def show_info(**kwargs):
print(kwargs)
show_info(name="Tom", age=18, city="Beijing")
输出:
{'name': 'Tom', 'age': 18, 'city': 'Beijing'}
示例2:遍历字典
def show_info(**kwargs):
for key, value in kwargs.items():
print(key, value)
show_info(name="Alice", age=20)
示例3:构造对象信息
def create_user(**kwargs):
return kwargs
user = create_user(name="Jack", age=25)
print(user)
三、*args 和 **kwargs 的区别
• *args
- 接收 位置参数
- 数据类型是 tuple
示例调用:
func(1, 2, 3)
• **kwargs
- 接收 关键字参数
- 数据类型是 dict
示例调用:
func(name="Tom", age=18)
四、函数中同时使用 *args 和 **kwargs
语法顺序必须是:
普通参数 -> *args -> **kwargs
示例1:
def demo(a, *args, **kwargs):
print("a:", a)
print("args:", args)
print("kwargs:", kwargs)
demo(1, 2, 3, 4, name="Tom", age=18)
输出:
a: 1
args: (2, 3, 4)
kwargs: {'name': 'Tom', 'age': 18}
示例2:更真实一点的函数
def create_order(user, *items, **options):
print("用户:", user)
print("商品:", items)
print("其他信息:", options)
create_order(
"张三",
"手机",
"耳机",
price=3000,
address="上海"
)
输出:
用户: 张三
商品: ('手机', '耳机')
其他信息: {'price': 3000, 'address': '上海'}
五、补充:参数解包(常见用法)
* 和 ** 还可以用于调用函数时解包。
示例:
def add(a, b, c):
print(a + b + c)
nums = [1, 2, 3]
add(*nums)
等价于:
add(1, 2, 3)
字典解包:
def show(name, age):
print(name, age)
data = {"name": "Tom", "age": 18}
show(**data)
一句话总结:
*args:收集 多余的位置参数 → tuple**kwargs:收集多余的关键字参数 → dict
特殊说明:
下面一段代码会报错,原因是:*args 只能接收 位置参数,而传入的是 关键字参数。
def show_info(*args):
print(args)
show_info(name="Tom", age=18, city="Beijing")
运行结果会报错:
TypeError: show_info() got an unexpected keyword argument 'name'
因为:
name="Tom"age=18city="Beijing"
这些都是 kwargs(关键字参数),而函数只定义了 *args,没有 **kwargs。
如果你想接收这些参数,需要这样写:
def show_info(**kwargs):
print(kwargs)
show_info(name="Tom", age=18, city="Beijing")
输出:
{'name': 'Tom', 'age': 18, 'city': 'Beijing'}
如果你同时支持两种参数:
def show_info(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
show_info(1, 2, name="Tom", age=18)
输出:
args: (1, 2)
kwargs: {'name': 'Tom', 'age': 18}
更多推荐



所有评论(0)