OK,我们今天来简单讲一下Python中的几个高级函数,为什么说这是高级函数呢?因为它可以极大的减少我们的代码量,让我们的代码看起来更加的清爽,提高我们的开发速度;
在理解匿名函数之前,我们先来回顾下我们之前创建函数是怎么创建的:
def 函数名(参数1,参数2[,……]):
函数主体
return 返回值
标标准准的函数构建方法,但是有一个问题,当我们创建的函数只需要计算两个数相加之和时,我们最少也要写两行代码:
def sum_n(x,y):
return x+y
而用lambda创建则只需要一行代码就可以搞定:
sum_n = lambda x,y:x+y
这个就是lambda的魅力所在,使用也是非常的简单,接下来我们就来讲解一下它的使用方法和优缺点:
lambda 参数列表:参数表达式
sum_n = lambda x,y:x+y
print(sum_n(1,2))
# 输出结果:
# 3
func = [lambda x,y:x+y,lambda x,y:x-y,lambda x,y:x*y,lambda x,y:x/y]
for fun in func:
print(fun(1,2))
# 输出结果:
# 3
# -1
# 2
# 0.5
sum_n = lambda x,y:x+y
def sum_m(func,x,y,n):
return func(x,y)-n
print(sum_m(sum_n,1,2,6))
# 输出结果:
# -3
print = lambda x:None
print('test')
# 输出结果:
# 什么都没发生
那么这就有了一个引申用法,我是否可以通过它来屏蔽某些函数功能;
那么,有优点就肯定有缺点,我们一一说一下:
sum_n = lambda x,y:x+y
sum_n(1,'a')
# 输出结果:
# TypeError: unsupported operand type(s) for +: 'int' and 'str'
这是什么意思呢?我们下面来举个栗子说明:
a = [1,2,3,4,5]
b = [3,5,6,2,7]
n = []
for i in range(5):
n.append(a[i]+b[i])
print(n)
# 输出结果:
# [4, 7, 9, 6, 12]
我们正常来讲,想要将两个列表元素依次相加,需要这么几行代码,但是用map函数就方便啦:
def sum_n(x,y):
return x+y
print(list(map(sum_n,[1,2,3,4,5],[3,5,6,2,7])))
# 输出结果:
# [4, 7, 9, 6, 12]
额,好像没有啥差别呀,不就是没用变量传参了嘛;不要着急,还记得lambda嘛,实现一行解决问题:
print(list(map(lambda x,y:x+y,[1,2,3,4,5],[3,5,6,2,7])))
# 输出结果:
# [4, 7, 9, 6, 12]
是不是很神奇,OK,现在要敲黑板了,我们来总结一下:
map函数可以根据我们指定的函数功能,将若干序元素依次进行处理,最后返回的也是一个序列集合;
那么现在都是序列元素个数对等的情况,如果元素个数不对等会怎么样呢?
print(list(map(lambda x,y:x+y,[1,2,3,4,5],[3,5,6])))
# 输出结果:
# [4, 7, 9]
我们可以发现,没有报错,只进行了前三个元素处理;那么,我们可以得出,当序列元素不对等时,不对等部分就不会进行处理。
这个函数功能从字面上应该就可以理解,它就相当于一个筛子,可以将不符合要求的序列元素过滤掉,然后返回一个新的序列;
a = [1,2,3,4,5,6,7,8,9]
print(list(filter(lambda x:x%2==1,a)))
# 输出结果:
# [1, 3, 5, 7, 9]
从上面栗子的结果可以看出,上面的功能就是筛选出序列中所有的奇数,接下来我们讲解下函数的参数:
filter(判断函数,源序列))
# 判断函数的返回值我们就可以理解成判断条件
下面我们再来举个栗子:
import math
print(list(filter(lambda x:math.sqrt(x)%1==0,range(1,100))))
# lambda x:math.sqrt(x)%1==0
# 这里的x就是判断值
# math.sqrt(x)%1==0 就是判断条件
# range(1,100) 就是要进行筛选的源序列
# 输出结果:
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
这个函数还是还是不好理解的,下面我来举个栗子:
from functools import reduce # 在Python3中我们不能直接拿来使用,要从functools中导入使用
print(reduce(lambda x,y:x+y,range(1,101)))
# 输出结果:
# 5050
上面的栗子就是非常经典的累加,将1-100的数字依次相加,最后得出一个结果:
reduce(处理函数,[a,b,c,d,e])
# 首先对a和b用函数进行处理,得出结果b1
# 然后对b1和c用函数进行处理,得出c1
# 一次类推
# 最后对d1和e用函数进行处理,得出最后的结果
我们可以理解成滚雪球,不断根据规则进行迭代处理,到最后一个元素处理完毕得到最终结果。