Python函数式编程
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
高阶函数:一个函数就可以接收另一个函数作为参数
变量可以指向函数,函数本身可以赋值给变量,函数名也是变量
如:
In [20]: abs Out[20]: <function abs> In [21]: abs(-20) Out[21]: 20 In [22]: x = abs In [23]: x(-2) Out[23]: 2
传入函数
In [24]: def sum(x,y): ....: return x+y In [26]: def de(x,y): ....: return x-y ....: In [27]: def cal(x,y,sum,de): ....: return sum(x,y)*de(x,y) ....: In [28]: cal(2,5,sum,de) Out[28]: -21
下面是一些很有用的高阶函数使用方法:
1、Map/Reduce
之前听说过Map/reduce是在做大数据分析的时候,用到的Hadoop的map/reduce。主要的思想还是不变的:map就是对每个数据分开处理,而reduce则是将分开的数据合在一起
1)map()
函数接收两个参数,一个是函数,一个是序列,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
如:把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT']
,输出:['Adam', 'Lisa', 'Bart']
。
In [10]: map(str.capitalize,['adam','lisa','bart'])
Out[10]: ['Adam', 'Lisa', 'Bart']
2)reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
In [6]: def func(x,y): ...: return x+ y ...: In [2]: a = [1,2,3,4,5,6,7] In [7]: reduce(func,a) Out[7]: 28
一般而言,map和reduce通常会一起使用
2、filter
filter()
函数用于过滤序列,filter()
接收一个函数和一个序列。filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
请尝试用filter()获取
1~100的素数。In [20]: def su(a):
....: i = 2 ....: while(i<a): ....: if a % i == 0: ....: return False
...: i = i + 1
....: return True ....: In [21]: filter(su,range(1,101))
3、 sorted
sorted()可以接受传入list,也可以接收一个比较函数来实现自定义的排序。
如:
def reversed_cmp(x, y): if x > y: return -1 if x < y: return 1 return 0 >>> sorted([36, 5, 12, 9, 21], reversed_cmp) [36, 21, 12, 9, 5]
返回函数:函数作为返回值
闭包:在函数的内部定义函数,在里面的函数可以调用外面的函数的局部变量,然后返回该内部函数。是为了读取函数内部的变量,这个在js中也有提到,一般而言,函数用完后就会释放掉,但是闭包函数会保存局部变量供内部函数使用不被释放掉
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
要想使用迭代,将循环变量保存下来
>>> def count(): ... fs = [] ... for i in range(1, 4): ... def f(j): ... def g(): ... return j*j ... return g ... fs.append(f(i)) ... return fs ... >>> f1, f2, f3 = count() >>> f1() 1 >>> f2() 4 >>> f3() 9
匿名函数
关键字lambda
表示匿名函数,冒号前面的x
表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return
,返回值就是该表达式的结果。
装饰器
偏函数