* args 和 ** args 主要用于函数定义,可以将不定数量的参数传递给一个函数。
这里不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所在在这个场景下使用这两个关键字。* args 是用来发送一个 非键值 的可变数量的参数列表给一个函数。
当你不确定你的函数里将要传递多少参数时你可以用*args
.例如,它可以传递任意数量的参数。
>>> def print_everything(*args):
for count, thing in enumerate(args):
... print '{0}. {1}'.format(count, thing)
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage
在函数中如果定义了变量x和y,*args放在函数中可以新增x和y的变量,简答方便。
>>> def func(x,y,*args):
print(type(x))
print(x)
print(y)
print(type(args))
print(args)
print_func(1,2,'one',[])
>>>
<class 'int'>
1
2
<class 'tuple'>
('one', [])
将*args放在函数变量最前面时,可能会报错,对变量x和y都有影响。如下:
def func(*args,x,y):
print(type(x))
print(x)
print(y)
print(type(args))
print(args)
运行时出现如下报错信息:
TypeError: func() missing 2 required keyword-only arguments: 'x' and 'y'
意思是 函数 print_func
找不到关键词参数 x
和 y
所以若 *args
不是在最后,则需要在参数传入时,明确定义 *args
后面的变量参数名,如下:
def func(*args,x,y):
print(type(x))
print(x)
print(y)
print(type(args))
print(args)
print_func(1,2,'one',[],x='x',y='y')
可以正确输出
<class 'str'>
x
y
<class 'tuple'>
(1, 2, 'one', [])
**kwargs
允许你将不定长度的 【键值对 key-value 】,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs
**kwargs
允许你使用没有事先定义的参数名:
>>> def table_things(**kwargs):
... for name, value in kwargs.items():
... print '{0} = {1}'.format(name, value)
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit