函数编程(二)

在python中有许多函数具有函数式编程的特征。

lambda函数可以很好地和使用这些函数的应用程序结合起来,因为它们都带了一个可执行的函数对象。

lambda表达式提供了迅速创造这些函数的机制。

 

一、filter

filter在给定一个对象的序列和一个“过滤”函数的基础上,每个序列元素都通过这个过滤器进行筛选,保留函数返回为真的对象。

filter函数为已知的序列的每个元素调用给定布尔函数。每个filter返回的非零(true)值元素添加到一个列表中。

返回的对象是一个从原始队列中“过滤后”的队列。

注意:filter()在python三种改了,返回的是一个可迭代的对象。

#!/usr/bin/env python
from random import randint   #调用函数

def odd(n):
    return n % 2   #定义一个整数的函数

allNums = []
for eachNum in range(9):
    allNums.append(randint (1,99))  #随机生成9个值
allFilter = []

for eachone in filter(odd,allNums):
    allFilter.append(eachone)  #用odd将allNums过滤

print(allFilter)

#虽然使用filter有些多余,但是重要的是思想。

执行结果:

#随机返回一些奇数值
[root@7 script]# python 11-7-21.py
[9, 25, 69]
[root@7 script]# python 11-7-21.py
[55, 83, 41]
[root@7 script]# python 11-7-21.py
[67, 9, 35, 85, 11]

第一次改写:odd()能够用一个lambda表达式替换。

#!/usr/bin/env python
from random import randint
allNums = []
for eachNum in range(9):
    allNums.append(randint(1,99))

allones = []
for eachone in filter(lambda n:n%2,allNums): #使用匿名函数直接生成,而且也没有保留函数的必要。
    allones.append(eachone)

print(allones)

第二次改写:一个列表就可以替代filter函数

#!/usr/bin/env python
from random import randint
allNums = []
for eachNum in range(9):
    allNums.append(randint(1,99))

eachones =[]
for eachone in [n for n in allNums if n%2]:  
    eachones.append(eachone)

print(eachones)

第三次改写:

#!/usr/bin/env python
from random import randint as ri
eachones = []
for eachone in [n for n in [ri(1,99) for i in range(9)] if n%2]:
    eachones.append(eachone)    #函数都可以不要了

print(eachones)

 

二、map()

map()和filter()有点类似,都可以通过函数来梳理数据。

在最简单的形式中,map()带一个函数和队列,将函数作用在序列的每个元素上,然后创建由每次函数应用组成的返回值列表。

>>> for i in map((lambda x:x+2),[0,1,2,3,4,5]):
...     print(i)
... 
2
3
4
5
6
7
>>> for i in map(lambda x,y:x+y,[1,3,5],[2,4,6]):
...     print(i)
... 
3
7
11
>>> for i in map(lambda x,y:(x+y,x-y),[1,3,5],[2,4,6]):
...     print(i)
... 
(3, -1)
(7, -1)
(11, -1)

 

posted @ 2017-11-04 21:41  明王不动心  阅读(141)  评论(0编辑  收藏  举报