0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中 Map/Filter/Reduce的差异

454398 来源:AI公园 作者:Jonathan Hsu 2020-11-17 14:37 次阅读

作者:Jonathan Hsu
编译:ronghuaiyang

导读

想不想去掉瀑布一样的For循环?使用函数式编程来写代码。

你有没有过看自己的代码的时候,看到瀑布一样的 for 循环?你是否发现自己不得不眯着眼睛,向显示器前倾才能看得更清楚?

我知道我有过。

For 循环是解决问题的瑞士军刀,但是,当需要浏览代码以快速阅读你所做的事情时,它们可能会让人不知所措。

有三种技术 — map、filter 和 reduce — 可以通过描述如何进行迭代来代替 for 训练。JavaScript 中也有这些技术,但是在 Python 中的实现略有不同。

我们将简要介绍这三种技术中的每一种,强调它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换普通 for 循环的示例。

什么是 Map, Filter, 以及 Reduce?

回顾之前写的代码,我发现在 95%的情况下,当循环遍历字符串或数组时,我是这样做的:将序列map到每个值,filter满足特定条件的值,或者将数据集reduce到单个聚合值。

有了这样的认识,这三种方法就是识别 —— 然后实现,你遍历 iterable 的原因通常属于这三种功能中的一种:

Map:对每个一项应用相同步骤的操作,然后存储结果。

Filter:应用验证标准,存储评估为真的项。

Reduce:返回一个在元素之间传递的值。

Python 中 Map/Filter/Reduce 的不同点是什么?

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

此外,每种技术都需要传递一个函数,该函数将为每个一项执行。通常,函数被写成匿名函数(在 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 result
map(inefficientSquare, my_list)

替换 For 循环

好吧,说正事。下面是三个常见的 for 循环示例,它们将被 map、filter 和 reduce 替换。我们的编程提示:计算列表中奇数的平方和。

首先,使用 basic 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+的functools库中导入。

lmbda 表达式是所有三个函数中的第一个参数,而 iterable 是第二个参数

reduce()的 lambda 表达式需要两个参数:累加器(传递给每个元素的值)和单个元素本身。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示器
    +关注

    关注

    21

    文章

    4915

    浏览量

    139715
  • python
    +关注

    关注

    55

    文章

    4764

    浏览量

    84352
收藏 人收藏

    评论

    相关推荐

    python:利用mapreduce编写一个str2float函数,把字符串'.1'转换成浮点数0.1:

    #!/usr/bin/env python3# -*- coding: utf-8 -*-from functools import reduceCHAR_TO_FLOAT = { '0': 0
    发表于 07-16 01:27

    python初学--用map规范英文名字

    进入第3天学习,接触到第一个练习,利用 map() 函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入: ['adam', 'LISA', 'barT'] ,输出
    发表于 12-25 14:47

    python高阶函数

    注意的是,以上示例是在 Python2.x 环境下演示的。而在 Python3.x ,却有所不同,你可以自己尝试一下。这里总结一下:第一点,map
    发表于 03-02 16:47

    纹理映射技术Mip_Map的研究_曾云

    纹理映射技术Mip_Map的研究_曾云
    发表于 03-15 11:08 0次下载

    Python的三种函数应用及代码

    1.filter的用法 函数filter(function,list)提供一种优雅的方式过滤出列表函数值返回为True的函数,函数filter(f,l)需要一个函数f作为第一个参数,
    发表于 11-15 13:07 1343次阅读
    <b class='flag-5'>Python</b>的三种函数应用及代码

    Reduce阶段values的每个值都共享一个对象

    Hadoop备忘:Reduce阶段IterableVALUEIN values的每个都共享一个对象。在Reduce阶段,具有相同key的的所有的value都会被组织到一起,形成一种key:values的形式。
    发表于 11-28 11:00 1331次阅读

    mapreduce MAP进程的数量怎么控制?

    1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值3.如果输入中有很多小文件,依然想减少
    发表于 01-02 14:04 1867次阅读
    mapreduce <b class='flag-5'>中</b><b class='flag-5'>MAP</b>进程的数量怎么控制?

    Mapreduce和Hivemap reduce个数设定

    Mapreducemapper个数的确定: 在map阶段读取数据前,FileInputFormat会将输入文件分割成split。split的个数决定了map的个数。 影响map个数,
    发表于 01-02 14:21 6076次阅读

    mapreduce工作原理图文详解_MapReduce任务Shuffle和排序

    本文主要分析以下两点内容:1.MapReduce作业运行流程原理2.MapReduce任务Shuffle和排序的过程。分析如下文
    发表于 01-02 14:39 8468次阅读
    mapreduce工作原理图文详解_<b class='flag-5'>Map</b>、<b class='flag-5'>Reduce</b>任务<b class='flag-5'>中</b>Shuffle和排序

    MDK- ARMmap文件全解析

    MDK-ARMmap文件全解析
    的头像 发表于 03-14 14:00 5932次阅读
    MDK- ARM<b class='flag-5'>中</b><b class='flag-5'>map</b>文件全解析

    python高阶函数详解

    python高阶函数 1. map 函数 map 函数,它接收两个参数,第一个参数是一个函数对象(当然也可以是一个lambda表达式),第二个参数是一个序列。 它可以实现怎样的功能呢,我举个例子你
    的头像 发表于 03-02 16:47 1254次阅读
    <b class='flag-5'>python</b>高阶函数详解

    Python 和 MicroPython 之间的差异

    Python 和 MicroPython 之间的差异
    的头像 发表于 12-28 09:51 3547次阅读

    NIVDIA的reduce优化笔记

    通俗的来说,Reduce就是要对一个数组求 sum,min,max,avg 等等。Reduce又被叫作规约,意思就是递归约减,最后获得的输出相比于输入一般维度上会递减。
    的头像 发表于 01-12 15:05 676次阅读

    Ruby 与 Python之间的差异

    Ruby 与 Python 之间的差异在很大程度上可通过 for 循环看出本质。 Python 拥有 for 语句。对象告诉 for 如何进行协作,而 for 的循环体会处理对象返回的内容
    的头像 发表于 10-30 11:50 570次阅读

    Python2与Python3的差异

    Python2与Python3是两个不同的版本,它们在语法、功能和性能等方面存在一些差异。下面是对Python2和Python3的详尽、详实
    的头像 发表于 11-23 16:48 859次阅读