很多时候,会有人问到args和*kwargs,那么如何理解呢?
其实, 并不是必须写成 *args
和 **kwargs
,真正在参数传递时起作用的,只有变量前面的 *
。你也可以写成 *params
和 **kv_params
。也就是说,*args
和 **kwargs
只是一种通俗的写法,但不是必须的
他们代表着什么呢?
*
用于传入的多个参数将按照元组形式存储,是一个元组**
用于参数前则表示传入的(多个)参数将按照字典的形式存储,是一个字典
*args
的用法
*args
和 **kwargs
主要在函数定义的时候使用。而 *args
是用来发送一个非键值对的可变数量的参数列表给一个函数
def argsdemo(parame, *args):
print("正常的参数:", parame)
print("*args:", args, "类型:", type(args))
for arg in args:
print("通过*args传递的参数:", arg)
argsdemo('python', 'java', '鸿蒙', 'go')
结果展示
正常的参数: python
*args: ('java', '鸿蒙', 'go') 类型: <class 'tuple'>
通过*args传递的参数: java
通过*args传递的参数: 鸿蒙
通过*args传递的参数: go
可以发现,看起来argsdemo函数只接收两个参数,可实际上我们向argsdemo函数传递了四个参数,魔法之处就在于 *args
,实际上是 *args
把多个参数组装成了一个元组传递给了argsdemo函数
**kwargs
的用法
**kwargs
允许你将不定长度的键值对, 作为参数传递给一个函数。如果你想要在一个函数里处理一些带名字的参数, 你就要使用 **kwargs
def kwargsdemo(**kwargs):
print("**kwargs:", kwargs, "类型:", type(kwargs))
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
kwargsdemo(name="leizi", age=3)
结果:
**kwargs: {'name': 'leizi', 'age': 3} 类型: <class 'dict'>
name = leizi
age = 3
**kwargs
把多个参数组装成了一个字典传递给了kwargsdemo函数
使用 *args
和 **kwargs
来调用函数
def demo_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
print("------------")
args = ("python", "java", "go")
# 使用 *args方式
demo_args_kwargs(*args)
print("************")
# 使用 **kwargs方式
kwargs = {"arg2": "java", "arg3": "go", "arg1": "python"}
demo_args_kwargs(**kwargs)
结果:
------------
arg1: python
arg2: java
arg3: go
************
arg1: python
arg2: java
arg3: go
只要一个函数在定义时使用了*args
和 **kwargs
这两个关键字作为参数,就可以增加不定长的参数
注意:函数的参数应该
*args
在 **kwargs
前,不然会报错