概述
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