实例讲解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基于右递归解决八皇后问题的方法
May 25 Python
Python 正则表达式实现计算器功能
Apr 29 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
django Admin文档生成器使用详解
Jul 22 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
如何通过Django使用本地css/js文件
Jan 20 Python
python编写俄罗斯方块
Mar 13 Python
pyecharts在数据可视化中的应用详解
Jun 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
Codeigniter检测表单post数据的方法
2015/03/21 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
Seajs源码详解分析
2019/04/02 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python实现2014火车票查询代码分享
2014/01/10 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
python实现用户名密码校验
2020/03/18 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
python super()函数的基本使用
2020/09/10 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
趣味运动会活动方案
2014/02/12 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
寄语学生的话
2014/04/10 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
怎么写工作检讨书
2014/11/16 职场文书
戒赌保证书
2015/05/11 职场文书
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫