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

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

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

图源:Unsplash

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

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

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

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

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

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

图源:Unsplash

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

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

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

Map, Filter, 和Reduce是什么?

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

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

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

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

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

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

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

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

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

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

  1. // JavaScript Arrow Function
  2. const square = number => number * number;// Python Lambda Expression
  3. square = lambda number: number * number

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

  1. def inefficientSquare(number):
  2. result = number * number
  3. return resultmap(inefficientSquare,my_list)

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

替换For循环

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

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

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

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

  1. 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 (传递给每个元素的值)和单个元素本身。

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

图源:Unsplash

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

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

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

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

留言点赞关注

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

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

相关推荐