实例讲解python函数式编程


Posted in Python onJune 09, 2014

函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”。 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数式编程。

lambda表达式(匿名函数):

普通函数与匿名函数的定义方式:

#普通函数
def add(a,b):
    return a + b
print add(2,3)

#匿名函数
add = lambda a,b : a + b
print add(2,3)

#========输出===========
5

匿名函数的命名规则,用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b)。

因为lamdba在创建时不需要命名,所以,叫匿名函数^_^

Map函数:计算字符串长度

abc = ['com','fnng','cnblogs']
for i in range(len(abc)):
    print len(abc[i])
#========输出===========
4

定义abc字符串数组,计算abc长度然后循环输出数组中每个字符串的长度。

来看看map()函数是如何来实现这个过程的。

abc_len = map(len,['hao','fnng','cnblogs'])
print abc_len
#========输出===========
[3, 4, 7]

虽然,输出的结果中是一样的,但它们的形式不同,第一种是单纯的数值了,map()函数的输出仍然保持了数组的格式。

大小写转换;

python提供有了,upper() 和 lower() 来转换大小写。

#大小写转换
ss='hello WORLD!'
print ss.upper()  #转换成大写
print ss.lower()  #转换成小写
#========输出===========
HELLO WORLD!
hello world!

通过map()函数转换:

def to_lower(item):
    return item.lower()
name = map(to_lower,['cOm','FNng','cnBLoGs'])
print name
#========输出===========
['com', 'fnng', 'cnblogs']

这个例子中我们可以看到,我们写义了一个函数toUpper,这个函数没有改变传进来的值,只是把传进来的值做个简单的操作,然后返回。然后,我们把其用在map函数中,就可以很清楚地描述出我们想要干什么。

再来看看普通的方式是如何实现字符串大小写转换的:

abc = ['cOm','FNng','cnBLoGs']
lowname = []
for i in range(len(abc)):
    lowname.append(abc[i].lower())
print lowname
#========输出===========
['hao', 'fnng', 'cnblogs']

map()函数加上lambda表达式(匿名函数)可以实现更强大的功能。

#求平方
#0*0,1*1,2*2,3*3,....8*8
squares = map(lambda x : x*x ,range(9))
print squares
#========输出===========
[0, 1, 4, 9, 16, 25, 36, 49, 64]

Reduce函数:

def add(a,b):
    return a+b
add = reduce(add,[2,3,4])
print add
#========输出===========

对于Reduce函数每次是需要对两个数据进行处理的,首选取2 和3 ,通过add函数相加之后得到5,接着拿5和4 ,再由add函数处理,最终得到9 。

在前面map函数例子中我们可以看到,map函数是每次只对一个数据进行处理。

 

然后,我们发现通过Reduce函数加lambda表达式式实现阶乘是如何简单:

#5阶乘
#5!=1*2*3*4*5
print reduce(lambda x,y: x*y, range(1,6))
#========输出===========

 Python中的除了map和reduce外,还有一些别的如filter, find, all, any的函数做辅助(其它函数式的语言也有),可以让你的代码更简洁,更易读。 我们再来看一个比较复杂的例子:

#计算数组中正整数的值
number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
count = 0
sum = 0
for i in range(len(number)):
    if number[i]>0:
        count += 1
        sum += number[i]
print sum,count
if count>0:
    average = sum/count
print average
#========输出===========
6

如果用函数式编程,这个例子可以写成这样:

number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
sum = filter(lambda x: x>0, number)
average = reduce(lambda x,y: x+y, sum)/len(sum)
print average
#========输出===========

最后我们可以看到,函数式编程有如下好处:

1)代码更简单了。
2)数据集,操作,返回值都放到了一起。
3)你在读代码的时候,没有了循环体,于是就可以少了些临时变量,以及变量倒来倒去逻辑。
4)你的代码变成了在描述你要干什么,而不是怎么去干。

Python 相关文章推荐
在Django的URLconf中使用命名组的方法
Jul 18 Python
python实现Floyd算法
Jan 03 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
Python返回数组/List长度的实例
Jun 23 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
python 字典套字典或列表的示例
Dec 16 Python
python实现名片管理器的示例代码
Dec 17 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
python爬取豆瓣电影TOP250数据
May 23 Python
理解python多线程(python多线程简明教程)
Jun 09 #Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 #Python
Python实例分享:快速查找出被挂马的文件
Jun 08 #Python
python小技巧之批量抓取美女图片
Jun 06 #Python
Python学习笔记(二)基础语法
Jun 06 #Python
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 #Python
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 #Python
You might like
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
Javascript 跨域访问解决方案
2009/02/14 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
python遍历目录的方法小结
2016/04/28 Python
Python中return self的用法详解
2018/07/27 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
python绘制封闭多边形教程
2020/02/18 Python
用 python 进行微信好友信息分析
2020/11/28 Python
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
社区八一活动方案
2014/02/03 职场文书
考察现实表现材料
2014/05/19 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
Javascript之datagrid查询详解
2021/09/15 Javascript
Golang 实现WebSockets
2022/04/24 Golang