今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性

Let's do it!

什么是 Python 中的 Lambda 函数

lambda 函数是一个匿名函数(即,没有名称定义),它可以接受任意数量的参数,但与普通函数不同,它只计算并返回一个表达式

Python 中的 lambda 函数使用以下语法表达:

lambda 参数:表达式

lambda 函数包括三个元素:

  • 关键字 lambda:与普通函数中 def 类似

  • 参数:支持传递位置和关键字参数,与普通函数一样

  • 正文:处理定参数的表达式

需要注意的是,普通函数不同,这里不需要用括号将 lambda 函数的参数括起来,如果 lambda 函数有两个或更多参数,我们用逗号列出它们

我们使用 lambda 函数只计算一个短表达式(理想情况下,单行)并且只计算一次,这意味着我们以后不会再复用这个函数。通常来说我们会将 lambda 函数作为参数传递给高阶函数(接受其他函数作为参数的函数),例如 Python 内置函数,如 filter()、map() 或 reduce()等

Python 中的 Lambda 函数如何工作

让我们看一个简单的 lambda 函数示例:

lambda x: x + 1

Output:

<function __main__.<lambda>(x)>

上面的 lambda 函数接受一个参数,将其递增 1,然后返回结果

它是以下带有 def 和 return 关键字的普通函数的更简单版本:

def increment_by_one(x):return x + 1

到目前我们的 lambda 函数 lambda x: x + 1 只创建一个函数对象,不返回任何内容,这是因为我们没有为其参数 x 提供任何值(参数)。让我们先分配一个变量,将它传递给 lambda 函数,看看这次我们得到了什么:

a = 2
print(lambda x: a + 1)

Output:

<function <lambda> at 0x00000250CB0A5820>

我们的 lambda 函数没有像我们预期的那样返回 3,而是返回了函数对象本身及其内存位置,可以看出这不是调用 lambda 函数的正确方法。要将参数传递给 lambda 函数,执行它并返回结果,我们应该使用以下语法:

(lambda x: x + 1)(2)

Output:

3

虽然我们的 lambda 函数的参数没有用括号括起来,但当我们调用它时,我们会在 lambda 函数的整个构造以及我们传递给它的参数周围添加括号

上面代码中要注意的另一件事是,使用 lambda 函数,我们可以在创建函数后立即执行该函数并接收结果。这就是所谓的立即调用函数执行(或 IIFE)

我们可以创建一个带有多个参数的 lambda 函数,在这种情况下,我们用逗号分隔函数定义中的参数。当我们执行这样一个 lambda 函数时,我们以相同的顺序列出相应的参数,并用逗号分隔它们:

(lambda x, y, z: x + y + z)(3, 8, 1)

Output:

12

也可以使用 lambda 函数来执行条件操作。下面是一个简单 if-else 函数的 lambda 模拟:

print((lambda x: x if(x > 10) else 10)(5))
print((lambda x: x if(x > 10) else 10)(12))

Output:

10
12

如果存在多个条件(if-elif-...-else),我们必须嵌套它们:

(lambda x: x * 10 if x > 10 else (x * 5 if x < 5 else x))(11)

Output:

110

但是上面的写法,又令代码变得难以阅读

在这种情况下,具有 if-elif-...-else 条件集的普通函数将是比 lambda 函数更好的选择。实际上,我们可以通过以下方式编写上面示例中的 lambda 函数:

def check_conditions(x):if x > 10:return x * 10elif x < 5:return x * 5else:return xcheck_conditions(11)

Output:

110

尽管上面的函数比相应的 lambda 函数增加了更多行,但它更容易阅读

我们可以将 lambda 函数分配给一个变量,然后将该变量作为普通函数调用:

increment = lambda x: x + 1
increment(2)

Output:

3

但是根据 Python 代码的 PEP 8 样式规则,这是一种不好的做法

赋值语句的使用消除了 lambda 表达式相对于显式 def 语句所能提供的唯一好处(即,它可以嵌入到更大的表达式中)

因此如果我们确实需要存储一个函数以供进一步使用,我们最好定义一个等效的普通函数,而不是将 lambda 函数分配给变量

Lambda 函数在 Python 中的应用

带有 filter() 函数的 Lambda

Python 中的 filter() 函数需要两个参数:

  • 定义过滤条件的函数

  • 函数在其上运行的可迭代对象

运行该函数,我们得到一个过滤器对象:

lst = [33, 3, 22, 2, 11, 1]
filter(lambda x: x > 10, lst)

Output:

<filter at 0x250cb090520>

为了从过滤器对象中获取一个新的迭代器,并且原始迭代器中的所有项都满足预定义的条件,我们需要将过滤器对象传递给 Python 标准库的相应函数:list()、tuple()、set ()、frozenset() 或 sorted()(返回排序列表)

让我们过滤一个数字列表,只选择大于 10 的数字并返回一个按升序排序的列表:

lst = [33, 3, 22, 2, 11, 1]
sorted(filter(lambda x: x > 10, lst))

Output:

[11, 22, 33]

我们不必创建与原始对象相同类型的新可迭代对象,此外我们可以将此操作的结果存储在一个变量中:

lst = [33, 3, 22, 2, 11, 1]
tpl = tuple(filter(lambda x: x > 10, lst))
tpl

Output:

(33, 22, 11)

带有 map() 函数的 Lambda

我们使用 Python 中的 map() 函数对可迭代的每个项目执行特定操作。它的语法与 filter() 相同:一个要执行的函数和一个该函数适用的可迭代对象。

map() 函数返回一个 map 对象,我们可以通过将该对象传递给相应的 Python 函数来从中获取一个新的迭代:list()、tuple()、set()、frozenset() 或 sorted()

与 filter() 函数一样,我们可以从 map 对象中提取与原始类型不同类型的可迭代对象,并将其分配给变量。

下面是使用 map() 函数将列表中的每个项目乘以 10 并将映射值作为分配给变量 tpl 的元组输出的示例:

lst = [1, 2, 3, 4, 5]
print(map(lambda x: x * 10, lst))
tpl = tuple(map(lambda x: x * 10, lst))
tpl

Output:

<map object at 0x00000250CB0D5F40>(10, 20, 30, 40, 50)

map() 和 filter() 函数之间的一个重要区别是第一个函数总是返回与原始函数相同长度的迭代。因此由于 pandas Series 对象也是可迭代的,我们可以在 DataFrame 列上应用 map() 函数来创建一个新列:

import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [0, 0, 0, 0, 0]})
print(df)
df['col3'] = df['col1'].map(lambda x: x * 10)
df

Output:

col1  col2
0     1     0
1     2     0
2     3     0
3     4     0
4     5     0col1  col2  col3
0     1     0    10
1     2     0    20
2     3     0    30
3     4     0    40
4     5     0    50

当然要在上述情况下获得相同的结果,也可以使用 apply() 函数:

df['col3'] = df['col1'].apply(lambda x: x * 10)
df

Output:

col1  col2  col3
0     1     0    10
1     2     0    20
2     3     0    30
3     4     0    40
4     5     0    50

我们还可以根据某些条件为另一列创建一个新的 DataFrame 列,对于下面的代码,我们可以互换使用 map() 或 apply() 函数:

df['col4'] = df['col3'].map(lambda x: 30 if x < 30 else x)
df

Output:

col1  col2  col3  col4
0     1     0    10    30
1     2     0    20    30
2     3     0    30    30
3     4     0    40    40
4     5     0    50    50

带有 reduce() 函数的 Lambda

reduce() 函数与 functools Python 模块相关,它的工作方式如下:

  • 对可迭代对象的前两项进行操作并保存结果

  • 对保存的结果和可迭代的下一项进行操作

  • 以这种方式在值对上进行,直到所有项目使用可迭代的

该函数与前两个函数具有相同的两个参数:一个函数和一个可迭代对象。但是与前面的函数不同的是,这个函数不需要传递给任何其他函数,直接返回结果标量值:

from functools import reduce
lst = [1, 2, 3, 4, 5]
reduce(lambda x, y: x + y, lst)

Output:

15

上面的代码展示了我们使用 reduce() 函数计算列表总和时的作用

需要注意的是,reduce() 函数总是需要一个带有两个参数的 lambda 函数,而且我们必须首先从 functools Python 模块中导入它

Python 中 Lambda 函数的优缺点

优点

  • 它是评估单个表达式的理想选择,应该只评估一次

  • 它可以在定义后立即调用

  • 与相应的普通语法相比,它的语法更紧凑

  • 它可以作为参数传递给高阶函数,例如 filter()、map() 和 reduce()

缺点

  • 它不能执行多个表达式

  • 它很容易变得麻烦,可读性差,例如当它包括一个 if-elif-...-else 循环

  • 它不能包含任何变量赋值(例如,lambda x: x=0 将抛出一个语法错误)

  • 我们不能为 lambda 函数提供文档字符串

总结

总而言之,我们已经详细讨论了在 Python 中定义和使用 lambda 函数的许多方面:

  • lambda 函数与普通 Python 函数有何不同

  • Python 中 lambda 函数的语法和剖析

  • 何时使用 lambda 函数

  • lambda 函数的工作原理

  • 如何调用 lambda 函数

  • 调用函数执行(IIFE)的定义

  • 如何使用 lambda 函数执行条件操作,如何嵌套多个条件,以及为什么我们应该避免它

  • 为什么我们应该避免将 lambda 函数分配给变量

  • 如何将 lambda 函数与 filter() 函数一起使用

  • 如何将 lambda 函数与 map() 函数一起使用

  • 我们如何在 pandas DataFrame 中使用

  • 带有传递给它的 lambda 函数的 map() 函数 - 以及在这种情况下使用的替代功能

  • 如何将 lambda 函数与 reduce() 函数一起使用

  • 在普通 Python 上使用 lambda 函数的优缺点

希望今天的讨论可以使 Python 中看似令人生畏的 lambda 函数概念更清晰、更易于应用,更希望小伙伴们能够喜欢,喜欢就点个吧!

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

  • 1).卧槽!Pdf转Word用Python轻松搞定!

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

  • 4).80行代码!用Python做一个哆来A梦分身

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷

  • 6).30个Python奇淫技巧集

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

  • 8).再见Python!我要学Go了!2500字深度分析!

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,看B站我的视频!

Python中常用最神秘的函数! lambda 函数深度总结!相关推荐

  1. python中常用于输出信息的语句函数是print括号_第十四课我们研究一下常用的print()函数,翻看了一下Python宝典...

    很高兴又和大家见面了. 上一节课,我们学会了如何打通任督二脉,突破编程中的瓶颈,小K希望大家遇到问题时,能够冷静下来,认真分析,不要怂. 这两节课的主要内容是带大家探究"熟悉的陌生人&quo ...

  2. python中常用于输出信息的语句函数是print括号_Python语句 print(type(1/2)的输出结果是...

    [填空题]遍历输出文件所有行. f=open("d:\\r2.txt","r") while True: str= print(str,end='') if n ...

  3. python中字典值的求和以及lambda函数的用法

    lambda函数用于排序以及字典值的求和 data = input() # 课程名 考分 d = {} while data:data = data.split()d[data[0]] = int(d ...

  4. Python中常用的高阶函数

    Python 中常用的高阶函数 ① filter(function,iterable)filter(function, iterable)filter(function,iterable)   过滤器 ...

  5. Python中常用函数

    Python中常用函数 1.range( )函数 函数定义: range(stop) range(start, stop[, step]) 返回值:返回一个递增或递减的数字列表,列表的元素值由三个参数 ...

  6. Python中数值数据类型-number以及Python中常用数学函数

    Python中每个对象都有一个数据类型,数据类型定义为一个值的集合以及定义在这个值集上的一组运算操作.   number(数值)是Python中6个标准的数据类型其中之一.它包含4中内置的数值数据类型 ...

  7. Python学习(5) map与lambda函数

    Python学习(5) map与lambda函数 前言 一. Python准备 二. Python仿真 三. 仿真结果 四. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上升,由 ...

  8. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  9. Python中常用的一些操作总结(未完待续)update @ 2017-5-18

    写在前面的话 其实也没有什么可以写的,或者说完全没有价值.因为你只要动一动手指就可以在Google上找到我要写的这些东西.只是我还不习惯好久没有碰我的blog,但是我又不想写没有价值的东西.或许有价值 ...

最新文章

  1. NC:中国药科郝海平和郑啸发现饮食-微生物互作缓解肠损伤
  2. 报时功能_现在的智能机都没有内置整点自动报时吗?锤子坚果手机SOS有!
  3. Nginx实战部署常用功能演示(超详细版),绝对给力~~~
  4. 习题6-6 使用函数输出一个整数的逆序数 (20 分)
  5. java函数调用约定_2020-09-04:函数调用约定了解么?
  6. ssh : how to add hostkey to “know_hosts”
  7. 异常捕获,返回错误码code给前端
  8. [转载]C#实现软件自动更新思路
  9. java 加载spring_spring的加载机制?
  10. LeetCode--032--最长有效括号(java)
  11. postman汉化包下载
  12. 为windows server 2008 r2系统安装笔记本内置摄像头驱动的过程
  13. 电池充电电路(TP4059)详解
  14. mysql自定义函数的分号_MySQL 第八篇:自定义函数、存储过程、游标-阿里云开发者社区...
  15. QT中QVector的使用
  16. 网络监测是如何工作的?
  17. 智能机器人用什么语言编程
  18. vim:vim从入门到放弃
  19. 中年危机,35 岁定律,见鬼去吧!
  20. SqlServer数据库定期自动备份与清除

热门文章

  1. java 如何循环执行一个对象_养猪场循环生态循环模式及其效益分析,当前牧草成为生态循环猪场效益更好的选择,如何打造一个现代生态循环的高效益猪场?...
  2. C语言实验——用*号输出字母C的图案
  3. 解决EF Code First列名 'xxx' 无效的问题
  4. 倍福PLC模拟量输入模块的使用方法
  5. Qt图形视图框架:视图增加标尺
  6. 回文数—简单方法(C语言)
  7. Spring--官方文档部分翻译(第五章 面向Aspect的编程-AOP)
  8. 什么是数字式KVM远程管理功能
  9. 07 面向对象编程-结构、封装、继承、多态、接口
  10. 如何重装Mac OS系统