目录
一、介绍:
二、实例:
2.1 args
2.2 *args
2.2.1 基础版
2.2.2 进阶版
2.3 **kwargs
2.4 *args 和**kkwargs连用
一、介绍:
首先,不是必须写成*args
和**kwargs
,只有变量前面星号*
才是必须的。也可以写成*vars
和**kwvars
,写成*args
和**kwargs
只是一个通俗的命名约定。
具体地,
args
:args
是一个常规的参数列表,表示函数接收的位置参数,可以包含零个或多个参数,由逗号分隔。即一个args表示一个参数*args
:*args
是一个特殊的参数,用于接收任意数量的位置参数,并将它们作为一个元组传递给函数。在函数定义时,可以使用*args
来接收多个不定长的位置参数,然后对它们进行处理。在调用函数时,可以使用*
运算符将一个可迭代对象解包成多个单独的参数,然后将它们传递给函数。*args表示的是一个任意长度的元组,即预先并不知道,函数调用时会传递多少个参数。**kwargs
:**kwargs
是另一个特殊的参数,用于接收任意数量的关键字参数,并将它们作为一个字典传递给函数。在函数定义时,可以使用**kwargs
来接收多个不定长的关键字参数,然后对它们进行处理。在调用函数时,可以使用**
运算符将一个字典解包成多个单独的关键字参数,然后将它们传递给函数。 *kwargs传入的是一个任意长度的字典,即预先并不知道,函数调用时会传递多少个参数。
二、实例:
2.1 args
args只是一个普通的参数名,可以用任何符合命名规则的符号替换,比如下面的x,y
def sum(x,y):
z = x+y
return z
sum(1,2)
2.2 *args
2.2.1 基础版
*args表示传入不定长度的元组。
def sum(*args):
sum = 0
for arg in args:
sum = sum + arg
return sum
t1 = sum(1)
t2 = sum(1,2)
t3 = sum(1,2,3)
print("t1,t2,t3的结果分别是:{},{},{}".format(t1, t2,t3))
运行结果:
从运行结果可以看出: t1的时候,*args传入的是长度为1的元组,t2的时候,表示传入的是长度为2的元组,t3的时候,表示传入的是长度为3的元组。具体运行结果如图。
2.2.2 进阶版
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')
运行结果:
分析:
代码将四个参数传入test_args函数。第一位的参数会作为f_args的参数传入,后面的三个参数,会自动变成一个长度为3的元组,作为*args参数传入。
2.3 **kwargs
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="John", age=30, city="New York") # 输出 name: John, age: 30, city: New York
运行结果:
2.4 *args 和**kkwargs连用
如果某个函数需要能够同时接受任意数量的位置参数和关键字参数,可以同时使用*args
和**kwargs
。
但是需要注意的是参数的位置,*args
要放在函数定义中最后一个位置参数后面,**kwargs
要放在函数定义中所有参数的最后面,在*args
后面仍然可以定义其他参数,但在*args
后面定义的参数,函数调用时需使用关键字参数传参。
def any_args1(*args, name, **kwargs):
print(args)
print(name)
print(kwargs)
def any_args2(*args, name='ting', **kwargs):
print(args)
print(name)
print(kwargs)
any_args1('test', 1, name='ting2', two=2)
print("=======================")
any_args2('test', 1, two=2)
print("=======================")
any_args2('test', 1, name='you', two=2)
print("=======================")
any_args2('test', 1, name='ting3', one=1, two=2)
运行结果: