Lambda 算子、过滤、缩减和映射(1)

(1)Python所有方向的学习路线(新版)

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

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

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

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

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

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

  • 同时拥有列表理解和“过滤、映射、缩减和 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 ])

输出:

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

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

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

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值