美文网首页
python内置函数filter的bug?

python内置函数filter的bug?

作者: 代码小不全 | 来源:发表于2018-11-05 22:34 被阅读0次

对同一个序列,连续使用filter进行过滤,如下的形式可以正常得到结果:

def filterF1( listSrc ):
    listSrc = filter( lambda x: x%2 != 0, listSrc )
    listSrc = filter( lambda x: x%3 != 0, listSrc )
    listSrc = filter( lambda x: x%5 != 0, listSrc )
    listSrc = filter( lambda x: x%7 != 0, listSrc )
    return list( listSrc )

但是如果写成循环调用,则得不到预期结果。
如下:

def filterF2( listSrc ):
    for item in filterItems:
        listSrc = filter( lambda x: x%item != 0, listSrc )
    return list( listSrc )

完整对比验证如下:

listA = range( 2, 100 )
filterItems = [ 2,3,5,7 ]
        
def filterF1( listSrc ):
    listSrc = filter( lambda x: x%2 != 0, listSrc )
    listSrc = filter( lambda x: x%3 != 0, listSrc )
    listSrc = filter( lambda x: x%5 != 0, listSrc )
    listSrc = filter( lambda x: x%7 != 0, listSrc )
    return list( listSrc )

def filterF2( listSrc ):
    for item in filterItems:
        listSrc = filter( lambda x: x%item != 0, listSrc )
    return list( listSrc )

def filterF3( listSrc ):
    i = 0
    while i < len( filterItems ):
        item = filterItems[i]
        listSrc = filter( lambda x: x%item != 0, listSrc )
        i += 1
        
    return list( listSrc )

def testFun( fun ):
    res = fun( listA )
    print( getattr( fun, '__name__' ) , 'res=', res )
    

if __name__ == '__main__':
    
    testFun( filterF1 )
    testFun( filterF2 )
    testFun( filterF3 )

输出结果:
filterF1 res= [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
filterF2 res= [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 99]
filterF3 res= [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 99]

看结果只有最后一次filter起作用了。
这是一个bug吗?

相关文章

网友评论

      本文标题:python内置函数filter的bug?

      本文链接:https://www.haomeiwen.com/subject/rcuexqtx.html