• 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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行上述程序,可以得到结果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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    代码解析:定义一个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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此时程序没问题,输出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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    另外一个**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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这个程序很简单,就不解释了,只要清楚一点就可以,*args可以传入任意数量的位置参数,**kwargs可以传入任意数量的关键字参数。

    该程序输出结果为:

    (3,)
    test
    six
    6
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    x86_64、AArch64、ARM32、LoongArch64、RISC-V
    18.基于Consul的服务发现和ConsulManager管理
    xss跨站脚本攻击
    Qt——常用控件详解
    Python爬虫之续Urllib && Jsonpath库的使用
    「入门篇」初识JVM (下下) - GC
    C语言连接MySQL
    软件测试的分类
    面试分享 | 护网蓝队面试经验
    董事长、CEO、总裁、总经理、总监的区别
  • 原文地址:https://blog.csdn.net/Time_Memory_cici/article/details/133278895