*args
和**kwargs
*args
和**kwargs
主要用于函数的定义。当函数的参数不确定时,可以使用*args
和**kwargs
来将不 定数量的参数传递给一个函数。这里不定的意思是预先并不知道函数的使用者会传递多少个参数,所以, 在这种场景下可以使用这两个关键字。
*args
是用来发送一个非键值对的可变数量的参数列表给一个函数。*args会接收任意多个参数并把 这些参数作为元组传递给函数。*args
没有key值,以元组形式传递。
**kwargs
存储可变的关键字参数,允许使用没有事先定义的参数名,将接收到任意多个关键字参数 作为字典传递给函数。**kwargs
有key值,以字典形式传递。
需要注意的是,函数的参数的顺序:*args
必须在**kwargs
前面,调用函数传递参数也必须依照此顺序。
(1) *args 示例
def demo(args_f,*args_v):
print(args_f)
for x in args_v:
print(x,end='')
demo(1,'a','b','c','d')
运行结果:
1
abcd
再例如:
def function(x,y,*args):
print(x,y,args)
function(1,2,3,4,5)
运行结果:
1 2 (3, 4, 5)
(2) **kwargs 示例
def demo(**kwargs):
for k,v in kwargs.items():
print(k,v)
demo(name='aaa')
运行结果:
name aaa
再例如:
def function(**kwargs):
print(kwargs,type(kwargs))
function(a=2)
运行结果:
{'a': 2} <class 'dict'>
在 Python 中,*args
和 **kwargs
是用于定义函数时的一种灵活参数机制。它们的主要作用是允许函数接收任意数量的参数。
1. *args
-
含义:
*args
是一个用于接收位置参数的可变参数列表。
当函数调用时,传递的所有额外位置参数都会被收集到一个元组中。 -
用法:
通常用于函数参数数量未知,或需要对多个位置参数进行统一处理的场景。 -
示例:
def demo_args(*args):
print(args) # args 是一个元组
demo_args(1, 2, 3) # 输出: (1, 2, 3)
demo_args("a", "b", "c", "d") # 输出: ('a', 'b', 'c', 'd')
- 应用场景:
- 构建函数能接收任意数量的参数。
- 迭代处理多参数。
2. **kwargs
-
含义:
**kwargs
是用于接收关键字参数的可变参数字典。
所有额外的关键字参数会被收集到一个字典中。 -
用法:
通常用于函数参数的关键字对数量未知,或需要对多个关键字参数进行统一处理的场景。 -
示例:
def demo_kwargs(**kwargs):
print(kwargs) # kwargs 是一个字典
demo_kwargs(a=1, b=2, c=3) # 输出: {'a': 1, 'b': 2, 'c': 3}
demo_kwargs(name="Alice", age=30) # 输出: {'name': 'Alice', 'age': 30}
- 应用场景:
- 灵活处理配置项。
- 动态生成参数列表。
3. 混合使用 *args
和 **kwargs
- 规则:
*args
必须出现在参数列表中**kwargs
之前。-
位置参数在关键字参数之前。
-
示例:
def demo_mixed(a, b, *args, **kwargs):
print("a:", a)
print("b:", b)
print("args:", args)
print("kwargs:", kwargs)
demo_mixed(1, 2, 3, 4, 5, name="Alice", age=30)
# 输出:
# a: 1
# b: 2
# args: (3, 4, 5)
# kwargs: {'name': 'Alice', 'age': 30}
4. 解包(Unpacking)
-
*
和**
的解包功能: 它们可以在函数调用时,将序列或字典中的值展开为独立的参数。 -
示例:
def demo_unpack(a, b, c):
print(a, b, c)
# 使用 * 解包列表/元组
args = (1, 2, 3)
demo_unpack(*args) # 输出: 1 2 3
# 使用 ** 解包字典
kwargs = {"a": 4, "b": 5, "c": 6}
demo_unpack(**kwargs) # 输出: 4 5 6
总结
*args
: 用于接收任意数量的位置参数,存储为元组。**kwargs
: 用于接收任意数量的关键字参数,存储为字典。- 它们让函数更灵活,适合多参数和动态参数传递的场景。