购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 Python高阶函数

在Python语言中,高阶函数的抽象能力是非常强大的,在代码中善于利用这些高阶函数,可以编写出简洁明了的程序代码。本节我们通过案例介绍map()函数、reduce()函数、filter()函数和sorted()函数4类高阶函数。

2.3.1 map()函数

Python内建了map()函数,它接收两个参数:一个是函数,另一个是迭代器(Iterator)。map()函数将传入的函数依次作用到序列的每一个元素上,把结果作为新的迭代器并返回。

例如,求一个列表中各个数值的立方,返回的还是列表,就可以调用map()函数实现,示例代码如下:

map()函数传入的第一个参数是f,即函数对象本身。由于结果r是一个迭代器,迭代器是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个列表。

其实这里可以不需要调用map()函数,编写一个循环也可以实现同样的功能,示例代码如下:

所以,map()函数作为高阶函数,它把运算规则抽象化,我们不仅可以传入简单的诸如f(x)=x**3这样的函数,还可以传入任意复杂的函数。例如把列表中所有的数字转为字符串,示例代码如下:

     list(map(str,[1, 2, 3, 4, 5, 6, 7, 8, 9]))

运行上述代码,输出为“['1', '2', '3', '4', '5', '6', '7', '8', '9']”,可以看出列表中所有的数字都转为字符串了。

2.3.2 reduce()函数

reduce()函数有三个参数:一个是函数f,一个是列表,还有一个是可选的初始值。初始值的默认值是0,reduce()函数传入的函数f对列表的每个元素反复调用函数f,并返回最终计算结果。

例如,计算列表[1, 2, 3, 4, 5]中所有数值的和,初始值是100,示例代码如下:

运行上述代码,输出结果是115。

此外,也可以使用Lambda函数进一步简化程序,示例代码如下:

2.3.3 filter()函数

Python内建的filter()函数用于筛选序列,与map()函数类似,filter()函数也接收一个函数和一个序列。与map()函数不同的是,filter()函数把传入的函数依次作用于每一个元素,然后根据返回值是True还是False来决定是保留还是丢弃该元素。

例如,调用filter()函数筛选出1~100中平方根是整数的数,示例代码如下:

运行上述代码,输出为“[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]”,其中math.sqrt()是求平方根的函数。

此外,还可以用filter()函数来处理缺失值等。例如,将一个序列中的空字符串都删除掉,示例代码如下:

运行上述代码,输出为“['华东', '华北', '华南']”。可见使用filter()高阶函数的关键在于如何正确地实现一个筛选函数。

注意

filter()函数返回的是一个迭代器,也是一个惰性序列,计算结果都需要调用list()函数来获得所有结果并返回一个列表。

2.3.4 sorted()函数

排序是程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心都是比较两个元素的大小。如果用于排序的是数字,可以直接比较,但如果是字符串或者字典,直接比较数学上的大小是没有意义的,因此比较的过程必须通过函数抽象出来。

Python内置的sorted()函数可以对列表进行排序:

     sorted([12, 2, -2, 8, -16])

运行上述代码,输出为“[-16, -2, 2, 8, 12]”。

此外,sorted()函数可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序,代码如下:

     sorted([12, 2, -2, 8, -16],key=abs)

运行上述代码,输出为“[2, -2, 8, 12, -16]”。

用key指定的函数将作用于列表的每一个元素上,并根据key函数返回的结果进行排序。

我们再看一个字符串排序的例子,代码如下:

     sorted(['Month', 'year', 'Day', 'hour'])

运行上述代码,输出为“['Day', 'Month', 'hour', 'year']”。

默认情况下,对字符串的排序是按照字符串中字符的ASCII编码的大小来排序的,大写字母会排在小写字母的前面。

现在,我们提出排序忽略大小写,按照字母顺序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略字母大小写的排序即可。忽略字母大小写来比较两个字符串,实际上就是先把字符串中的字母都变成大写字母(或者都变成小写字母),然后再进行比较。

这样,我们给sorted()函数传入key函数,即可实现忽略字母大小写进行排序:

     sorted(['Month', 'year', 'Day', 'hour'],key=str.lower)

运行上述代码,输出为“['Day', 'hour', 'Month', 'year']”。

要进行反向排序,不必改动key函数,传入第三个参数reverse=True即可:

     sorted(['Month', 'year', 'Day', 'hour'], key=str.lower, reverse=True)

运行上述代码,输出为“['year', 'Month', 'hour', 'Day']”。 MAgUcFuYlBHXa0pesaUyUcRukTa9wFNiwU52At6jmHaia4xaINdWj4wOtwrl0pzC

点击中间区域
呼出菜单
上一章
目录
下一章
×