在定义函数的时候,有时候会遇到参数比较多或者不确定参数名的情况。这个时候就可以使用可变参数。
可变参数的形式有
*args : 元组类型参数
**kwargs :字典类型参数
args和kwargs的参数是自定义的。主要是前面的操作符不能少!
比如看一个简单的常规例子
def fun(name, age): print(name) print(age)if __name__ == '__main__': fun('tom', 19) # fun('lily') # TypeError: fun() missing 1 required positional argument: 'age'
print(name)
print(age)
if __name__ == '__main__':
fun('tom', 19)
# fun('lily') # TypeError: fun() missing 1 required positional argument: 'age'
定义了一个fun函数,参数有name和age。当调用fun函数时,如果只传一个参数则会报TypeError的错误。
假设我们不光有name、age 还需要传参性别、爱好、职业、电话等参数。一个个写就显得比较繁琐。不够Pythonic。
*args
这样我们就可以通过列表类型的参数进行传递。
def fun_arr(name, *args): print(name) print(args)if __name__ == '__main__': fun('tom', 19) # fun('lily') # TypeError: fun() missing 1 required positional argument: 'age' fun_arr('tom') # 输出 tom 、() # tom # (20, 'man', '篮球', 'pythoner', '17766666666') fun_arr('tom', 20, 'man', '篮球', 'pythoner', '17766666666')
print(name)
print(args)
if __name__ == '__main__':
fun('tom', 19)
# fun('lily') # TypeError: fun() missing 1 required positional argument: 'age'
fun_arr('tom') # 输出 tom 、()
# tom
# (20, 'man', '篮球', 'pythoner', '17766666666')
fun_arr('tom', 20, 'man', '篮球', 'pythoner', '17766666666')
如上,参数 name 对应的是 tom。而args 则对应的是('tom', 20, 'man', '篮球', 'pythoner', '17766666666')。
**kwargs
字典类型参数,实例如下
def fun_dict(**kwargs): # 循环打印字典的键和值 # name tom # age 18 # mobile 17766666666 for k, v in kwargs.items(): print(k, v) # 也可通过get的方式取参数的值 # my name is tom i'am 18 years old, my phone number is 17766666666 print("my name is %s i'am %s years old, my phone number is %s" % (kwargs.get('name'), kwargs.get('age'), kwargs.get('mobile')))if __name__ == '__main__': fun_dict(name='tom', age=18, mobile='17766666666')
# 循环打印字典的键和值
# name tom
# age 18
# mobile 17766666666
for k, v in kwargs.items():
print(k, v)
# 也可通过get的方式取参数的值
# my name is tom i'am 18 years old, my phone number is 17766666666
print("my name is %s i'am %s years old, my phone number is %s"
% (kwargs.get('name'), kwargs.get('age'), kwargs.get('mobile')))
if __name__ == '__main__':
fun_dict(name='tom', age=18, mobile='17766666666')
补充:
可变参数允许多个任意参数,也允许不传参数。
两个可变参数同时存在是,一定要将 *参数 放在 **参数 之前!!!否则编译错误。
通常情况下,都是将可变参数写在最后面。
如果写在前面则会将后面的参数也会收集到列表中。如果将可变参数写在前面,则需要指定后面的参数名
如下
def fun_arr(*args, name): print(name) print(args)if __name__ == '__main__': # 如下写法 则会报错 # TypeError: fun_arr() missing 1 required keyword-only argument: 'name' fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', 'tom') # 正确的写法 fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', name='tome')
print(name)
print(args)
if __name__ == '__main__':
# 如下写法 则会报错
# TypeError: fun_arr() missing 1 required keyword-only argument: 'name'
fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', 'tom')
# 正确的写法
fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', name='tome')