列表解析:如何从filter函数一步步重构到列表解析(经典)

来源:互联网 发布:angular 1.1.0.min.js 编辑:程序博客网 时间:2024/06/14 20:00

本产生一个较大的随机数集合,然后
过滤出所有的的偶数,留给我们一个需要的数据集

 

原始版:

from random import randint
def odd(n):
return n % 2
allNums = []
for eachNum in range(9):
allNums.append(randint(1, 99))
print filter(odd, allNums)

代码包括两个函数:odd(), 确定一个整数是奇数(真) 或者 偶数(假)Boolean 函数,以及
main(), 主要的驱动部件。main()的目的是来产生10 个在1 到100 之间的随机数:然后调用filter()
来移除掉所有的偶数。最后,先显示出我们过滤列表的大小,然后是奇数的集合

 

第一次重构
在第二次浏览时,我们注意到odd()是非常的简单的以致能用一个lambda 表达式替换
from random import randint allNums = []
for eachNum in range(9):
allNums.append(randint(1, 99))
print filter(lambda n: n%2, allNums)

 

 

from random import randint
allNums = []
for eachNum in range(9):
allNums.append(randint(1, 99))
print [n for n in allNums if n%2]

 

 

 

Refactoring Pass 3
我们通过整合另外的列表解析将我们最后的列表放在一起,来进一步简化我们的代码。正如你
如下看到的一样, 由于列表解析灵活的语法,就不再需要一个暂时的变量了。(为了简单,我们用
一个较短的名字将randint()倒入到我们的代码中)
from random import randint as ri
print [n for n in [ri(1,99) for i in range(9)] if n%2]
虽然比原来的长些, 但是这行扮演了该例子中核心部分的代码不再如其他人想的那么模糊不清

 

 

通过以上三次重构,可以很清晰的读懂最后一段函数的意思。

 

原创粉丝点击