在使用python编程过程中,项目的完成离不开每个函数的功劳,因此函数就是编程的生命!然而,函数定义中的*args和**kwargs参数会让许多刚接触python的coder不知所措,所以这里讲一下python函数中这两个参数的作用和意义。
*args定义:打包所有的参数到一个元组(tuple),这是非常有用的,因为可以使函数接受任意数量的参数。
注意:args是自定义的,并不是保留字,你也可以使用其他的,但编程人员都约定俗成的使用args表示参数(因为参数的英文单词是:arguments)
不成功的例子:
# *args = parameter that will pack all arguments into a tuple
# useful so that a function can accept a varying amount of arguments
def add(num1, num2):
sum = num1 + num2
return sum
print(add(5,6))
运行上述程序,可以得到结果11。但是如果再添加一个参数,如最后一行改为print(add(5,6,8))
,程序则会报错TypeError: add() takes 2 positional arguments but 3 were given
,意思是add函数仅能传入两个位置参数,但我们却给了三个。这时,就要用到神奇的*args了。
改进后的例子:
# *args = parameter that will pack all arguments into a tuple
# useful so that a function can accept a varying amount of arguments
def add(*args):
sum = 0
for i in args:
sum += i
return sum
print(add(5,6,7))
代码解析:定义一个add函数,*args代表可以传入任意多个参数到add函数;令sum=0;开始循环,如果i在参数args内,则执行sum=sum+i操作;返回sum;最后是打印add(5,6,7),结果为18,此时最后一行print中的add函数可以传入任意多个参数。
同理,kwargs也是可以自定义的,你也可以使用其他的,但编程人员都约定俗成的使用kwargs表示关键字参数(因为关键字参数的英文单词是:keyword arguments), 重要的是前面的两个星号。
**kwargs定义:打包所有的参数到一个字典(dictionary),这是非常有用的,因为可以使函数接受任意数量的关键字参数。此外, **kwargs 只能在参数列表的最后一位,他的后面不能跟任意的参数。即def add(a,b,*args,debug=True,**kwargs):
不成功的例子:
# **kwargs = parameter that will pack all arguments into a dictionary
# useful so that a function can accept a varying amount of keyword arguments
def hello(first, last):
print("Hello " + first +" " + last)
hello(first = "Li", last= "Ming")
此时程序没问题,输出Hello Li Ming
。但如果一个人的名字是三个字,比如叫李小明,便没法正常输出了。这时,就要用到神奇的*kwargs了。
成功的例子:
def hello(**kwargs):
print("Hello ",end="")
for key,value in kwargs.items():
print(value,end="")
hello(first = "Li", middle= "Xiao",last= "Ming")
另外一个**kwargs例子:
# **kwargs = parameter that will pack all arguments into a dictionary
# useful so that a function can accept a varying amount of keyword arguments
def add(a,b,*args,debug=True,**kwargs):
result = a+b
if debug:
print(args)
if 'name' in kwargs:
print(kwargs['name'])
if 'old' in kwargs:
print(kwargs['old'])
for arg in args:
result += arg
if debug:
print(result)
return result
add(1,2,3,debug=True,name='test',old= 'six')
这个程序很简单,就不解释了,只要清楚一点就可以,*args可以传入任意数量的位置参数,**kwargs可以传入任意数量的关键字参数。
该程序输出结果为:
(3,)
test
six
6