python中的关键字参数*args和**kwargs详解

 更新时间:2023年11月03日 10:08:36   作者:惊瑟  
这篇文章主要介绍了python中的关键字参数*args和**kwargs详解,在定义类或函数时,有时候会用到*args和**kwargs,前者叫位置参数,后者叫关键字参数,需要的朋友可以参考下

一、使用场景

在定义类或函数时,以下场景会用到*args和**kwargs,前者叫位置参数,后者叫关键字参数

  1. 不确定传入参数的数量或形式
  2. 不关心传入参数的数量或形式(此时该类或函数多作为一个中间件的角色,接收参数后只是做了一些预处理,最后将这些参数传递给其他类或函数做进一步处理,如装饰器)

二、使用方法

基本使用:

def receive_args(*args, **kwargs):
    print(f'args type is: {type(args)}, value is: {args}')
    print(f'kargs type is: {type(kwargs)}, value is: {kwargs}')

if __name__ == '__main__':
    receive_args(0,name='jyz')

输出:

args type is: <class 'tuple'>, value is: (0,)
kargs type is: <class 'dict'>, value is: {'name': 'jyz'}

由此我们得出:args本质是一个tuple,kwargs本质是dict,值得注意的是,*是在定义函数的形式参数时用来标志参数的类型(位置参数还是关键字参数),在函数体内要拿到真正的参数需要将*去掉。

传入多个参数

def receive_args(*args, **kwargs):
    print(f'args type is: {type(args)}, args[0] is: {args[0]}, args[1 ] is: {args[1]},args[2] is: {args[2]}')
    print(f"kwargs type is: {type(kwargs)}, name is: {kwargs['name']}, gender is: {kwargs['gender']}")

if __name__ == '__main__':
    receive_args(0,1,2,name='jyz',gender='male')

输出:

args type is: <class 'tuple'>, args[0] is: 0, args[1 ] is: 1,args[2] is: 2
kwargs type is: <class 'dict'>, name is: jyz, gender is: male

由于args本质是一个tuple,kwargs本质是dict,因此可以在函数中对它们直接进行操作。

容易出错的地方

def receive_args(*args, **kwargs):
    print('args is: ',args)
    print('kwargs is: ',kwargs)
    
if __name__ == '__main__':
    a = 0
    b = 1
    d = {'name':'jyz','gender':'male'}
    receive_args(a,b,d)

输出:

args is:  (0, 1, {'name': 'jyz', 'gender': 'male'})
kwargs is:  {}

出乎意料的是,receive_args并未将d当做kwargs,而是作为args。而如果想要将字典类型作为关键字变量传到函数中去,需要在变量前使用**做额外的标志:

def receive_args(*args, **kwargs):
    print('args is: ',args)
    print('kwargs is: ',kwargs)

if __name__ == '__main__':
    a = 0
    b = 1
    d = {'name':'jyz','gender':'male'}
    receive_args(a,b,**d) # d前用**做标志

输出:

args is:  (0, 1)
kwargs is:  {'name': 'jyz', 'gender': 'male'}

三、结论

  1. args本质是一个tuple,kwargs本质是dict;
  2. 传入关键字参数时,要么使用key=value形式传递;要么先定义dict再使用**dict传递。

到此这篇关于python中的关键字参数*args和**kwargs详解的文章就介绍到这了,更多相关python中的*args和**kwargs内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用IPython下的Net-SNMP来管理类UNIX系统的教程

    使用IPython下的Net-SNMP来管理类UNIX系统的教程

    这篇文章主要介绍了使用IPython下的Net-SNMP来管理类UNIX系统的教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • Python模块的加载讲解

    Python模块的加载讲解

    今天小编就为大家分享一篇关于Python模块的加载讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • python之pkl文件的用法及说明

    python之pkl文件的用法及说明

    这篇文章主要介绍了python之pkl文件的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python+matplotlib绘制多子图的方法详解

    Python+matplotlib绘制多子图的方法详解

    Matplotlib是Python中最受欢迎的数据可视化软件包之一,它是 Python常用的2D绘图库,同时它也提供了一部分3D绘图接口。本文将详细介绍如何通过Matplotlib绘制多子图,需要的可以参考一下
    2022-07-07
  • Python类和对象的定义与实际应用案例分析

    Python类和对象的定义与实际应用案例分析

    这篇文章主要介绍了Python类和对象的定义与实际应用,结合三个具体案例形式分析了Python面向对象程序设计中类与对象的定义、应用、设计模式等相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • 基于PyQt实现多页面切换的详细教程

    基于PyQt实现多页面切换的详细教程

    在实际桌面应用开发中,页面切换不仅仅是简单的按钮切换,往往还涉及到页面间的数据传递、动态内容更新、以及更复杂的UI布局,本文将基于PyQt的QStackedWidget,详细讲解如何实现多页面切换,需要的朋友可以参考下
    2025-12-12
  • 让你一文弄懂Pandas文本数据处理

    让你一文弄懂Pandas文本数据处理

    文本数据具有数据维度高、数据量大且语义复杂等特点,是一种较为复杂的数据类型,下面这篇文章主要给大家介绍了关于Pandas文本数据处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python实现希尔排序算法的原理与用法实例分析

    Python实现希尔排序算法的原理与用法实例分析

    这篇文章主要介绍了Python实现希尔排序算法,简单讲述了希尔排序的原理并结合具体实例形式分析了Python希尔排序的具体实现方法与使用技巧,需要的朋友可以参考下
    2017-11-11
  • 教你用python编写脚本实现自动签到

    教你用python编写脚本实现自动签到

    这篇文章主要介绍了教你怎样用python编写脚本实现自动签到,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • python实现360的字符显示界面

    python实现360的字符显示界面

    这篇文章主要介绍了python实现360的字符显示界面示例,需要的朋友可以参考下
    2014-02-02

最新评论