实例讲解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 命令行也可以自动补全
Nov 30 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
Python采用Django开发自己的博客系统
Sep 29 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Python模拟登陆实现代码
Jun 14 Python
Python构建XML树结构的方法示例
Jun 30 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
解决Django no such table: django_session的问题
Apr 07 Python
Python devel安装失败问题解决方案
Jun 09 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python2与Python3的区别点整理
2019/12/12 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
四风问题自我剖析材料
2014/10/07 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
Golang实现AES对称加密的过程详解
2021/05/20 Golang