python不定长参数_Python 函数参数之不定长参数(*args/**kwargs)、匿名函数 Lambda详解...

Python 调用函数时可使用的正式参数类型:必需参数 (位置参数)、关键字参数 (key=value)、默认参数 (key=default)、不定长参数(可变参数)、强制位置参数(组合传参)

Tips:有兴趣的还可以了解一下什么是形参?什么是实参?

不定长参数  *args **kwargs

Python 在定义函数的过程中,当你可能需要一个函数能处理比当初声明时更多的参数。那么就会用到 *arg、**kwargs 称之为不定长参数,声明时不会命名;

*args 具体语法操作如下:def func(a, *args):

print(a)

print(args)

func(1, 2)

结果输出:

1

(2,)

注意:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

如果在函数调用时没有指定参数,它就是一个空元组:def func(a, *args):

print(a)

print(args)

func(10)

func(1, 2)

结果输出:

结果:

10

()

结果:

1

(2,)

从上面的示例来看,如果传入的参数超过了位置参数,后面的参数都会以元组的来接收,那么如果我们直接传入一个元组参数行不行?t = (1, 2, 3)

def func(a, *args):

print('结果:')

print(a)

print(args)

func(1, 2, t )

结果:

1

(2, (1, 2, 3))

从以上示例来看目前是可以的,但是如果我们需要对参数进行计算或者其他操作的时候呢?下面再来看一个列子:t = (1, 2, 3)

def avg(a, *args):

return (a + sum(args)) / (len(args) + 1)

print(avg(20, t))

结果:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

结果就报错了,原因是因为你直接传入的是一个元组,int类型和元组是不能直接进行计算的,那么怎么解决这个问题?其实很简单看下面的实例:t = (1, 2, 3)

def avg(a, *args):

return (a + sum(args)) / (len(args) + 1)

print(avg(20, *t))

结果:

6.5

其实很简单,只需要在传 t 元组的时候加上一个 * 就可以了,称之为解包,就是把元组打散,分开传入.

*kwargs 具体语法操作如下:d = {'name': 'amy', 'age': 18}

t = (1, 2, 3)

def func(a, *args, **kwargs):

print('结果:')

print(f'位置参数:{a}')

print(f'不定长元组参数:{args}')

print(f'不定长键值对参数:{kwargs}')

func(1, t, d)

结果:

位置参数:1

不定长元组参数:((1, 2, 3), {'name': 'amy', 'age': 18})

不定长键值对参数:{}

咦,发现实际结果并不是我们想要的,键值对的参数跑到元组里面去了,那下面看一下正确的传入方式:t = (1, 2, 3)

def func(a, *args, **kwargs):

print('结果:')

print(f'位置参数:{a}')

print(f'不定长元组参数:{args}')

print(f'不定长键值对参数:{kwargs}')

func(1, t, name='name', age=18)

结果:

位置参数:1

不定长元组参数:((1, 2, 3),)

不定长键值对参数:{'name': 'angst', 'age': 18}

正确的参数传入方式就是通过关键字参数的方式进行传入,这样就达到了我们想要的目的,但是,如果我就是想传入一个字典类型的参数进去怎么办?d = {'name': 'amy', 'age': 18}

t = (1, 2, 3)

def func(a, *args, **kwargs):

print('结果:')

print(f'位置参数:{a}')

print(f'不定长元组参数:{args}')

print(f'不定长键值对参数:{kwargs}')

func(1, t, **d)

结果:

位置参数:1

不定长元组参数:((1, 2, 3),)

不定长键值对参数:{'name': 'amy', 'age': 18}

其实也是可以的,方法跟元组的类似,参数在传入的时候加上 ** 就行了。那么最后一个问题?怎么获取对应不定长参数的值呢?d = {'name': 'amy', 'age': 18}

t = (1, 2, 3)

def func(a, *args, **kwargs):

print('结果:')

print(f'位置参数:{a}')

print(f'不定长元组第一个参数:{args[0][0]}')

print(f'不定长键值对名称参数:{kwargs.get("name")}')

func(1, t, **d)

结果:

位置参数:1

不定长元组第一个参数:1

不定长键值对名称参数:amy

从上面的列子可以看出,其实获取的并没有什么不同,元组通过下标获取,字典通过Key获取。

匿名函数  Lambda

python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。简单来说就是不用给函数定义名称;

> lambda 只是一个表达式,函数体比 def 简单很多。

>lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

>lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

>虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

以上是 菜鸟教程 的解释,下面来看具体的示例:def hello(name):

print(f'hello {name}')

hello('Amy')

angst = lambda name: print(f'hello {name}')

print(angst)

结果输出:

hello Amy

at 0x0000026EE6F34048>

一个是正常的 hello() 函数定义和调用,又定义了一个lambda 函数赋值给了变量 angst,两个函数的实际功能其实是一直的,但是从上面输出的结果来看 angst 出输出的是一个函数对象在内存的地址;其实并没有调用,只是打印了angst 函数变量而已,正确的调用方式其实跟正常的函数一样,在变量后面加上一个()def hello(name):

print(f'hello {name}')

hello('Amy')

angst = lambda name: print(f'hello {name}')

angst('angst')

结果输出:

hello Amy

hello angst

从上面可以看出,其实匿名函数从本质上来说并没有不同,只是使用的场景稍微有些特许而已,由于lambda 函数没有定义名称,所有我们在定义的时候通过会赋值一个变量去引用,之前的变量一般都是一些参数类型,但是通过lambda的形式将函数赋值给变量,通过变量调用该函数时需要带上(),如果有参数就在()传参即可。lambda 的函数一般是用于比较简单的函数表达。lambda 函数还有一个特性就是自带 return 关键字,可以自动把结果返回给函数本身。lambda:None;函数没有输入参数,输出是 None

lambda x, y: x+y;函数输入是x和y,输出是它们的和

lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)

lambda **kwargs: kwagrs.get(key);输入是任意键值对参数,输出是key 对应的value

根据这个lambda函数应用场景的不同,可以将lambda函数的用法有以下几种 参考博客:

1>.将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数,调用时记得带上()

2>.将lambda函数赋值给其他函数,从而将其他函数用该 lambda 函数进行替换.

例:time.sleep=lambda x:None,在后续代码中调用time库的sleep函数将不会执行原有的功能。执行time.sleep(3)时,不会休眠3秒而是None

3>.将lambda函数作为其他函数的返回值,返回给调用者

例如:return lambda x, y: x+y 返回一个加法函数。lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础,在后面的高级教程装饰器中会用到,这里就不描述具体的用法了,后续可以关注我的博客,有专门对阵装饰器的用法讲解。

4>.将lambda函数作为参数传递给其他函数

例:部分Python内置函数接收函数作为参数。map函数:lambda函数用于指定对列表中每一个元素的共同操作。如:map(lambda x: x+1, [1, 2,3])将列表[1, 2,         3]中的元素分别加1,其结果[2, 3, 4]

lambda的使用一直存在一些争议,lambda 函数的好处和局限都很明显,到底要不要使用和什么使用需要自我实践了,只要在合理的时候使用合理的操作才是最合理的。

以上就是匿名函数的一些常用操作,当然还有更多的高级用法,有兴趣的同学可以自行查阅资料。如果有疑问也可以给我留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java第一天上班需要安装那些_明天第一天上班,应该带什么包啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼“下面拍卖的是一位道友在上古遗存下来的仙殿中得到的一盒炫迈!!!!!!!”大厅中顿时一片嘈杂.......拍卖行的老者摆了摆手示意让大家静一静然后慢悠…

java代码例子_程序员快速弄清Java异常体系,拒绝痛苦编程,开发效率加倍

知己知彼方能百战不殆,在小编初学Java时候特别怕程序报异常,经常会因为异常不知所措,相信这个问题应该是所有 初学者都会有的心理感受;如果你也有这种感受,那么只有一种解决方法: 迎难而上,攻克Java异常体系,长痛不如短痛,只要清楚了Java的异常体系,就不会再有这种感受了。下面…

java多条件判断_Java基础教程,第七讲,条件控制、循环语句、数组

学完此次课程,我能做什么?学完此次课程我们将掌握Java中的条件判断和多种循环语句,并且掌握数组的定义和初始化,以及几个常用的数组函数。学习此次课程,需要多久?10分钟课程内容和其他语言一样Java使用条件…

文件上传java前端怎么写_做一个文件上传,前端是ajax提交数据后台是java,这个错误怎么办...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/bazx] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to …

python对文件操作的相关函数_超全!python的文件和目录操作总结

文件的基本读写path rC:UsersBradyDocumentstmpwith open(path rdemo.txt, r, encodingutf-8) as f:content f.read()print(content)open()函数open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)Open file and return a cor…

qq机器人源码_基于Springcloud+vue+oAuth2.0全家桶模拟商城项目源码分享

项目介绍功能点:模拟商城,完整的购物流程、后端运营平台对前端业务的支撑,和对项目的运维,有各项的监控指标和运维指标。技术点:核心技术为springcloudvue两个全家桶实现,采取了取自开源用于开源的目标&…

java静态页面我都做不出_Java高并发:静态页面生成方案

提升网站性能的方式有很多,例如有效的使用缓存,生成静态页面等等。今天要说的就是生成静态页面的方式。这个也是我近期一直在搞的一个问题,近期在做使用html servlet做个人网站,为什么是这2个东西呢?1、直接用servlet…

python 工厂模式与单例模式_python基础单例模式 工厂模式 策略模式 观察者模式...

一、单例模式单例:单个实例,确保某个类只有一个实例存在举例:1、登录app,当前的登录对象,只能有一个2、音乐播放器,正在播放的歌曲类而言,只能有一个实例1 import my_util # 被导入的模块会从…

js sleep函数_简单而面试中又常见的知识点:JS执行机制

在开始讲解之前,我们先来看一段代码:console各位小伙伴觉得上面的结果输出会是多少呢?如果你没有了解过javascript的执行机制的话,上面的题目可能会让你崩溃。不过别着急,先往下看,我保证你看到最后&#x…

护卫神怎么增加php版本_护卫神php套件 php版本升级方法(php5.5.24)

最近小编开始学习研究win2008 r2的php环境配置,发现护卫神的php套件非常好用,安装简单,但是因为php版本不是最新的版本,所以就想将php升级下,因为新版的php修复了一些bug所以这里就分享下方法,需要的朋友可…

servlet中doget和dopost的区别_Servlet学习

一.HTTP协议浏览器 ----------------------------------------->服务器请求 http协议&#xff08;包含&#xff1a;1.请求行2.请求头3.空行4.请求实体&#xff09;url浏览器<-------------------------------------------服务器 响应htmlcssjsdata数据特点&#xff1a; 1…

python numpy dtype object_如何将(dtype = object)numpy数组值设置为Python列表,而不将numpy解释为值列表?...

我有一个dtype object数组,其中的值是Python列表或np.nan.我想用[无](不是无)替换np.nan的值.对于一个纯Python列表,我已经可以使用[x if(x不是np.nan)其他[无] for x in s],并且将数组转换为列表对我来说很好,但是出于好奇,我想知道如何使用numpy数组来完成这项工作.困难在于…

php curl跨域cookie_php使用curl带cookie访问一直失败求助

Launcher:感谢你在百忙中抽空帮我。刚才我做了个对比&#xff1a;1、使用Microsoft Network Monitor 监听apache发送的数据包2、使用Microsoft Network Monitor 截获ie登录目标后台3、使用Microsoft Network Monitor 截获firefox登录目标后台由第一点得到&#xff1a;cookie确实…

python如何用idle启动_Python从IDLE启动的方法

学习Python就要先学会安装和启动&#xff0c;目前Python的启动方法有两种&#xff0c;从IDLE启动是比较常见的&#xff0c;也是小码王老师今天要教大家的&#xff0c;广大家长、小朋友们一起来学习了解一下吧。在Start(开始)菜单中&#xff0c;可以看到“Python2.5”下面的“ID…

java xml 节点路径,SelectSingleNode使用XPath为已知良好的xml节点路径返回null

回答(9)2 years ago我强烈怀疑问题与名称空间有关 . 尝试摆脱名称空间&#xff0c;你会没事的 - 但显然这对你的实际情况没有帮助&#xff0c;我认为这个文件是固定的 .我不记得如何在XPath表达式中指定命名空间&#xff0c;但我确信这是问题所在 .编辑&#xff1a;好的&#x…

php fastcgi exp,nginx +phpfastcgi 环境下 导出excel文件,超时,数据被截断问题,解决...

nginx 错误日志显示&#xff0c;访问超时2015/09/16 07:18:43 [error] 2108#0: *6 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.138.7, server: localhost, request: "GET /test/index.php?mlists.e…

python爬虫软件安装不了_Mac os 下 python爬虫相关的库和软件的安装

由于最近正在放暑假&#xff0c;所以就自己开始学习python中有关爬虫的技术&#xff0c;因为发现其中需要安装许多库与软件所以就在这里记录一下以避免大家在安装时遇到一些不必要的坑。一. 相关软件的安装&#xff1a;1. homebrew:homebrew 是mac os系统下的包管理器由于功能齐…

php中文删除乱码部分,PHP中文乱码解决办法

一&#xff0e; 首先是PHP网页的编码1. php文件本身的编码与网页的编码应匹配a. 如果欲使用gb2312编码&#xff0c;那么php要输出头&#xff1a;header(“Content-Type: text/html; charsetgb2312")&#xff0c;静态页面添加&#xff0c;所有文件的编码格…

hdfs 多租户_【技术干货】常见的HDFS面试问答精选

最常见的HDFS面试问答1. 什么是HDFS&#xff1f;答&#xff1a;HDFS代表Hadoop分布式文件系统&#xff0c;该系统将大型数据集存储在Hadoop中。它可以在商用硬件上运行&#xff0c;并且具有很高的容错能力。HDFS遵循主/从体系结构&#xff0c;其中许多计算机在集群上运行。群集…

python装饰器常见问题_python 装饰器常见用法

跟踪调用class tracer: # State via instance attributesdef __init__(self, func): # On decoratorself.calls 0 # Save func for later callself.func funcdef __call__(self, *args, **kwargs): # On call to original functionself.calls 1print(call %s to %s % (self…