Python中lambda表达式的使用——完整通透版

文章目录

  • 一、前言
  • 二、 基本语法
  • 三、举个简单的例子:
  • 四、常见应用场景
    • 1. 用于排序函数
      • `sort()` 方法简介
      • `lambda` 表达式的作用
      • 详细解释
      • 进一步扩展
      • 总结
    • 2、与 `map`、`filter`、`reduce` 等函数结合
      • 1、 `map()` 函数
        • 示例:将列表中的每个数字平方
      • 2、 `filter()` 函数
        • 示例:筛选出列表中的偶数
      • 3、 `reduce()` 函数
        • 示例:计算列表所有元素的累加和
      • 总结
    • 3、 用于函数内部或一次性使用的函数
  • 五、总结

一、前言

lambda 表达式是Python中的一种简洁的匿名函数表达方式,它用于创建简单的函数,通常在不需要定义完整函数的情况下使用。lambda 表达式的语法非常简洁,适合编写一行的小函数。
接下来我们从具体的例子出发,由浅入深理解如何使用lambda表达式。


二、 基本语法

lambda 参数1, 参数2, ... : 表达式
  • lambda 引导关键字,表示这是一个匿名函数。
  • 后面紧跟参数,参数之间用逗号分隔。
  • 冒号后是函数的表达式,也就是返回值。

相当于简写形式的 def 函数定义。

三、举个简单的例子:

# 普通函数
def add(x, y):return x + y# 用 lambda 表达式写成
add_lambda = lambda x, y: x + y# 调用
print(add(2, 3))         # 输出: 5
print(add_lambda(2, 3))  # 输出: 5

在这个例子中,add_lambda 是一个等价于 add 的匿名函数,但它使用了 lambda 表达式来定义。

四、常见应用场景

1. 用于排序函数

当我们需要排序一个包含元组、字典等复杂数据类型的列表时,通常会使用 lambda 来定义排序的规则。

例如在列表的.sort排序函数的参数中,使用key=一个lambda表达式指定排序规则。

# 按照元组中的第二个元素排序
points = [(1, 2), (3, 1), (5, 4)]
points.sort(key=lambda x: x[1])
print(points)  # 输出: [(3, 1), (1, 2), (5, 4)]

在排序函数的示例中,我们使用了 lambda 表达式和列表的 sort 方法,对一个包含元组的列表进行排序。下面我将逐步讲解这个例子的工作原理。

sort() 方法简介

sort() 是 Python 中列表的一个内置方法,用于就地对列表进行排序(即会直接修改原始列表)。它可以根据默认顺序(即数字从小到大,字符串按字典顺序)对列表元素排序。

我们可以使用 key 参数来自定义排序规则。key 接受一个函数,这个函数用于生成用于比较的值。

例如,默认情况下,sort() 方法是基于元素的值排序:

numbers = [3, 1, 2]
numbers.sort()
print(numbers)  # 输出: [1, 2, 3]

但是,如果我们想要按自定义规则排序,例如根据元组的某个元素(例如第二个元素)进行排序,我们就可以使用 key 参数。

lambda 表达式的作用

在这个例子中,我们要对一个包含多个元组的列表 points 进行排序,而排序的依据是每个元组的第二个元素(索引为1的元素)。要实现这个功能,我们使用 lambda 表达式:

key=lambda x: x[1]

这里 x 是列表中的每个元组,x[1] 表示元组的第二个元素。我们告诉 sort 方法,应该根据每个元组的第二个元素来排序。

详细解释

  1. 数据结构points = [(1, 2), (3, 1), (5, 4)]
    这是一个包含三个元组的列表,每个元组包含两个数字。例如,(1, 2) 表示一个点的坐标,1x 坐标,2y 坐标。

  2. lambda 表达式key=lambda x: x[1]

    • x 代表列表中的每个元组。
    • x[1] 提取元组的第二个元素。
    • lambda 表达式的作用是告诉 sort 方法,只需要考虑每个元组的第二个元素进行比较排序。
  3. 排序过程

    • sort() 方法从列表的第一个元组开始,对每个元组调用 lambda x: x[1],返回第二个元素的值,作为排序的依据。

    • 对元组 (1, 2)lambda 返回 2。对元组 (3, 1),返回 1。对元组 (5, 4),返回 4

    • 然后,sort() 方法按照 1, 2, 4 的顺序对元组排序,结果是:[(3, 1), (1, 2), (5, 4)]

  4. 最终结果
    排序后的列表 points[(3, 1), (1, 2), (5, 4)]。这个结果是根据每个元组的第二个元素从小到大排序的。

进一步扩展

如果我们想按元组的第一个元素排序,只需要将 x[1] 改为 x[0]

points.sort(key=lambda x: x[0])
print(points)  # 输出: [(1, 2), (3, 1), (5, 4)]

如果你想实现降序排序,可以设置 reverse=True

points.sort(key=lambda x: x[1], reverse=True)
print(points)  # 输出: [(5, 4), (1, 2), (3, 1)]

总结

lambda 表达式在排序函数中用于简洁地定义排序的依据。通过传递 key 参数,我们可以轻松自定义排序规则,比如按元组中的某个特定元素排序。

2、与 mapfilterreduce 等函数结合

lambda 表达式与 mapfilterreduce 等高阶函数结合使用是 Python 编程中的一个强大工具。接下来我们会详细解释这三种函数及其结合 lambda 的用法。

1、 map() 函数

map() 函数用于对可迭代对象中的每个元素应用一个函数,并返回一个新的迭代器。它可以接受一个函数和一个或多个可迭代对象(如列表、元组)。

语法:

map(function, iterable)
  • function 是要应用于每个元素的函数。
  • iterable 是可迭代对象(例如列表、元组等)。

当结合 lambda 使用时,lambda 表达式作为匿名函数传递给 map()

示例:将列表中的每个数字平方
nums = [1, 2, 3, 4, 5]# 使用 lambda 表达式和 map
squared = map(lambda x: x**2, nums)# 将结果转换为列表并打印
print(list(squared))  # 输出: [1, 4, 9, 16, 25]

解释:

  • lambda x: x**2 是一个匿名函数,用来计算每个数字的平方。
  • map() 函数依次将 lambda 应用于 nums 列表中的每个元素,即 1, 2, 3, 4, 5,然后返回每个元素平方后的结果。

等价的普通函数写法:

def square(x):return x ** 2squared = map(square, nums)
print(list(squared))  # 输出: [1, 4, 9, 16, 25]

2、 filter() 函数

filter() 函数用于筛选可迭代对象中的元素,保留那些使函数返回 True 的元素。它也返回一个迭代器。

语法:

filter(function, iterable)
  • function 是用于测试每个元素的函数,返回 TrueFalse
  • iterable 是需要过滤的可迭代对象。

当与 lambda 表达式结合使用时,lambda 可以作为过滤条件。

示例:筛选出列表中的偶数
nums = [1, 2, 3, 4, 5]# 使用 lambda 表达式和 filter
evens = filter(lambda x: x % 2 == 0, nums)# 将结果转换为列表并打印
print(list(evens))  # 输出: [2, 4]

解释:

  • lambda x: x % 2 == 0 是一个匿名函数,用来判断 x 是否为偶数。
  • filter() 函数依次将 lambda 应用于 nums 列表中的每个元素,返回 True 的元素保留,返回 False 的元素被过滤掉。因此,最终结果是保留偶数 24

等价的普通函数写法:

def is_even(x):return x % 2 == 0evens = filter(is_even, nums)
print(list(evens))  # 输出: [2, 4]

3、 reduce() 函数

reduce() 函数用于对可迭代对象中的元素进行累积操作,最终合并为一个值。它需要导入 functools 模块,因为它不属于 Python 的内置函数。

语法:

from functools import reduce
reduce(function, iterable)
  • function 是一个需要两个参数的函数,用来将前一个计算结果与下一个元素进行合并。
  • iterable 是可迭代对象。

当与 lambda 表达式结合时,lambda 用来定义累积的规则。

示例:计算列表所有元素的累加和
from functools import reducenums = [1, 2, 3, 4, 5]# 使用 lambda 表达式和 reduce
total = reduce(lambda x, y: x + y, nums)print(total)  # 输出: 15

解释:

  • lambda x, y: x + y 是一个匿名函数,接受两个参数 xy,并返回它们的和。
  • reduce() 函数首先将前两个元素 12 相加得到 3,然后将 33 相加得到 6,以此类推,直到处理完所有元素。最后返回累加结果 15

等价的普通函数写法:

def add(x, y):return x + ytotal = reduce(add, nums)
print(total)  # 输出: 15

总结

  1. map():对每个元素应用函数,返回每个元素的变换结果。适合批量操作。
  2. filter():根据条件过滤元素,保留符合条件的元素。
  3. reduce():对序列中的元素进行累积操作,适合需要归约为单一值的场景。

lambda 表达式可以方便地与这些高阶函数结合,减少代码的冗余和函数的显式定义。

3、 用于函数内部或一次性使用的函数

当函数只需要使用一次,可以直接用 lambda 表达式,而无需定义新的函数名。

def apply_operation(x, operation):return operation(x)# 使用 lambda 传递匿名函数
result = apply_operation(5, lambda x: x * 2)
print(result)  # 输出: 10

五、总结

lambda 表达式用于简化代码,尤其适用于短小的函数,避免显式定义完整函数。虽然它方便,但当函数较为复杂时,还是建议使用普通函数定义,以提高代码的可读性。


感谢的关注与点赞!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Typora安装和导入导出

Typora安装和导入导出 文章目录 Typora安装和导入导出前言Typora v1.9.5Typora v1.4.7Pandoc 前言 Typora v1.9是最新版, , Typora v1.4是老版本的, 这两个选择一个即可Pandoc可以导入导出word Typora v1.9.5 Typora v1.9.rar, 提取码:tian按ctrl单击鼠标左键打开…

数据飞轮崛起:数据中台真的过时了吗?

一、数据中台的兴起与困境 随着大数据技术的不断发展,我见证了企业数据能力建设的演变。从数据中台的兴起,到如今数据飞轮模式的热议,企业的数据管理理念经历了巨大的变化。起初,数据中台作为解决数据孤岛、打破部门壁垒的“救星…

新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)

这是在复现论文”“时遇到的报错。 ImportError: cannot import name uniform from torch_geometric.nn.pool.topk_pool 一、报错原因 论文作者使用的是2.1.0版本的torch_geometric。而我安装了2.6.1的torch_geometric。新版中已经去除了uniform和maybe_num_nodes这两个函数&…

力扣 中等 162.寻找峰值

文章目录 题目介绍解法 题目介绍 解法 定理&#xff1a;如果 i<n−1 且 nums[i]<nums[i1]&#xff0c;那么在下标 [i1,n−1] 中一定存在至少一个峰值。证明 思路分析&#xff1a;利用采用红蓝染色题体法&#xff0c;n为数组的长度&#xff0c;开始左指针L指向数组最左边…

CompletableFuture-详解使用及源码解析

背景 上一篇文章我们看了FutureTask&#xff0c;分析了他的问题&#xff0c;异步编程并不方便。 问题1&#xff1a; FutureTask获取执行结果前&#xff0c;主线程需要通过get()方法一直阻塞等待子线程执行完成call方法&#xff0c;才可以拿到返回结果问题2&#xff1a;如果不…

linux固定串口别名

最近项目功能要求&#xff0c;需要将插入设备的串口设备占用的端口号固定住&#xff0c;这里记录一下设置过程方便以后查阅。 linux固定串口别名 配置过程相关补充 配置过程 列出当前插入USB端口的设备&#xff1a; lsusb查看当前设备的端口号&#xff1a; ls dev/查看当前设…

【24华为杯数模研赛赛题思路已出】国赛D题思路丨附参考代码丨免费分享

2024年华为杯研赛C题解题思路 D 题 大数据驱动的地理综合问题 地理系统是自然、人文多要素综合作用的复杂巨系统[1-2]&#xff0c;地理学家常用地理综合的方式对地理系统进行主导特征的表达[3]。如以三大阶梯概括中国的地形特征&#xff0c;以秦岭—淮河一线和其它地理区划的…

一周热门|李飞飞:过于武断的AI政策将损害学术界和开源社区;纽约大学教授:我们可能都被奥特曼耍了

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 01 企业动态 CogVideoX 2B&#xff1a;首个开源商用级视频生成模型 作为首个开源商用级视频生成模型&#xff0c;CogVideoX 2B 与智谱AI「清影」同源&a…

java项目编译UTF-8编译问题

代码没有报错信息,但是一启动就各种符号什么的报错,看代码也没有问题 然后就搜各种解决方案 我试了好几种,这种是生效的,直接在IDEA修改 没修改之前的配置 修改后的

一对一视频通话软件Call-Me

什么是 Call-Me &#xff1f; Call-Me 使你能够直接通过网页浏览器使用 WebRTC 技术轻松进行一对一的视频通话。 Call-Me 的主要功能&#xff1a; 使用用户名登录。通过输入接收者的用户名进行视频通话。切换视频源的可见性。通话结束时挂断电话。提供 REST API 获取所有连接…

【d46】【Java】【力扣】234.回文链表

思路 判断是否是回文&#xff0c;需要&#xff1a;一个指针指向头&#xff0c;一个指针指向尾&#xff0c;两个指针一边向中间靠拢&#xff0c;一边判断数值是否相同 对于单链表&#xff0c;不方便获得pre&#xff0c;如果将节点放进 数组/list &#xff0c;数组/list可以直接…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第七集:制作小骑士完整的冲刺Dash行为

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作一个完整的小骑士冲刺Dash行为 1.制作动画以及使用UNITY编辑器编辑2.使用代码实现完整的冲刺行为控制总结 前言 大家又好久不见&#xff08;虽然就过了…

论文速递!基于PINN的知识+数据融合方法!实现可再生能源电力系统中的TTC高效评估

本期推文将介绍一种结合知识驱动和数据驱动的混合算法在电力系统总传输能力&#xff08;TTC&#xff09;评估中的应用&#xff0c;这项研究发表于《IEEE Transactions on Power Systems》期刊&#xff0c;主要解决高比例可再生能源渗透下电力系统中的TTC快速评估问题。 荐读的论…

day21JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

linux----进程地址空间

前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、空间分布 二、栈和堆的特点 &#xff08;1&#xff09;栈堆相对而生&#xff0c;堆是向上增长的&#xff0c;栈是向下增长的。 验证&#xff1a;堆是向上增长的 这里我们看到申请的堆&#xff…

springMvc的初始配置

基础文件结构(toWeb插件) 1.导入对应依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"ht…

【软考】循环冗余校验码

目录 1. 说明2. CRC 的代码格式3. 例题3.1 例题1 1. 说明 1.循环冗余校验码(Cyclic Redundancy Check&#xff0c;CRC)广泛应用于数据通信领域和磁介质存储系统中。2.它利用生成多项式为k个数据位产生&#xff0c;r个校验位来进行编码&#xff0c;其编码长度为 kr。3.循环几余…

如何成为信息安全等级测评师?具体有哪些要求?

给大家的福利&#xff0c;点击下方蓝色字 即可免费领取↓↓↓ &#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 文章目录 前言 信息安全等级测评师 定义与作用&#xff1a;证书颁发&#xff1a;能力要求&#x…

【React】(推荐项目)一个用 React 构建的 CRUD 应用程序

推荐项目&#xff1a;CRUD 应用示例 在本篇文章中&#xff0c;我想向大家推荐一个非常实用的项目&#xff1a;CRUD 应用示例。这个项目展示了如何使用现代技术栈创建一个基础的增删改查&#xff08;CRUD&#xff09;应用&#xff0c;非常适合用于学习和实践后端开发技能。 适…

【2024华为杯数学建模研赛赛题已出(A-F题)】

华为杯2024年中国研究生数学建模竞赛A-F题已公布 A题 B题 C题 D题 E题 F题