函数式编程

函数式编程之-Partial application

穿精又带淫゛_ 提交于 2020-02-09 05:21:10
上一篇关于Currying的介绍,我们提到F#是如何做Currying变换的: let addWithThreeParameters x y z = x + y + z let intermediateFn1 = addWithThreeParameters 1 给定一个接受三个参数的函数 addWithThreeParameters ,我们通过 let intermediateFn1 = addWithThreeParameters 1 这样的方式创建出了一个新的函数 intermediateFn1 ,其函数签名为: int -> int -> int 上面是F#用来描述函数签名的方式,它表示函数接受两个int类型的参数,返回类型为int类型。 类似地: (int -> int) -> int 表示参数为 (int -> int) 类型的函数,返回类型为int;而 (int -> int) 又是一个函数,表示接受一个int类型的参数,返回类型仍然为int。 对于F#而言,函数本身需要接受三个参数,但是我们调用的时候只给一个参数,从而创建出接受两个参数的新函数,这种方式被称作是 Partial application 。也就是说我们通过 Partial application 的方式完成了Currying。 Partial application 是常用的函数式编程风格

Python3 函数式编程

这一生的挚爱 提交于 2020-02-09 05:20:36
  函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。   函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 变量可以指向函数 以Python内置的求绝对值的函数 abs() 为例,调用该函数可以获取一个煺的绝对值;但是,如果只写 abs 呢? >>> abs <built-in function abs> 可见, abs(-10) 是函数调用,而 abs 是函数本身 要获得函数调用结果,我们可以把结果赋值给变量,但是,如果把函数本身赋值给变量呢? >>> f = abs >>> f <built-in function abs> 结论:函数本身也可以赋值给变量,即:变量可以指向函数。 函数名也是变量 那么函数名是什么呢?函数名其实就是指向函数的变量!对于 abs() 这个函数,完全可以把函数名 abs 看成变量,它指向一个可以计算绝对值的函数! 如果把 abs 指向其他对象,会有什么情况发生? >>> abs = 10 >>> abs(-10) Traceback (most recent call last)

Python学习笔记五函数式编程(二)

╄→гoц情女王★ 提交于 2020-02-09 04:15:33
参考教程:廖雪峰官网 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一、返回函数 高阶函数除了可以接受函数作为参数之外,还可以把函数作为返回值。 通常我们也可以通过以下方式求和: def calc_sum(*args): sum=0 for n in args: sum=sum+n return sum 但如果有一种情况 ,不需要立刻得出求和结果,而是在后续的代码中根据需要再计算,这种情况不返回求和的结果,而是返回求和的函数: def lazy_sum(*args): def funcsum(): sum=0 for n in args: sum=sum+n return sum return funcsum x=lazy_sum(1,3,5) #返回值赋给x,x是一个代入(2,3,5)元组局部变量的函数funcsum() #通过输出可以看出x是一个函数 print(x) #需要调用x()时候才输出求和结果 print(x()) 对于上例,调用lazy_sum()时候传入的参数(1,3,5)成为了新创建的funcsum()函数的内部变量,这样的程序结构也称为“闭包(Closure)”。 需要注意,即便传入同样的参数,返回的函数也是不同的: x1=lazy_sum

函数式编程

核能气质少年 提交于 2020-02-09 04:15:22
函数也是对象 python中函数也是一个对象,因此可以当做参数传递 函数map() map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回,和java1.8的map一致,用来转换数据,生成新的惰性序列 def f(x): return x * x #构建一个返回x * x列表的迭代器 r=map(f, [1,2,3,4,5,6,7,8,9]) 函数reduce() reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算 #求和 from functools import reduce def add(x, y): return x + y reduce(add, [1, 3, 5, 7, 9]) 函数filter() 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素 #过滤列表中的偶数,只保留奇数 def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))

函数式编程——C#理解

非 Y 不嫁゛ 提交于 2020-02-09 04:08:19
转自: http://www.cnblogs.com/xiaozhi_5638/p/4762846.html 目录 一个问题 函数式编程中的函数 数学与函数式编程 混合式编程风格 一个问题 假设现在我们需要开发一个绘制数学函数平面图像(一元)的工具库,可以提供绘制各种函数图形的功能,比如直线f(x)=ax+b、抛物线f(x)=ax²+bx+c或者三角函数f(x)=asinx+b等等。那么怎么设计公开接口呢?由于每种行数的系数(a、b、c等)不同,并且函数构造也不同。正常情况下我们很难提供一个统一的接口。所以会出现类似下面这样的公开方法: //绘制直线函数图像 public void DrawLine(double a, double b) { List<PointF> points = new List<PointF>(); for(double x=-10;x<=10;x=x+0.1) { PointF p =new PointF(x,a*x+b); points.Add(p); } //将points点连接起来 } //绘制抛物线图像 public void DrawParabola(double a, double b, double c) { List<PointF> points = new List<PointF>(); for(double x=-10;x<=10;x

每个人都应该懂点函数式编程

倖福魔咒の 提交于 2020-02-09 03:57:47
目录 一个问题 函数式编程中的函数 数学与函数式编程 混合式编程风格 一个问题 假设现在我们需要开发一个绘制数学函数平面图像(一元)的工具库,可以提供绘制各种函数图形的功能,比如直线f(x)=ax+b、抛物线f(x)=ax²+bx+c或者三角函数f(x)=asinx+b等等。那么怎么设计公开接口呢?由于每种行数的系数(a、b、c等)不同,并且函数构造也不同。正常情况下我们很难提供一个统一的接口。所以会出现类似下面这样的公开方法: //绘制直线函数图像 public void DrawLine(double a, double b) { List<PointF> points = new List<PointF>(); for(double x=-10;x<=10;x=x+0.1) { PointF p =new PointF(x,a*x+b); points.Add(p); } //将points点连接起来 } //绘制抛物线图像 public void DrawParabola(double a, double b, double c) { List<PointF> points = new List<PointF>(); for(double x=-10;x<=10;x=x+0.1) { PointF p =new PointF(x,a*Math.Pow(x,2) + b*x

廖---函数式编程

你说的曾经没有我的故事 提交于 2020-02-09 03:24:13
引入: 越低级的语言,越贴近计算机,执行效率高;越高级的语言,越贴近计算,执行效率低。 函数式编程的特点:允许函数本身作为参数传入另一个函数,还允许返回一个函数。 高阶函数 将函数作为参数传入,此函数称为 高阶函数。 def add(x, y, f): #参数f 为函数 return f(x) + f(y) x=-5 y=-6 f = abs print(add(x,y,f)) 11 map()/reduce() map() : 接收两个参数,一个是函数(可以有任意个参数),另一个是 Iterable 序列。map()将传入的函数依次作用于序列的每个元素,并将结果作为新的 Iterator 返回。 def f(x): return x * x >>>r = map(f, [1,2,3,4,5,6,7,8,9]) >>>list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81] 结果 r 是一个 Iterator ,它是 惰性序列,因此通过 list() 函数将其转为list,便于观察。 map()作为高阶函数,将运算规则抽象了,可以用来计算复杂的函数,例: # 将list所有的数字转为字符串 >>>list(map(str, [1,2,3,4,5,6,7,8,9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9']

Java 函数式编程

≯℡__Kan透↙ 提交于 2020-02-09 02:27:31
在兼顾面向对象特性的基础上,Java语言通过Lambda表达式与方法引用等,为开发者打开了函数式编程的大门。 下面我们做一个初探。 Lambda的延迟执行 有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以 作为解决方案,提升性能。 性能浪费的日志案例 注:日志可以帮助我们快速的定位问题,记录程序运行过程中的情况,以便项目的监控和优化。 一种典型的场景就是对参数进行有条件使用,例如对日志消息进行拼接后,在满足条件的情况下进行打印输出: public class Demo01Logger { public static void main(String[] args) { String msgA = "Hello "; String msgB = "World "; String msgC = "Java"; log(1, msgA + msgB + msgC); } private static void log(int level, String mgs) { if (level == 1) { System.out.println(mgs); } } } 这段代码存在问题:无论级别 level 是否满足要求,作为 log 方法的第二个参数,三个字符串一定会首先被拼接并传入方 法内,然后才会进行级别判断。如果级别不符合要求

Python之函数式编程

坚强是说给别人听的谎言 提交于 2020-02-09 00:25:46
高阶函数(map/reduce,filter,sorted)  变量可以指向函数: >>> x = abs(- 10) >>> x >>> 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 传入函数 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 def add (x, y, f): return f(x) + f(y) 当我们调用add(-5,6,abs)时,参数x,y和f分别接收-5,6,和abs,根据函数定义,我们可以推导计算过程为: x=-5 y=6 f=abs f(x)+f(y)==>abs(-5)+abs(6)==>11 return 11 >>> add(- 5, 6, abs) 11 map/reduce Python内建了map()和reduce()函数。 map()函数接收两个参数,一个函数,一个式Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 一个函数f(x)

python学习之路4

这一生的挚爱 提交于 2020-02-08 22:51:08
一、字符编码与转码 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间 3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string in python3 #-*-coding:gb2312 -*- #这个也可以去掉 __author__ = 'xxx' import sys print(sys.getdefaultencoding()) msg = "姆巴佩" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔,如果是py2需先解码成unicode再编码成gb2312 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")