实例讲解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 28 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
Python 转换文本编码实现解析
Aug 27 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
python实现统计代码行数的小工具
Sep 19 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
python sleep和wait对比总结
Feb 03 Python
超级详细实用的pycharm常用快捷键
May 12 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP常用的三种设计模式
2017/02/17 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
在Windows8上的搭建Python和Django环境
2014/07/03 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python读取xlsx的方法
2018/12/25 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
文秘求职信范文
2014/04/10 职场文书
争先创优活动总结
2014/08/27 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
六年级学生评语大全
2014/12/26 职场文书
四则混合运算教学反思
2016/02/23 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
Golang Web 框架Iris安装部署
2022/08/14 Python