函数式编程

开始学习函数式编程后对编程的一些新感受

浪尽此生 提交于 2019-11-28 14:24:54
我们绝大多数程序员都是用命令式编程,因为学校教的编程就是命令式的,什么C、Java等等(当然他们也可以用函数式编程)。函数式编程和命令式编程不是一个相对应层次的概念。理论上, 函数式编程 的理论基础是Lambda演算,指令式编程基于图灵机。从程序员角度来看,函数式编程不支持赋值操作,一个函数的执行只会返回一个值,不会有任何副作用,所以看上去,一个函数就是一个大的表达式。 这里不再深入去谈函数式编程,更多可以看看前面提到的那个专题。 1. 编程到底是什么? 编程(程序设计)实际上是一个对现实世界中的事物抽象,并由计算机语言实现的过程。核心的步骤就包含三个:理解、抽象、实现。 不同的理解思路,会导致完全不同的抽象结果;不同的抽象结果就会提供各不同的理解。最后根据理解和抽象,由特定的语言完成时间,但其结果要想完全理解还需要前两个步骤支撑。 有点像建筑中的“房子是什么,房地产设计,盖房子”。 2. 编程的发展过程到底有哪些? 程序设计的历史,按照我的理解大致的几个主要阶段: 计算机程序设计历史前阶段;主要是纸带、存储器等原始方式。 计算机语言初级阶段;主要以汇编语言为主,面向的主要内容是“ 数据存储+指令集”; 计算机广泛工业语言设计阶段;主要以C语言为主的大面积应用,此时由C语言更面向人易懂的方向发展。并且操作系统,编译器,数据库软件开始发展;面向的主要内容是“ 程序=算法+数据结构 ”

函数式编程

久未见 提交于 2019-11-28 13:11:42
函数式编程简介什么是函数式编程 函数式是一种编程范式 函数式编程特点 把计算看做是函数而不是一系列指令 纯函数式编程不需要变量 , 测试简单 支持高阶函数 , 代码简洁 Python支持的函数式编程的特点 不是纯函数式编程 , 支持有变量存在 支持高阶函数 , 函数可以作为变量传入 支持闭包 , 有了闭包就可以返回函数 有限度的支持匿名函数 3.2 Python中的高阶函数 高阶函数 : 可以接收函数作为参数的函数就是高阶函数 变量可以指向函数 函数名就是指向函数的变量 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 实例 import math def add(x, y, f): return f(x) + f(y) def sqrt(i, j, k): return k(i) + k(http://www.amjmh.com/v/BIBRGZ_558768/) if __name__ == '__main__': print(add(-5, 9, abs)) print(sqrt(9, 16, math.sqrt)) ———————————————— 来源: https://www.cnblogs.com/liyanyan665/p/11408541.html

python函数式编程

泪湿孤枕 提交于 2019-11-28 11:26:18
函数式编程可以使代码更精简。 函数:filter(function_or_none, iterable)   返回通过函数function_or_none过滤iterable迭代列表后的新列表。过滤函数为None返回原列表。   list_a经过lambda函数过滤后得到列表list_b list_a = [1, 2, 3, 4, 5, 6] list_b = list(filter(lambda x: x > 3, list_a)) print(list_b)   结果: [4, 5, 6] 其他相关一些函数:   map,enumerate,sorted,any,all,zip等等。 来源: https://www.cnblogs.com/bryant24/p/11406597.html

java_函数式编程写法

与世无争的帅哥 提交于 2019-11-28 10:27:20
1 package cn.aikang.Test; 2 3 import org.junit.Test; 4 5 import java.util.Scanner; 6 import java.util.function.Supplier; 7 8 public class Test01 { 9 //定义一个方法,方法的参数是一个接口 10 //使用该方法生产一个字符串 11 public static String show(Supplier<String> sup){ 12 return sup.get(); 13 } 14 15 public static void main(String[] args) { 16 //调用生产字符串的方法,使用匿名函数重写他的方法 17 /*String a = show(()->{ 18 return "喂!你好"; 19 });*/ 20 //简化: 21 String a = show(()->"喂!你好"); 22 System.out.println(a); 23 } 24 } 来源: https://www.cnblogs.com/aikang525/p/11404850.html

java_函数式编程

断了今生、忘了曾经 提交于 2019-11-28 08:37:58
创建函数式接口: 1 //定义了一个函数式接口 2 @FunctionalInterface 3 public interface BlogTest { 4 /* 5 函数式接口: 6 概念:有且仅有一个抽象方法的接口 7 接口中任何包含其他方法(默认,静态,私有) 8 格式: 9 interface 接口名称{ 10 public abstract 返回值类型 方法名称(可选参数信息); 11 其他非抽象方法内容 12 } 13 注解:@FunctionalInterface 检测接口是否是一个函数式接口 14 */ 15 16 public void show(); 17 } 使用函数式接口: 1 //使用函数式接口 2 class Test02{ 3 //方法中的参数是函数式接口 4 public static void show1(BlogTest blogTest){ 5 System.out.println("我是一个函数式接口"); 6 } 7 8 public static void main(String[] args) { 9 //调用函数式接口 10 //方法的参数是一个函数式接口,所以可以传递Lambda表达式show((函数参数) 11 show1(()->{}); 12 } 13 } 来源: https://www.cnblogs.com

函数式编程

旧城冷巷雨未停 提交于 2019-11-28 08:33:21
   相对于面向对象编程关注的是数据而言,函数式编程关注的是动作,是一种过程抽象的思维,就是对当前的动作去进行抽象。 函数式编程具有两个基本特征: (1)函数是第一等公民; (2)函数是纯函数 函数是第一等公民 指函数跟其他数据类型一样处于平等地位,可以赋值给其他变量,可以作为参数传入另一个函数,也可以作为别的函数的返回值。 纯函数 定义是对于相同的输入,永远会得到相同的输出,并且不会产生副作用的函数。无副作用指的是函数内部的操作不会对外部产生影响(如修改全局变量的值、修改DOM的值) //是纯函数 function add(x,y){ return x+y; } //输出不确定,不是纯函数 function random(x){ return Math.random()*x; } //输出不确定,有副作用,不是纯函数 function setColor(el,color){ el.style.color=color; } //在js中,slice()是纯函数,每次传入相同的值返回同样的结果;splice()是不纯的。 //不纯的 var min = 18; var checkage = age => age > min; //纯的,这很函数式 var checkage = age => age > 18;   在不纯的版本中,函数的行为不仅取决于输入的参数

Java函数式编程原理以及应用

烈酒焚心 提交于 2019-11-28 06:11:37
一. 函数式编程 Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力。 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量、参数、返回值和数据类型。 基于表达式来替代方法的调用 函数无状态,可以并发和独立使用 函数无副作用,不会修改外部的变量 函数结果确定性;同样的输入,必然会有同样的结果。 下面jdk1.8里面对函数式编程的定义。只是一个 FunctionalInterface 接口 。 特别的简单。 1 @Documented 2 @Retention(RetentionPolicy.RUNTIME) 3 @Target(ElementType.TYPE) 4 public @interface FunctionalInterface {} 这个函数式接口有几点以下的限制: 唯一的抽象方法,有且仅有一个 (即所有的函数式接口,有且只能有一个抽象方法) 加上标注,则会触发JavaCompiler的检查。对于符合函数接口的接口,加不加都无关紧要,但是加上则会提供一层编译检查的保障。如果不符合,则会报错。 不能被覆盖之后,再声明为抽象方法,则不算抽象方法。 例如接口实现了Object中的方法。 可用于lambda类型的使用方式 二. Java8新增函数式接口 Stream的操作是建立在函数式接口的组合之上的

函数式编程

℡╲_俬逩灬. 提交于 2019-11-28 04:53:05
一、高阶函数 变量可以指向函数 >>> abs(-10) 10 求绝对值的函数 >>> abs <built-in function abs> 只写函数名,说明abs指向了一个地址 >>> x = abs(-10) >>> x 10 把结果赋值给变量 >>> f = abs >>> f <built-in function abs> 试一试函数能否赋值 >>> f = abs >>> f(-10) 10 结论:变量可以指向函数 函数名也是变量 >>> abs = 10 >>> abs(-10) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable 结论: abs 这个变量已经不指向求绝对值函数了,函数名也是变量 传入函数 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 一个最简单的高阶函数: 1 def add(x, y, f): 2 return f(x) + f(y) 3 4 print(add(-5, 6, abs)) 虽然可以这么做,但是在实践当中,不会这么采用,以免造成冲突 map/reduce map()函数的底层实现 1 def map

python函数式编程之返回函数

為{幸葍}努か 提交于 2019-11-28 00:50:37
函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。如果不需要立刻求和,而是在后面的代码中,根据需要再计算,可以不返回求和的结果,而是返回求和的函数: def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum f = lazy_sum(1,2,3)#返回的是求和函数 print(f) f()#调用时才会计算求和结果 ------------------------------------------------------------------------------- Output: <function lazy_sum.<locals>.sum at 0x00000269FA029950> 6 在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum ,并且,内部函数 sum 可以引用外部函数 lazy_sum 的 参数和局部变量 ,当 lazy_sum 返回函数 sum 时, 相关参数和变量都保存在返回的函数中 ,这种称为“ 闭包 (Closure)”的程序结构拥有极大的威力。 请再注意一点,当我们调用 lazy_sum() 时,每次调用都会返回一个 新的函数 ,即使传入相同的参数。 闭包

类型和程序设计语言

我的梦境 提交于 2019-11-27 19:10:20
编程语言的类型系统为何如此重要? - 知乎 https://www.zhihu.com/question/23434097/answer/43057230 《类型和程序设计语言》.pdf - 免费高速下载 - 皮皮盘-收入最高的网盘 当前标签:简单易懂的程序语言入门小册子 当前标签:简单易懂的程序语言入门小册子 简单易懂的程序语言入门小册子(9):环境,引入环境 古霜卡比 2014-05-16 05:46 阅读:793 评论:2 简单易懂的程序语言入门小册子(8):基于文本替换的解释器,小结 古霜卡比 2014-05-08 08:55 阅读:883 评论:5 简单易懂的程序语言入门小册子(7):基于文本替换的解释器,加入continuation,重构解释器 古霜卡比 2014-05-03 10:27 阅读:643 评论:0 简单易懂的程序语言入门小册子(1.5):基于文本替换的解释器,递归定义与lambda演算的一些额外说明 古霜卡比 2014-05-02 11:41 阅读:753 评论:0 简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation 古霜卡比 2014-04-28 11:18 阅读:926 评论:2 简单易懂的程序语言入门小册子(5):基于文本替换的解释器,递归,不动点,fix表达式,letrec表达式 古霜卡比 2014-04-23