Python函数可变参数(*arg,**kwargs)
Python 在定义函数时也可以使用可变参数,即允许定义参数个数可变的函数。这样当调用该函数时,可以向其传入任意多个参数。
1、可变参数:形参前添加一个*
语法格式如下:
def demo(home,*str):
print(home)
# 输出str元组中的元素
print("str={0}".format(str))
for i in str:
print(i)
# 可传入任何多个参数
demo("晒兔子","https://www.cnblogs.com/qingchengzi","https://www.python.org/")
程序执行结果为:
晒兔子
str=('https://www.cnblogs.com/qingchengzi', 'https://www.python.org/')
https://www.cnblogs.com/qingchengzi
https://www.python.org/
上面程序中,demo() 函数的最后一个参数就是 str 元组,这样在调用该函数时,除了前面位置参数接收对应位置的实参外,其它非关键字参数都会由 str 元组接收。
当然,可变参数并不一定必须为最后一个函数参数,例如修改demo() 函数为:
def demo(*str,home):
print(home)
# 输出str元组中的元素
print("str={0}".format(str))
for i in str:
print(i)
# 可传入任何多个参数
demo("晒兔子","https://www.cnblogs.com/qingchengz
可以看到,str 可变参数作为demo() 函数的第一个参数。但需要注意的是,在调用该函数时,必须以关键字参数的形式给普通参数传值,否则 Python 解释器会把所有参数都优先传给可变参数,如果普通参数没有默认值,就会报错。
也就是说,下面代码调用上面的demo() 函数是不对的:
def demo(*str,home):
print(home)
# 输出str元组中的元素
print("str={0}".format(str))
for i in str:
print(i)
# 可传入任何多个参数
demo("晒兔子","https://www.cnblogs.com/qingchengzi","https://www.python.org/")
报错信息:
TypeError: demo() missing 1 required keyword-only argument: 'home'
2、可变参数:形参前添加两个*
这种形式的语法格式如下:
**kwargs
**kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。
如下代码:
def demo(home,*str,**course): print(home) print(str) print(course)# 可传入任何多个参数 demo("晒兔子", "https://www.cnblogs.com/qingchengzi", "https://www.python.org/", django="https://docs.djangoproject.com/en/dev/", drf="https://www.cnblogs.com/qingchengzi/p/18054793" )
程序输出结果:
晒兔子
('https://www.cnblogs.com/qingchengzi', 'https://www.python.org/')
{'django': 'https://docs.djangoproject.com/en/dev/', 'drf': 'https://www.cnblogs.com/qingchengzi/p/18054793'}
上面程序在调用demo() 函数时,第 1 个参数传递给 home 参数,第 2、3 个非关键字参数传递给 str 元组,最后 2 个关键字参数将由 course 字典接收。
注意,*args 可变参数的值默认是空元组,**kwargs 可变参数的值默认是空字典。因此,在调用具有可变参数的函数时,不一定非要给它们传值。
以调用demo
demo(home="https://docs.djangoproject.com/en/dev/")
程序执行结果为:
https://docs.djangoproject.com/en/dev/
()
{}