首页 > 编程语言 >Python深入理解*和**含义和应用

Python深入理解*和**含义和应用

时间:2024-05-03 16:22:20浏览次数:34  
标签:函数 Python 含义 args 入参 参数 kwargs 深入

本文源代码:https://gitee.com/obullxl/PythonCS/tree/master/CS-CY2405

Python中*和**很常见

禅师在阅读Python代码过程中,经常看到一个函数或方法的入参是*args**kwargs(如:def func(*args, **kwargs)等)形式,或者在调用函数或方法时,在入参的元组和列表前面增加1个*号(如:func(*(1, 2, 3))等),或者在字典类型入参前面增加2个*号(如:func(**{'x':1, 'y':2, 'z':3})等)。

刚开始看到参数前面*号,禅师一度以为是C/C++中的指针,但在万物皆对象的Python种,指针是不会存在的。本文我们一起来看看1个*号和2个**号的含义和用法,也让我们来感受一下Python灵活性有多强大。

位置参数和命名参数

在了解函数入参*args**kwargs之前,我们首先要了解一下函数或方法的位置参数和命名参数,以函数定义def func(a, b, c, x=None, y=None, z=None)为例:

  • 位置参数通俗的讲就是参数的位置的固定的,与函数或方法的参数名无关,比如函数或方法的第1个参数、第2个参数等。样例函数的a/b/c入参就是位置参数,他们分别在函数的第1到第3个参数。Python语法规定,位置参数只能在函数或方法前面的参数(即中间不能有位置参数)。

  • 命名参数通俗的讲就是参数是有名字,在调用函数或方法时,需要指定参数的名称,命名参数可以有默认值。样例函数的x/y/z入参就是命名参数,x/y/z就是参数的名称,且他们均有None默认值。Python语法规定,位置参数只能在函数或方法后面的参数(即中间不能有位置参数)。

1个*和2个**的作用

其实从函数入参能看出来,1个*是位置参数,2个**是命名参数,那么它们到底有什么作用呢:

  • 函数或方法的定义,如def func(*args, **kwargs)1个*的作用是收集调用本函数的所有的位置参数,收集后的类型是元组;2个**的作用也是参数收集,只是收集的是命名参数,收集后的结果是字典(在Java中称为Map)。

  • 函数或方法的调用,如func(*(1, 2, 3), **{x=4, y=5, z=6}):*的作用是拆解,与收集相反;其中,1个*为把元组或列表按照顺序拆开,作为位置入参,2个**则把字典按照命名参数拆开。

例:定义函数或方法(参数收集)

def mfunc(*args, **kwargs):
    '''
    函数定义:收集参数,*把所有的位置参数收集到一个元组中,**则把最后的命名参数组装成Map字典。
    '''
    print(f'{type(args)} args = {args}')
    print(f'{type(kwargs)}  kwargs = {kwargs}')


mfunc()
mfunc(1, 2, 3, x='a', y='b')
mfunc(1, 2, ('t1', 't2'), ['t1', 't2'], {'k1': 'v1', 'k2': 'v2'}, x='a', y='b')

'''
入参拆解参数,定义收集参数,相互抵消,无实际意义。
'''
mfunc(*(1, 2, 3), **{'k1': 'v1', 'k2': 'v2'})

例:调用函数或方法(拆解或映射)

def mprint(x, y):
    '''
    函数调用:拆解参数,*把元组或列表按照顺序拆开,作为入参,**则把Map字典按照命名参数拆开。
    '''
    print(f'{type(x)} x = {x}')
    print(f'{type(y)} y = {y}')


mprint(*(1, 2))
mprint(*((1, 2), 3))
mprint(**{'x': 'x1', 'y': 'y1'})

特别注意:拆解位置参数数量需要与函数或方式定义一致,或者拆解命名参数的参数名需要与定义一致!

禅定:Python为什么需要*和**?

从前面的分析可以看出***的作用和用法,Python中它们是必须的吗?禅师答案:

  • 函数和方法定义中是必须的:举个反射的简单场景,函数入参的个数、类型是动态的,因此需要收集(如:Java中为Object[]数组)

函数和方法调用是可选的,目的是为了简化编程(Python之禅:Beautifulis better than ugly.),不需要手工逐个参数设置,如调用函数入参func(*my_lsit, **my_dict)就明显比func(my_list[0], my_list[1], my_list[2], my_dict['x'], my_dict['y'], my_dict['z'])优雅太多了。


我的本博客原地址:https://ntopic.cn/p/2024050201


微信公众号:Python禅师

标签:函数,Python,含义,args,入参,参数,kwargs,深入
From: https://www.cnblogs.com/obullxl/p/18170925/NTopic2024050201

相关文章

  • python批量get pikachu的shell脚本模板
    声明:工具仅用于技术交流,请勿运行该脚本!!若造成损失,一切后果由使用者承担'''EXP:getshellusepikachu'''importrequests###############......
  • python教程2:if...else...+循环
    一、if判断有单分支、双分支、多分支,下面就是一个多分支的案例:二、缩进三、for循环四、while循环 五、其他random模块 string模块 ......
  • python web密码爆破脚本
    如下#-*-coding:utf-8-*-'''肉机爆破密码脚本由于是面向肉机的脚本,所以牺牲了一些速度,增加了准确性程序挂肉机上然后去睡觉等结果嘛从这里复制了代码:https://blog.csdn.net/tempulcc/article/details/108323499对于没pip的机器,可把模块打包成zip,上传的机器上用unz......
  • python教程2:变量+数据类型+运算符
    一、变量程序是从上到下依次逐⾏执⾏的,所以变量必须先定义,后调⽤,否则会报错变量定义规范 二、数据类型1、数字类型可⽤type()⽅法来查看数据类型 2、字符串多引号多引号什么作⽤呢?作⽤就是多⾏字符串必须⽤多引号字符串拼接3、布尔类型布尔类型很简单,就两个......
  • Python高阶---协程
    协程:协程,又称微线程。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。=============================交替执行defconsumer():r=''while......
  • https://geek-docs.com/python/python-ask-answer/74_hk_1707485473.html
    Python中的b是什么介绍 在Python中,我们经常会看到一种奇特的表示方法,即以字符’b’开头的字符串,例如b'Hello'。这种表示方法在Python中被称为字节字符串(bytestring),简称为b字符串。在本文中,我们将详细介绍b字符串的特点、用途和常见应用场景。b字符串的特点字节字符串以字......
  • python教程1:环境安装+代码编辑器安装
    1、环境安装打开官⽹https://www.python.org/downloads/windows/下载中 下载后执⾏,点击下⼀步安装就⾏,注意选择添加Python到当前⽤户环境变量 2、代码编辑器安装 下载地址:https://www.jetbrains.com/pycharm/download选择Professional专业版  最后破解激......
  • AWS S3 Lambda Python脚本函数实现图片自动转换为webp并上传至s3
    AmazonS3自动转换图片格式 AmazonS3存储桶新增文件自动触发AWSLambda。Lambda取S3文件做转换并存回去S3同一个目录下,并增加相应的后缀名。并且支持通过APIGateway的方式触发对图片进行修改并输出。本Lab使用PythonPillow做图片转换,读者可以参考Pillow文档......
  • Python之禅,开宗明义:import this
    #!/usr/bin/envpythonimportthisPython之禅:TheZenofPython,byTimPetersBeautifulisbetterthanugly.Explicitisbetterthanimplicit.Simpleisbetterthancomplex.Complexisbetterthancomplicated.Flatisbetterthannested.Sparseisbette......
  • 随机森林Adaboosting算法与Python实现(二)
    AdaBoost是Freund和Schapire于1996年提出的一种集成学习方法。它的核心思想是通过迭代训练一系列弱分类器,每次调整样本权重以便更好地拟合被前一轮分类器错误分类的样本,从而构建一个强分类器。最终的模型是基于这些弱分类器的加权组合。AdaBoost广泛应用于二分类和多分类问题,尤其......