Python 之 lambda 函数完整详解 & 巧妙运用

2023-11-05

一、前言

lambda 函数在 Python 编程语言中使用频率非常高,使用起来非常灵活、巧妙;

那么,什么是lambda ?它有哪些用法和应用场景呢 ?

下面让我一起来解读 lambda的神秘之处 !

好文章 记得收藏+点赞+关注额 !!!

---- Nick.Peng


二、lambda 语法

  • lambda 函数的语法只包含一个语句,表现形式如下:
    lambda [arg1 [,arg2,.....argn]]:expression
  • 其中,lambda 是 Python 预留的关键字,[arg…] 和 expression 由用户自定义。
  • 具体介绍如下:
    [arg…] 是参数列表,它的结构与 Python 中函数(function)的参数列表是一样的。
    [arg…] 可以有非常多的形式。例如:
    a, b
    a=1, b=2
    *args
    **kwargs
    a, b=1, *args
    空
    ......
    
    expression 是一个参数表达式,表达式中出现的参数需要在[arg......]中有定义,并且表达式只能是单行的,只能有一个表达式。
    以下都是合法的表达式:
    1
    None
    a + b
    sum(a)
    1 if a >10 else 0
    ......
    

三、lambda 特性

  • lambda 函数是匿名的:
    所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
  • lambda 函数有输入和输出:
    输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
  • lambda 函数拥有自己的命名空间:
    不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。
    常见的lambda函数示例:
    lambda x, y: x*y			# 函数输入是x和y,输出是它们的积x*y
    lambda:None					# 函数没有输入参数,输出是None
    lambda *args: sum(args)		# 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
    lambda **kwargs: 1			# 输入是任意键值对参数,输出是1
    

四、lambda 常见用法

    由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。
    在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种:

  • 1、将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
    示例:
    add = lambda x, y: x+y
    相当于定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add就指向了具有加法功能的函数。
    这时我们如果执行add(1, 2),其输出结果就为 3

  • 2、将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
    示例:

    # 为了把标准库time中的函数sleep的功能屏蔽(Mock),我们可以在程序初始化时调用:
    time.sleep=lambda x: None
    # 这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。
    # 例如:
    time.sleep(3)	# 程序不会休眠 3 秒钟,而是因为lambda输出为None,所以这里结果是什么都不做
    
  • 3、将lambda函数作为参数传递给其他函数。
    典型的用法就是下面我们常见的几种高阶函数。

五、lambda 用法之高阶函数

  • map() 函数:
    描述:
    map() 会根据提供的函数对指定序列做映射
    第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
    语法:
    map(function, iterable, ...)
    参数:
    function ----> 函数
    iterable ----> 一个或多个序列
    返回值:
    Python 2.x 版本返回的是列表
    Python 3.x 版本返回的是迭代器
    示例:

    # ===========一般写法:===========
    # 1、计算平方数
    def square(x):
    	return x ** 2
    
    map(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]
    
    
  • reduce() 函数:
    描述:
    reduce() 函数会对参数序列中元素进行累积
    函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    语法:
    reduce(function, iterable[, initializer])
    参数:
    function  ----> 函数,有两个参数
    iterable   ----> 可迭代对象
    initializer ----> 可选,初始参数
    返回值:
    返回函数计算结果。

    实例:

    # ===========一般写法:===========
    # 1、两数相加
    def add(x, y):            
    	return x + y
    
    reduce(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 reduce
    
    def fn(x, y):
    	return x * 10 + y
    
    reduce(fn, [1, 3, 5, 7, 9])
    # 结果:
    13579
    
  • sorted() 函数:
    描述:
    sorted() 函数对所有可迭代的对象进行排序操作

    sort 与 sorted 区别:
    sort 是 list 的一个方法,而 sorted 可以对所有可迭代的对象进行排序操作。
    list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

    语法:
    sorted(iterable[, cmp[, key[, reverse]]])
    参数说明:
    iterable  ----> 可迭代对象。
    cmp       ----> 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    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、利用参数 cmp 排序
    sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
    # 结果:
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    # 3、利用参数 key 排序
    sorted(L, key=lambda x:x[1])
    # 结果:
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    
    # 4、按年龄升序
    students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    sorted(students, key=lambda s: s[2])
    # 结果:
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    # 5、按年龄降序
    sorted(students, key=lambda s: s[2], reverse=True)
    # 结果:
    [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    
  • filter() 函数:
    描述:
    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
    语法:
    filter(function, iterable)
    参数:
    function ----> 判断函数。
    iterable  ----> 可迭代对象。
    返回值:
    Pyhton2.7 返回列表,Python3.x 返回迭代器对象,具体内容可以查看:Python3 filter() 函数

    实例:

    # ===========一般用法:===========
    # 1、过滤出列表中的所有奇数
    def is_odd(n):
    	return n % 2 == 1
    		 
    newlist = 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]
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 之 lambda 函数完整详解 & 巧妙运用 的相关文章

  • 使用 Flask-restful RequestParser 进行嵌套验证

    使用烧瓶宁静 http flask restful readthedocs org 微框架 我在构建一个RequestParser这将验证嵌套资源 假设预期的 JSON 资源格式为 a list obj1 1 obj2 2 obj3 3 o
  • 如何以 HDF5 格式提供 caffe 多标签数据?

    我想将 caffe 与矢量标签一起使用 而不是整数 我检查了一些答案 似乎 HDF5 是更好的方法 但后来我陷入了这样的错误 precision layer cpp 34 检查失败 outer num inner num bottom 1
  • Python lambda 函数没有在 for 循环中正确调用[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 制作一个计算器 我使用 for 循环来绘制按钮 并且尝试使用 lambda 函数 以便仅在按下按钮时调用按钮的操作 而不是在程序启动时立即调用 然而 当我尝试这
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • 如何/在哪里发布 Python 包

    如果一个人创建了一个有用的 Python 包 那么如何 在哪里发布 宣传它以供其他人使用 我已经把它放到了 github 上 但几周后谷歌也没有找到它 包装整洁完整 我制作它供我个人使用 不与其他人分享将是一种耻辱 这是 PyPI 指南 h
  • 从 SQL Server 中调用 Python 文件

    我的文件名中有 Python 脚本 C Python HL py 在此 Python 脚本中 有预测模型以及对 SQL 数据库中某些表的更新 我想将此文件称为 SQL 作业 我怎样才能做到这一点 这个问题不一样 如何在 SQL Server
  • 映射器无法组装任何主键列

    我从 sqlite 表创建了一个临时表 该表是基于各种选择标准的原始表的子集 屏幕截图中有一个示例 我试图一次循环一个表记录 以便更新每个记录中的字段 我有 source table self source engine create en
  • VSCode Jupyter Notebook - 恢复缓存版本

    我正在使用在 Ubuntu 19 10 上运行的 VSCode v 1 48 0 创建一个 Jupyter Notebook VSCode 崩溃了 不幸的是我没有保存笔记本 当我重新启动时它是空的 我已经能够在 config Code Us
  • 无法将 python 数据框中的列类型从 object 转换为 str

    我已经下载了一个csv文件 然后将其读取到python dataframe 现在所有4列都有对象类型 我想将它们转换为str类型 现在dtypes的结果如下 Name object Position Title object Departm
  • Flask-httpauth: get_password 装饰器如何为 basic-auth 工作?

    我想知道有没有人用过这个烧瓶延伸 https github com miguelgrinberg flask httpauth简化 http basic auth 基本上我不明白这个example https github com migu
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 如何从列表中删除“\xe2”

    我是 python 新手 正在使用它在我的项目中使用 nltk 对从网页获得的原始数据进行单词标记后 我得到了一个包含 xe2 xe3 x98 等的列表 但是我不需要这些并想删除它们 我只是尝试过 if x in a and if a st
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • 如何点击 Google Trends 中的“加载更多”按钮并通过 Selenium 和 Python 打印所有标题

    这次我想单击一个按钮来加载更多实时搜索 这是网站的链接 该按钮位于页面末尾 代码如下 div class feed load more button Load more div 由于涉及到一些 AngularJS 我不知道该怎么做 有什么提
  • Tensorflow:提要字典错误:您必须为占位符张量提供值

    我有一个错误 我无法找出原因 这是代码 with tf Graph as default global step tf Variable 0 trainable False images tf placeholder tf float32
  • 是否可以使用 Python 中的密码安全地加密然后解密数据?

    我在 python 程序中有一些数据 我想在使用密码写入文件之前对其进行加密 然后在使用它之前读取并解密它 我正在寻找一些可以根据密码进行加密和解密的安全对称算法 这个问题 https stackoverflow com questions
  • 如何访问模板缓存? - 姜戈

    I am 缓存 HTML在几个模板内 例如 cache 900 stats stats endcache 我可以使用以下方式访问缓存吗低级图书馆 例如 html cache get stats 我确实需要对模板缓存进行一些细粒度的控制 有任
  • 用于获取有关 SVN 存储库信息的 Python 库?

    我正在寻找一个可以从 SVN 存储库中提取 至少 以下信息的库 not工作副本 修订号及其作者和提交消息 每个修订版中的更改 添加 删除 修改文件 有Python库可以做到这一点吗 对于作者和提交消息 我可以解析 db revprops 0

随机推荐

  • ALIGN_SIZE宏解释

    转载 http blog chinaunix net uid 27879959 id 3880459 html 0 tsina 1 63290 397232819ff9a47a7b7e80a40613cfe1
  • 会话固定攻击(session fixation attack)及解决办法

    1 Cookie 的工作过程 Cookie的传递用到了两个字段 请求头字段Cookie和响应头字段Set Cookie 当用户浏览器第一次访问服务器的时候 服务器肯定是不知道他的身份的 所以 就要创建一个独特的身份识别数据 格式是 key
  • 本地maven仓库有jar包但是pom却报错

    发生背景 电脑已经存在了一个项目 需要导入另外一个项目 将新项目的maven地址指向之前那个项目的maven仓库 出现mybatis spring boot在pom中报红 去找jar对应的文件夹 发现jar已存在 但是还是报错 解决 根据网
  • 数值分析:矩阵奇异值分解

    1 奇异值分解 SVD 1 奇异值分解 已知矩阵 bm A in R m times n 其奇异值分解为 bm A bm U bm S bm V T 其中 bm U in R m times m bm V in R n times n 是正
  • 第7章 数据库设计和ER模型

    第7章 数据库设计和ER模型 考试范围 7 1 7 7 考试题型 数据库设计题 考试内容 掌握基本ER模型的概念与ER图的设计 掌握将ER模型转换成关系模式的方法 1 掌握基本ER模型的概念与ER图的设计 概念 E R 模型是数据库设计中广
  • Lottie系列一:介绍与使用

    文章目录 一 Lottie 二 Lottie起源 社区 2 1起源 2 2 社区 2 3 Why Lottie 效率 还原度高 体积 研发的优势 2 4 When Lottie 2 5 Lottie不支持的效果 2 6 官方Demo和在线预
  • CPOW挖矿时代即将到来,你准备好了吗

    自2019年中本聪创建比特币以来 区块链已经经历了整整十年的发展历程 大家都知道 获取比特币的方式可以通过挖矿产出 这种通过硬件设备 消耗电能产出的模式被称为POW挖矿模式 这种模式最为简单 也是最常见的一种挖矿模式 绝大多数的数字货币都是
  • 台式计算机连接wifi适配器遇到问题,电脑提示无线适配器或访问点有问题的处理方法...

    我们在使用电脑过程中 多多少少都会遇到一些问题 比如 最近一位用户就反馈自己的电脑提示无线适配器或访问点有问题 导致网络无法正常连接 感觉十分烦恼 那么 该怎么办呢 接下来 就随系统城小编一起看看该问题的解决方法 方法如下 一 可能电脑的无
  • 基于云计算的Linux系统命令汇总

    用户管理 useradd 指定用户家目录 d 创建系统用户 r redhat 指定shell s 不创建家目录 M 权限管理 chmod 给用户添加权限 chmod 755 user chown 设置文件或目录的所有者和所属的组 只有文件主
  • 靶机三:CHRONOS_ 1

    一 靶机地址 https www vulnhub com entry chronos 1 735 二 信息收集 arpscan 发现主机地址 nmap信息收集 发现80 8000 22端口 可以访问到靶机页面 三 渗透阶段 burpsuit
  • 企业注册一个微信小程序都需要准备哪些物料

    企业注册一个微信小程序都需要提前准备哪些物料 准备资料 公司企业邮箱 企业资质信息 包括企业工商营业执照 组织机构代码证 非个体工商户 税务登记证 非个体工商户 法定代表人 负责人身份证明 法定代表人或负责人的有效身份证明 如身份证 护照等
  • ubuntu下ssh2安装

    iceant iceant desktop share ssh localhost ssh connect to host localhost port 22 Network is unreachable iceant iceant des
  • 清除APP 数据的时候出现Crash的情况分析

    在清除Chromium 浏览器数据的时候出现了异常情况 Crash 复制步骤 info gt Storage cache gt CLEAR STORAGE gt CLEAR ALL DATA gt OK Crash 关键log如下 5 25
  • 在家远程工作的体验和总结(为什么我决定更多的在家办公)

    在Parse ly公司 我们骄傲于有一个分布式的开发团队 我们的CTO Andrew 还写了一篇精彩的文章阐述为什么完全的分布式团队是可行的 我们三分之二的团队分步在美国 加拿大 欧洲等地 但我们在纽约也有一个 总部 这是我们的业务团队平时
  • Ubuntu系统建立Andriod编译环境

    本文来源 http source android com source initializing html Initializing a Build Environment The Getting Started section descr
  • vue3+vuex的使用

    vue3 vuex的使用 在src中新建store文件 import createStore from vuex import state from state import actions from actions import muta
  • 无法连接至Synaptics定点装置驱动程序,联想thinkpad最完美解决办法

    话说今天手欠 把红点和触摸板都关上了 闲着没事清理注册表信息 这下好了 我的红点的注册表就被清了 刚百度过遇到各种各样的回答 有新建注册表的 有直接运行SynTPEnh exe程序的 还有建议去重装驱动的 对于ThinkPad来说 别的没用
  • 【ubuntu软件】atom笔记软件----下载、配置、使用

    最近平台切换到了ubuntu环境 很多软件都不能用了 今天看下atom这个笔记软件的下载 配置及其使用 一 为什么选择atom atom是免费的 这个及其重要 其次atom是跨平台的 二 下载 1 官网下载 下载地址 https atom
  • vscode快捷键:折叠、展开代码

    vscode代码编辑器折叠所有区域的代码快捷键 1 折叠所有区域代码的快捷键 ctrl k ctrl 0 先按下ctrl和K 再按下ctrl和0 注意这个是零 不是欧 2 展开所有折叠区域代码的快捷键 ctrl k ctrl J 先按下ct
  • Python 之 lambda 函数完整详解 & 巧妙运用

    文章目录 一 前言 二 lambda 语法 三 lambda 特性 四 lambda 常见用法 五 lambda 用法之高阶函数 一 前言 lambda 函数在 Python 编程语言中使用频率非常高 使用起来非常灵活 巧妙 那么 什么是l