(二十)python 3 匿名函数

匿名函数lambda

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。

无参数
# 使用def定义函数的方法
def true():return True#等价的lambda表达式
>>> lambda :True
<function <lambda> at 0x0000000001E42518># 保留lambda对象到变量中,以便随时调用
>>> true = lambda :True
>>> true()
True
一个参数 
# 使用def定义的函数
def add( x, y ):return x + y# 使用lambda的表达式
lambda x, y: x + y# lambda也允许有默认值和使用变长参数
lambda x, y = 2: x + y
lambda *z: z# 调用lambda函数
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')

lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多  

lambda表达式是可以嵌套的(闭包)

>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15

匿名函数的使用  

匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

filter函数

>>> list = [1, 2, 3]
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]
>>> result = [x for x in list if x%2==0]
>>> result
[2]

map函数

>>> result = map(lambda x: x*2, list)
>>> result
[2, 4, 6]
>>> result = [x*2 for x in list]
>>> result
[2, 4, 6]

reduce函数

>>> result = reduce(lambda x, y: x+y,list)
>>> result
6
>>> result = sum(list)
>>> result
6

跳转表(jump table) 

lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。

>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}

[key]() 8

  

注意问题:

x = 10
a = lambda y: y + xx = 20 
b = lambda y: y + x#猜想一下:a(10) 和 b(10)返回的结果是什么?如果你认为结果是20 和 30,那么就错了print(a(10))  ##输出:30print(b(10))  ##输出:30

lambda表达式中的x是一个自由变量, 是在运行时绑定值,而不是定义时就绑定,即lambda表达式中的x是执行时的值,这与函数的默认值参数定义是不同的。例如:

x = 15
print(a(10))  ##输出:25x = 3
print(a(10)) ##输出:13

如果想让匿名函数,在定义时就捕获到参数值,可以将那个参数值定义成默认参数即可,例如:

m = 4
c = lambda n, m = m: m + nprint(c(10))  ##输出:14m = 2
print(c(10))  ##输出:14

  

有时候,可能会不恰当的使用lambda表达式。 比如,通过在一个循环或列表推导中创建一个lambda表达式列表,并期望函数能在定义时就记住每次的迭代值。例如:

funcs = [lambda x: x+n for n in range(3)]
for f in funcs:print(f(0))# 2
# 2
# 2

但是实际效果是,n的值为迭代的最后一个值。将参数值设置为默认参数,才能得到想要的效果,修改代码如下:

funcs = [lambda x, n = n: x+n for n in range(3)]
for f in funcs:print(f(0))# 0
# 1
# 2

  

 

转载于:https://www.cnblogs.com/a-ant/p/11030145.html

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

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

相关文章

docker中启动关闭删除所有的容器命令

docker中 重启启动所有的容器命令 docker restart $(docker ps -a | awk { print $1} | tail -n 2)docker中 启动所有的容器命令 docker start $(docker ps -a | awk { print $1} | tail -n 2)docker中 关闭所有的容器命令 docker stop $(docker ps -a | awk { print $1} | …

真香警告!2021Android高级面试题,挥泪整理面经

前言 这是“拔剑金九银十”的第二篇文章&#xff0c;本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理。 希望可以对你们有所帮助。不多废话&#xff0c;进入正题。 目录&#xff1a; Java中高级 计算机网络 Android高级面试—性能优化 Android优秀第三方…

51nod1584加权约数和

题目大意&#xff1a; 求:\[ \sum_{i-1}^n\sum_{j1}^nmax(i,j)\sigma(i*j) \] 题解 对于这个\(\max\)&#xff0c;套路的把它转化成&#xff1a;\[ 2*\sum_{i1}^n\sum_{j1}^ii*\sigma(i*j)-\sum_{i1}^n i*\sigma(i*i) \] 对于前面的部分&#xff0c;我们可以&#xff1a;\[ \su…

冗余的阿里云实例开启和停止API

停止使用的API URL:https://api.aliyun.com/?spm5176.12818093.resource-links.dapi_platform.488716d0OrHCwQ#/?productEcs&version2014-05-26&apiStopInstance&tabDEMO&langJAVA 启动实例&#xff1a; URL:https://api.aliyun.com/?spm5176.12818093.re…

知乎大V推荐!面试官6个灵魂拷问,原理+实战+视频+源码

概述 想了很久怎么样可以让文章的标题不那么悲观&#xff0c;但是各种文案都在我脑海里面不断的被否定&#xff0c;要么是不那么抓眼球&#xff0c;要么是立意不匹配。最后想了想&#xff0c;这个标题是真的符合我最近的感悟。 希望看过文章&#xff0c;能有同感的朋友也能多…

Codeforces Round #499 (Div. 1) Solution

Codeforces Round #499 (Div. 1) Solution https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm specialist....\) A. Fly 二分答案&#xff0c;送分题。 #include<bits/stdc.h> using namespace std;void read(int &x) {x0;int f1;char ch…

Windows10家庭版安装Docker Desktop(非Docker Toolbox)

现在大部分笔记本预装的都是win10家庭版&#xff0c;而家庭版又不支持Hyper-V&#xff0c;Docker Desktop是无法直接安装的。但其实家庭版是可以通过脚本开启Hyper-V来安装Docker Desktop的。下面就教大家如何操作。 开启Hyper-V 添加方法非常简单&#xff0c;把以下内容保存…

阿里P7手把手教你!阿里P7级别面试经验总结,搞懂这些直接来阿里入职

什么是中年危机 根据权威数据显示&#xff0c;国内IT程序员鼎盛时期是在25-27岁左右&#xff0c;30岁对于程序员而言完全是一个38线&#xff0c;接着就是转业转岗的事情&#xff0c;这一点在业界也算是一个共识了。 大学毕业步入IT行业普遍年龄也是在22岁左右&#xff0c;然而…

自适应阈值化操作:adaptiveThreshold()函数

在图像阈值化操作中&#xff0c;更关注的是从二值化图像中&#xff0c;分离目标区域和背景区域&#xff0c;但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值&#xff0c;则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处&#xf…

阿里P8亲自教你!Activity的6大难点,你会几个?年薪50W

前言 网上有很多对程序员简历的一些指导&#xff0c;这里就不重述&#xff0c;大家可以搜下网上其他大神的总结&#xff0c;结合自身情况修改下。我有几点建议&#xff1a; 1.尽量不要花哨&#xff0c;程序员和设计师或者产品运营还不一样&#xff0c;我们的简历成功与否决定…

为什么选用NACOS

Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如…

Qt样式表之一:Qt样式表和盒子模型介绍

一、Qt样式表介绍 Qt样式表是一个可以自定义部件外观的十分强大的机制&#xff0c;可以用来美化部件。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表&#xff08;Cascading Style Sheets, CSS)的启发&#xff0c;不过与CSS不同的是&#xff0c;Qt样式表应用于部件的世界…

阿里P8大佬亲自教你!Android内存泄漏总结,看看这篇文章吧!

前言 这次去腾讯面试的是我大学同学&#xff0c;我们大学都是一学习&#xff0c;一起吃饭&#xff0c;一起洗脚&#xff0c;一起。。。 他们公司最近也裁员了&#xff0c;不过他是裁员前去的腾讯&#xff0c;不知道谁捞到他简历了&#xff0c;莫名就走了流程&#xff0c;他莫…

Sentinel在订单大量服务调用的应用场景

Sentinel译为“哨兵”&#xff0c;顾名思义&#xff0c;面对您后台的大量服务/微服务&#xff0c;前置一个哨兵&#xff0c;但面对大量请求时&#xff0c;让后台服务有序被调用&#xff0c;但某些服务的不可用时&#xff0c;采用服务熔断降级等措施&#xff0c;让系统仍能平稳运…

leetcode 214 Shortest Palindrome

lc214 Shortest Palindrome 可以将问题转化成找到原字符串的最长palindrome子串&#xff08;注意&#xff0c;子串必须以s[0]为起始&#xff09; 例如&#xff1a;sdserf sds为最长palindrome子串 只需要将sds之后的子串翻转一下&#xff0c;补充到原字符串之前即可 fre sdser…

程序员深度学习!我想谈谈关于Android面试那些事,附赠课程+题库

想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样~。 25%的面试官会在头5分钟内决定面试的结果60%的面试官会在头15分钟内决定面试的结果 一般来说&#xff0c;一场单面的时间在30分钟左右&…

MOSS 代替Spring Boot Admin 的服务治理工具

1.1 什么是服务治理 服务治理&#xff0c;我也称之为微服务治理&#xff0c;是指用来管理微服务的整个生命周期。包括应用的创建&#xff0c;服务名的规范&#xff0c;服务的上下线&#xff0c;服务的迁移&#xff0c;整个服务的生老病死等方方面面的治理。 1.2 Moss概述 Mo…

Django之form表单组件、cookie与session

---恢复内容开始--- Form表单组件 引例&#xff1a; 先来看一个注册的例子&#xff0c;全部用的是reg函数来实现的。 views.py文件 def reg(request):errors {username:,password:}if request.method POST:username request.POST.get(username)password request.POST.get(p…

程序员经验分享:Android高级工程师系列学习路线介绍,面试必备

前言 曾听过很多人说Android学习很简单&#xff0c;做个App就上手了&#xff0c;工作机会多&#xff0c;毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期&#xff0c;工作主要是按照业务需求实现App页面的功能&#xff0c;按照设…

Java实现将文件或者文件夹压缩成zip

Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求&#xff0c;于是我在网上找了下别人写好的zip工具类。但找了好多篇博客&#xff0c;总是发现有bug。因此就自己来写了个工具类。 这个工具类的功能为&#xff1a; &#xff08;1&#xff09;可以压缩文件…