实例讲解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 相关文章推荐
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
Python中异常重试的解决方案详解
May 05 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
python实现ID3决策树算法
Dec 20 Python
python检测主机的连通性并记录到文件的实例
Jun 21 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
Python多线程的退出控制实现
Aug 10 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 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中神奇的fastcgi_finish_request
2011/05/02 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
JS中的多态实例详解
2017/10/15 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
python中的对数log函数表示及用法
2020/12/09 Python
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
人力资源管理毕业生自荐信
2014/06/26 职场文书
公司门卫工作职责
2014/06/28 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python