第5章 函数与函数式编程 凡此变数中函彼变数者,则此为彼之函数。 函数式编程 (简称FP) 是一种编程范式(programming paradigm)。 函数式编程与命令式编程最大的不同是:函数式编程的焦点在数据的映射,命令式编程(imperative programming)的焦点是解决问题的步骤。 函数式编程不仅仅指的是Lisp、Haskell、 Scala等之类的语言,更重要的是一种编程思维,解决问题的思考方式,也称面向函数编程。 函数式编程的本质是函数的组合。 5.1 函数式编程简介 函数式编程是关于不变性和函数组合的编程范式。
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9'] reduce return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25 把字符串转化为整数的函数: from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def char2num(s): 此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序: >>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36] key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
目录 一个常见的HTTP服务器 拆分可选配置 函数式选项 更进一步 ServerConfig 我们先来看看一个常见的HTTP服务器的配置,它区分了2个必填参数与4个非必填参数 type ServerCfg string, port int, maxconns int, timeout time.Duration, tls *tls.Config) (*Server, error) {} SplitConfig 编程的一大重点 int Protocol string Timeout time.Duration MaxConns int TLS *tls.Config } // 定义一个Option类型的函数 就是需要编写多个Option函数,代码量会有所增加。 如果大家对这个感兴趣,可以去看一下Rob Pike的这篇blog 。 首先,我们改造一下函数Option // 返回错误 type OptionWithError func(*Server) error 然后,我们改造一下其中两个函数作为示例 func Protocol
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128794.html原文链接:https://javaforall.cn
当然, 对函数式编程也有所耳闻, 但也仅仅是有所耳闻, 从来没有上手写过. 最近没事的时候就找些资料看看, 同时也尝试自己写一些函数式编程思想的代码. 以下简单总结一下我最近对函数式编程的体验. 最开始, 我以为将面向对象中的类为基本单位, 换成函数为基本单位, 就是函数式编程了, 结果发现, 这只能说明我还是在使用面向对象的思想. 那么什么是函数式编程呢? 看到函数这个名字, 最先想到的就是初中的数学了: f(x)=2x. 这是一个一元一次函数. 针对我对于函数式编程的使用来看, 总结函数式编程的几个特点, 可能并不全面: 管道操作. 可以将数据通过依次流过各个管道, 将各种简单的操作整合为一个复杂的操作. 将函数作为头等对象 延迟处理. 此外, 函数式编程不止以上内容, 这段时间只是简单的尝试
什么是函数式编程 函数式编程是一种编程范式,是一种如何编写程序的方法论。 举个简单例子: int a =10; int b = 15; int c = 2; int sum = a + b; int quadrature = sum * c; 这样的方式属于命令式编程,关心的是解决问题的步骤 函数编程 Math.multiplyExact(Math.addExact(a,b),c); 特点: 函数是“一等公民” 函数是和其他数据类型一样可以赋值给变量,可以作为方法参数,返回值。 4、不用考虑死锁的问题 —— 不修改变量 Java8 新增的函数式接口 分四种: 先看下源码的介绍 Function 接收一个T类型参数,返回R类型。 //返回 3 functionA.apply(2); //返回 4 functionB.apply(2); //返回 5
函数式编程已经有比较长的历史了,如今的动态语言,很大程度上也受到了函数式编程(反过来名叫命令式编程)的启发。 在函数式编程语言中,当你写了一个函数,接受一些参数,那么当你调用这个函数时,影响函数调用的只可能是你传进去的参数,而你得到的也只能够是计算结果。因此,一个 void 的方法,是没有任何意义的。 在函数式编程中访问状态是十分安全的,因为状态不会改变,我可以把一个 Point 或 List 对象交给任意多的地方去访问,完全不用担心副作用。 函数式编程的十分容易并行,因为我在运行时不会修改状态,因此无论多少线程在运行时都可以观察到正确的状态。两个函数完全无关,因此它们是并行还是顺序地执行便没有什么区别了。 我们还可以有延迟计算,可以进行 Memorization,经常使用递归作为控制流,这些都是函数式编程中十分有趣的方面。
source=cloudtencent 什么是函数式编程? 函数式编程(Functional Programming, FP)就是利用纯函数实现细粒度的函数,然后再通过函数的组合把细粒度的函数组合成功能更强大的函数。 函数式编程中的 "函数" 不是程序中的函数(方法),而是数学中的函数(映射关系),例如 y=sin(x) 中 x 和 y 的关系,函数式编程用来描述数据之间的映射。 函数式编程 把现实世界中的事物和事物之间的联系抽象到程序世界,对运算过程进行抽象。 基础案例 非函数式编程 const num1 = 2 const num2 = 3 const sum = num1 + num2 函数式编程 function add(num1, num2) {
了解JavaScript函数式编程目录 0-了解 JavaScript 函数式编程 - 什么是纯函数 1-了解 JavaScript 函数式编程 - 柯里化 2-了解 JavaScript 函数式编程 - 代码组合的优势 3-了解 JavaScript 函数式编程 - 声明式函数 4-了解 JavaScript 函数式编程 - 类型签名 声明式 声明式代码 什么是声明式,我们将不再指示计算机如何工作 声明式最重要的是不是指定执行顺序,所以它天然的适合进行并行运算。它和纯函数一起解释了为何函数式编程是未来并行计算的一个不错的选择 -- 我们真的不需要做什么就能现实一个并行/并发系统。 易于测试,我们不用依赖于函数的状态,我们只关心结果的验证。 函数式编程更加易于理解。 总结 声明式和命令式的区别和含义,这里我们可以结合上一篇文章 组合代码 相关知识。 下篇文章 4-了解 JavaScript 函数式编程 - 类型签名
Java 8 函数式编程 java.util.function.* @FunctionalInterface 都是函数接口,没有成员(状态) 高阶函数:参数或返回值为函数 方法引用:类名::方法名 可以 类名::new、String[]::new 流操作 Stream.of("-1", "0", "1") // 生成 .map(函数) // 映射 .filter(返回布尔值函数) // 过滤器 (重构:找for中if) .flatMap(函数) // 平面映射:多个流合并 .min(Comparator.comparing(x -> x.getLength())) .reduce(0, 返回类型 接口方法: Supplier supplier(); // 供应器:创建容器 BiConsumer<A, T> accumulator(); // 累加器:类似reduce的第二参数(函数式 Comparator 比较规则)) .parallel() // BaseStream 并行流 集合.parallelStream() 影响性能因素:1.数据大小、2.结构、3.装箱、4.核心数、5单元处理开销
JAVA函数式编程 背景 常见的编程范式 函数式编程的优劣 JAVA8中为函数式编程引入的变化 JAVA函数式编程可以简单概括 基本函数 Lambda表达式 方法引用 Stream流API 创建操作 中间操作 比如时下潮流前沿spring framework5中的响应式编程就是使用到了函数式编程的风格。 代表语言有:SQL,HTML,CSS 函数式编程:函数式编程将函数作为编程中的“一等公民”,关注于流程而非具体实现。可以将函数作为参数或返回值。所有数据的操作都通过函数来实现。可以理解为数学中的函数。 缺点: 由于函数内数据不变原则,导致的资源占用 调试上相对于命令式的困难 JAVA8中为函数式编程引入的变化 函数式接口,函数式接口中只能有一个抽象方法 @FunctionInterface,这也是为了函数调用时避免带来二义性 被default修饰的方法–默认实现 JAVA函数式编程可以简单概括 lambda + 方法引用 + stream API = java函数式编程 基本函数 以上是在函数式编程中的基本函数模型,我们大可以将其与数学函数做关联
传统的解决方案 函数式解决方案 命令式和函数式区别 命令式编程风格常常迫使我们出于性能考虑,把不同的任务交织起来,以便能够用一次循环来完成多个任务。 在面向对象的命令式编程语⾔里面,重用的单元是类和类之间沟通⽤的消息,比如方法。 而函数式编程用 map()、filter() 这些高阶函数把我们解放出来,让我们站在更高的抽象层次上去考虑问题,把问题看得更清楚。函数式编程语言实现重⽤的思路很不一样。 函数式语言提倡在有限的几种关键数据结构 (如 list、set、map)上运用针对这些数据结构高度优化过的操作,以此构成基本的运转机构。 开发者再根据具体用途,插⼊⾃己的数据结构和⾼阶函数去调整机构的运转⽅式。 再来一题 题目:找到一个字符串里面某个字符数组里面第一个出现的字符的位置。
纯函数是什么 函数,不依赖执行的上下文,也不影响上下文的变量,输出只由输入决定 看下几个不是纯函数的例子 输出依赖外部变量 let b = 1 function unPure(a) { return b } 复制代码 输出改变外部变量 let o = {} function unPure(object) { object.ex = 1 return object } 复制代码 纯函数的例子 = 'pending') { return {...options, {foo: 'baz'}} } } } 优化后的代码 // 使two抽离出来,成为纯函数 this.state === 'pending') { this.two(options) } } } 复制代码 更优美的理解我们使用的代码,更好的享受编程的乐趣 额外地说一下,使用纯函数与面向对象编程并无冲突。
什么是函数式编程? 函数式编程的本质,函数式编程中的函数这个术语不是指计算机中的函数,而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。 比如sqrt(x)函数计算x的平方根,只要x不变,无论什么时候调用,调用几次,值都是不变的。 有什么好处? 函数式的最主要的好处是不可变性带来的。没有可变的状态,函数就是引用透明的没有副作用。 函数即不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试更容易。 在那些地方用到了? 随着React、vue的火热,函数式编程的概念也开始流行起来,多种前端状态管理框架Flux redux Vuex早期的underscore RxJS库都使用了函数式的特性。
本质上,decorator 就是一个返回函数的高阶函数,它需要接受一个函数作为输入参数,并返回一个函数。 Python 的 @ 语法可以把 decorator 置于函数的定义处: @log def now(): print('2015-3-25') 此时调用 now 函数,会在运行 now 前运行 偏函数 functools.partial 的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
越来越多的迹象表明,函数式编程已经不再是学术界的最爱,开始大踏步地在业界投入实用。 也许继"面向对象编程"之后,"函数式编程"会成为下一个编程的主流范式(paradigm)。 ; 这就是函数式编程。 二、特点 函数式编程具有五个鲜明的特点。 1. 5. 引用透明 引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。 多核CPU是将来的潮流,所以函数式编程的这个特性非常重要。 5. 代码的热升级 函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。
qr-code.png 函数式编程 Map map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回,比循环更简洁,更易读。 , reverse=True) ['Zoo', 'Credit', 'bob', 'about'] ['Zoo', 'Credit', 'bob', 'about'] Pipeline 该部分来自酷壳函数式编程 下面,我们来看看函数式的pipeline应该怎么写? nums, [even_filter, multiply_by_three, convert_to_string]) ['The Number: 6', 'The Number: 12'] 参考 廖雪峰函数式编程 python interview 酷壳函数式编程
函数式编程通过在函数中定义表达式和对表达式求值完成计算.它尽量避免由于状态变化和使用可变对象映入复杂性,让程序变得更加简洁明了. ? 关于编程范式来讲并没有统一得划分标准.主要把函数式和命令式编程来做比较.二者之间得特征区别就是状态. 函数式程序即函数的组合,相应的开发过程是:首先设计一组易于理解的底层函数,然后在此基础上设计符合业务需求的高级函数。相比于由复杂的流程控制组成的指令集合,高级函数更容易可视化。 关键之处不是命令式编程存在某种缺陷,而是函数式编程是一种思维方式的转变,这种改变适用于许多场景。如何用函数式方法编写同一个算法,你会发现函数式编程并没有使算法显著变短或变快。 使用函数式范式 在函数式编程中,求3或5的倍数可分为两部分。 ❏ 对一系列数值求和。 ❏ 生成一个满足某个条件的序列,例如3或5的倍数组成的序列。 一个列表的和的递归形式定义如下。
什么是函数式编程 函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。 比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。 5.引用透明,输入参数一样,输出结果一定相同。 5.代码热升级,无副作用,只要保证接口不变内部实现和外部无关,可以在运行状态下更新代码。 利用模式匹配,我们可以去掉函数中的「分支」(最常见的是 if),写出非常简洁的代码。 相关链接 函数式编程初探 我所了解的函数式编程
函数式编程是什么? 函数式编程是一种通过组合纯函数来编写软件的编程范式,它是声明式而非命令式的,其原则是避免共享状态, 改变数据,以及副作用。 函数式编程推荐: 使用纯函数 使用函数组合 使用声明式代码而非命令式代码 函数式编程应当避免: 副作用 改变数据 共享状态 术语解释 副作用(side effect) 函数副作用是指函数在执行过程中改变了函数之外的环境 命令式编程需要告诉计算机如何完成任务(如计算机熟悉的顺序、分支、循环等),而声明式编程只需要告诉计算机要做什么(如组合函数),它抽象掉了具体的控制流。 通过函数式编程的定义我们知道,函数式编程是将纯函数组合起来,从而完成复杂任务的编程方式。其哲学思想类似于Unix Do one thing, and do it well 的设计理念。 不论面向对象和函数式编程孰优孰劣,javascript因并不是天生的OOP语言而更加偏向于函数式编程,这点从React引入hooks就可见一斑。