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

news2024/9/20 18:20:24

文章目录

  • 一、前言
  • 二、 基本语法
  • 三、举个简单的例子:
  • 四、常见应用场景
    • 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 ** 2

squared = 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 == 0

evens = 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 reduce

nums = [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 + y

total = 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.coloradmin.cn/o/2149654.html

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

相关文章

Centos 7 搭建Samba

笔记: 环境:VMware Centos 7(网络请选择桥接模式,不要用NAT) 遇到一个问题就是yum 安装404,解决办法在下面(没有遇到可以无视这句话) # 安装Samba软件 yum -y install samba# 创建…

Shader Graph Create Node---Channel

二、Channel 1、Combine(合并通道) 2、Flip(翻转) 3、Split(分离) 4、Swizzle(交换)

ELK环境部署

目录 环境准备 Elasticsearch 部署 安装Elasticsearch Elasticsearch-head 插件 安装node 安装 phantomjs 安装 Elasticsearch-head Logstash 安装部署 Kibana 安装部署 ELFK 本章纯搭建过程,几乎无任何注释解释 环境准备 ELK的搭建和测试,…

力扣(LeetCode)每日一题 2576. 求出最多标记下标

题目链接https://leetcode.cn/problems/find-the-maximum-number-of-marked-indices/description/?envTypedaily-question&envId2024-09-12 思路: 先排序,然后定义双指针 left,right,贪心遍历,左指针在中间&…

机器狗与无人机空地协调技术分析

随着科技的飞速发展,机器狗与无人机作为智能机器人领域的杰出代表,正逐步在军事侦察、灾害救援、环境监测、农业植保等多个领域展现出巨大的应用潜力。本文旨在深入探讨机器狗与无人机之间的空地协调技术,分析其在复杂环境中的协同作业机制、…

轻松打造:用Python实现手机与电脑间的简易消息系统

展示🎥 观看视频:👀,这是之前完成的一个项目,但今天我们的重点不是这个哦。 告别往昔,启航新篇章 现象🌟 智能互动:📱 我们每天都在享受与智能设备的互动,…

作为HR,如何考察候选人的沟通能力

如何考察候选人的沟通能力。沟通能力,这个听起来简单,实际上却是一个非常复杂的技能,它关乎到一个人能否有效地传递信息,理解他人,并且在团队中发挥积极的作用。 作为HR,我们应该怎样才能精准地把握住候选…

鸿蒙开发(HarmonyOS)组件化浅谈

众所周知,现在组件化在移动开发中是很常见的,那么组件化有哪些好处: 1. 提高代码复用性:组件化允许将应用程序的不同功能模块化,使得这些模块可以在不同的项目中重复使用,从而提高开发效率并减少重复工作。…

JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析

拼多多2面,还是模拟拼团,要求用户拼团成功后,提交订单支付金额。 之前我们在系列(8)《CountDownLatch核心原理》,实现过拼团场景。但是CountDownLatch里调用countDown()方法后,线程还是可以继续执行后面的代码&#xf…

【云安全】云上资产发现与信息收集

一、云基础设施组件 1、定义 在云计算基础架构中,基础设施组件通常包括:计算、存储、网络和安全等方面的资源。例如,计算资源可以是虚拟机、容器或无服务器计算引擎;存储资源可以是对象存储或块存储;网络资源可以是虚拟…

数字电路与逻辑设计-计数器逻辑功能测试

一.实验目的 1.验证用触发器构成的计数器计数原理; 2.掌握测试中规模集成计数器功能的方法; 二.实验原理 时序逻辑电路中,有一种电路称为计数器,计数器是用来对时钟脉冲进行计数的…

稳联Profinet转Canopen网关携手伺服,高效提升生产效率

在当今的工业生产领域,追求高效、精准和可靠的生产方式是企业不断努力的方向。稳联技术Profinet转Canopen(WL-ABC3033)网关与伺服系统的携手合作,为提高生产效率带来了新的机遇和突破。 实现无缝通信,优化生产流程稳联…

Flink提交任务

第3章 Flink部署 3.1 集群角色 3.2 Flink集群搭建 3.2.1 集群启动 0)集群规划 表3-1 集群角色分配 具体安装部署步骤如下: 1)下载并解压安装包 (1)下载安装包flink-1.17.0-bin-scala_2.12.tgz,将该jar包…

无人机之控制距离篇

无人机的控制距离是一个复杂且多变的概念,它受到多种因素的共同影响。以下是对无人机控制距离及其影响因素的详细分析: 一、无人机控制距离的定义 无人机控制距离指的是遥控器和接收机之间的最远传输距离。这个距离决定了无人机在操作者控制下能够飞行的…

2024年氧化工艺证考试题库及氧化工艺试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年氧化工艺证考试题库及氧化工艺试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的氧化…

VM+Ubuntu16.04硬盘扩容

步骤: 用df -h查看自己虚拟机的硬盘空间使用情况在虚拟机下安装gparted软件备用 sudo apt-get install gparted在VM的界面或者Windows终端修改虚拟机硬盘大小回到虚拟机的gparted软件里,修改分区,先删除原有的逻辑分区和扩展分区&#xff0c…

一键快速替换PPT上的字体?这个你一定要学会。

前言 最近有个朋友在做PPT,说是准备在各大平台分发,咨询小白关于PPT上内容的事情,结果小白问了一句:字体用的是什么? 嗯……她说是:汉仪黑和字魂。 好家伙,这不是妥妥的当别人财神爷的机会吗&…

是的,第一个在Domino中整个AI本地大语言模型的开源项目已经发布

大家好,才是真的好。 做梦也没想到,上一篇《Notes,无代码应用开发王者归来!》居然又一次焕发了卓越的青春活力,阅读量超高。真希望能再接再厉,续创辉煌。 但今天咱们怎么也不能再讲HCL Notes/Dmino 14.5 …

Vue3 : Pinia的性质与作用

目录 一.性质 二.作用 三.Pinia 的核心概念 四.使用 1.count.ts 2.count.vue Vue 3 中 Pinia 是一个专为 Vue 3 设计的状态管理库,它旨在提供一种简单、直观的方式来管理应用的状态。 一.性质 1.集成性:Pinia 是 Vue 3 官方推荐的状态管理库&…

Linux C高级 day2

一、 1.mkdir ../dir1 && touch ../dir/file 2.cp -r /mnt/dir1/* /home/dir2 3.pwd 4.ls -l 5.ip或ifconfig 6.top 7.ps aux | grep python 8.kill -9 7580 9.ping 10.find /usr -type f -name *name* 11. a-> 输入内容->ese->shift冒号 wq回车 …