龙空技术网

如何用Map、Filter和Reduce替换Python For循环?

读芯术 77

前言:

此时各位老铁们对“mapreduce map”大体比较关注,同学们都需要分析一些“mapreduce map”的相关资讯。那么小编在网络上搜集了一些关于“mapreduce map””的相关资讯,希望兄弟们能喜欢,看官们一起来了解一下吧!

全文共2375字,预计学习时长7分钟

图源:Unsplash


屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码?


没错,我就是这样的。(难以切齿)


For循环是解决问题的瑞士军刀,非常好用,但是当浏览代码想看看自己做了什么的时候,它们会把你淹没。


此时,Map, filter和 reduce三种技术可以帮到你。


它们可以通过提供描述迭代原因的函数替代选择,来矫正For循环的狂热。


图源:Unsplash


在之前的文章里,小芯有介绍过 JavaScript里使用这些技术,但是在Python中的实现稍许有些不同。


下面将分别简要介绍三种技术,重点强调它们在JavaScript和Python中的语法不同,然后举出如何替换常见For循环的示例。


Map, Filter, 和Reduce是什么?


回顾之前写的代码,我意识到当循环字符串或数组时,95%的情况下,我都在做如下的事情之一:将系列语句映射(Map)到每个值,过滤(Filter)掉满足特定情况的值,或者将数据集减少(Reduce)到单个聚合值。


基于这种观点,这三种方法是识别和实现,因为循环迭代的原因通常对应以下三种功能类型之一:


· Map:对每个项应用相同的步骤集,储存结果。

· Filter: 应用验证条件,储存计算值为True的项。

· Reduce: 返回从一个元素传递到另一个元素的值。


是什么让Map、Filter、Reduce与众不同?


在Python中,这三种技术易函数的形式存在,而不是Array或String类的方法。这意味着要写成map(function, my_list)而不是my_array.map(function)。


此外,每个技术都需要传递函数,该函数会被每个项执行。通常而言,函数会写成匿名函数,在JavaScript中叫胖箭头函数。但是在Python中会经常使用lambda表达式。


Lambda表达式和箭头函数之间的语法其实非常相似。将=>替换为:,确保使用了关键词lambda,剩下的几乎就完全相同。


// JavaScript Arrow Functionconst square = number => number * number;// Python Lambda Expressionsquare = lambda number: number * number

Lambda表达式和箭头函数之间的一个关键区别是,箭头函数可以扩展成有多个语句的完整函数,而lambda表达式只限于一个能返回的表达式。因此当使用map(), filter()或 reduce()时,如果需要对每个项执行多个操作,需要先定义函数,再把函数使用进去。


def inefficientSquare(number):result = number * numberreturn resultmap(inefficientSquare,my_list)

替换For循环


下面是三个常见的For循环示例,分别用map, filter和 reduce替换掉。编程目的:计算列表中奇数的平方和。


首先是基本的For循环示例。请注意:这纯粹是为了演示,即使没有map/filter/reduce也可以改进它。


numbers = [1,2,3,4,5,6]odd_numbers = []squared_odd_numbers = []total = 0# filter for odd numbersfor number in numbers:if number % 2 == 1:odd_numbers.append(number)# squareall odd numbersfor number in odd_numbers:squared_odd_numbers.append(number *number)# calculate totalfor number in squared_odd_numbers:total += number# calculate average

将每个步骤替换为一个函数:


from functools importreducenumbers = [1,2,3,4,5,6]odd_numbers = filter(lambda n: n % 2 == 1,numbers)squared_odd_numbers = map(lambda n: n * n, odd_numbers)total =reduce(lambda acc, n: acc + n, squared_odd_numbers)

有几个重要语法要点需要强调。


· map() 和 filter() 原生可用。但是reduce() 必须从 Python3+中的functools 库里导入。

· Lambda表达式是所有三个函数里的第一个参数,而迭代表达式是第二个参数。

· reduce()的Lambda表达式需要两个参数: accumulator (传递给每个元素的值)和单个元素本身。


图源:Unsplash


诚然,For循环在代码中不可或缺,但是过度使用未免有点单调,学习新知识为自己的代码锦上添花,不是更好吗?


毕竟,学习新知识可不是坏事,小芯更不是什么魔鬼。(坏笑)


最后,衷心祝愿大家远离洪水般的For循环。

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

标签: #mapreduce map