Pythonic体验(二 )由filter()说起

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程序追求程序越简单越好,涉及列表,要想到充分利用列表推导或生成器表达式

 

你可能感兴趣的:(python)