![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=1739157366-FmRQ1vUlBptY37i3YPZQapzVxnezlUyh-0-bfb752bd2c09bc3c6818abc57d0c6bf5)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_3.jpg?sign=1739157366-YigOswUJjjmxxNpeEspqB8ahG0rj1xS4-0-1b5a98afb2c305c15eb09bd2d1f91385)
可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用匿名函数lambda编写的代码只占一行,十分简明,而且调用方式和普通的用def和return语句定义的函数一样。
匿名函数不会在任何空间里创建名字,所以可以节省大量内存。匿名函数lambda的使用示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_4.jpg?sign=1739157366-7Dtqt9YuMYRhOwOEuEFU9QAeU3zWKAA9-0-51b94150b2fe7edba15a76d1919fc45f)
调用方式如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_1.jpg?sign=1739157366-HbvsvY3PvWGhJn5kMrFkV8aXMycMgGV7-0-b7f35afb60c76bdaa8039e1df2dad8a3)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_2.jpg?sign=1739157366-SAqYt7YRtc78jqNuVgc9HXuAdf6kb4M5-0-160aa71ce7d57f9fc9cdceb635f0e41d)
Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_3.jpg?sign=1739157366-J7FbCu6EfIJa31YnnUX8pglnMAhYfD09-0-4b0a09064e97e4434eea5e51e4cc24d8)
原理是当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=1739157366-1SntUq8c4qQ4ET2oBMhe1o9k7LsLFGdJ-0-8c01a4d17d1118ecfddb8fffbc3f5428)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_5.jpg?sign=1739157366-VnT4T0TPkUwvXUiBdMi77gYAJwy6SfVg-0-a2a9b88e3efb9c00175f043bd6f09642)
上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_6.jpg?sign=1739157366-btMCcs9BBiDSurrH5E6OCDje5VbEvaLN-0-0670099be73aeb7c9a5aa4a66cba97ee)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_7.jpg?sign=1739157366-pgQqkqxHsAwvZdKSzwIOx83T0Cz99B0l-0-21593f0df09bac0a6fb0670a620725b9)
map()是映射函数,大致的源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_8.jpg?sign=1739157366-kzzrRiNceyT5KPtTHIDwEg0LVhWXsc5B-0-d6cdac35f81cd52782084bf36bb2e3b7)
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_1.jpg?sign=1739157366-EczoGC48fXZmK3GLovjC6uZFAl5RoZq4-0-d736bff3d82963a599623e9711add726)
其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于创建哈希表(字典)。
reduce()是迭代器,也被称为“折叠”,源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_2.jpg?sign=1739157366-4UUWjP34fN9EKSO0txN3JscJ1YjGn2Ni-0-51ef7ca377630e75a3e0fa2dae8e210c)
具体的示例代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_3.jpg?sign=1739157366-RUF4YfdOK0Yqqgv1JTV5k5urEWUjkPE5-0-55f1e93858e1a4e76e66c88e129ebaa5)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_4.jpg?sign=1739157366-qgm5n9VmLNJ08KKPf0ma2Wg4p8RO7SnS-0-4c72df4c5d2e27217b974183b60b0031)