for循环会导致缩进,缩进会让代码冗长而丑陋,所以应该尽管少写for循环。而python中的map,filter和reduce可以在很多情况下替代for循环。
map是对序列每个元素执行某个函数,如果第一个函数参数为None,其效果相当于zip函数:
map(None, [1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
zip([1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
不同的是,序列长度不一致时,map和zip的处理方法不一样:
zip([1,2,3], [4,5,6], [7,8,9,10])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
map(None, [1,2,3], [4,5,6], [7,8,9,10])
[(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, None, 10)]
第一个参数为函数时,序列对应元素依次为参数:
map(lambda x,y,z:x+y+z, [1,2,3], [4,5,6], [7,8,9])
[12, 15, 18]
filter就是依次判断是否为True,如果第一个参数为None时,就返回元素中被认为是True的元素:
filter(None, [True, False, 1, 0, 'abc', '', [1], []])
[True, 1, 'abc', [1]]
如果第一个参数不为None,就依次进行过滤:
filter(lambda x:1<x<10, [-10, 0, 1, 2, 8, 10, 11])
[2, 8]
reduce就是对元素进行收缩处理,如下代码相当于sum(xrange(10)):
reduce(lambda x,y:x+y, xrange(10))
45
更确切地讲,就是:
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
等价于:
((((1+2)+3)+4)+5)
reduce还有第三个参数,可以设置计算的初始值。