Python编程技巧:如何用Map, Filter, Reduce代替For循环?
off999 2024-09-16 00:51 70 浏览 0 评论
你是否有过这样的经历,你查看自己写的代码并看到满眼的 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
雷锋网雷锋网雷锋网
相关推荐
- lol盒子官方下载(英雄联盟盒子官方)
-
Wegame英雄联盟箱也叫LOL盒子,但现在LOL盒子已经被删除了,但是你可以放现在的盒子Wegame它被理解为英雄联盟指定插件,因为它还具有查看召唤师记录和记录各种数据、水晶复活、野生怪...
- 微信2025最新版本官方免费下载
-
是的,苹果6可以继续使用微信。虽然苹果6已经不再是最新的iPhone型号,但它仍然能够支持微信的运行。只要你的苹果6上安装了最新版本的iOS系统,你就可以在上面下载和使用微信应用程序,与朋友们聊天、分...
- 在线音乐(在线音乐合集)
-
在线听音乐就是利智能手机或者电脑,其中的应用上的资源,不下载随搜随播放收听,这样的听音乐方便快捷,但是音质一般,因为手机和电脑都是软解,若是想要得到无损音质,则把曲目下载后导出手机或者电脑外,使用储卡...
- 滴滴注册司机车辆要求(滴滴注册司机车辆要求营运证)
-
以北海市为例,车辆要求如下:根据《北海市网约车管理实施细则》第十三条拟从事网约车经营的车辆,应当符合以下条件(一)七座及以下乘用车;(二)网约车经营车辆尾气排放必须达到国家规定的环保标准,发动机排量...
- 植物大战僵尸单机下载(单机植物大战僵尸免费版手机版)
-
您好,要在手机上下载并玩植物大战僵尸无尽版(Plantsvs.ZombiesEndlessVersion),可以按照以下步骤操作:1.打开手机的应用商店(如AppStore或Google...
-
- 赚钱app第一名(赚钱app第一名提现微信)
-
比较大的公司产品就有:抖音极速版和今日头条极速版,欢迎扫码注册,注册后可以做任务赚金币,金币可以还钱,还可以提现;其他还有一些各种app,什么走路赚钱,读书赚钱等等的,不过不建议安装。头条、西瓜、抖音、快手等等都很靠谱啊,赚钱只能各凭本事了...
-
2026-02-03 09:51 off999
- 新东方英语线上课程报名(适合小学生免费学英语的软件)
-
新东方网上报名及支付操作流程一、登陆http://sz.xdf.cn/,进入新东方官网首页,搜索课程名称或者班号,选择适合您的课程二、进入搜课课程页面,点击【立即报名】三、去结算已选在购物车的课程四、...
- 沫子漫画画免费读漫画在线观看
-
漫画结局就是夏沫和大少爷结婚,洛熙就在教堂听了什么后释然了,夏末还怀上了欧辰的宝宝,并且获得了最佳女主角的奖项。据文中洛熙的说法,是在第一次参加超级明星的那天晚上,在漫画第四话第28页,不过漫画上画的...
- 主题壁纸大全下载(好看的主题壁纸图片)
-
主题和壁纸有很大的区别,壁纸的话,你可以根据自己的喜好来设置你想要得到的壁纸,可以从你的相册里面挑选壁纸作为你的手机屏幕壁纸纸,但是主题的话,主题,他是属于一个系列的,当你换了手机主题之后,你的操作界...
- 网络电视下载什么软件看直播电视
-
1,饭团影视tv版 饭团影视是一款超好看的影视资源播放器软件轻松享受追剧的快感,无卡顿流畅播放,超强大的播放功能。 2,红影TV版 红影TV是一款电视点播软件,无需授权码,无需注册登录,软件完全...
- 如何快速学会cad制图(怎样能快速学会cad画图)
-
CAD可以自学啊,很简单,就是你报个班去学也就是那些简单点的东西,自学都可以搞定的,因为那些辅导班很少有教你实际的东西,大都是一些简单命令的操作。。。CAD也分好几种,机械,电气,建筑等等,你的先选好...
- 苹果手机微信安装(苹果手机微信安装教程)
-
苹果手机是目前市场上最受欢迎的智能手机之一,而微信也是最流行的即时通讯软件之一。在苹果手机上安装微信非常简单,只需按照以下步骤操作即可。步骤一:打开AppStore应用商店在苹果手机主屏幕上找到Ap...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
