Python中 *args 和 **kwargs 参数的深度解析及其区别探究

文章目录

  • 一、概述
  • 二、位置参数和关键字参数
  • 三、*args
  • 四、**kwargs
  • 五、*args 和 **kwargs 结合
  • 六、总结
  • 一、概述

    在Python编程中经常会见到函数参数中有*args**kwargs这两个参数,两个参数都表示可以接受不定数量的参数,那么它们到底有啥区别呢,在使用的时候如何选择?本文主要介绍*args**kwargs两个参数的区别和用法。

    def len(*args, **kwargs): 
        pass
    

    简单的说

  • args(arguments):位置参数。
  • kwargs(keyword arguments):关键字参数
  • 可变长度的参数主要有 *args**kwargs 两种。

  • *args:表示任意个位置参数,将参数打包成元组(tuple)给函数体调用
  • **kwargs :表示任意个关键字参数,将参数打包成字典(dict)给函数体调用,实际上是k=v 形式的键值对
  • 二、位置参数和关键字参数

    更多位置参数与关键字参数的用法参考python中的*与**用法详解

  • 位置参数:函数传入的参数与实际函数的参数在位置和定义的含义需要保持一致(实参位置和形参保持一致,按形参声明的先后顺序一一赋值)
  • # 自定义函数
    def func(a, b):
        print(a + b)
     
    # 实际调用调用,位置一一对应
    func(1,2)
    func(2,1) # 顺序变化后,实参中的a,b就不一样了。
    
  • 关键字参数:调用函数(key=value)以键值对形式(实参的顺序无所谓)。如果参数有*args和**kwargs,则应保持(*args,**kwargs)
  • # 自定义函数
    def func(a, b):
        print(a + b)
     
    # 实际调用调用,关键字通过字典的形式传输
    func(a=1, b=2)
    func(b=2, a=1)  #顺序可以调换,调换后实参中的a,b值不变。
    

    如果两者参数(位置参数和关键字参数)混合使用,关键字参数必须在位置参数的后面

    至于为什么要在后面,通过结合位置参数以及关键字的参数原理:

  • 位置参数:实参和形参位置保持一致,按形参声明的先后顺序一一赋值,否则会出错
  • 关键字参数:调用函数以形参=实参的方式,(实参的顺序无所谓)
    具体看完整例子:
  • # 自定义函数
    def func(a, b):
        print(a + b)
     
    # 混合使用,正确调用输出
    func(1, b=2)
    
    # 混合使用,错误调用,无法输出
    func(a=1, 2)  #关键字参数要在位置参数后面,否则报错。
    

    三、*args

    如果在参数名前加*,代表这个参数为可变参数

    *args是用来接收任意数量的位置参数的,它将传入的参数以元组(tuple)的形式存储。

    示例如下:

    # 自定义函数
    def func(*args):
        print(args, type(args))
    
    # 调用函数,传入2个数值
    func(1, 2)  # 输出的内容为 (1, 2) <class 'tuple'> ,通过元组的格式进行存储
    

    既然已经知道以元组的格式进行存储
    可以通过自定义一个元组之后传入参数

    # 定义元组
    tuple = (1, 2)
    
    # 调用函数
    func(*tuple)
    

    func(*tuple)指的是将元组拆分成单个元素,等价于func(1,2), 关于*tuple更多用法可参考python中的*与**用法详解

    四、**kwargs

    **kwargs 允许函数接受任意数量的关键字参数。这些参数在函数内部以字典(dictionary)的形式存在,整体赋值给变量名为**kwargs

    具体例子如下:

    # 自定义函数
    def func(**kwargs):
        print(kwargs,type(kwargs))
    
    # 调用函数,传入2个数值
    func(a=1 , b=2)  # 输出的内容为 {'a': 1, 'b': 2} <class 'dict'> ,通过字典的格式进行存储
    

    既然已经知道是字典的格式存储,可以自定义一个字典

    # 定义字典
    dict = {
    	'a': 1,
    	'b': 2
    }
    
    # 调用函数
    func(**dict)
    

    五、*args 和 **kwargs 结合

    注意点:参数arg*args**kwargs三个参数如果要一起使用的话,必须为(arg,*args,**kwargs)这个顺序,否则程序会报错。

    示例如下:

    # 自定义函数,包含*args和**kwargs
    def func(arg, *args, **kwargs):
        print(arg)    # 输出 1
        print(args)   # 输出 (2, 3)
        print(kwargs) # 输出 {'a': 4,'b': 5}
    
    # 调用函数,传入arg、args以及kwargs参数
    func(1, 2,3, a=4,b=5)
    

    已经知道一个是位置参数一个是关键字参数

    可以自定义一个元组以及字典的类型:

    # 定义元组以及字典类型
    tuple = (1, 2,3)
    dict = {
    	'a': 1,
    	'b': 2
    }
    
    # 调用函数,传入参数
    # 注意位置参数和关键字参数的顺序
    func(*tuple , **dict)
    
    def func(self, *args, **kwargs):
          if args:
              for name in args:
                  print(f"Hello, {name}!")
          if kwargs:
              for name in kwargs.values():
                  print(f"Hello, {name}!")
    

    六、总结

  • *args 处理位置参数(参数的顺序很重要)。**kwargs 处理关键字参数(参数的名称和对应的值很重要)。
  • *args 在函数内部是一个元组,你可以使用索引或循环来访问其中的元素。**kwargs 在函数内部是一个字典,你可以通过键来访问其中的值。
  • 在调用函数时,使用 * 来解包列表或元组,将其作为位置参数传递。使用 ** 来解包字典,将其作为关键字参数传递。
  • 作者:五月天的尾巴

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中 *args 和 **kwargs 参数的深度解析及其区别探究

    发表回复