python 匿名函数lambda的简洁用法


当前版本:

  • Python 3.8.4

        

文章目录如下

1. lambda 的特点

2. lambda 的用法

2.1. 基本语法

2.2. 函数传参

2.3. 结合条件语句

3. lambda 的应用场景

3.1. 处理列表

3.2. 处理字典


        

1. lambda 的特点

lambda 是一种匿名函数的定义方式,也称为 lambda 函数。它不需要为函数命名,这使得在需要临时或一次性的函数功能时非常方便,通常只需要一行代码即可完成函数的定义。

为什么说它简洁呢,来看一组对比:

【传统函数】

def add_def(a, b):
    return a + b

print(add_def(2, 3))

【lambda函数】

add_lambda = lambda a, b: a + b
print(add_lambda(2, 3))

使用传统函数使用2行代码,使用 lambda 函数仅需要1行代码,从代码量来讲确实简洁,如果代码量大,使用传统函数更容易阅读。所以一般只有在逻辑简单的情况使用 lambda 函数最合适。

        

2. lambda 的用法

2.1. 基本语法

lambda 由2部分组成(关键字:表达式)

lambda : 表达式
  • 表达式:表示函数的逻辑操作,可以是任意有效的 Python 表达式。 

        

用一个最简单的表达式来举例:

lambda: "Hello, World!"

结果(匿名函数): 

        

正常情况下,我们是通过 lambda 来定义一个匿名函数,比如:

func = lambda : 1+1

通过 lambda 来定义一个匿名函数(func),我们可以直接调用这个函数,也支持向函数传参。

        

2.2. 函数传参

匿名函数本身就是函数的一种,所以它也支持传参,语法如下:

lambda 参数 : 表达式

        

定义1个参数的例子

func = lambda x: x**2

我们定义一个名为func的匿名函数,调用时与正常情况下传参即可

func(3)    # 传入一个参数

        

定义多个参数也是同样的方法

func = lambda x,y,z: x+y+z

调用函数时传入多个参数

func(3,4,5)

        

当然了,参数同样支持默认值

func = lambda x=10,y=20,z=30: x+y+z

调用时可以使用默认值或自定义的值,与传统函数没有区别

func()        # 使用默认值
func(x=20)    # 使用部分默认值
func(1,2,3)   # 不使用默认值

        

也支持可变参数(语法:*参数名)

func = lambda *args: sum(args)

调用参数时没有数量限制

func(10)              # 传入1个参数
func(10, 20, 30, 40)  # 传入多个参数

        

2.3. 结合条件语句

lambda 支持与条件语句一起使用,语法如下:

lambda 参数 : 条件语句

        

比如简单的三目运算:

func = lambda x: True if x > 0 else False

通过传入的参数判断是否大于0,如果大于0返回True,否则返回False

func(2)    # 传入一个大于0的参数

        

多条件可以使用多个 if

func = lambda x: "大于0" if x > 0 else "小于0" if x < 0 else "等于0"
  • 如果 x 大于 0,则满足条件 x > 0;如果 x 不大于 0,但小于 0,则满足条件 x < 0;如果 x 不满足前面两个条件,即等于 0,则执行最后的 else 分支。

  • 如果语句再复杂一点就不适用匿名函数了,不太好阅读。

        

如果参数是字符串,返回字符串的长度,否则返回-1

func = lambda x: len(x) if isinstance(x, str) else -1
  • 同样通过 if 判断这个参数,成功返回 len(x),失败返回 -1

         

更加复杂一点的判断

func = lambda x: True if (x > 0) and (x % 2 == 0) else False
  • 如果参数 x 大于0,并且是偶数,返回 True,否则返回 False

        

3. lambda 的应用场景

3.1. 处理列表

处理列表的元素还需要借助 filter 函数,用于过滤序列(列表、元组等)。它的语法如下:

filter(函数, 序列)

利用一个函数来对序列进行判断,该函数返回True保留元素,返回False则不保留元素。

        

【案例一】过滤元素的偶数

numbers = [1, 2, 3, 4, 5]

even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
  • 元素取余为0则保留元素,反之不保留

也可以直接定义1~10的偶数列表

even_numbers = list(filter(lambda x: x % 2 == 0, range(1, 11)))

        

【案例二】过滤元素的奇数

numbers = [1, 2, 3, 4, 5]

odd_numbers = list(filter(lambda x: x % 2 != 0, numbers))
  •  元素取余不等于0则保留元素,反之不保留

        

【案例三】过滤字符串长度大于3的元素

names = ["AAA", "BBBB", "CCCCC", "DDD"]

long_names = list(filter(lambda name: len(name) > 3, names))
  •  元素长度大于3则保留元素,反之不保留

        

【案例四】过滤出空元素

L = ["AAA", "BB", "", "DDD", ""]

non_empty = list(filter(lambda l: l != "", L))
  •  元素不为空则保留元素,反之不保留

        

3.2. 处理字典

【案例一】将值排序

age = {"小李": 18, "小王": 27, "小张": 23}

# 升序
sorted_age = dict(sorted(age.items(), key=(lambda item: item[1]) ))

# 降序
sorted_age = dict(sorted(age.items(), key=(lambda item: item[1]), reverse=True))
  • 利用 lambda 表达式作为排序的关键字,根据字典中的值对键值对进行排序,并使用 reverse=True/False 参数进行降/升序排序。 

复杂一点的字典也是使用同样的方式处理

students = [
    {"姓名": "小李", "年龄": 18, "成绩": "A"},
    {"姓名": "小王", "年龄": 20, "成绩": "B"},
    {"姓名": "小张", "年龄": 19, "成绩": "A"},
    {"姓名": "小徐", "年龄": 21, "成绩": "C"}
]

sorted_students = sorted(students, key=lambda x: x["年龄"])  # 通过年龄排序

         

【案例二】保留值大于20的键值对

age = {"小李": 18, "小王": 27, "小张": 23}

passed_age = dict(filter(lambda item: item[1] >= 20, age.items()))
  • age.items() 表示取键值对,lambda将这个键值对传入匿名函数,再通过这个参数取索引为1(就是值)的值来判断是否大于等于20。如果为True保留键值对,为False则不保留。

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具&#xff0c;Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/&#xff0c;点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…

MySQL十部曲之六:数据操作语句(DML)

文章目录 前言语法约定DELETEINSERTSELECT查询列表SELECT 选项子句FROMWHEREORDER BYGROUP BYHAVINGWINDOWLIMITFOR SELECT ... INTO连接查询CROSS JOIN和INNER JOINON和USINGOUTER JOINNATURE JOIN 子查询标量子查询使用子查询进行比较带有ANY、IN或SOME的子查询带有ALL的子查…

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升&#xff0c;越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;以实现数据加密传输&#x…

docker 容器管理

文章目录 docker 容器管理容器基础容器概念可写的容器层容器的磁盘大小写时拷贝 容器操作容器创建和运行容器的启停查看容器信息进入容器操作删除容器基于容器创建镜像 容器限制限制容器内存限制容器CPU限制容器块IO带宽资源限制的实现机制动态修改容器配置 容器监控容器监控命…

热门应用滥用苹果 iPhone 推送通知,暗中窃取用户数据

移动研究人员 Tommy Mysk 近日揭露&#xff0c;部分热门应用利用 iPhone 推送通知功能秘密发送用户数据&#xff0c;这引发了用户隐私安全担忧。 许多 iOS 应用程序正在使用由推送通知触发的后台进程来收集设备的用户数据&#xff0c;从而有可能创建用于跟踪的指纹档案。 Mys…

【misc | CTF】攻防世界 2017_Dating_in_Singapore

天命&#xff1a;这次终于碰到了算是真正的misc题目了 下载附件&#xff0c;打开是PDF&#xff0c;我一开始以为是flag隐写在PDF里面了 虽然也不奇怪&#xff0c;应该是可以的&#xff0c;毕竟PDF有xss漏洞也是可以的 言归正传&#xff0c;打开PDF 看着新加坡的日历&#xff…

机器学习系列15:通过t-SNE可视化高维数据

t-SNE 的全称是 t-distributed stochastic neighbor embedding&#xff08;t-分布随机领域嵌入&#xff09;&#xff0c;这是一种非线性降维技术。而 PCA 和 LDA 是线性的降维技术。 t-SNE 通常用来在二维或者三维空间中可视化复杂数据集。 简单来说&#xff0c;t-SNE 试图发…

idea中Spring项目yml文件注释中文乱码问题

idea中spring项目yml文件中文乱码问题&#xff0c;如图&#xff1a; 当出现这种情况一般就是idae的配置问题&#xff0c;解决起来也是非常简单的。 按下面操作即可&#xff0c;如图&#xff1a; 解决方式&#xff1a; 1.进入设置 2.找到File Encodings&#xff0c;然后再将编…

PWN 常用工具-补充

目录 pwndbg 如何加载文件 如何运行到Main函数停止 如何查看程序的内存布局 查看内存地址存储的值 如何查看某个地址存储的指令 搜索字符串 打印 调试相关 断点相关 查看栈内数据 查看栈调用顺序 从程序回到gdb 修改内存中的值 file 可执行文件特征 动态链接文…

elementUI的el-select传递item对象或其他参数的2种方法

方法1 :value“item” 绑定对象 只要:value绑定item对象就可以 value-key"value" 必须是item里的一个属性&#xff0c;绑定值为对象类型时必填 <el-select v-model"value" placeholder"请选择" value-key"value" change"cha…

Day02-数据类型和运算符(基本数据类型转换,赋值运算符,算术运算符,关系运算符,逻辑运算符,条件运算符,位运算符,赋值运算符,运算符优先级,标点符号)

文章目录 Java基础语法学习目标1 基本数据类型转换&#xff08;Conversion&#xff09;&#xff08;掌握&#xff09;1.1 自动类型转换&#xff08;隐式类型转换&#xff09;1.2 强制类型转换&#xff08;显式类型转换&#xff09;1.3 基本数据类型与字符串类型的转换 2 运算符…

一起玩儿Proteus仿真(C51)——01. 仿真软件Proteus和开发软件Keil C51的安装

摘要&#xff1a;本文介绍仿真软件Proteus和开发软件Keil C51的安装 智能小车系列文章已经连续发布49期了。为了照顾更多读者的需求&#xff0c;从这周开始&#xff0c;新增加一个系列——Proteus仿真系列&#xff0c;这个系列的文章还是以一个个小的专题的形式&#xff0c;介绍…

数据结构(二)------单链表

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一.什么是链表二.链表的分类三.单链表的实现总结 前言 上一节&#xff0c;我们介绍了顺序表的实现与一些经典算法。 但是顺序表这个数据结构依然有不少缺陷&#xff1a; 1.顺序表指定…

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块&#xff0c;能够在强大的拓扑结构中提供高性能无线串行通信&#xff0c;如点对点、点对多点和安全 Mesh&#xff08;P840 不提供 Mesh&#xff09;。 它采用跳…

多线程 之 静态代理

什么是静态代理&#xff1f; 静态代理是一种思想&#xff0c;找一个代理负责一些琐事&#xff0c;自己则专注于一件大事。 有哪些具体的表现&#xff1f; 在日常生活中做饭就是这样&#xff0c;会做饭的人需要做饭&#xff0c;那么其他的人就来帮他打杂&#xff0c;这样做饭的…

Sqli-labs-master第一关通关攻略

第一关基于错误的字符串/数字型注入 第一关打开&#xff0c;请输入id数值作为参数&#xff0c;那就输呗整个1&#xff0c;2&#xff0c;3看看效果 通过ID数值得变动&#xff0c;页面也随之发生变化&#xff0c;然后就是判断SQL语句是否拼接&#xff0c;是字符型还是数字型 输入…

DETR解读,将Transformer带入CV

论文出处 [2005.12872] End-to-End Object Detection with Transformers (arxiv.org) 一个前置知识 匈牙利算法&#xff1a;来源于二部图匹配&#xff0c;计算最小或最大匹配 算法操作&#xff1a;在n*n的矩阵中 减去行列最小值&#xff0c;更新矩阵&#xff08;此时行或者…

(蓝桥杯每日一题)求最长回文串

问题描述 给出一个长度为 n 的小写字符串&#xff0c;求一个最长的子串 S&#xff0c;满足SXY,X&#xff0c;Y>1&#xff0c;且X,Y 均为回文串。 输入格式 输入包括一行: 第一行是一个长度为 n 的小写字符串。 输出格式 输出包括一行&#xff1a; 一行一个整数&#xff0c;表…

Java设计模式-享元模式(12)

馆长准备了很多学习资料,其中包含java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具 等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关注…

Vue ECharts X轴 type为value的数据格式 + X轴固定间隔并向上取整十位数 - 附完整实例

echarts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…