实例讲解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 相关文章推荐
通过C++学习Python
Jan 20 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
Python判断telnet通不通的实例
Jan 26 Python
Python3内置模块random随机方法小结
Jul 13 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
Python中的With语句的使用及原理
Jul 29 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Python函数中apply、map、applymap的区别
Nov 27 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获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
javascript replace()正则替换实现代码
2010/02/26 Javascript
javascript 闭包疑问
2010/12/30 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python如何判断数独是否合法
2016/09/08 Python
Python常用外部指令执行代码实例
2020/11/05 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
我未来的职业规划范文
2014/01/11 职场文书
美发店5.1活动方案
2014/01/24 职场文书
给国外客户的邀请函
2014/01/30 职场文书
个人自荐材料
2014/05/23 职场文书
教师个人年度总结
2015/02/11 职场文书
导游词之五台山
2019/10/11 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技