实例讲解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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python数据结构之翻转链表
Feb 25 Python
基于Python闭包及其作用域详解
Aug 28 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
Python super()函数使用及多重继承
May 06 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
Python importlib模块重载使用方法详解
Oct 13 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
bat批处理之字符串操作的实现
Mar 16 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
javascript中的几个运算符
2007/06/29 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
js中less常用的方法小结
2017/08/09 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
简单介绍Python中的len()函数的使用
2015/04/07 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
用python爬取租房网站信息的代码
2018/12/14 Python
python实现数字炸弹游戏
2020/07/17 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
给交警的表扬信
2014/01/12 职场文书
大学校园活动策划书
2014/02/04 职场文书
2014年档案室工作总结
2014/12/01 职场文书
亮剑观后感300字
2015/06/05 职场文书
学子宴致辞大全
2015/07/27 职场文书