引用知乎上看到的一段话:
“函数式编程与命令式编程最大的不同其实在于:
函数式编程关心数据的映射,命令式编程关心解决问题的步骤
首先,最直观的角度来说,函数式风格的代码可以写得很精简,大大减少了键盘的损耗(
其次,函数式的代码是“对映射的描述”,它不仅可以描述二叉树这样的数据结构之间的对应关系,任何能在计算机中体现的东西之间的对应关系都可以描述——比如函数和函数之间的映射(比如 functor);比如外部操作到 GUI 之间的映射(就是现在前端热炒的所谓 FRP)。它的抽象程度可以很高,这就意味着函数式的代码可以更方便的复用。
另外还有其他答主提到的,可以方便的并行。
同时,将代码写成这种样子可以方便用数学的方法进行研究(不能理解 monad 就是自函子范畴上的一个幺半群你还想用 Haskell 写出 Hello world ?)
至于什么科里化、什么数据不可变,都只是外延体现而已。”
作者:nameoverflow
链接:https://www.zhihu.com/question/28292740/answer/100284611
来源:知乎
以下是本人对具体使用时的一点理解
1、lambda
使用:
lambda1= lambda x, y: x+y
print lambda1(1, 2)#3
理解:a变成了函数,lambda冒号左边为a的行参,右边为实现逻辑,在调用a时,和普通函数调用方法一致:函数名(实参);
2、map reduce filter等
1) ret =map(func,arg)
使用:
map1 = map(len, ['123', '1', '22'])
print map1#相当于[len('123'), len('1'), len('2')]->[3, 1, 2]
map2 = map(lambda x: x*x, range(3))
print map2#相当于[0*0, 1*1, 2*2]->[0, 1, 4]
理解:
这里的func直接用lamda写匿名函数的实现逻辑,或者写Python的内置函数名(len ,lower等简单逻辑),arg为实参,map直接调用了func这个函数,返回了ret;
一般arg为一个列表、元组这种集合类型,而map的作用,是为arg集合中的每一个item执行func的逻辑;
ret仍保留列表的格式,将每一个item执行完func的结果组合起来放在了一个新的列表ret里;
2) ret = reduce(func, arg)
使用:
reduce1 = reduce(lambda x, y: x+y, [1, 2, 3])
print reduce1#1+2+3->6
reduce2 = reduce(lambda x, y: x*y, [1, 2, 3, 4])
print reduce2#1*2*3*4->24
理解:
这里的func直接用lamda写匿名函数的实现逻辑,arg为实参,reduce直接调用了func这个函数,返回了ret;
一般arg为一个列表、元组这种集合类型,而reduce的作用,是为arg集合中的每个item做一个积累(func的功能:累加,阶乘这种)的逻辑,前几个arg中item的处理结果基础上再加上其他item的操作;
ret 即为一个处理完的值;
3)ret = filter(func, arg)
使用:
filter1 = filter(lambda x: x>1, [1, 2, 3])
print filter1#找出序列中大于1的item->[2, 3]
理解:func中写一些过滤条件,对arg中的item逐个过滤,符合条件的item组成一个新的列表返回;