高阶函数
高阶函数(Higher-Order Function,HOF)是函数式编程中的一个重要概念。一个函数如果能接受一个或多个函数作为参数,或者返回一个函数作为返回值,那么它可以被称为高阶函数。如果高阶函数接收其它函数作为参数,则它的行为在运行时,可以基于传递给它的函数进行动态调整。
Python 中有一些内置的高阶函数,包括函数式编程中经常使用到的 map(), filter(), 和 reduce() 等。其中 map(), filter() 虽然在函数式编程中使用非常频繁,但是在 Python 中,列表(或字典)推导式以及生成器表达式,在功能上基本可以取代 map() 和 filter()。在 Python 程序中,Pythora 星球居民更倾向于使用列表推导式和生成器表达式。但为了保证代码的可读性,列表推导式和生成器表达式一般适用于简单逻辑,复杂功能的实现还是更适合使用这些高阶函数。
map
基本用法
在介绍生成器表达式的时候,我们使用了一个简单的示例:假设我们有一个输入迭代器,其中包含了一组数据,我们希望生成一个新的迭代器,可以产生一组新数据,这组新数据中的每个数,对应原数列中每个数的平方值。使用生成器表达式可以写成如下程序。
numbers = range(10)
squared = (x*x for x in numbers)
for num in squared:
print(num)
使用函数式编程,对于这个问题,还有另一种解决方案:使用 map() 函数。map() 函数接受一个函数和一个可迭代对象作为参数,然后返回一个新的迭代对象。返回的迭代对象中的每个元素,是将输入迭代对象中每个元素传递给输入函数运行后的结果。使用 map() 函数改写上面的代码如下:
numbers = range(10)
squares = map(lambda x: x*x, numbers)
for num in squares:
print(num)
在上面的示例中,传递给 map 的参数,numbers 是需要被处理的可迭代对象,匿名函数 lambda x: x*x
则表示需要对可迭代对象中的每个元素做平方。
使用多个可迭代对象
当给 map() 函数提供多个可迭代对象时,它会并行处理这些对象。这意味着它会取每个可迭代对象的第一个元素,然后应用函数;接着取每个可迭代对象的第二个元素,再次应用函数,依此类推。比如:
a = [1, 2, 3]
b = [10, 20, 30]
summed = map(lambda x, y: x + y, a, b)
print(list(summed)) # [11, 22, 33]
在上面这个示例中,lambda 函数接收两个参数,并将它们加在一起。如果传递给 map() 的可迭代对象长度不同,map() 将在最短的可迭代对象结束时停止。
使用列表推导式处理多个可迭代对象时,要借助 zip() 函数,把多个可迭代对象转换成单个可迭代对象再处理。而 map() 函数可以直接处理它们。