Python 匿名函数lambda 详情
作者:宇宙之一粟 发布时间:2022-07-30 12:37:39
1.前言
在 Python 中,说到函数,大家都很容易想到用 def 关键字来声明一个函数:
def Hello():
# function body
然后我们可以在添加由圆括号括起来的参数列表。函数体内可能有很多行代码,里面有尽可能多的语句和表达式。
除了 def 语句定义函数以外,还有一种生成函数对象的表达式形式: lambda 表达式,这个表达式创建了一个能够随时调用的函数。
有时声明一个函数只有一条语句,比如:
def square(x):
return x*2
(没有lambda 函数返回函数本身而不是将其赋值给一个变量名。所以它也被称为匿名函数函数名)。 lambda 的一般形式是关键字 lambda 后面跟上一个或者多个参数,之后是一个冒号,再之后是一个表达式:
lambda argument1, argument2, ... argumentN: expression using argument
lambda 表达式所返回的函数对象与 def 创建并赋值后的函数对象工作起来是完全一样。一个 lambda
函数可以有尽可能多的参数,但函数体必须是一个表达式。
2.如何使用 lambda
lambda 只能包含一个表达式,通常用作内联函数的定义,或者用作推迟一些代码的执行。
再来看上面的平方的例子:
def square(x):
return x*x
a_list = [1, 2, 3, 4, 5]
aa_list = list(map(square, a_list))
print(aa_list) # [1, 4, 9, 16, 25]
上述代码就是 lambda 函数使用的好地方,使用更少的代码行,并且可以避免创建仅使用一次的命名函数(然后必须存储在内存中)。您可以编写一个将其参数平方的 lambda 函数: lambda x: x*2 ,并将其与 map 函数一起使用以将列表中的所有元素进行平方运算:
a_list = [1, 2, 3, 4, 5, 6]
aa_list = list(map(lambda x: x*2, a_list))
print(aa_list) # [2, 4, 6, 8, 10, 12]
如果在短时间需要一个小函数,可以使用 lambda 函数——例如作为 map 或 filter 等高阶函数的参数,可以我们利用 lambda 来筛选偶数:
a_list = [1, 2, 3, 4, 5, 6]
aa_list = list(filter(lambda x: x%2==0, a_list))
print(aa_list) # [2, 4, 6]
lambda 函数是在使用它的地方定义的,这样内存中就没有命名函数。如果只在一个地方使用了一个函数,那么使用 lambda 函数来避免混乱是有意义的。
还可以从函数返回 lambda 函数。如果您需要创建多个乘以数字的函数,例如加倍或三倍等,lambda 可以提供帮助。您可以创建一个函数 multiplyBy
,而不是创建多个函数,如下所示,然后使用不同的参数多次调用此函数以创建双倍、三倍等函数:
def muliplyBy (n):
return lambda x: x*n
double = multiplyBy(2)
triple = muliplyBy(3)
times10 = multiplyBy(10)
lambda 函数从父函数获取值 n,因此在 double 中 n 的值为 2,在三倍中为 3,在 times10 中为 10。现在使用参数调用这些函数将乘以该数字。
double(6)
> 12
triple(5)
> 15
times10(12)
> 120
如果您在这里没有使用 lambda 函数,则需要在 multiplyBy
中定义一个不同的函数,
如下所示:
def muliplyBy (x):
def temp (n):
return x*n
return temp
使用 lambda
函数使用一半的行并使其更具可读性。
3.总结
lambda
是一个表达式,而不是语句。因此,lambda
能够出现在 Python 语法不允许 def 出现的地方。例如在一个列表字面量中或者函数调用的参数中,而使用 def 语句虽然函数能通过名称引用,但是必须在其他地方创建,作为一个表达式,lambda 返回一个值(一个新的函数),可以选择性地被赋值给一个变量值。lambda
的主体是一个单独的表达式,而不是一个代码块。 lambda 的主体可以像 def 函数体的 return 语句一样,可以将结果写出一个裸露的表达式,而不是显式地返回。lambda 是一个编写简单的函数而设计的,而 def 用来处理更大的任务。
来源:https://blog.51cto.com/yuzhou1su/5098370
猜你喜欢
- 大多数做过网页设计的都知道“CSS框架”,而且肯定有很多设计师已经开始在作品中使用CSS框架。就像其他编程语言一样,CSS也可以把一些重复使
- 先介绍一下SQLSERVER中的存储类对象,哈哈,先介绍一下概念嘛,让新手老手都有一个认知SQLSERVER Management Stud
- 在 * 站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面。这会消耗大量的资源
- 每次找安装教程太麻烦,因此给自己备份一下步骤,方便以后查看。解压版下载地址https://dev.mysql.com/downloads/m
- 小白我用的是vue-cli的全家桶,在标签中加入v-drap则实现元素拖拽, 全局指令我是写在main.js中Vue.direc
- 前言安全性是所有数据库管理系统的一个重要特征。理解安全性问题是理解数据库管理系统安全性机制的前提。最近和同事在做数据库权限清理的事情,主要是
- SQL2000的SA密码不能更改的解决方法,在更改sa的密码出现下面的错误:Error 21776: [SQL-DMO] The name
- 如下所示:<div class="status_button">
- 本文实例为大家分享了js拖拽实现图形伸缩效果的具体代码,供大家参考,具体内容如下点击矩形的四个角和四个边实现不同的效果<!DOCTYP
- 导出到excel EXEC master..xp_cmdshell 'bcp Settle
- AttribteError: ‘module' object has no attribute xxx'描述:模块没有相关属
- 本文为大家分享了python2.7+selenium2实现淘宝滑块自动认证的具体代码,供大家参考,具体内容如下1.编译环境 操作系统:win
- 话不多说,直接看示例首先是图片标记的写法<img data-src="/images/image.jpg" alt
- 简介urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接。urlparse库用于把url解析为
- 如今我使用 Python 已经很长时间了,但当我回顾之前写的一些代码时,有时候会感到很沮丧。例如,最早使用 Python 时,我写了一个名为
- 如何在聊天室实现趣味答题并计分功能?这个创意确实很好,我们可用在聊天室框架中加入一隐含帧(5分钟刷新一次)的做法来实现这一功能。questi
- MySQL变量包括系统变量和系统变量。这次的学习任务是用户自定义变量。用户变量主要包括局部变量和会话变量。用户自定义变量的声明方法形如:@v
- 本文实例为大家分享了vue自定义过滤器创建和使用方法,供大家参考,具体内容如下过滤器:生活中有很多例子,净水器 空气净化器 。过滤器的作用:
- 根据用户权限设定用户可以访问哪些页面,用django实现一个简单的demo。1.models.py 文件class level(models
- 如下所示:Uploadfiles = request.FILES.get('参数', '')for i in