零基础入门学习Python(第2版)
上QQ阅读APP看书,第一时间看更新

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]