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

  

 

 

 

 

posted @ 2025-03-09 12:23  叶无齐  阅读(15)  评论(0)    收藏  举报

python学习之路

[python随笔]