map for循环_如何用Map、Filter和Reduce替换Python For循环?
全文共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 Function
- const square = number => number * number;// Python Lambda Expression
- square = lambda number: number * number
Lambda表达式和箭头函数之间的一个关键区别是,箭头函数可以扩展成有多个语句的完整函数,而lambda表达式只限于一个能返回的表达式。因此当使用map(), filter()或 reduce()时,如果需要对每个项执行多个操作,需要先定义函数,再把函数使用进去。
- def inefficientSquare(number):
- result = number * number
- return 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 numbers
- for number in numbers:
- if number % 2 == 1:
- odd_numbers.append(number)# squareall 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 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学习与发展的干货
如转载,请后台留言,遵守转载规范
map for循环_如何用Map、Filter和Reduce替换Python For循环?相关推荐
- 如何用Map、Filter和Reduce替换Python For循环?
2020-01-06 17:00:00 全文共2375字,预计学习时长7分钟 图源:Unsplash 屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码? 没错 ...
- python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环
展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...
- js map对象遍历_何时使用 Map 来代替变通的 JS 对象
JS 普通对象 {key: 'value'} 用于存放结构化数据.但有一件事我觉得很烦:对象键必须是字符串(或很少使用的 symbol). 如果将数字用作键会怎样?在这种情况下不会有错误: const ...
- python传文件给堡垒机上远程的另一个机器_如何用hive调度堡垒机上的python脚本...
工作中,如果我们本地要操作的数据量大,那么主机是跑不起来python脚本的,这个时候,就要用到服务器(也叫堡垒机)了.那么如何用HIVE调用堡垒机上的python脚本呢?今天小白就总结一下步骤和一些注 ...
- python pandas for循环_高逼格使用Pandas加速代码,向for循环说拜拜!
原标题:高逼格使用Pandas加速代码,向for循环说拜拜! 作者:George Seif 编译:公众号翻译部 全网进行中··· 你为什么劝入/劝退Quant? 前言 使用Pandas datafra ...
- android 结束if循环_(第五讲)if 分支语句和 while 循环
本文首发于微信公众号「烽哥带你学Android」,工作日每日更新 1x0 switch 分支语句 昨天我们最后学习了分支结构中的 if 条件语句.其实和 if 条件语句还有个兄弟 -- switch ...
- matlab循环数组里的数据库,用于在matlab的python中循环数组
Matlab代码的直译应该是import numpy as np x = np.zeros((parts, 2)) for i in range(parts): x[i,0] = i*L + 1 x[ ...
- java中map函数指针_如何用Rust编写合适的map函数?
使用以下链接列表定义: enum List { Nil, Cons(T, ~List) } 我正在尝试编写一个map函数(即将操作应用于列表的每个元素并返回一个新列表) . 我正在尝试使用教程中提供的 ...
- python 矩阵运算 for循环_如何用Python科学计算中的矩阵替代循环?
比如求一个平面稳态导热问题,控制方程就是拉普拉斯方程: (我才发现原来有[插入公式]这个功能) 按照最简单的毅种循环来写就是: def laplace(u): nx, ny = u.shape for ...
最新文章
- AI做不了“真”3D图像?试试Google的新生成模型
- Java多线程 - AQS详解
- gradient设置上下渐变_iOS 绘制渐变·实例篇
- Kernel Video Converter中文版
- 我的新书终于写完了。
- Java BigDecimal 转换,除法陷阱(转)
- BGP的同步规则分析
- mongovue mysql_MongoDB 客户端 MongoVue
- 激光共聚焦显微镜原理
- python读取文本后如何加拼音_[编程心得]用Python给汉字加上带音调的拼音
- “海尔”业务流程再造给我们的启示(转载)
- 清华大学鲍橒计算机1999,《最强大脑》鲍橒:世界盲棋第一人的最强记忆
- 大比分领先!ACCV 2022 国际细粒度图像分析挑战赛冠军方案
- 产品破局思考:一个思维,一种策略
- 初中计算机科学生情况,初中计算机科学与技术的现代化运用探究
- 第四篇:奇点临近,时代呼唤物联网的到来!
- 加利福尼亚理工学院鸟类数据库-2011(Caltech-UCSD Birds-200-2011)
- JAVA-S7协议连接PLC工具类
- 华为数通笔记-NAT
- android 循环播放mp3,android – 使用AudioTrack播放循环音频
热门文章
- CTF(Pwn)32位文件 和 64 文件 的 差异
- java converter转换器_springboot 自定义转换器(converter)
- python教程:函数参数中默认值及重要警告
- Python常用模块之序列化模块
- Python重用父类方法和super的使用
- python关键字与标识符
- python声音分类_Python音频信号分类MFCC特征神经网络
- C语言 enum和typedef enum的区别
- xshell安装与配置,Xftp(不能连接虚拟机解决方法,sudo apt-get install openssh-server,服务没开怎么传输数据?)(虚拟机和windows之间自由复制)
- NumPy复制数组之浅拷贝和深拷贝(注意,直接用等号不是复制,且切片会改变原数组!!!)ndarray.copy() ndarray.view()(view()只是改变shape形状,数据还是同一个)