引
数据集data_socrestudentid course score
1 math 89
2 english 76
. . .
问题:求各studentid总分
方法1-一般写法:
student_score_total={}
for i in xrange(data_socre.shape[0]):
studentid=data_socre.ix[i,'studentid']
score=data_socre.ix[i,'score']
if studentid in student_score_total.keys():
student_score_total[studentid]+=score
else:
student_score_total[studentid]=score
方法2-函数式编程:
student_score_total=data_socre.ix[:,['studentid','score']].groupby('studentid').agg(sum)
函数式编程要明显优于一般写法(代码量、可读性)
那什么是函数式编程:
函数式编程定义
定义(百度百科):函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
特性
一、高阶函数
和一般函数差别:
1、输入参数可以是函数
2、输出结果可以是函数
例(python2.7,下同):
输出结果可以是函数
def add(x,y):
def add_1():
return x+y
return add_1
add_1=add(1,2)
print add_1
输入参数可以是函数
def add(x,y):
return x+y
def add_square(add):
return add*add
计算
print add_square(add(1,2))
9
二、闭包
定义(百度百科):闭包就是能够读取其他函数内部变量的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
构成(必要):
1、外部函数
2、内部函数
3、外部函数变量
例:
def add(x,y):
def add_1():
return x+y
return add_1
外部函数(add):必须将内部函数作为返回
内部函数(add_1):必须要有一个内部函数
外部函数变量(x,y):内部函数必须引用外部函数变量
ps.可以发现闭包和高阶函数是结合在一起使用
三、偏函数
定义:通过固定函数的部分参数值从而达到新建函数的作用
例:
def add(x,y):
return x+y
import functools
add_1 = functools.partial(add,x = 10)
print add_1(y=1) #等价于 add(x=10,y=1)
11
四、柯里化
定义:把有多个参数的函数变成单参数函数 公式:z = f(x, y) 变成 z = f(x)(y)
例:
def add(x, y):
return x+y
print add(1, 2)
3
def add(x):
def add_1(y):
return x + y
return add_1
print add(1)(2)
3
柯里化的偏函数应用
add_1 = add(x=1)
print add_1(y=2)
3
ps.python中只能对第一个参数做偏函数化(或者说只能是从外到内逐次参数做偏函数化)
五、惰性计算
理解:表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值;逻辑处理与具体运算时间分离,只有当提交具体执行计算任务时,逻辑处理才开始运算
六、只用"表达式"
理解(百度百科):"表达式"(expression)是一个单纯的运算过程,总是有返回值。也就是说,每一步都是单纯的运算,而且都有返回值。
七、没有"副作用"
理解:不产生除函数返回结果以外的任何影响(不修改任何外部变量)
八、引用透明性
理解:输入相同的参数返回相同的结果;计算结果不依赖除输入参数外的其他因素的影响
总结:
函数式编程优点
1、将问题处理拆解为各执行步骤:处理逻辑清晰、代码可读性高、后期易维护更新
2、通过使用已有的函数,大幅减少代码量,提高编程效率
3、将逻辑处理和具体计算分离,通过组件化编程,降低使用者技术门槛(复杂逻辑处理由技术较好的人员事先实现准备好)