![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=1739273708-9retqEoIWSGdtSj3Yxnm6k983aF4Fr1c-0-9091b1585d371d93063953239dc08416)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_3.jpg?sign=1739273708-UheYKLwGVdBdKDnp6XIxkVqmNoicl4YG-0-f8fd964e67e7590a7c3a8a8d8bd9af4d)
可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用匿名函数lambda编写的代码只占一行,十分简明,而且调用方式和普通的用def和return语句定义的函数一样。
匿名函数不会在任何空间里创建名字,所以可以节省大量内存。匿名函数lambda的使用示例如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_62_4.jpg?sign=1739273708-vKmxQi1qAi5DJmxS4ByVchcaZ78XcS8L-0-fffca7e2c7aad7f5d25802e79fd3883a)
调用方式如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_1.jpg?sign=1739273708-wtKoFx17kb8QBg1hU4GzFsxL8ttHnqNH-0-6a9a0944e090a1fc8edbf67b36a75735)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_2.jpg?sign=1739273708-WX5DpNohRGDReUtcZ5SGGQXJtpS5GHG2-0-a4b52996aa18adc392cc0696e5138ac1)
Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_3.jpg?sign=1739273708-5taBMKEf2WMzZ9KtCGDs2UpxWRt3lXnF-0-c550dbf971e430eef9e8c25fc406c544)
原理是当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=1739273708-XfYqYcwvcN7mUbouSoALM4QmuluqIuhe-0-a26752d76ea56dc5bec7b3d0ff22069b)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_5.jpg?sign=1739273708-N3hfsgwu8re2slwXXtHBMbB0yXgB5Ldg-0-42fde36bf54f918a2b8230c23d1d26ea)
上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_6.jpg?sign=1739273708-24PMDFX408HT3xHfgAtRVSbdIIGfxnBk-0-0f2dbef3d291738ade2a2d15706cf09c)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_7.jpg?sign=1739273708-vrbZjwz9tCXW7OVlzvmbbkLgvCtzqRm0-0-819027508589e4acb14adb7542a68bf7)
map()是映射函数,大致的源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_63_8.jpg?sign=1739273708-uxCHMuS7XDR2IXlatuLR8shab8mT5SXS-0-4b8cca6f2d5c1365033546ce574b28e3)
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_1.jpg?sign=1739273708-FHJpG276qqq1qh0FJRjS8ues1E2f5xoT-0-9d6bdc42950e4f92cd858744b915c993)
其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于创建哈希表(字典)。
reduce()是迭代器,也被称为“折叠”,源代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_2.jpg?sign=1739273708-hxh5SzreIAlY12Mwwgbezl2EsniSZMpg-0-d4efa612854c914bb09426c0c4f527e9)
具体的示例代码如下:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_3.jpg?sign=1739273708-DltOjmpJDZQGsX9uerTnr8g4miT5h0Mg-0-82148e01fba62de183a2305558f5d240)
输出结果:
![](https://epubservercos.yuewen.com/ED1E6A/20118172701012106/epubprivate/OEBPS/Images/40923_64_4.jpg?sign=1739273708-goydH3m9s5YckpYnBZAEBJbdNbdRf7We-0-414fc34c6fca5df8bcdde31ef9d23bd9)