函数式编程
最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转。
今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见。
首先,我们学习函数式编程时,需要知道一个概念:高阶函数。那么到底什么是高阶函数呢?把函数作为参数传入,这样的函数就称为高阶函数。而函数式编程就是指这种高度抽象的编程范式。
接下来,我简单介绍以下四种函数的用法:map/reduce filter sorted lambda
在这里,map/reduce并不是分布式系统中的map/reduce,而是Python中内建的map()函数和reduce()函数。
map:我们在使用map函数时候,map函数需要接收两个参数,第一个参数是函数,第二个参数是序列,那么表示的含义就是map将传入的函数依次作用在序列中的每一个元素,并把结果以列表的形式返回。
1 def f(x): 2 return x*x 3 4 print map(f,[1,2,3,4,5,6,7,8,9,10])
结果可想而知了:
看到这里,你会不会有不屑意味,我干嘛非得用map函数啊,直接写一个函数,然后调用即可了啊。不错,这样写肯定没错滴,但是会不会有些麻烦呀。看下面的代码
1 def fuc(x): 2 return x*x 3 4 L = [] 5 for num in [1,2,3,4,5,6,7,8,9,10]: 6 L.append(fuc(num)) 7 print L
reduce:reduce函数和map函数有什么不同之处呢?reduce函数也需要两个参数:函数和序列。reduce参数中的函数必须接收两个参数,那么reduce函数表示的含义则为把返回的结果继续和序列的下一个元素做累积计算,典型例子比如对序列求和。
1 def f2(x,y): 2 return x+y 3 4 print reduce(f2,[1,2,3,4,5,6,7,8,9,10])
想到reduce的定义,我们还可以用reduce来解决一个蛋疼无比的问题,那就是把序列变为整数,比如[1,2,3,4,5]变为12345。
1 def fn(x,y): 2 return x*10+y 3 4 print reduce(fn,[1,2,3,4,5,6,7,8])
filter:filter函数用于过滤序列中某些元素。和map、reduce函数一样,filter也接收一个函数和一个序列,不同的是,filter把传入的函数参数作用于序列中每一个元素,然后根据返回值判断是true还是false来决定该元素是否被丢弃。
1 def isEven(x): 2 return x%2==0 3 4 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,返回值就是该表达式的结果。
1 print map(lambda x : x*x , [1,2,3,4,5,6,7,8,9,10]) 2 ff = lambda x : x*x*x 3 print ff(5)
匿名函数也是有很多优点的,要不然怎么会使用它呢。第一,函数没有名字,不必担心有函数名冲突;第二,匿名函数是一个函数对象,也可以把匿名函数赋值给一个变量,然后利用变量来调用函数。