实例讲解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中处理字符串之isalpha()方法的使用
May 18 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
Python远程视频监控程序的实例代码
May 05 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
python占位符输入方式实例
May 27 Python
django 连接数据库 sqlite的例子
Aug 14 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
520使用Python实现“我爱你”表白
May 20 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
python中的sys模块和os模块
Mar 20 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
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
jquery foreach使用示例
2013/09/12 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
React实现todolist功能
2020/12/28 Javascript
python解析xml文件操作实例
2014/10/05 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
一百行python代码将图片转成字符画
2021/02/19 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
个人简历自我评价
2014/02/02 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
离婚案件原告代理词
2015/05/23 职场文书
家长会后的感想
2015/08/11 职场文书
MySQL深分页问题解决思路
2022/12/24 MySQL
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS