函数式编程filter、map、reduce

(本文是一篇学习笔记和自己对filter、map、reduce的理解
参考:link.
作为一名半路出家的程序员,还记得第一门学习的编程语言是C,那种面向过程设计的语言风格很适合做事的流程和方式,很容易让人上手。但是C 语言虽然简单灵活,能够让程序员在高级语言特性之上轻松进行底层上的微观控制,被誉为“高级语言中的汇编语言”,但其基于过程和底层的设计初衷又成了它的短板(例如内存的申请释放完全由程序员控制,这就会带来很多的意外惊喜)。
后面慢慢接受到了面向对象的程序设计,学习了C++,Java,Python等语言,逐渐感受到对象化对于编程的优势,面向对象编程不够友好地就是代码阅读体验不佳,因为很多方法都封装在了接口或者类里面,对其行为不仔细阅读代码有时不是很好把握,但或许这就是万物皆对象的魅力所在吧。
最近接触了一点点函数式编程。

什么是函数式编程?

学习过数学应该都知道函数,如:

f(x)=5x^2+4x+3
g(x)=2f(x)+5=10x^2+8x+11
h(x)=f(x)+g(x)=15x^2+12x+14

假设 f(x) 是一个函数,g(x) 是第二个函数,把 f(x) 这个函数套下来,并展开。然后还可以定义一个由两个一元函数组合成的二元函数,还可以做递归,下面这个函数定义就是斐波那契数列。

f(x)=f(x-1)+f(x-2)

对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的
函数式编程有以下特点。特征
stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。
immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。
优势
没有状态就没有伤害。
并行执行无伤害。
Copy-Paste 重构代码无伤害。
函数的执行没有顺序上的问题。

函数式编程也很简单容易,例如:
// 非函数式,不是pure funciton,有状态
int cnt;
void increment(){cnt++;
}// 函数式,pure function, 无状态
int increment(int cnt){return cnt+1;
}

为什么需要函数式编程?

编程语言是一种工具,编程语言的发展也是朝着越来越高效,方便的路径发展。随着各种语言的出现,程序员已经不再局限于各种语言,而是聚焦于业务,这就要求程序具有抽象的能力,能解决通用问题,这就是编程范式。
在程序世界中,编程工作更多的是解决业务上的问题,而不是计算机的问题,我们需要更为贴近业务、更为抽象的语言,如典型的面向对象语言 C++ 和 Java 等。
函数式编程的理念:
把函数当成变量来用,关注描述问题而不是怎么实现,这样可以让代码更易读。
因为函数返回里面的这个函数,所以函数关注的是表达式,关注的是描述这个问题,而不是怎么实现这个事情。

函数式编程关注的是:describe what to do, rather than how to do it
过程式编程范式叫做 Imperative Programming – 指令式编程,而把函数式编程范式叫做 Declarative Programming – 声明式编程

函数式语言的三套件

函数式语言有三套件,Map、Reduce 和 Filter,在学习得时候理解不是很好,在此记录几个例子复习一下。

Map

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

# 传统的非函数式
upname =['HAO', 'CHEN', 'COOLSHELL']
lowname =[]
for i in range(len(upname)):lowname.append( upname[i].lower() )# 函数式
def toUpper(item):return item.upper()upper_name = map(toUpper, ["hao", "chen", "coolshell"])print(upper_name)
# 输出 ['HAO', 'CHEN', 'COOLSHELL']map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数

reduce

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。[reduce是减少的意思,每次头用函数合并前两个数据,知道集合中只有一个数据为止]

from functools import reducedef add(x, y) :            # 两数相加return x + y
sum1 = reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
sum2 = reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数

Filter

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中

import math
def is_sqr(x):return math.sqrt(x) % 1 == 0newlist = filter(is_sqr, range(1, 101))
print(newlist)a = filter(lambda x: x % 2 == 0, range(10))

Map、Reduce 和 Filter是轮子,可以合起来造汽车:
计算数组中正数的平均值

# 计算数组中正数的平均值
num =  [2, -5, 9, 7, -2, 5, 3, 1, 0, -3, 8]
positive_num_cnt = 0
positive_num_sum = 0
for i in range(len(num)):if num[i] > 0:positive_num_cnt += 1positive_num_sum += num[i]if positive_num_cnt > 0:average = positive_num_sum / positive_num_cntprint(average)#计算数组中正数的平均值
positive_num = list(filter(lambda x: x>0, num))  #python2返回事list,python2返回时filter对象,需要转换
average = reduce(lambda x,y: x+y, positive_num) / len( positive_num )

函数式编程的抽象:把业务抽象为一个个函数:
例如:把一个列表中偶数*3并转为字符串输出

def even_filter(nums):for num in nums:if num % 2 == 0:yield num
def multiply_by_three(nums):for num in nums:yield num * 3
def convert_to_string(nums):for num in nums:yield 'The Number: %s' % numnums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 三个函数串起来
pipeline = convert_to_string(multiply_by_three(even_filter(nums)))

函数式编程filter、map、reduce相关推荐

  1. Python函数式编程,map/reduce,filter和sorted

    什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...

  2. 王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()

    转载请注明出处:王亟亟的大牛之路 首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!! 本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈) 今天上的是关于Pyt ...

  3. Python函数式编程:map/reduce

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作为一种抽象程度极高的编程范式,函数式编程的最大特点就是允许函数本 ...

  4. Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)

    内部函数 Python中函数的作用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外,若往外直至全局作用域都查找不到的话代码会抛异常. 主要看以下代码的差别~~ "&qu ...

  5. python3函数中lambda/filter/map/reduce的用法

    lambda/filter/map/reduce这几个函数面试中很肯定会用到,本篇主要介绍这几个函数的用法. 1.lambda 匿名函数,用法如下: # lambada 参数,参数,参数 : 返回的表 ...

  6. Python函数式编程中map()、reduce()和filter()函数的用法

    Python中map().reduce()和filter()三个函数均是应用于序列的内置函数,分别对序列进行遍历.递归计算以及过滤操作.这三个内置函数在实际使用过程中常常和"行内函数&quo ...

  7. Python函数式编程-map()、zip()、filter()、reduce()、lambda()

    三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str map函数 map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function, seq ...

  8. Python高级特性: 函数编程 lambda, filter,map,reduce

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

  9. filter,map,reduce,apply函数

    (1)lambda     lambda是Python中一个很有用的语法,它允许你快速定义单行最小函数.类似于C语言中的宏,可以用在任何需要函数的地方. 基本语法如下: 函数名 = lambda ar ...

最新文章

  1. 数据结构与算法:二分查找
  2. CSS弹出二级多列菜单和DIV布局实例 - 仿IBM官网首页
  3. java启动mysq服务_Java Web开发——MySQL数据库的安装与配置
  4. leetcode51. N 皇后(回溯算法)
  5. 信息摘要技术及算法介绍
  6. 论文浅尝 | Zero-Shot Transfer Learning for Event Extraction
  7. UDP丢包问题及解决方案
  8. Linux系统文件夹权限475,linux系统中文件的特殊权限
  9. 小程序素材抓取软件_小程序上新丨2020冬季产品图库更新,海量素材随你用!...
  10. 视频下载软件Annie的安装及使用
  11. python 爬取淘宝视频_识别假货有绝招,先用python抓淘宝评论(附视频教程)
  12. php+剧影评系统 毕业设计-附源码140859
  13. C# 生成多张excel 并打包
  14. springBoot+mybatisPlus项目骨架
  15. Java接口(笔记本USB接口案例)
  16. Vue(3)之 过滤器
  17. 解决 git@gitlab.com: Permission denied (publickey,gssapi-with-mic,password)
  18. 吐血整理,20个计算机保研常见问题及回答模板
  19. 荣耀X10 Max发布在即 屏幕优势显著
  20. iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)

热门文章

  1. bestcoder #56 div 2 B Clarke and problem(dp)
  2. JS配合css实现slide文字框缩放伸展效果
  3. UA OPTI544 量子光学7 补充:Density Operator
  4. UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Matrix Completion简介
  5. UA MATH563 概率论的数学基础 鞅论初步4 Radon-Nikodym定理,条件期望的存在唯一性
  6. UA MATH636 信息论5 信道编码简介
  7. Linux内核源码学习
  8. 面试系列八 es写入数据的工作原理
  9. 在cmd中使用python使用pip报错invalid syntax
  10. 关于我之前写的修改Windows系统Dos下显示的用户名之再修改测试