欢迎关注公众号【Python开发实战】,免费领取Python、PyCharm安装教程和Python学习电子书!
*args
和**kwargs
的用法首先,不是必须写成*args
和**kwargs
,只有变量前面星号*
才是必须的。也可以写成*vars
和**kwvars
,写成*args
和**kwargs
只是一个通俗的命名约定。
*args
和**kwargs
主要用于函数的定义中,可以将任意数量的参数传递给一个函数。即预先并不知道,函数调用时会传递多少个参数,在这样的场景下就需要使用这两个关键字。最常见的使用场景是编写装饰器时使用。
*args
的用法*args
:允许将任意数量的位置参数传递给一个函数,在函数内部,args会被转化为元组。
def test_args(f_arg, *args):
print('args的数据类型:', type(args))
print('第一个位置参数:', f_arg)
for arg in args:
print('通过*args传递的参数:', arg)
test_args('linux', 'python', 'web', 'sql')
输出:
args的数据类型:
第一个位置参数: linux
通过*args传递的参数: python
通过*args传递的参数: web
通过*args传递的参数: sql
**kwargs
的用法**kwargs
:允许将任意数量的关键字参数传递给一个函数,在函数内部,kwargs被转化为字典。
def test_kwargs(**kwargs):
print('kwargs的数据类型:', type(kwargs))
for key, value in kwargs.items():
print(f'{key} : {value}')
test_kwargs(age=18)
输出:
kwargs的数据类型:
age : 18
如果某个函数需要能够同时接受任意数量的位置参数和关键字参数,可以同时使用*args
和**kwargs
。
但是需要注意的是参数的位置,*args
要放在函数定义中最后一个位置参数后面,**kwargs
要放在函数定义中所有参数的最后面,在*args
后面仍然可以定义其他参数,但在*args
后面定义的参数,函数调用时需使用关键字参数传参。
def any_args1(*args, name, **kwargs):
print(args)
print(kwargs)
print(name)
def any_args2(*args, name='lau', **kwargs):
print(args)
print(kwargs)
print(name)
any_args1('one', 1, name='lau', two=2)
any_args2('one', 1, two=2)
any_args2('one', 1, name='katie', two=2)
输出:
('one', 1)
{'two': 2}
lau
('one', 1)
{'two': 2}
lau
('one', 1)
{'two': 2}
katie
*args
和**kwargs
调用函数现在来看一下怎样使用*args
和**kwargs
来调用一个函数。
def test_args_kwargs(arg1, arg2, arg3):
print(f'arg1: {arg1}')
print(f'arg2: {arg2}')
print(f'arg3: {arg3}')
首先,使用*args
调用函数test_args_kwargs。
args = (3, 'one', 9)
test_args_kwargs(*args)
输出:
arg1: 3
arg2: one
arg3: 9
再使用**kwargs
来调用函数test_args_kwargs。
kwargs = {'arg2': 'one', 'arg1': 3, 'arg3': 5}
test_args_kwargs(**kwargs)
输出:
arg1: 3
arg2: one
arg3: 5