当前位置: 首页 > news >正文

Python 进阶语法:lambda函数

一、lambda函数是什么

Python中的lambda函数是一种简洁的匿名函数,用于执行简单的操作。它是一种不可变的单表达式函数,可以在需要一个函数的地方使用。

lambda函数的语法结构非常简单,由lambda关键字、参数列表和冒号组成,后面跟着一个表达式。

例如:

lambda x: x * 2

这个lambda函数接收一个参数x,并返回x的两倍。

二、lambda函数的简单应用

2.1  匿名函数应用

lambda函数可以作为匿名函数使用,在需要一个简单函数的地方直接使用。

例如,将一个列表中的元素平方:

squares = list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) 
print(squares) # 输出:[1, 4, 9, 16, 25]

这段代码的功能是使用 Python 的 map 函数和 lambda 表达式对列表 [1, 2, 3, 4, 5] 中的每个元素进行平方操作,并将结果存储在新的列表 squares 中。

解释一下代码的各个部分:

  • map(function, iterable1, ...) 函数是 Python 中的一个内置函数,用于对可迭代对象(如列表、元组等)中的元素应用指定的函数。它返回一个迭代器,其中包含应用函数后的结果。
  • lambda x : x**2 是一个匿名函数,它接受一个参数 x 并返回 x 的平方。
  • [1,2,3,4,5]是输入的列表。

执行这段代码后,变量 squares 将包含新列表 [1, 4, 9, 16,25]

2.2  对数据列表进行排序

2.2.1  自定义排序规则

使用lambda函数可以在对列表进行排序时自定义排序规则。

例如,按照绝对值对列表进行排序:

numbers = [-3, -1, 2, -5, 4]
sorted_numbers = sorted(numbers, key=lambda x: abs(x))
print(sorted_numbers) # 输出:[-1, 2, -3, 4, -5]

这段代码的目的是对一个数字列表 numbdrs ,用sorted() 函数进行排序,排序的依据是每个数字的绝对值。

  • 数字列表 numbers = [-3, -1, 2, -5, 4]
  • 使用 sorted() 函数对这个列表进行排序。为了按照每个数字的绝对值进行排序,我们使用了一个 key 参数,该参数是一个函数,用于提取用于排序的值。在这里,我们使用了一个 lambda 函数,该函数返回每个数字的绝对值。
  • lambda x: abs(x) 这个函数表示:对于列表中的每个元素 x,都计算其绝对值。
  • 打印排序后的列表 sorted_numbers,输出结果是[-1, 2, -3, 4, -5]。
2.2.2  筛选符合条件的元素

使用lambda函数可以筛选出符合条件的元素。

例如,筛选出列表中大于等于3的元素:

numbers = [1, 2, 3, 4, 5] 
filtered_numbers = filter(lambda x: x >= 3, numbers) 
print(list(filtered_numbers)) # 输出:[3, 4, 5]

这段代码的功能是从一个给定的数字列表中筛选出所有大于或等于3的数字,并将结果存储在新的迭代器 filtered_numbers 中。最后,通过 print 函数将结果列表打印出来。

下面是代码的逐步解释:

  • numbers = [1, 2, 3, 4, 5]:定义一个包含数字1到5的列表。
  • filter(lambda x: x >= 3, numbers):使用 filter 函数从 numbers 列表中筛选出满足条件的元素。这里使用的条件是 lambda x: x >= 3,即选择所有大于或等于3的数字。
  • list(filtered_numbers):将筛选后的迭代器 filtered_numbers 转换为列表,以便可以打印它。
  • print(list(filtered_numbers)):打印结果列表。

运行这段代码后,输出将是 [3, 4, 5],这是原始列表中所有大于或等于3的数字的列表。

三、lambda函数的进阶应用

3.1  嵌套lambda函数

lambda函数可以嵌套在其他函数中使用,实现更复杂的操作。

嵌套的lambda函数在Python中是一种非常简洁和强大的编程技巧,它允许你在一个lambda函数内部定义另一个lambda函数。这种嵌套的用法在需要定义简单的、临时的函数时特别有用。

下面是一个嵌套lambda函数的简单示例:

# 定义一个lambda函数,该函数返回另一个lambda函数  
add_x = lambda y: lambda z: z + y  # 使用这个嵌套的lambda函数  
add_5 = add_x(5)  
add_10 = add_x(10)  # 调用这个嵌套的lambda函数  
print(add_5(3))  # 输出:8  
print(add_10(3))  # 输出:13

在这个例子中,add_x 是一个外层的lambda函数,它接受一个参数 y 并返回一个内层的lambda函数。这个内层的lambda函数接受一个参数 z 并返回 z + y

然后我们创建了两个内层的lambda函数,一个是 add_5,一个是 add_10,分别对应于 y=5y=10 的情况。最后,我们分别调用这两个函数并打印结果。

嵌套的lambda函数可以用于各种情况,例如在排序列表时定义自定义的排序标准,或者在需要临时函数的地方使用。但需要注意的是,过度使用嵌套的lambda函数可能会导致代码难以阅读和理解,因此在使用时需要谨慎。

3.2  lambda函数与map、filter、reduce和sorted结合使用

lambda函数可以与map、filter、reduce和sorted等内置函数结合使用,实现更高效的代码。

3.2.1  map() 函数
  • 描述:map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
  • 语法:map(function, iterable, ...)
  • 参数:function(函数),iterable (一个或多个序列)
  • 返回值:Python 2.x 版本返回的是列表,Python 3.x 版本返回的是迭代器
  • 示例:
# ===========一般写法:===========
# 1、计算平方数
def square(x):return x ** 2map(square, [1,2,3,4,5])	# 计算列表各个元素的平方
# 结果:
[1, 4, 9, 16, 25]# ===========匿名函数写法:============
# 2、计算平方数,lambda 写法
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
# 结果:
[1, 4, 9, 16, 25]	 # 3、提供两个列表,将其相同索引位置的列表元素进行相加
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
# 结果:
[3, 7, 11, 15, 19]
 3.2.2  filter() 函数
  • 描述:filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
  • 语法:filter(function, iterable)
  • 参数:function (判断函数),iterable  (可迭代对象)
  • 返回值:Pyhton2.7 返回列表,Python3.x 返回迭代器对象
  • 实例:
# ===========一般用法:===========
# 1、过滤出列表中的所有奇数
def is_odd(n):return n % 2 == 1newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))
# 结果: [1, 3, 5, 7, 9]# ===========匿名函数用法:===========
# 2、将列表[1, 2, 3]中能够被3整除的元素过滤出来
newlist = filter(lambda x: x % 3 == 0, [1, 2, 3])
print(list(newlist))
# 结果: [3]
3.2.3  reduce() 函数
  • 描述:reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
  • 语法:reduce(function, iterable[, initializer])
  • 参数:function (函数,有两个参数),iterable(可迭代对象),initializer(可选,初始参数)
  • 返回值:返回函数计算结果。
  • 实例:
# ===========一般写法:===========
# 1、两数相加
def add(x, y):            return x + yreduce(add, [1, 3, 5, 7, 9])    # 计算列表元素和:1+3+5+7+9
# 结果:
25"""
===========执行步骤解析:===========
调用 reduce(add, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
1    先计算头两个元素:f(1, 3),结果为4;
2    再把结果和第3个元素计算:f(4, 5),结果为9;
3    再把结果和第4个元素计算:f(9, 7),结果为16;
4    再把结果和第5个元素计算:f(16, 9),结果为25;
5    由于没有更多的元素了,计算结束,返回结果25。
"""
# ===========匿名函数写法:===========
# 2、两数相加,lambda 写法
reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
# 结果:
15# 当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。# 3、但是如果要把序列 [1, 3, 5, 7, 9] 变换成整数 13579,reduce就可以派上用场:
from functools import reducedef fn(x, y):return x * 10 + yreduce(fn, [1, 3, 5, 7, 9])
# 结果:
13579
3.2.4  sorted()函数
  • 描述:sorted() 函数对所有可迭代的对象进行排序操作。
  • sort 与 sorted 区别:sort 是 list 的一个方法,而 sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
  • PY3语法:sorted(iterable, key=None, reverse=False)
  • 参数说明:iterable (可迭代对象)、key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse 排序规则,reverse = True 降序 , reverse = False 升序(默认)。返回值:返回重新排序的列表。
  • 示例:
# ===========一般用法:===========
# 1、简单排序
a = [5,7,6,3,4,1,2]
b = sorted(a)       # 使用sorted,保留原列表,不改变列表a的值
print(a)
# [5, 7, 6, 3, 4, 1, 2]
print(b)
# [1, 2, 3, 4, 5, 6, 7]# ===========匿名函数用法:===========
L=[('b',2),('a',1),('c',3),('d',4)]
# 2、利用参数 key 排序
new_L = sorted(L, key=lambda x:x[1])
print(new_L)
# 结果:[('a', 1), ('b', 2), ('c', 3), ('d', 4)]# 3、按年龄升序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
s_age = sorted(students, key=lambda s: s[2])
print(s_age)
# 结果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]# 4、按年龄降序
j_age = sorted(students, key=lambda s: s[2], reverse=True)
print(j_age)
# 结果:[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

四、注意事项

4.1  lambda函数的局限性

lambda函数主要用于简单的操作,不适合用于复杂的逻辑或大量数据处理。对于复杂的逻辑或大量数据处理,建议使用常规函数或类。

4.2  不要过度使用lambda函数

虽然lambda函数可以使代码更加简洁,但过度使用可能会使代码难以阅读和理解。因此,在使用lambda函数时应该适度,并保持代码的可读性。

4.3  lambda函数与常规函数的比较

相对于常规函数,lambda函数更加简洁,可以在需要简单函数的地方直接使用。然而,常规函数更加灵活,可以包含复杂的逻辑和嵌套结构,并且可以返回多个值或使用异常处理等特性。因此,在选择使用lambda函数还是常规函数时,应该根据实际需求进行选择。

相关文章:

  • 浅聊 DNS 和 host
  • MySQL索引类型及数据结构【笔记】
  • obsidian阅读pdf和文献——与zotero连用
  • 【yaml 文件使用】pytest+request 框架中 yaml 配置文件使用
  • 【云原生】k8s图形化管理工具之rancher
  • JVM篇:垃圾回收算法
  • 基于frp工具实现内网穿透,跨局域网远程SSH登录
  • Spring Boot整合Redis的高效数据缓存实践
  • 《30天自制操作系统》 第一周(D1-D7) 笔记
  • GraphicsMagick 的 OpenCL 开发记录(二十五)
  • Vue2 - keep-alive 作用和原理
  • Sql server强制走索引
  • 【工具变量】中国各省市级是否属于“知识产权示范区”匹配数据(2010-2024年)
  • 强化学习 - Trust Region Policy Optimization (TRPO)
  • 2、互信息(Mutual Information)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • JavaScript学习总结——原型
  • Java基本数据类型之Number
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SQLServer插入数据
  • tab.js分享及浏览器兼容性问题汇总
  • Xmanager 远程桌面 CentOS 7
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 理解在java “”i=i++;”所发生的事情
  • 模型微调
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 移动端 h5开发相关内容总结(三)
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)u-boot-nand.bin的下载
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .jks文件(JAVA KeyStore)
  • .Mobi域名介绍
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net 获取url的方法
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @JSONField或@JsonProperty注解使用
  • @RequestMapping用法详解
  • @开发者,一文搞懂什么是 C# 计时器!
  • []T 还是 []*T, 这是一个问题
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [acm算法学习] 后缀数组SA
  • [Android]竖直滑动选择器WheelView的实现