简述Python中filter、map、reduce函数

时间:2021-08-30 18:25:36

概述

map filter

  • python 3 中,map和filter返回生成器,因此他们的直接替代品是生成器表达式;
  • Python 2中,这两个函数返回的是列表,直接替代品是列表推导式;
  • filter是用于过滤的生成器函数,map是用于映射的生成器函数;即:
    filter中的函数返回的是原可迭代对象进行筛选后的结果,map函数返回的是重新创建的新的可迭代对象。

reduce

  • Python 2 中,reduce是内置函数;
  • Python 3中,reduce放到了functools模块中了;
  • 该函数最常用于求和,但Python2.3以后,求和来说,内置函数sum在可读性和性能方面更优。

filter(function, iterable)

function 函数名
iterable 可迭代对象

filter中的函数返回布尔值,可迭代对象通过迭代,将元素传入函数,通过函数返回的布尔值来判断该元素是保留还是丢弃。

In [178]: def a(item):
...: return item - 2

In [179]: list(filter(a,range(5)))
Out[179]: [0, 1, 3, 4]

map(function,it1, ,[it2,…,itN])

function 函数名
it 可迭代对象

  • 通过迭代,将元素传入函数,经过函数处理后,将函数的返回值放入到新的可迭代对象中;
  • 调用map函数的结果是是重新创建并返回了新的可迭代对象;
  • map可以接收多个可迭代对象,如果传入n个,那么func必须可以接受n个参数,而且要并行处理各个可迭代对象。

python 2 中使用map函数效率低些,因为map函数要使用结果构建一个列表;
在Python 3 中,map函数是惰性的,它会创建一个生成器,按需产出结果,因此能节省内存。

In [172]: list(map(lambda x:x+5,range(5)))
Out[172]: [5, 6, 7, 8, 9]
In [171]: list(map(lambda x,y:x+y,range(5),range(5)))
Out[171]: [0, 2, 4, 6, 8]

reduce(function, iterable, [initial])

function 函数名
iterable 可迭代对象
initial 如果提供了initial,把它当做第一个元素传入

与map不同的是,reduce里的函数必须传入两个形参,并且会把上一个元素在函数执行的结果累积到下一个元素。

In [174]: from functools import reduce

In [176]: ret = reduce(lambda x,y:x+y,range(5))

In [177]: print(ret)
10


In [199]: ret2 = reduce(lambda x,y:x+y,range(5),10)

In [200]: print(ret2)
20