6.4 函数式编程
函数式编程是一种古老的编程模式,就是用函数(计算)来表示程序,用函数的组合来表达程序组合的思维方式,最开始受到学术界的热捧,近年来开始在业界被投入使用。因此,越来越多的高级语言都加入对函数式编程的支持,Python当然也不例外。
6.4.1 lambda
视频讲解
Python允许使用lambda关键字来创建匿名函数。什么是匿名函数呢?匿名函数与普通函数在使用上有什么不同?匿名函数被发明出来的意义何在?(夺命三连问)
那先来谈谈lambda表达式怎么用,然后再来讨论它的意义吧。
先定义一个普通的函数:
如果使用lambda语句来定义这个函数,就会变成这样:
>>> lambda x : 2 * x +? 1 <function <lambda> at 0x00000000007FCD08>
就像前面讲过的三元操作符一样,匿名函数在很大程度上简化了函数的定义过程。Python使用lambda关键字来创建匿名函数。
基本语法是使用冒号(:)分隔函数的参数及返回值:冒号的左边放置函数的参数,如果有多个参数,使用逗号(,)分隔即可;冒号右边是函数的返回值。
执行完lambda语句后实际上返回一个函数对象,如果要对它进行调用,只需要给它绑定一个临时的名字即可:
>>> g = lambda x : 2 * x + 1 >>> g(5) 11
作为对比,这是普通函数:
把它转换为lambda表达式:
>>> g = lambda x, y : x + y >>> g(3, 4) 7
前面闭包的例子也可以转换为lambda表达式:
6.4.2 filter()
filter()函数是一个过滤器,它的作用就是在海量的数据里面提取出有用的信息。那么Python的这个filter()函数如何来实现过滤功能呢?
先看Python自己的注释:
filter()这个内置函数有两个参数:第一个参数可以是一个函数也可以是None,如果是一个函数的话,则将第二个可迭代对象里的每一个元素作为函数的参数进行计算,把返回True的值筛选出来;如果第一个参数为None,则直接将第二个参数中为True的值筛选出来。
这么说有些读者可能还不大理解,小甲鱼还是用简单的例子帮助大家消化一下:
>>> temp = filter(None, [1, 0, False, True]) >>> list(temp) [1, True]
利用filter()函数,下面尝试编写一个筛选奇数的过滤器:
结合前面学到的lambda表达式,就可以使用函数式编程来实现:
>>> list(filter(lambda x : x % 2, range(10))) [1, 3, 5, 7, 9]
6.4.3 map()
map在这里不是地图的意思,在编程领域,map一般作“映射”来解释。
map()这个内置函数也有两个参数,仍然是一个函数和一个可迭代对象,将可迭代对象的每一个元素作为函数的参数进行运算加工,直到可迭代序列每个元素都加工完毕。
举个例子:
>>> list(map(lambda x : x * 2, range(10))) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
map()的第二个参数是收集参数,支持多个可迭代对象。map()会从所有可迭代对象中依次取一个元素组成一个元组,然后将元组传递给func。注意:如果可迭代对象的长度不一致,则以较短的迭代结束为止。
举个例子:
>>> list(map(lambda x, y : x + y, [1, 3, 5], [10, 30, 50, 66, 88])) [11, 33, 55]