当前位置: 首页 > 文档资料 > Python 之旅 >

函数式编程 - map/reduce/filter

优质
小牛编辑
136浏览
2023-12-01

map/reduce/filter 是 Python 中较为常用的内建高阶函数,它们为函数式编程提供了不少便利。

map

map 函数的使用形式如下:

  1. map(function, sequence)

解释:对 sequence 中的 item 依次执行 function(item),并将结果组成一个 List 返回,也就是:

  1. [function(item1), function(item2), function(item3), ...]

看一些简单的例子。

  1. >>> def square(x):
  2. ... return x * x
  3. >>> map(square, [1, 2, 3, 4])
  4. [1, 4, 9, 16]
  5. >>> map(lambda x: x * x, [1, 2, 3, 4]) # 使用 lambda
  6. [1, 4, 9, 16]
  7. >>> map(str, [1, 2, 3, 4])
  8. ['1', '2', '3', '4']
  9. >>> map(int, ['1', '2', '3', '4'])
  10. [1, 2, 3, 4]

再看一个例子:

  1. def double(x):
  2. return 2 * x
  3. def triple(x):
  4. return 3 *x
  5. def square(x):
  6. return x * x
  7. funcs = [double, triple, square] # 列表元素是函数对象
  8. # 相当于 [double(4), triple(4), square(4)]
  9. value = list(map(lambda f: f(4), funcs))
  10. print value
  11. # output
  12. [8, 12, 16]

上面的代码中,我们加了 list 转换,是为了兼容 Python3,在 Python2 中 map 直接返回列表,Python3 中返回迭代器。

reduce

reduce 函数的使用形式如下:

  1. reduce(function, sequence[, initial])

解释:先将 sequence 的前两个 item 传给 function,即 function(item1, item2),函数的返回值和 sequence 的下一个 item 再传给 function,即 function(function(item1, item2), item3),如此迭代,直到 sequence 没有元素,如果有 initial,则作为初始值调用。

也就是说:

  1. reduece(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

看一些例子,就能很快理解了。

  1. >>> reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 相当于 ((1 * 2) * 3) * 4
  2. 24
  3. >>> reduce(lambda x, y: x * y, [1, 2, 3, 4], 5) # ((((5 * 1) * 2) * 3)) * 4
  4. 120
  5. >>> reduce(lambda x, y: x / y, [2, 3, 4], 72) # (((72 / 2) / 3)) / 4
  6. 3
  7. >>> reduce(lambda x, y: x + y, [1, 2, 3, 4], 5) # ((((5 + 1) + 2) + 3)) + 4
  8. 15
  9. >>> reduce(lambda x, y: x - y, [8, 5, 1], 20) # ((20 - 8) - 5) - 1
  10. 6
  11. >>> f = lambda a, b: a if (a > b) else b # 两两比较,取最大值
  12. >>> reduce(f, [5, 8, 1, 10])
  13. 10

filter

filter 函数用于过滤元素,它的使用形式如下:

  1. filter(function, sequnce)

解释:将 function 依次作用于 sequnce 的每个 item,即 function(item),将返回值为 True 的 item 组成一个 List/String/Tuple (取决于 sequnce 的类型,python3 统一返回迭代器) 返回。

看一些例子。

  1. >>> even_num = list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6]))
  2. >>> even_num
  3. [2, 4, 6]
  4. >>> odd_num = list(filter(lambda x: x % 2, [1, 2, 3, 4, 5, 6]))
  5. >>> odd_num
  6. [1, 3, 5]
  7. >>> filter(lambda x: x < 'g', 'hijack')
  8. 'ac' # python2
  9. >>> filter(lambda x: x < 'g', 'hijack')
  10. <filter object at 0x1034b4080> # python3

小结

  • map/reduce/filter 为函数式编程提供了不少便利,可使代码变得更简洁;
  • 注意在 python2 和 python3 中,map/reduce/filter 的返回值类型有所不同,python2 返回的是基本数据类型,而 python3 则返回了迭代器;

参考资料