函数式编程

最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转。

今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见。

首先,我们学习函数式编程时,需要知道一个概念:高阶函数。那么到底什么是高阶函数呢?把函数作为参数传入,这样的函数就称为高阶函数。而函数式编程就是指这种高度抽象的编程范式。

正文

接下来,我简单介绍以下四种函数的用法:map/reduce   filter   sorted   lambda

在这里,map/reduce并不是分布式系统中的map/reduce,而是Python中内建的map()函数和reduce()函数。

map:我们在使用map函数时候,map函数需要接收两个参数,第一个参数是函数,第二个参数是序列,那么表示的含义就是map将传入的函数依次作用在序列中的每一个元素,并把结果以列表的形式返回。

 def f(x):
return x*x print map(f,[1,2,3,4,5,6,7,8,9,10])

结果可想而知了:

看到这里,你会不会有不屑意味,我干嘛非得用map函数啊,直接写一个函数,然后调用即可了啊。不错,这样写肯定没错滴,但是会不会有些麻烦呀。看下面的代码

 def fuc(x):
return x*x L = []
for num in [1,2,3,4,5,6,7,8,9,10]:
L.append(fuc(num))
print L

reduce:reduce函数和map函数有什么不同之处呢?reduce函数也需要两个参数:函数和序列。reduce参数中的函数必须接收两个参数,那么reduce函数表示的含义则为把返回的结果继续和序列的下一个元素做累积计算,典型例子比如对序列求和。

 def f2(x,y):
return x+y print reduce(f2,[1,2,3,4,5,6,7,8,9,10])

想到reduce的定义,我们还可以用reduce来解决一个蛋疼无比的问题,那就是把序列变为整数,比如[1,2,3,4,5]变为12345。

 def fn(x,y):
return x*10+y print reduce(fn,[1,2,3,4,5,6,7,8])

filter:filter函数用于过滤序列中某些元素。和map、reduce函数一样,filter也接收一个函数和一个序列,不同的是,filter把传入的函数参数作用于序列中每一个元素,然后根据返回值判断是true还是false来决定该元素是否被丢弃。

 def isEven(x):
return x%2==0 print filter(isEven,[1,2,3,4,5,6,7,8,9,10])

sorted:sorted函数用于对序列排序,这个函数之前的Python总结里多次提到,这里我简单说一下通常的规定吧:对于两个元素x和y,如果x<y,返回-1,如果x>y ,返回1,如果x==y,返回0。这样默认的规定下,我们排序的结果是从小到大排序的,所以如果想得到从大到小的结果,我们需要重写sorted函数的规定,这个和C++是一样的道理吧,就不贴代码了,自己边撸边悟吧。

lambda:便利强大的lambda函数又称为匿名函数,它不需要显式的定义函数,但是匿名函数也有一些限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

 print map(lambda x : x*x , [1,2,3,4,5,6,7,8,9,10])
ff = lambda x : x*x*x
print ff(5)

匿名函数也是有很多优点的,要不然怎么会使用它呢。第一,函数没有名字,不必担心有函数名冲突;第二,匿名函数是一个函数对象,也可以把匿名函数赋值给一个变量,然后利用变量来调用函数。

最新文章

  1. 前端学HTTP之数据传输
  2. 【血的教训】玩 Ubuntu 遇到的致命问题(进不了系统)及 解决方案
  3. iOS 学习笔记 五 (2015.03.17)使用storyBoard进行tableview的跳转
  4. Java GC专家系列1:理解Java垃圾回收
  5. 《REWORK》启示录 招聘笔杆子——程序员为什么值得写博客
  6. 如何把powerpoint幻灯片大小改为标准或宽屏教程【图文】
  7. Android 6.0 以及HttpClient
  8. PHP mktime函数获取今天的开始和结束时间戳
  9. 浅谈web服务器的编写之http协议
  10. Node Inspector 代理实现
  11. Java 8 Optional类深度解析(转)
  12. JS学习笔记Day24
  13. java-同步控制及不可变设置(只读访问)
  14. 拷贝JAR包
  15. 记初学python的一些心得
  16. 第二次Scrum冲刺——Life in CCSU
  17. java模板设计模式
  18. Go基础系列:Go slice详解
  19. LSTM学习—Long Short Term Memory networks
  20. XXX on tree

热门文章

  1. zoj 3471 Most Powerful (有向图)最大生成树 状压dp
  2. Magenta源代码笔记(3) —— 内存管理【转】
  3. C#使用DirectoryEntry类操作Windows帐户
  4. Java IO 学习(一)同步/异步/阻塞/非阻塞
  5. apache2.4+tomcat8+jk1.2.40集群配置
  6. 从客户端(ExportContent=&quot;...ontinuous &lt;br /&gt;Pass Count&quot;:13...&quot;)中检测到有潜在危险的 Request.Form 值。
  7. centos7设置系统语言为中文
  8. django博客开发
  9. python logging模块学习(转)
  10. 将输入流InputStream转换为String