王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()
王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()
首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!!
本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈)
今天上的是关于Python的文章,毕竟在亲戚家拜年,懒得插各类手机调试什么的,况且确实好久没有弄Python了,就写了,废话不多,开始正题!!
函数式编程
函数是什么?
把复杂的操作化为简单的函数分解成简单的操作,这种操作就是面向过程,也就是C这类的实现的大体概念。
函数式是什么?
函数没有变量,任意一个函数,只要输入是确定的,输出就是确定的,以函数作为最基础元件的编程叫做函数式编程(传统的函数式编程里没有变量的,而Python里有)
在Python变量声明时不需要对变量类型定义像这样
a=123
而像java c这些是
int a =123 ;
Python中的变量也可以指向方法(函数,随你怎么叫了理解就行)
这里拿max方法作为例子
print('最大值函数 :', max([1, 2, 3, 100, 20]));
结果:
最大值函数 : 100
返回了最大值100,那么我们把函数指向一个对象试试
maxValue = max;
print('对象指向函数 最大值为:', maxValue(10, 20))
结果:
对象指向函数 最大值为: 20
那既然函数可以指向变量,那么函数也就可以当做参数传入另一个函数了吧?(猜测) 那我们来试试看!
这次拿绝对值函数abs来实验
c = abs
def testABS(a, b, c):
return c(a) + b
print('测试函数结果:', testABS(-1, -9, c))
结果:
测试函数结果: -8
也就是1-9=-8,符合我们的设想,是可以传入一个函数的
map()
map方法有2个参数,第一个参数为一个函数,第二个参数为一个Iterable(所以你传入(),[]什么的都行了)
每次的结果会单独生成,返回的新的Iterable对象的长度不会减少。
def testMAP(a):
return a + a
print('返回的结果为:', list(map(testMAP, (1, 2, 3, 4, 5))))
结果:
返回的结果为: [2, 4, 6, 8, 10]
类似的实现,可以用一个循环操作,像这样
istValue = []
for x in [1, 2, 3, 4, 5, ]:
listValue.append(testMAP(x))
print('返回的结果为:', listValue)
结果和上面的map效果是一样的
再贴个例子int list转字符串list
def toString(a):
return str(a)
print('转换为字符串:', list(map(toString, [1, 2, 3, 4])))
结果:
转换为字符串: ['1', '2', '3', '4']
原Iterable对象里每个元素不会有任何关系,而reduce()函数恰恰相反
reduce()
reduce也是传入两个参数第一个参数为一个函数,第二个参数为一个Iterable,但是和map的区别在于,他把结果继续和序列的下一个元素做累积计算。
def absAll(a, b):
return abs(a) + abs(b)
print('返回所有值的绝对值的和', reduce(absAll, (-1, 2, -3, -10, 1)))
结果:
返回所有值的绝对值的和 17
流程就是
1+2=3
3+3=6
6+10=16
16+1=17
那我们把之前的toString操作结合进来(这次让他toInt),计算各总和,像这样
# map reduce组合使用
def toInt(a):
return int(a)
print('字符串转数字:', toInt("12"))
print('组合拳结果为:', reduce(absAll, list(map(toInt, ["1", "2", "3"]))))
结果:
字符串转数字: 12
组合拳结果为: 6
这样你的程序就可以变得更丰富,更易用。
filter()
filter()函数也需要传入2个参数,第一参数为一个函数,第二个参数为一个序列。filter会遍历每个元素,然后根据第一个参数函数的逻辑判断当前元素True还是False,True就加到新的序列里,False就去掉。
我们看下例子:
def checkValue(a):
return a - 5 > 0
print('判断是否>5', list(filter(checkValue, [1, 6, 9, 3])))
结果:
判断是否>5 [6, 9]
返回一个新序列,值为符合第一个函数逻辑的值。
评论关闭