函数编程(二)

在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 @   明王不动心  阅读(142)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示