实例讲解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 相关文章推荐
Python3里的super()和__class__使用介绍
Apr 23 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
Python 26进制计算实现方法
May 28 Python
python如何通过实例方法名字调用方法
Mar 21 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
pyqt5实现登录界面的模板
May 30 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
Feb 05 Python
python实现TCP文件传输
Mar 20 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
Python常用断言函数实例汇总
Nov 30 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php图片验证码代码
2008/03/27 PHP
Cannot modify header information错误解决方法
2008/10/08 PHP
php中session与cookie的比较
2015/01/27 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python画微信表情符的实例代码
2019/10/09 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
护理专科自荐书范文
2014/02/18 职场文书
答谢会策划方案
2014/05/12 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
MySQL常用慢查询分析工具详解
2022/08/14 MySQL