filter()函数体现了Python函数式编程的重要特征,通过它给定一个序列和‘过滤’函数,将序列中每一项都‘过滤‘一下,丢弃返回False的项,返回包含所有’符合要求‘的项的队列。
下面有一个小段代码,是将9个随机产生的整数,获得其中的所有奇数,如下:
1 #!/usr/bin/env python 2 from random import randint 3 4 def odd(num): 5 return num % 2 6 7 allNums = [] 8 9 for eachnum in range(9): 10 allNums.append(randint(1, 99)) 11 12 print filter(odd, allNums)
这里应用了随机函数randint()和filter()函数,
运行如下:[3,55,37,41]
第一次重构如下:
1 #!/usr/bin/env python 2 from random import randint 3 4 allNums = [] 5 6 for eachnum in range(9): 7 allNums.append(randint(1, 99)) 8 9 print filter(lambda x : x %2, allNums)
这里通过lambda关键字定义了匿名函数,省去几行代码,
随机运行结果如下: [45,97,37,13]
第二次重构如下:
1 #!/usr/bin/env python 2 from random import randint 3 4 allNums = [] 5 6 for eachnum in range(9): 7 allNums.append(randint(1, 99)) 8 9 print [x for x in allNums if x%2]
这里通过列表推导表达式,省去了filter()函数,而且也使表达式更简单了。
第三次重构如下:
1 #!/usr/bin/env python 2 from random import randint 3 print [x for x in [randint(1, 99) for y in range(9)] if x%2]
这里同样通过列表推导,并且是嵌套方式,省去了几行代码,使整个程序缩减为了2行,并且不失程序的简单明了,
小结:
Python程序追求程序越简单越好,涉及列表,要想到充分利用列表推导或生成器表达式
’