python专题-函数式编程
函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”。 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数式编程。
lambda表达式(匿名函数):
普通函数与匿名函数的定义方式:

#普通函数
def add(a,b):
return a + b print add(2,3) #匿名函数
add = lambda a,b : a + b
print add(2,3) #========输出===========
5
5

匿名函数的命名规则,用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b)。
因为lamdba在创建时不需要命名,所以,叫匿名函数^_^
Map函数:
计算字符串长度

abc = ['com','fnng','cnblogs'] for i in range(len(abc)):
print len(abc[i]) #========输出===========
3
4
7

定义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 #========输出===========
9

对于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)) #========输出===========
120

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 #========输出===========
30 6
5

如果用函数式编程,这个例子可以写成这样:

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 #========输出===========
5

最后我们可以看到,函数式编程有如下好处:
1)代码更简单了。
2)数据集,操作,返回值都放到了一起。
3)你在读代码的时候,没有了循环体,于是就可以少了些临时变量,以及变量倒来倒去逻辑。
4)你的代码变成了在描述你要干什么,而不是怎么去干。
python专题-函数式编程的更多相关文章
- python基础-函数式编程
python基础-函数式编程 高阶函数:map , reduce ,filter,sorted 匿名函数: lambda 1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...
- 可爱的 Python : Python中函数式编程,第一部分
英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...
- Python的函数式编程: map, reduce, sorted, filter, lambda
Python的函数式编程 摘录: Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 函数是Python内建支持的一种封装,我们通过把大段代码 ...
- python 10函数式编程
函数式编程 函数是Python内建支持的一种封装, ...
- python之函数式编程
python提供了支持函数式编程的简单机制: 1. map函数 2. filter函数 3. reduce函数. 典型的M/R计算模型. 但还是有点简单...
- 可爱的 Python : Python中函数式编程,第二部分
英文原文:Charming Python: Functional programming in Python, Part 2,翻译:开源中国 摘要: 本专栏继续让David对Python中的函数式编 ...
- Python进阶 函数式编程和面向对象编程等
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
- 【python】函数式编程
No1: 函数式编程:即函数可以作为参数传递,也可以作为返回值 No2: map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的 ...
- python,函数式编程
函数式编程: 特点:允许传递的参数是函数,且允许返回一个函数. 由于Python允许使用变量,因此,Python不是纯函数式编程语言,同样的输入可能输出不同,有副作用.纯函数式编程语言没有变量,输入和 ...
随机推荐
- 利用Unity3D与Oculus实现机器情绪安抚师的一种方案
(一张最原始的Unity3D中音乐可视化粒子海的图,想象一下,如果这幅场景出现在虚拟设备中,辅以根据音乐频谱变化的色彩与悦动频率,会是怎样的效果呢?) Unity3D有着非常完备的虚拟三维场景交互开发 ...
- 【css】盒子模型 之 概述
摘要 一些基本的概念以及常见使用问题 概述 BFC 是css 中布局的核心 - 盒模型,根据块级元素及行级元素可分为块级容器, 行级容器,但容器内部都遵循 BFC BFC 空间布局 备注: IE 的盒 ...
- linux的文件权限与目录配置<----->第二章
1.Linux文件属性 [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] ...
- JPA Advanced Mappings(映射)
JPA Advanced Mappings(映射) JPA是一个使用java规范发布的库.因此,它支持所有面向对象的实体持久性概念. 原文链接:http://blogxinxiucan.sh1.new ...
- ubuntu上安装nginx+mysql+php5-fpm(PHP5 - FastCGI Process Manager)
题外话:由于近段时间测试环境ssh链路质量不大好,经常短线.故我把整个安装过程放到screen里去执行,以防止断线中断了安装过程.执行screen -S install,这样断线后,只要再执行scre ...
- OPNET中FIN,FOUT以及FRET的作用 分类: opnet 2014-05-12 16:07 144人阅读 评论(0) 收藏
为了使一个用户定义的函数被执行,该函数必须与一个特殊的堆栈跟踪代码相连.堆栈跟踪技术靠在函数的入口点和出口点插入预处理器宏指令完成(一个函数只有一个入口点,但可以有多个出口点(由C语言的return声 ...
- 测试环境-memcached安装与说明
一,下载memcached和libevent安装包: 1,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent (这两个包百度上都能找到) 二,安装lib ...
- 写个 Hello world - 前端从入坑到弃坑系列教程(1)
这是一个系列教程<前端从入坑到弃坑>的第一篇. HTML 是什么 说白了,HTML 就是网页的内容.比如你现在正在阅读的这个网页的内容,就是 HTML.如果你还不明白,请继续往下阅读. 写 ...
- Python 导入模块
导入模块 方法1:import 模块名 //导入整个模块,调用方法时,需要加上模块名 方法2:from 模块名 import 方法 ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...