实例讲解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中urllib模块用法实例详解
Nov 19 Python
python实现复制整个目录的方法
May 12 Python
python生成词云的实现方法(推荐)
Jun 13 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Python实现翻转数组功能示例
Jan 12 Python
python实现雨滴下落到地面效果
Jun 21 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
python实现监控阿里云账户余额功能
Dec 16 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Python中lru_cache的使用和实现详解
Jan 25 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中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
php分页代码学习示例分享
2014/02/20 PHP
smarty中post用法实例
2014/11/28 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
纯php生成随机密码
2015/10/30 PHP
索趣科技的答案
2007/02/07 Javascript
setAttribute 与 class冲突解决
2008/02/17 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
python比较2个xml内容的方法
2015/05/11 Python
python如何查看系统网络流量的信息
2016/09/12 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python自动点赞功能的实现思路
2020/02/26 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
python中操作文件的模块的方法总结
2021/02/04 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
安全资料员岗位职责
2013/12/14 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
公司年底活动方案
2014/08/17 职场文书
大学生党课感想
2015/08/11 职场文书
Tomcat配置访问日志和线程数
2022/05/06 Servers