![Python数据分析从小白到专家](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/38209745/b_38209745.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.4.1 匿名函数lambda
匿名函数lambda属于函数式编程的范畴,但是Python不是天生的函数式编程语言。虽然Python不适合函数式编程,但是匿名函数lambda具备的迅速命名函数的功能可以使代码更加简洁。首先来看看如何定义一个一般函数和匿名函数lambda,代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_2.jpg?sign=1739286552-ezm7j6VK3X152DemW33fd43VFaQrTIfX-0-9d3089b23dea328c951b1a96ad198123)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_3.jpg?sign=1739286552-x0WVHc2c9JXsAF1wEPU8VcccqthpLXWz-0-db2b6ee783b8e20ce243533fffefe78b)
可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用匿名函数lambda编写的代码只占一行,十分简明,而且调用方式和普通的用def和return语句定义的函数一样。
匿名函数不会在任何空间里创建名字,所以可以节省大量内存。匿名函数lambda的使用示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_4.jpg?sign=1739286552-82w9m9FEPcBMQsZFrBJDA5D5I0ieMNX6-0-5951abf12001069a38454b16990a18f5)
调用方式如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_1.jpg?sign=1739286552-7FqkiKvydSvHZPg2fJq3h2JpJzXJr4A0-0-da153eef6c2643809bdc473252a07f81)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_2.jpg?sign=1739286552-yV3aUMgcsGMyUalzSRKQi7RXwsNcErJB-0-4365e5f79762f912bdc570723b0a6e91)
Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_3.jpg?sign=1739286552-eIEUBkqQMxKBalkdkNGe4n9iZhmZekxG-0-48522c26d6e25dd0b79eadeac149440d)
原理是当if bool_func(eachItem)被判为True时,将eachItem加入新的filtered_seq列表中,否则舍去。bool_func是过滤法则;seq是传入列表;filtered_seq是传出列表。下面的示例是先产生一个较大的随机数集合,然后过滤所有的偶数,留下奇数,代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_4.jpg?sign=1739286552-vU4g2EBs7mmH8t6HyZ1LPhNeug44IYLD-0-0f11be4449bfe085ce3cfb8fa15006e5)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_5.jpg?sign=1739286552-jgjeQgyohGWC4MfcTSipevLOUB3U1taC-0-0645f633b864633530a18352d6384b3d)
上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_6.jpg?sign=1739286552-dTb9zOTVffPK4uiwOzh0dHp6TC8fSfNT-0-a615f4599adaf2c76f2d5095913cfb37)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_7.jpg?sign=1739286552-O1OwokE57HzMG0QvRZxX5L7itgXDwkE2-0-fae2a2e5a258685814164cb36704b45c)
map()是映射函数,大致的源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_8.jpg?sign=1739286552-TSpSEIjwKhUYanXOiqgX6GRXhXSNODd5-0-5a3373df34fb11b2d99d462a64a2d9e0)
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_1.jpg?sign=1739286552-zSGZmVx7yLGv7mwibQ6zck1DTADBqBzK-0-20aef3dff76dc1e4eb03a198196bb67e)
其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于创建哈希表(字典)。
reduce()是迭代器,也被称为“折叠”,源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_2.jpg?sign=1739286552-bWjVbN4sLNNCYaCbt8bKFqfwMczisBUZ-0-6cb5b7454ab64fe5cf6cdc30c7b82f0b)
具体的示例代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_3.jpg?sign=1739286552-a61ev9THz9oshYyMvqAGdWP8W8KCW5Nt-0-9202cfba42a598aa35d8c23566a72a2d)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_4.jpg?sign=1739286552-0Nq9LFZgpdluR8UcC2NChg0ClU1tvQFs-0-5df1fae48f6b4b9d26390ea37dbaf885)