python3的匿名函数

avatar 2020年4月26日23:41:01 评论 1,158 次浏览

匿名函数也是函数的一种,不过匿名函数和其他函数不一样,匿名函数只能是一种表达式,不能有return,返回值就是表达式的结果。匿名函数的关键词就是lambda,可以结合其他的函数一起使用,匿名函数的好处就是简单,不需要对函数进行定义,在调用时,只能先赋值给变量后才可以调用匿名函数返回结果。看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~

def wulaoer(a,b):
    return a * b
wolf = lambda a,b: a * b
print("普通函数直接调用,返回结果:",wulaoer(2,7))
print("匿名函数赋值给变量,返回结果:",wolf(2,5))

打印结果:

普通函数直接调用,返回结果: 14
匿名函数赋值给变量,返回结果: 10

这个是普通的匿名函数直接转换,匿名函数只能赋值给变量后才可以调用,不能直接调用,匿名函数只能使用简单的表达式,下面看稍微比较复杂一点的匿名函数表达式的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~

def devops(x,y):
    if x > y:
        return x ** y
    else:
        return x / y

golong=lambda x,y:x ** y if x > y else x / y

print("三元运算函数,,返回结果:",devops(2,7))
print("三元运算函数转成匿名函数,返回结果:",golong(2,7))

打印结果:

三元运算函数,,返回结果: 0.2857142857142857
三元运算函数转成匿名函数,返回结果: 0.2857142857142857

匿名函数在调用的时候判断前面式True,后面是False,所以这个顺序需要表达清楚,lambda相当于函数中的def,x,y相当于函数的参数,后面是函数的表达式,参数和表达式之间使用了":"进行分割,后面就是匿名函数的表达式,匿名函数比较常用,下面看一下匿名函数的使用场景。

匿名函数使用的场景

匿名函数可以接受多个参数,也可以接受其他的函数,这里说的是lambda结合map函数,先看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
python3=[1,2,3,4,5,6]
for t,i in enumerate(python3):
    python3[t]=i*i
print("for循环遍历列表元素平方:",python3)
python3=[1,2,3,4,5,6]
DevOps=list(map(lambda x:x*x,python3))
print("匿名函数结合map函数:",DevOps)

打印结果:

for循环遍历列表元素平方: [1, 4, 9, 16, 25, 36]
匿名函数结合map函数: [1, 4, 9, 16, 25, 36]

匿名函数作为一个参数,传到map函数中,直接返回结果,上面赋值给一个变量,不过也不是函数,只是一个变量值。可以直接打印不需要调用。

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~

python3=[1,2,3,4,5]
nginx= 1
for i in python3:
    nginx*=i
print("序列累计结果:",nginx)
from functools import reduce
DevOps = reduce(lambda x,y: x * y ,python3)
print("匿名函数结合reduce函数:",DevOps)

打印结果:

序列累计结果: 120
匿名函数结合reduce函数: 120

匿名函数作为一个参数,传入到reduce函数中,对匿名函数返回的结果进行求积。所以,最终reduce的函数会对匿名函数返回的所有序列进行累积计算操作。下面看一下filter函数:

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~
python3=[1,2,3,4,5]
DevOps=list(filter(lambda x:x % 2 == 1,python3))
print("只保留奇数:",DevOps)
DevOps=list(filter(lambda x:x % 2 == 0,python3))
print("只保留偶数:",DevOps)
linux=list(range(100,200))
DevOps=list(filter(lambda x:int(str(x))==int(str(x)[::-1]),linux))
print("匿名函数结合filter函数,找出回力数:",DevOps)

打印结果:

只保留奇数: [1, 3, 5]
只保留偶数: [2, 4]
匿名函数结合filter函数,找出回力数: [101, 111, 121, 131, 141, 151, 161, 171, 181, 191]

filter函数会对传入的参数进行筛选,这里使用的偶数和奇数都是针对filter函数中作为参数的匿名函数的所有元素进行了一个判断,然后筛选。最后一个是对所有元素进行一个去掉筛选。

#!/usr/bin/python3
#coding:utf-8
#~~~~~~~~~~~~www.wulaoer.org 吴老二个人博客~~~~~~~

python3=[-2,5,9,-10,6]
DevOps=sorted(python3,key=lambda x:abs(x))
print("根据据绝对值进行排序",DevOps)

python3=["golong","nginx","jenkins","mysql","tomcat"]
DevOps=sorted(python3,key=lambda x:x[0])
print("根据首字母进行排序",DevOps)

python3= [('golong', 75), ('nginx', 92), ('mysql', 66), ('jenkins', 88)]
DevOps=sorted(python3, key = lambda x : x[0])
print("根据名字进行排序",DevOps)
DevOps=sorted(python3, key = lambda x : x[1], reverse=True)
print("根据成绩进行排序:",DevOps)

输出结果:

根据据绝对值进行排序 [-2, 5, 6, 9, -10]
根据首字母进行排序 ['golong', 'jenkins', 'mysql', 'nginx', 'tomcat']
根据名字进行排序 [('golong', 75), ('jenkins', 88), ('mysql', 66), ('nginx', 92)]
根据成绩进行排序: [('nginx', 92), ('jenkins', 88), ('golong', 75), ('mysql', 66)]

这个是针对sorted函数进行一个排序,作为匿名函数的参数,出入的是一个列表或者远足,真对排序时使用了排序方式,reverse,排序方向默认时从小到大,reverse=True是从大到小的排序,这就是匿名函数的用法,和相关场景涉及到的使用方法。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: