实例讲解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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
Python常用的爬虫技巧总结
Mar 28 Python
浅谈Python中函数的参数传递
Jun 21 Python
python负载均衡的简单实现方法
Feb 04 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python socket聊天脚本代码实例
Jan 02 Python
Python递归函数特点及原理解析
Mar 04 Python
python 自动识别并连接串口的实现
Jan 19 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/03/04 星际争霸
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
js 省地市级联选择
2010/02/07 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
python中的内置函数getattr()介绍及示例
2014/07/20 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
python3中zip()函数使用详解
2018/06/29 Python
python提取log文件内容并画出图表
2019/07/08 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
互联网创业计划书的书写步骤
2014/01/28 职场文书
上班看电影检讨书
2014/02/12 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
健康教育评估方案
2014/05/25 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB