网站首页 > java教程 正文
你是否有过这样的经历,你查看自己写的代码并看到满眼的 for 循环?你发现你必须斜着你的眼睛,并将脑袋前倾到你的显示器,以看得更清楚。
反正我有过这样的经历。
for 循环就像是一把瑞士军刀,它可以解决很多问题,但是,当你需要扫视代码,快速搞清楚代码所做的事情时,它们可能会让人不知所措。
map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。我之前在 JavaScript 中写过这些技术的入门文章,但是它们在 Python 中的实现略有不同。
我们将简要介绍这三种技术,主要介绍它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换 for 循环的示例。
什么是 Map、Filter 和 Reduce?
回顾我以前编写的代码,我意识到 95% 的时间都花在遍历字符串或数组上。在这种情况下,我会执行以下操作之一:将一系列语句映射到每个值,筛选满足特定条件的值,或将数据集减少为单个聚合值。
有了这种洞察力,你就可以识别和实现这三种方法,即循环遍历通常属于这三种功能类别之一:
Map:对每个项应用相同的步骤集,存储结果
Filter:应用验证条件,存储计算结果为 True 的项
Reduce:返回一个从元素传递到元素的值
为什么 Python Map/Filter/Reduce 会不一样?
在 Python 中,这三种技术作为函数存在,而不是数组或字符串类的方法。这意味着,你将编写 map(function, my_list),而不是编写 my_array.map(function)。
此外,每个技术都需要传递一个函数,该函数将执行每个项目。通常,该函数是作为匿名函数(在 JavaScript 中称为 arrow 头函数)编写的。但是,在 Python 中,你经常看到被使用的是 lambda 表达式。
lambda 表达式和 arrow 函数之间的语法实际上非常相似。将 => 替换为 : 并确保使用关键字 lambda,其余的几乎相同。
// JavaScript Arrow Functionconst square = number => number * number;
// Python Lambda Expressionsquare = lambda number: number * number
arrow 函数和 lambda 表达式之间的一个关键区别是,arrow 函数能够通过多个语句扩展成完整的函数,而 lambda 表达式仅限于返回的单个表达式。因此,在使用 map、filter或 reduce时,如果需要对每个项执行多个操作,请先定义函数,然后再包含它。
def inefficientSquare(number):
result = number * number
return result
map(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 numbers
for number in numbers:
if number % 2 == 1:
odd_numbers.append(number)
# square all odd numbers
for number in odd_numbers:
squared_odd_numbers.append(number * number)
# calculate total
for number in squared_odd_numbers:
total += number
# calculate average
让我们将每个步骤转换为这三个函数的其中之一:
from functools import reduce
numbers = [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必须从 Python 3 以上版本中的函数库导入
lambda 表达式是所有三个函数中的第一个参数,iterable 是第二个参数
reduce的 lambda 表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身
记住,for 循环在代码中确实是很重要的,但是扩展工具包从来都不是坏事。
via:https://medium.com/better-programming/how-to-replace-your-python-for-loops-with-map-filter-and-reduce-c1b5fa96f43a
雷锋网雷锋网雷锋网
猜你喜欢
- 2024-10-26 Java8 List转Map,我卡壳了......
- 2024-10-26 HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
- 2024-10-26 Java集合-- Map(Java集合类)
- 2024-10-26 js 函数式编程:不要再使用 for 循环啦,试试 map 吧
- 2024-10-26 大厂Java二面:Spring循环依赖,烂大街的问题这么答面试官才满意
- 2024-10-26 JAVA集合之 MAP和HASHMAP(java中map和hashmap)
- 2024-10-26 双列集合Map不再难懂:轻松掌握这些知识点!
- 2024-10-26 用到停不下来,Java 8 新特性:foreach 和 stream
- 2024-10-26 Go语言开发者必知必会的Map优化技巧
- 2024-10-26 计算机程序员的入门实践-Map常用的遍历方式(七)
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)