python之 lambda匿名函数以及高阶函数
lambda主要用在一些简单的,并不需要特地命名的函数. 比如我们有一个函数
def add(x,y): return x+y
用匿名函数可以是
lambda x,y : x+y
#这个表达式表示输出x+y的值
需要注意的是,匿名函数 冒号前面是变量 相当于函数的传参 冒号后面是代码,并且冒号后面不允许出现用来赋值的 = 号.
lambda也支持三目运算符
lambda x,y : x if x >y else y #这个匿名函数表示输出X 如果x比y大的话,否则输出y
我们来看一些高级一点的用法 ,我们都知道高阶函数
排序(sorted) 可以对一个数组排序.
list2 = [1,3,4,5,8,4,3,9] a = sorted(list2) print(a) #[1, 3, 3, 4, 4, 5, 8, 9]
但是如果有一个这样的列表 ,我们想根据元祖中的数字来对这个列表的值排序
list1 = [ ("a",3), ("c",5), ("ddd",7), ("ea",2), ("bb",9), ("fe",8), ]
我们可以用sorted方法的key关键字,传递一个lambda函数给他
a = sorted(list1,key=lambda x:x[1]) print(a) #[('ea', 2), ('a', 3), ('c', 5), ('ddd', 7), ('fe', 8), ('bb', 9)]
lambda函数更多的是配合高阶函数来使用,比如我们有个列表,我们需要计算列表中每个值的平方
list2 = [1,3,4,5,8,4,3,9] list1 = [] for i in list2: list1.append(i ** 2 ) print(list1) #[1, 9, 16, 25, 64, 16, 9, 81]
比较繁琐,我们用高阶函数加匿名函数 一行代码就可以实现
list2 = [1,3,4,5,8,4,3,9] a = map(lambda x:x**2 ,list2) print(list(a)) #[1, 9, 16, 25, 64, 16, 9, 81]
#这里map函数得到的结果是一个map对象,我们可以通过list转换的方式将他打印出来.map对象不能直接print
映射 (map) 高阶函数还可以对1个以上的对象进行计算,比如
list1 = (1,3,4,5,8,4,3,9) list2 = (1,3,4,5,8,4,3,9) a = map(lambda x,y:x + y ,list1,list2) print(tuple(a)) #这可以让两个元祖的值互相相加,得出结果 (2, 6, 8, 10, 16, 8, 6, 18)
规约(reduce) 要注意的是reduce需要导包才可以使用
from functools import reduce
x = reduce(lambda x,y:x+y,range(1,101)) print(x) #这里会直接得出5050,reduce不需要传递两个参数,x,y的本质是 第一个数和第二个数相加的值,赋值给X,然后第三个数赋值给y,然后x+y 的值继续赋值给x,第四个数赋值给y #这里说明一下 range(1,101), a = range(1,101) print(list(a)) #这个可以直接打印出一个从1到100的列表,reduce允许这样传参 #同时reduce还允许传第三个参数,就是初始值 x = reduce(lambda x,y:x+y,range(1,101),100) print(x) #这里会得出5150,注意这里的100是初始值,也就是先加100,然后再第一个数和第二个数相加赋值给x,第三个数赋值给y
过滤(filter) 用来筛选数据
a = [0,1,2,0,5,8,6,4,2,5,7,8,9,1,10,25]
x = filter(lambda b: b >=4 ,a)
print(list(x))
#其实他的原理就是下面这样
x = filter(lambda b: True if b >=4 else False,a)
#这里会把所有大于等于4的值全部列出,同样我们也需要list才可以将他转成列表打印.
#filter中的lambda主要用来做布尔判断
打包(zip) 可以将多个序列的值依次打包元祖.
list1 = [1,2,3,4,5,6,7,8,9,10] list2 = ['a','b','c','e','f','g','h','i','j','k'] w = zip(list1,list2) for i in w: print(i) ''' (1, 'a') (2, 'b') (3, 'c') (4, 'e') (5, 'f') (6, 'g') (7, 'h') (8, 'i') (9, 'j') (10, 'k') '''
zip可以同时打包多个序列,但是需要注意的是,打包的元祖数以最短的序列为准,比如
list1 = [1,2,3,4,5,6,7,8,9,10] list2 = ['a','b','c','e','f','g','h','i','j','k'] x = zip(range(1,15),list1,list2) for i in x: print(i) #这里有三个序列,最长的有14位,但是实际结果只会到10. ''' (1, 1, 'a') (2, 2, 'b') (3, 3, 'c') (4, 4, 'e') (5, 5, 'f') (6, 6, 'g') (7, 7, 'h') (8, 8, 'i') (9, 9, 'j') (10, 10, 'k') '''
最大和最小(max) (min),这个比较简单就不赘述了.
list1 = [1,24,6,3,2,4,6,7,0] a = max(list1) b = min(list1) print(a,b) # 24 0
回调函数 --将一个函数作为参数
不是每一个函数都可以用匿名函数来实现,如果有一些比较复杂的函数,我们也可以用回调的方式来实现
#假设我们先定义了4个函数,分别是两个数的加减乘除. def add(a,b): print(a+b) def cha(a,b): print(a-b) def chen(a,b): print(a*b) def chu(a,b): print(a/b) #我们再定义一个函数,他有三个参数. def demo(a,b,func): func(a,b) #那么我们只需要调用这个参数,将上面4个函数作为参数传进去,就可以加减乘除一次性搞定了 #这就是回调函数 demo(3,4,add) #输出7