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函数式编程:从入门到走火入魔
一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...
- python函数式编程,列表生成式
1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...
- (转)Python函数式编程——map()、reduce()
转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- python 函数式编程:高阶函数,map/reduce
python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...
- Python函数式编程(进阶2)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python函数式编程简介
参考原文 廖雪峰Python函数式编程 函数 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
随机推荐
- activemq安全设置 设置admin的用户名和密码
ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到 <bean id="securityConstraint" class="o ...
- 【原】MyEclipse8.5集成Tomcat7时启动错误:Exception in thread “main” java.lang.NoClassDefFoundError
解决方法: MyEclipse->Window->Preferences->MyEclipse->Servers->Tomcat->Tomcat 6.x->L ...
- Qt 实现遥感图像显示时的连动效果
遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果.如 ...
- count有关
1.count有两个作用:统计某个字段有值的记录数:统计结果集的记录数.2.count括号内的表达式不为null,就是统计结果集的记录数.也就是说,count(1),count(*),count(10 ...
- 【C++沉思录】句柄2
1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...
- Git教程学习(五)
14. 解决冲突 14.1. 场景 当分支A和分支B在同一个文件上都有修改时会出现冲突.常见的情况是从master分支的基础上生成了新分支dev,然后在dev上进行了修改并add&commit ...
- asp Gridview绑定形式获取行号
Gridview中使用<%# Container.DataItemIndex %>取得当前行的序号 而在Repeater控件中使用Container.ItemIndex取得当前行的序号 & ...
- 值得一看:利用对标帮助客户进行GAP分析,找到业务发展方向!
最好是跟CBM一起来使用. Presentation Here: https://ibm.biz/BdXJrQ CAN ONLY ACCESS at IBM internal.
- java单例之enum实现方式
传统的两私有一公开(私有构造方法.私有静态实例(懒实例化/直接实例化).公开的静态获取方法)涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例), 目前最为安全的实现单例的方法是通过内部静态en ...
- 判断big endian和little endian的方法
http://blog.sina.com.cn/s/blog_6ab0b9a80101awzr.html 不同体系的CPU在内存中的数据存储往往存在着差异.例如,Intel的x86系列处理器将低序 ...