对同一个序列,连续使用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吗?
网友评论