实例讲解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中正则表达式的用法实例汇总
Aug 18 Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 Python
python机器人行走步数问题的解决
Jan 29 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
一篇文章弄懂Python中的内建函数
Aug 07 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 中文乱码解决办法总结分析
2009/07/30 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
JS 显示当前日期与时间的代码
2010/03/24 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
Python 爬虫模拟登陆知乎
2016/09/23 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
仓库门卫岗位职责
2013/12/22 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
本科生求职信
2014/06/17 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
计划生育汇报材料
2014/12/26 职场文书
大学生十八大感想
2015/08/11 职场文书