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.mzph.cn/diannao/54389.shtml

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

相关文章

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候,不清楚什么时候用RTMP推送模块,什么时候用GB28181设备接入模块,也不清楚二者差异化。实际上,RTMP推流和GB28181接入模块,在很多方面存在差异,如应用领…

centos 安装VNC,实现远程连接

centos 安装VNC,实现远程连接 VNC(Virtual Network Computing)是一种远程控制软件,可以实现通过网络远程连接计算机的图形界面。 服务器安装VNC服务 yum install -y tigervnc-server*启动VNC服务,过程中需要输入连接密码 vncserver :1查看…

云栖大会Day1:云应用开发平台 CAP 来了

2024 云栖大会开幕,在大会第一天,阿里云正式发布全新产品——云应用开发平台 CAP。CAP 拥有丰富的场景化应用模板,可以极速体验,并且具备更低的成本优势以及灵活组装等特点,成为广大开发者与企业必备的一站式应用开发平…

Stable Diffusion绘画 | ControlNet应用-instant-ID控制器:快速生成人物多角度图片

使用 instant-ID 控制器,用户只需要提供一张正脸图片,就可以快速地给人物生成多角度图片的,从而很好的保持了人物的一致性。 对于要制作小说推文、创建人物故事情节的创作,是一个非常好用且高效的功能。 准备工作 使用该控制类型&…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第一篇-原理】

如果想直接制作,请看【第二篇】内容 这次做一个这样的东西,通过在2DRT上实时绘制,生成动态的体积纹理,也就是可以runtime的VDB 设想的文章流程: 对原理进行学习制作体积渲染制作实时绘制 第一篇(本篇)是对“…

vue3+element-plus icons图标选择组件封装

一、最终效果 二、参数配置 1、代码示例 <t-select-icon v-model"selectVlaue" />2、配置参数&#xff08;Attributes&#xff09;继承 el-input Attributes 参数说明类型默认值v-model绑定值string-prefixIcon输入框前缀iconstringSearchisShowSearch是否显…

机器翻译之创建Seq2Seq的编码器、解码器

1.创建编码器、解码器的基类 1.1创建编码器的基类 from torch import nn#构建编码器的基类 class Encoder(nn.Module): #继承父类nn.Moduledef __init__(self, **kwargs): #**kwargs&#xff1a;不定常的关键字参数super().__init__(**kwargs)def forward(self, X, *args…

Git入门学习(1)

Git 00.准备工作-gitee注册 今天Git的设置中需要用到gitee的注册信息&#xff0c;先自行完成注册工作&#xff0c;可以 参考笔记 或第二天视频&#xff08;10.Git远程仓库-概念和gitee使用准备&#xff09; 传送门: gitee&#xff08;码云&#xff09;:https://gitee.com/ 注…

详解:冒泡排序

1.是什么 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…

2024华为杯研赛D题保姆级教程思路分析+教程

2024年中国研究生数学建模竞赛D题保姆级教程思路分析 D题&#xff1a;大数据驱动的地理综合问题&#xff08;数学分析&#xff0c;统计学&#xff09; 关键词&#xff1a;地理、气候、统计&#xff08;细致到此题&#xff1a;统计指标、统计模型、统计结果解释&#xff09; …

c++249多态

#include<iostream> using namespace std; class Parent { public:Parent(int a){this->a a;cout << " Parent" << a << endl;} public:virtual void print()//在子类里面可写可不写 {cout << "Parent" <<a<&l…

OpenCV 2

目录 图像平滑处理 高斯与中值滤波 图像阈值 ​编辑 Canny边缘检测 非极大值抑制 边缘检测效果 轮廓检测方法 ​编辑 ​编辑​编辑 轮廓检测结果 轮廓特征与近似 图像平滑处理 以上两种出来的图片效果 以上的效果&#xff0c;因为填的是normalize False&#xff0c;越界…

Vue接入高德地图并实现基本的路线规划功能

目录 一、申请密钥 二、安装依赖 三、代码实现 四、运行截图 五、官方文档 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装依赖 npm i am…

艾丽卡的区块链英语小课堂

系列文章目录 IT每日英语&#xff08;三&#xff09; 文章目录 系列文章目录前言1.principle2.efficient3.implement4.accumulated5,occupation6.phases7.validator8.nominated9.commissions10.significantly 前言 欢迎来到艾丽卡的区块链英语小课堂&#xff0c;在这里&…

vmware + ubuntu + 初始配置(超级用户权限、vim安装、ssh登陆、共享文件夹、git)

1 VMware Ubuntu下载与安装 下载与安装 2 使用超级用户权限 &#xff08;1&#xff09;执行命令&#xff1a;sudo passwd root 然后在弹出的密码中输入密码即可&#xff0c;具体如下&#xff1a; 第一个密码是当前用户密码 后面两个是root用户密码 //推荐使用一个密码 3 vi…

航空航司reese84逆向

reese84逆向 Reese84 是一种用于保护网站防止自动化爬虫抓取的防护机制&#xff0c;尤其是在航空公司网站等需要严格保护数据的平台上广泛使用。这种机制通过复杂的指纹识别和行为分析技术来检测和阻止非人类的互动。例如&#xff0c;Reese84 可以通过分析访问者的浏览器指纹、…

基于PHP的电脑线上销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的电脑线上销售系…

免费音乐剪辑软件大揭秘:2024 大学生的音乐创作利器

对于音乐爱好者而言&#xff0c;如果你萌生了尝试音乐剪辑的念头&#xff0c;不妨先从探索一些免费工具开始。在此&#xff0c;我愿分享几款我个人体验过的、值得一试的音乐剪辑免费软件&#xff0c;希望能为你的音乐探索之旅增添乐趣与灵感。 1.福晰音频剪辑 链接直达>&g…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费&#xff1f;在日常生活和工作学习中&#xff0c;处理PDF文件是常见任务。但有时PDF文件体积较大&#xff0c;给传输、存储和分享带来不便。因此&#xff0c;学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间&#xff0c;同时尽…

数据保护从现在开始:如何抵御 .[RestoreBackup@cock.li].SRC 勒索病毒

导言 勒索病毒是一种不断演变的网络威胁&#xff0c;.[RestoreBackupcock.li].SRC、[chewbaccacock.li].SRC勒索病毒便是其中一种新型的攻击手段。该病毒通过加密用户文件并要求支付赎金来恢复访问&#xff0c;给个人和企业带来了严重的安全风险和经济损失。本文91数据恢复将探…