全文共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,剩下的几乎就完全相同。

  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)

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

图源:Unsplash

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

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

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

留言点赞关注

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

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

map for循环_如何用Map、Filter和Reduce替换Python For循环?相关推荐

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

    2020-01-06 17:00:00 全文共2375字,预计学习时长7分钟 图源:Unsplash 屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码? 没错 ...

  2. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  3. js map对象遍历_何时使用 Map 来代替变通的 JS 对象

    JS 普通对象 {key: 'value'} 用于存放结构化数据.但有一件事我觉得很烦:对象键必须是字符串(或很少使用的 symbol). 如果将数字用作键会怎样?在这种情况下不会有错误: const ...

  4. python传文件给堡垒机上远程的另一个机器_如何用hive调度堡垒机上的python脚本...

    工作中,如果我们本地要操作的数据量大,那么主机是跑不起来python脚本的,这个时候,就要用到服务器(也叫堡垒机)了.那么如何用HIVE调用堡垒机上的python脚本呢?今天小白就总结一下步骤和一些注 ...

  5. python pandas for循环_高逼格使用Pandas加速代码,向for循环说拜拜!

    原标题:高逼格使用Pandas加速代码,向for循环说拜拜! 作者:George Seif 编译:公众号翻译部 全网进行中··· 你为什么劝入/劝退Quant? 前言 使用Pandas datafra ...

  6. android 结束if循环_(第五讲)if 分支语句和 while 循环

    本文首发于微信公众号「烽哥带你学Android」,工作日每日更新 1x0 switch 分支语句 昨天我们最后学习了分支结构中的 if 条件语句.其实和 if 条件语句还有个兄弟 -- switch ...

  7. 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[ ...

  8. java中map函数指针_如何用Rust编写合适的map函数?

    使用以下链接列表定义: enum List { Nil, Cons(T, ~List) } 我正在尝试编写一个map函数(即将操作应用于列表的每个元素并返回一个新列表) . 我正在尝试使用教程中提供的 ...

  9. python 矩阵运算 for循环_如何用Python科学计算中的矩阵替代循环?

    比如求一个平面稳态导热问题,控制方程就是拉普拉斯方程: (我才发现原来有[插入公式]这个功能) 按照最简单的毅种循环来写就是: def laplace(u): nx, ny = u.shape for ...

最新文章

  1. AI做不了“真”3D图像?试试Google的新生成模型
  2. Java多线程 - AQS详解
  3. gradient设置上下渐变_iOS 绘制渐变·实例篇
  4. Kernel Video Converter中文版
  5. 我的新书终于写完了。
  6. Java BigDecimal 转换,除法陷阱(转)
  7. BGP的同步规则分析
  8. mongovue mysql_MongoDB 客户端 MongoVue
  9. 激光共聚焦显微镜原理
  10. python读取文本后如何加拼音_[编程心得]用Python给汉字加上带音调的拼音
  11. “海尔”业务流程再造给我们的启示(转载)
  12. 清华大学鲍橒计算机1999,《最强大脑》鲍橒:世界盲棋第一人的最强记忆
  13. 大比分领先!ACCV 2022 国际细粒度图像分析挑战赛冠军方案
  14. 产品破局思考:一个思维,一种策略
  15. 初中计算机科学生情况,初中计算机科学与技术的现代化运用探究
  16. 第四篇:奇点临近,时代呼唤物联网的到来!
  17. 加利福尼亚理工学院鸟类数据库-2011(Caltech-UCSD Birds-200-2011)
  18. JAVA-S7协议连接PLC工具类
  19. 华为数通笔记-NAT
  20. android 循环播放mp3,android – 使用AudioTrack播放循环音频

热门文章

  1. CTF(Pwn)32位文件 和 64 文件 的 差异
  2. java converter转换器_springboot 自定义转换器(converter)
  3. python教程:函数参数中默认值及重要警告
  4. Python常用模块之序列化模块
  5. Python重用父类方法和super的使用
  6. python关键字与标识符
  7. python声音分类_Python音频信号分类MFCC特征神经网络
  8. C语言 enum和typedef enum的区别
  9. xshell安装与配置,Xftp(不能连接虚拟机解决方法,sudo apt-get install openssh-server,服务没开怎么传输数据?)(虚拟机和windows之间自由复制)
  10. NumPy复制数组之浅拷贝和深拷贝(注意,直接用等号不是复制,且切片会改变原数组!!!)ndarray.copy() ndarray.view()(view()只是改变shape形状,数据还是同一个)