函数编程(二)
在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)