你看过自己写的代码,看过满眼的for循环吗? 你发现你必须斜着眼睛,头向显示器前倾,才能看得更清楚。
总之我有过这样的经历。
for环路就像瑞士军刀,可以解决很多问题。 但是,如果踏实的乌龟需要对代码进行踢球,需要快速弄清楚代码在做什么,它们可能会不知所措。
map、filter、reduce三种技术可以提供函数的备选方案,说明迭代的原因,以避免过度的for循环。 以前在JavaScript上写过这些技术的入门文章,但是在Python上的实现有些不同。
下面简要介绍这三种技术,主要介绍JavaScript和Python语法的差异,并提供for循环转换方法的示例。
什么是地图、过滤器和重构?
回顾以前写的代码,我发现95%的时间都花在遍历字符串和数组上。 在这种情况下,将一组语句映射到每个值,筛选满足特定条件的值,或将数据集减少到一个聚合值。
有了这种洞察力,就可以识别和实现这三种方法。 也就是说,循环扫描通常属于这三个功能类别之一。
Map :对每个项目应用相同的步骤集,然后保存结果
Filter :应用验证条件,保存计算结果为True的项目
Reduce :返回从元素传递给元素的值
为什么Python Map/Filter/Reduce不同呢?
在Python中,这三种技术作为函数而不是数组和字符串类的方法存在。 也就是说,将编写map ) function,my_list,而不是my _ array.map (函数)。
此外,还需要向每个技术传递执行每个项目的函数。 此函数通常编写为匿名函数(在JavaScript中称为箭头函数)。 但是,在Python中,经常看到使用lambda式。
lambda表达式和arrow函数的语法实际上很相似。=替换为(,以便使用关键字lambda )。 剩下的差不多了。
//javascriptarrowfunctionconstsquare=编号=编号*编号;
//pythonlambdaexpressionsquare=lambda编号:编号*编号
行函数和lambda表达式之间的一个重要区别是,行函数可以在多个语句中扩展为完整的函数,而lambda表达式只限于返回的一个表达式。 因此,使用map、filter或reduce时,如果需要对各个项目执行多个操作,则必须在定义函数之后将其包含在内。
definefficientsquare (编号) :
结果=编号*编号
返回结果
地图(信息方形,我的列表) )。
替换for循环
是的,请给我下面的好东西。 以下是三个常见的for循环的示例,它们将被map、filter和reduce替换。 我们的编程目标:计算列表的奇数平方和。
首先,使用基本的for循环的例子。 注意:以下代码只是为了演示,没有map/filter/reduce也有改进的余地。
numbers=[ 1,2,3,4,5,6 ]
odd _编号=
四方形_奇数_编号=
总值=0
# #过滤器为奇数编号
编号:
if编号%2==1:
odd _ numbers.append (编号)
# #方形全部奇数号
for number in odd_numbers:
squared _ odd _ numbers.append (编号*编号) )。
# #计算总体
财富:
总数=编号
# #计算平均值
让我们将每一步转换为这三个函数中的一个。
从功能工具导入延迟
numbers=[ 1,2,3,4,5,6 ]
odd _ numbers=过滤器(lambdan : n %2==1,numbers ) ) ) ) ) )。) ) ) ) ) ) ) ) ) ) ) ) )。
四边形_奇数_编号=地图(拉丁美洲: n * n,奇数_编号) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
total=Reduce(lambdaACC,n: acc n,四方形_奇数_编号) ) ) ) )。
必须强调几个重要的语法要点。
map和过滤器可以在本地使用。 但是,必须从Python 3或更高版本的包装器中导入reduce
lambda表达式是所有三个函数中的第一个参数,iterable是第二个参数
reduce的lambda表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身
请记住,for循环在代码中确实很重要,但扩展工具包绝非坏事。
via:https://媒体.com/better-programming/how-to-replace-your-python-for-loops-with-map-filter-and
雷锋网雷锋网雷锋网