深入理解lambda函数及其用法

碧水幽幽泉 碧水幽幽泉     2022-10-04     420

关键词:

Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?
当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。

先来看个简单lambda函数

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x和y是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?
这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能。

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常规函数

>>> def add2(x, y):
...     return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

lambda使用场景:

#1.函数式编程:
例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函数sorted支持接收一个函数作为参数,该参数作为 sorted的排序依据,这里按照列表元素的绝对值进行排序。

当然,我也可以用普通函数来实现:
>>> def foo(x):
...     return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不过是这种方式代码看起来不够 Pythonic 而已。

lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,可以用在任何需要函数的地方:
>>> add = lambda x,y : x+y
>>> add(5,6)
11
>>> (lambda x,y:x+y)(5,6)
11

#2.Python中最常见的filter筛选、map小刷子、reduce合并,都可以用lambda表达式来生成!
对于序列来讲,有三个函数式编程工具: filter()、map()和reduce()。

map(function,sequence):把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。如果function有两个参数,即map(function,sequence1,sequence2)。
 
#求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) #Python2.x使用map(lambda x:x*x,range(1,21))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

filter(function,sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回。
 
#求1~20之间的偶数
>>> list(filter(lambda x:x%2 == 0,range(1,21))) #Python2.x使用filter(lambda x:x%2 == 0,range(1,21))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

reduce(function,sequence):function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。
 
#求1~100之和
>>> from functools import reduce          #Python3.x之后需要导入reduce模块
>>> reduce(lambda x,y:x+y,range(1,101))
5050

#求1~100之和,再加上10000
>>> reduce(lambda x,y:x+y,range(1,101),10000)
15050

#3.闭包
闭包:一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。

来看一个用lambda函数作为闭包的例子。
>>> def add(n):
...     return lambda x:x+n
...
>>> add2 = add(5)
>>> add2(15)
20

这里的lambda函数就是一个闭包,在全局作用域范围中,add2(15)可以正常执行且返回值为20。之所以返回20是因为在add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。

 

深入理解lambda

概述  Lambda是一个表达式,也可以说它是一个匿名函数。然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。下面就来说说Lambda是如何进行转换和工... 查看详情

深入理解lambda的奥秘

...然是JDK1.8。所以,我们有必要聊一聊Java8的一些新特性。深入理解lambda的奥秘深入理解Stream之原理剖析深入理解Stream之foreach源码解析深入浅出NPE神器Optional谈谈接口默认方法与静态方法深入浅出重复注解与类型注解深入浅出JVM元... 查看详情

匿名函数及其使用(代码片段)

参考文章匿名函数python使用lambda创建匿名函数:lambda函数拥有自身的命名空间,且不能访问自有参数列表之外的或全局命名空间里的参数主体是一个表达式语法lambda[arg1[arg2,arg3,......argn]]:expression常见用法主要与其他函数联合使用... 查看详情

深入理解java8lambda(类库篇——streamsapi,collectors和并行)

...http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/关于深入理解Java8Lambda(语言篇——lambda,方法引用,目标类型和默认方法)深入理解Java8Lambda(类库篇——StreamsAPI,Collector和并行)深入理解Java8Lambda(原理篇——Java编译器... 查看详情

深入理解lambda(代码片段)

概述Lambda是一个表达式,也可以说它是一个匿名函数。然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。下面就来说说Lambda是如... 查看详情

c语言的罗盘——指针!深入理解c语言指针及其应用(代码片段)

...;字符串库函数和指针等内容,在这篇文章我们将继续深入了解有关字符串库函数和指针的探索。📒博客主页:https://blog.csdn.net/m0 查看详情

深入理解:linearregression及其正则方法

  这是最近看到的一个平时一直忽略但深入研究后发现这里面的门道还是很多,LinearRegression及其正则方法(主要是Lasso,Ridge,ElasticNet)这一套理论的建立花了很长一段时间,是很多很多人的论文一点点堆起来的一套理论体系.如果你... 查看详情

c++11新特性:12——c++11lambda匿名函数用法详解(代码片段)

...是被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为lambda函数或者lambda表达式。继Python、Java、C#、PHP等众多高级编程语言都支持 查看详情

深入理解tcp协议及其源代码(代码片段)

connect及bind、listen、accept背后的三次握手connect、bind、listen、accept函数的源码分析socket()函数:当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(addressfamily,AF_XXX)空间中,但没有一个具体的地址。如果想要... 查看详情

深入理解伙伴算法及其改进

...伙伴算法的优缺点详细给我讲了一下,发现这个算法值得深入研究一波~看了很多资料,下面整理资料,然后谈谈自己的理解。 体会  Linux操作系统主要的内存分配算法是伙伴系统(Buddy算法),机制是按照2的幂次方进行分... 查看详情

promise对象深入理解(代码片段)

 目录基本用法返回另一个Promise实例Promise.prototypeof.then Promise.prototype.catch Promise.prototype.finally() Promise.resolve()Promsie.reject()Promise的执行顺序 基本用法Promise对象是一个构造函数,下面的例子生成一个p 查看详情

深入理解lambda表达式与optionalnull源码解析(java11三)

importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;importjava.util.*;importjava.u 查看详情

原型原型对象的理解及其原型链继承

...型对象,及其原型链不是很清楚,今天我就说说对这些的深入认识下。(如果有什么不懂得欢迎留言探讨,当然如果有什么写的不恰当的也希望大家留言备注。) 首先,再说原型与原型对象之前,当然有必要清楚构造函数,实... 查看详情

lambda函数的用法

lambda函数又叫匿名函数,匿名函数就是没有名字的函数,不使用def语句声明的函数。如果要声名,则需要使用lambda关键字进行声明。一般用来定义简单的函数。1.声明一个简单的加法匿名函数:冒号前面的为函数的参数,后面为... 查看详情

深入理解闭包中的委托

参考技术A关于闭包的使用在官方文档中已经说明的很清楚了,这里再对闭包的委托机制进行说明,该机制对于Groovy开发,gradle脚本编写非常重要!要理解闭包,那么就必须要了解闭包中的三个属性,该属性仅在闭包中可以使用... 查看详情

c++stl|深入理解关联容器multimap和map及其查找操作

参考技术A关联容器map和multimap为了实现接近于logn的查找(二分查找)效率,将一维的数据组织成二维的树型逻辑结构(红黑树做为底层逻辑结构)。由此,为了维护其元素有序结构,其增加元素的成员函数是insert(),而不是序列... 查看详情

深入理解lambda表达式(代码片段)

一、背景Java8的Lambda表达式已经不再是“新特性”。现在很多人工作中会使用Lambda表达式。但是,你是否真正理解Lambda表达式的底层原理?本文给出自己的理解,希望对大家有帮助。二、分析下面是一段非常简单的代... 查看详情

深入理解正则表达式环视的概念与用法

在《深入理解正则表达式高级教程-环视》中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法。 深入理解正则表达式环视的概念与用法... 查看详情