用map,filter和reduce来代替for循环

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还有第三个参数,可以设置计算的初始值。

发表于 2014年10月22日 00:47   评论:0   阅读:3755  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo