python函数中*args和**kwargs的作用和意义

一、背景

在使用python编程过程中,项目的完成离不开每个函数的功劳,因此函数就是编程的生命!然而,函数定义中的*args和**kwargs参数会让许多刚接触python的coder不知所措,所以这里讲一下python函数中这两个参数的作用和意义。

二、*args位置参数

*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也是可以自定义的,你也可以使用其他的,但编程人员都约定俗成的使用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

python函数中*args和**kwargs的作用和意义_第1张图片

你可能感兴趣的:(python)