Lambda 算子、过滤、缩减和映射

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

他放弃他们的理由是这样的:

  • 有一个同样强大的替代 lambda、过滤器、映射和缩减,即列表理解

  • 列表理解(更明显,更容易理解

  • 同时拥有列表理解和“过滤、映射、缩减和 lambda”正在违背 Python 的座右铭“应该有一种明显的方法来解决问题”

有些人喜欢它,有些人讨厌它,许多人害怕 lambda 运算符。lambda 运算符或 lambda 函数是一种创建小型匿名函数(即没有名称的函数)的方法。这些函数是一次性函数,即它们只在创建的地方需要。Lambda 函数主要与 filter()、map() 和 reduce() 函数结合使用。由于 Lisp 程序员的需求,lambda 特性被添加到 Python 中。

lambda 函数的一般语法非常简单:

lambda 参数列表:表达式

参数列表由逗号分隔的参数列表组成,表达式是使用这些参数的算术表达式。您可以将函数分配给变量以为其命名。

以下 lambda 函数示例返回其两个参数的总和:

sum = lambda x , y : x + y

sum ( 3 , 4 )

输出:

7

上面的例子可能看起来像是数学家的玩具。一种形式主义,它把一个容易理解的问题变成一个抽象的更难理解的形式主义。最重要的是,我们可以通过使用以下常规函数定义来获得相同的效果:

def sum ( x , y ):

返回 x + y

sum ( 3 , 4 )

输出:

7

我们可以向您保证,当您学会使用 map() 函数时,这种方法的优势将是显而易见的。

map() 函数


正如我们之前提到的,当与 map() 函数结合使用时,可以看出 lambda 运算符的优势。map() 是一个带有两个参数的函数:

r = 地图(功能,序列)

第一个参数 func 是一个函数的名称,第二个参数是一个序列(例如一个列表)seq。map() 将函数 func 应用于序列 seq 的所有元素。在 Python3 之前,map() 用于返回一个列表,其中结果列表的每个元素都是函数 func 应用于列表或元组“seq”的相应元素的结果。在 Python 3 中, map() 返回一个迭代器。

下面的例子说明了 map() 的工作方式:

def 华氏度( T ):

return (( float ( 9 ) / 5 ) * T + 32 )

def celsius ( T ):

return ( float ( 5 ) / 9 ) * ( T - 32 )

温度 = ( 36.5 , 37 , 37.5 , 38 , 39 )

F = 地图(华氏, 温度)

Ç = 地图(摄氏, ˚F )

temperatures_in_Fahrenheit = 列表地图(华氏, 温度))

temperatures_in_Celsius = 列表地图(摄氏, temperatures_in_Fahrenheit ))

打印(temperatures_in_Fahrenheit )

打印(temperatures_in_Celsius )

输出:

[97.7, 98.60000000000001, 99.5, 100.4, 102.2]

[36.5, 37.00000000000001, 37.5, 38.00000000000001, 39.0]

在上面的例子中,我们没有使用 lambda。通过使用 lambda,我们不必定义和命名函数 fahrenheit() 和 celsius()。您可以在以下交互式会话中看到这一点:

C = [ 39.2 , 36.5 , 37.3 , 38 , 37.8 ]

F = list ( map ( lambda x : ( float ( 9 ) / 5 ) * x + 32 , C ))

打印( F )

输出:

[102.56, 97.7, 99.14, 100.4, 100.03999999999999]

C = list ( map ( lambda x : ( float ( 5 ) / 9 ) * ( x - 32 ), F ))

打印( C )

输出:

[39.2, 36.5, 37.300000000000004, 38.00000000000001, 37.8]

map() 可以应用于多个列表。列表不必具有相同的长度。map() 将其 lambda 函数应用于参数列表的元素,即它首先应用于具有第 0 个索引的元素,然后应用于具有第一个索引的元素,直到达到第 n 个索引:

a = [ 1 , 2 , 3 , 4 ]

b = [ 17 , 12 , 11 , 10 ]

c = [ - 1 , - 4 , 5 , 9 ]

列表(地图( lambda x , y , z : x + y + z , a , b , c ))

输出:

[17、10、19、23]

列表(地图( lambda x , y : x + y , a , b ))

输出:

[18, 14, 14, 14]

列表(地图( lambda x , y , z : 2.5 * x + 2 * y - z , a , b , c ))

输出:

[37.5, 33.0, 24.5, 21.0]

如果一个列表的元素比其他列表少,map 将在最短列表被消耗后停止:

a = [ 1 , 2 , 3 ]

b = [ 17 , 12 , 11 , 10 ]

c = [ - 1 , - 4 , 5 , 9 ]

列表( map ( lambda x , y , z : 2.5 * x + 2 * y - z , a , b , c ))

输出:

[37.5, 33.0, 24.5]

我们可以在上面的示例中看到,参数 x 从列表 a 中获取其值,而 y 从 b 中获取其值,而 z 从列表 c 中获取其值。

映射函数列表


上一章的 map 函数用于将一个函数应用于一个或多个可迭代对象。我们现在将编写一个函数,该函数将一系列函数(例如列表或元组等可迭代对象)应用于一个 Python 对象。

from math import sin , cos , tan , pi

def map_functions ( x , functions ):

“”" 将一个可迭代的函数映射到对象 x “”"

res = []

for func in functions :

res . append ( func ( x ))

return res

family_of_functions = ( sin , cos , tan )

print ( map_functions (pi , family_of_functions ))

输出:

[1.2246467991473532e-16, -1.0, -1.2246467991473532e-16]

之前定义的 map_functions 函数可以使用列表推导技术来简化,我们将在章节列表推导中介绍:

def map_functions(x, 函数):

返回 [ func(x) for func in 函数 ]

过滤

功能

过滤器(函数,序列)

提供了一种优雅的方法来过滤掉序列“序列”的所有元素,函数函数返回True。即,如果 item 包含在序列“sequence”中并且 function(item) 返回 True,则 filter(function, sequence) 的迭代器结果将生成一个 item。

换句话说:函数 filter(f,l) 需要一个函数 f 作为它的第一个参数。f 必须返回一个布尔值,即 True 或 False。此函数将应用于列表 l 的每个元素。只有 f 返回 True 元素才会被迭代器产生,也就是 filter(function, sequence) 的返回值。

在下面的例子中,我们首先过滤掉前 11 个斐波那契数列的奇数和偶数元素:

fibonacci = [ 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 ]

odd_numbers = list ( filter ( lambda x : x % 2 , fibonacci ))

打印( odd_numbers )

输出:

[1, 1, 3, 5, 13, 21, 55]

even_numbers = list ( filter ( lambda x : x % 2 == 0 , fibonacci ))

打印( even_numbers )

输出:

[0, 2, 8, 34]

even_numbers = list ( filter ( lambda x : x % 2 - 1 , fibonacci ))

打印( even_numbers )

输出:

[0, 2, 8, 34]

减少列表


正如我们在教程本章的介绍中提到的。在迁移到 Python 3 时,reduce() 已从 Python 的核心中删除。 Guido van Rossum 讨厌 reduce(),我们可以从他在 2005 年 3 月 10 日在 artima.com 上发表的声明中了解到:

"So now reduce(). This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do. So in my mind, the applicability of reduce() is pretty much limited to associative operators, and in all other cases it's better to write out the accumulation loop explicitly."

功能

减少(功能,序列)

不断地将函数 func() 应用于序列 seq。它返回单个值。

如果 seq = [ s1, s2, s3, … , sn ],调用 reduce(func, seq) 的工作方式如下:

At first the first two elements of seq will be applied to func, i.e. func(s1,s2) The list on which reduce() works looks now like this: [ func(s1, s2), s3, ... , sn ] In the next step func will be applied on the previous result and the third element of the list, i.e. func(func(s1, s2),s3) The list looks like this now: [ func(func(s1, s2),s3), ... , sn ] Continues like this until just one element is left and returns this element as the result of reduce()

如果 n 等于 4,前面的解释可以这样说明:

减少

我们想用一个简单的例子来说明 reduce() 的这种工作方式。我们必须导入 functools 才能使用 reduce:

导入 functools

functools 。减少( lambda x , y : x + y , [ 47 , 11 , 42 , 13 ])

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值