Python函数式编程常用函数简介
函数式 编程则将一个问题分解成一系列函数。 理想情况下,函数只接受输入并输出结果,对一个给定的输入也不会有影响输出的内部状态。在函数式程序里,输入会流经一系列函数。每个函数接受输入并输出结果。函数式风格反对使用带有副作用的函数,这些副作用会修改内部状态,或者引起一些无法体现在函数的返回值中的变化。完全不产生副作用的函数被称作“纯函数”。消除副作用意味着不能使用随程序运行而更新的数据结构;每个函数的输出必须只依赖于输入。
函数式编程可以被认为是面向对象编程的对立面。对象就像是颗小胶囊,包裹着内部状态和随之而来的能让你修改这个内部状态的一组调用方法,以及由正确的状态变化所构成的程序。函数式编程希望尽可能地消除状态变化,只和流经函数的数据打交道。
函数式编程是一种编程泛型,它将计算机运算视作数学上的函数计算,并且避免使用程序状态以及易变对象,可以程序变得简洁高效,是Python的一大特色。
在Python中,函数式编程主要由几个函数的使用组成:lambda(), map(), reduce()和filter()。下面逐一介绍:
lambda
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.
看个例子:
func=lambda x:x*x
print(func(1))
#1
print(func(2))
#4
#以上lambda等同于以下函数
def func(x):
return(x*x)
在实现一些小的函数时如果不想大张旗鼓的专门写一个函数,那么匿名函数就再适合不过了。对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
map
假设有一个列表a=[1,2,3], 要给列表的每个元素加1得到新列表,利用‘列表解析’可以这样写:
b = [i+1 for i in a]
而利用map()函数可以这样写:
b = map(lambda x: x+2, a)
b = list(b)
>> [3, 4, 5]
也就是我们先定义一个函数,然后结合map()将函数逐一应用到列表的每一个元素,最后返回一个数组。
这里可以看到map()函数与列表解析功能相似,但是列表解析本质上是for命令,而我们知道for命令的效率并不高,而map()函数实现了相同的功能,但是运行效率高多了,特别是数据量巨大的时候。
reduce
reduce()函数与map()函数有点相似,但map()函数用于逐一遍历,而reduce()函数用于递归计算,比如计算n的阶乘:
reduce(lambda x,y:x*y, range(1, n+1))
# 在2.x中,上述命令可以直接运行,但是在3.x中,reduce()函数置于funtools库中,如需使用,要导入
匿名函数lambda构造了二元函数,返回两个数的乘积,reduce命令首先将列表的前两个元素作为函数的输入参数进行计算,然后将运算结果与第三个数字作为输入参数进行计算,依此递推,直到列表结束,返回最终结果。
filter
最后是filter()函数,顾名思义,它是一个过滤器,用于筛选出列表中符合条件的元素,例如,
b = filter(lambda x: x> 5 and x< 9, range(10))
>> [6,7,8]
使用filter函数首先需要返回一个值为bool型的函数,例如上面那个函数判断X是否大于5且小于9,然后将这个函数作用到range(10)的每个元素中,如果True,则挑选出那个元素,最后将所有满足条件的组成列表返回。
上述filter()函数也可以用列表解析写为:
b = [i for i in range(10) if i>5 and i<9]
这样的表达式也很简介,但是执行效率比不上filter(), 我们的程序要兼顾简洁与效率。
Python编程使用好上述几个函数可以使我们的程序变得更加简洁高效,是提高技术的有效途径。