python函数式编程

引用知乎上看到的一段话:

“函数式编程与命令式编程最大的不同其实在于:

函数式编程关心数据的映射,命令式编程关心解决问题的步骤

 

首先,最直观的角度来说,函数式风格的代码可以写得很精简,大大减少了键盘的损耗(

其次,函数式的代码是“对映射的描述”,它不仅可以描述二叉树这样的数据结构之间的对应关系,任何能在计算机中体现的东西之间的对应关系都可以描述——比如函数和函数之间的映射(比如 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组成一个新的列表返回;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值