• 手机站
  • 收藏
聚培教育网合作机构 > 烟台达内教育
烟台达内教育
400-998-6158
烟台达内教育是一家由留学海归创办的高端职业教育培训机构,是中国人才培养平台、人才输送平台。
烟台达内教育

Python函数式编程之匿名函数

python学习网

更新时间:2021-11-01 浏览:102
核心提示:定义 在界定涵数的情况下,不愿给涵数起一个名称。这个时候就可以用lambda来界定一个匿名函数;匿名函数又称作高效率涵数;由于在

ython函数式编程之匿名函数

定义

在界定涵数的情况下,不愿给涵数起一个名称。这个时候就可以用lambda来界定一个匿名函数;匿名函数又称作高效率涵数;由于在申明的过程中能够随时启用(不用先申明界定随后再启用)。

英语的语法

lambda 用户标识符....:句子关系式

特性

a.申明时沒有涵数名(降低程序猿对涵数名的界定)

b.应用lambda关键词

举例说明

*建立一个没有参匿名函数

func1 = lambda: 1 == 2

  res = func1()

  print(res)

  #輸出結果为False

*建立一个传送好几个主要参数匿名函数


func2 = lambda x, y, z: x   y   z

res = func2(1, 2, 3)

print(res)

#輸出結果为6

*建立一个带if分辨的匿名函数


func3 = lambda x, y: x if x >; y else y

res = func3(2, 6)

print(res)

#輸出結果为6

之上界定不标准,为了更好地更好的了解,因此逐层界定;详尽可以看下面的错误观念表明;

留意

1.用户标识符中间应用分号分隔;

2.启用时能够同时将lambda总体括起來,随后后边加上括弧传到相匹配的实参(沒有实参则要携带括弧表明实行该匿名函数,不然回到的是该匿名函数的目标)

3.匿名函数中间是可以互相启用和嵌入的

功效

1. 程序流程一次行应用,因此不用界定涵数名,节约运行内存中变量定义室内空间

2. 假如想让程序流程更为简约时

匿名函数好多个标准

1. 一般也就一行关系式,务必有传参

2. 不可以有return

3. 能够沒有主要参数,能够有一个或好几个主要参数

匿名函数很多案例

A.应用 max函数求词典的*值


dict1 = {'age1': 12, 'age2': 13, 'age3': 14}

res = max(dict1, key=lambda x: dict1[x])

print(res)

B.应用filter过虑字符串数组是不是以某一英文字母开始


Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']

B_Name= filter(lambda x: x.startswith('B'),Names)

B_Name

#輸出結果为:['Bob', 'Barbara']

C.lambda和map,filter协同应用


squares = map(lambda x:x**2,range(10))

filters = filter(lambda x:x>;5 and x<;50,squares) print(filters) #輸出結果为:[9, 16, 25, 36, 49]

D.lambda和sorted协同应用


death = [ ('James',32),('Alies',20),('Wendy',25)]

sorted(death,key=lambda age:age[1])

#依照第二个原素,数据库索引为1排列

#輸出結果为:[('Alies', 20), ('Wendy', 25), ('James', 32)]

E.lambda和reduce协同应用


list1 = [1,2,3,4]

sum = reduce(lambda x,y:x y,list1)

print(sum)

#輸出結果为:10

F.求2个目录原素的和


a = [1,2,3,4]

b = [5,6,7,8]

map(lambda x,y:x y, a,b)

#輸出結果为:[6, 8, 10, 12]

应用错误观念

1 .给匿名函数取名

PEP 8 中提议公司不必写相近我们的编码

func1 = lambda: 1 == 2

匿名函数能够可以作为自变量一样传送,例如发送给涵数做为主要参数,并不需要它一定有一个名称。*须 特别注意的是,实际上里面的使用并沒有真正的具有给涵数取名的功效。

2. 沒有需要的匿名函数

一些情况下,大家并没有应用匿名函数的必需,但却不经意中采用了。一般有这两种状况。一是应用无意义的启用,例如现在的编码


res=sorted(list1,key=lambda x:len(x))

将目录按原素的长短开展排列

实际上,我们可以同时应用


res=sorted(list1,key=len)

上边的一明确提出来大伙儿立刻就了解了,可是平常大家却多多少少的犯了差不多的问题。另一方面,有很多涵数,标准库上都早已建立了,大家不清楚,因此干了不必要的事儿。

3. 减少易读性的匿名函数

按原素的尺寸和字典序对目录开展排列


list1=["abc","bcde","mhjk"]

res=sorted(list1,key=lambda x:(len(x),x.upper()))

上边的编码可以完成作用,可是我认为下边的逻辑性更强一些


def get_len_upper(x):

return len(x),x.upper()

list1=["abc","bcde","mhjk"]

res=sorted(list1,key=get_len_upper)

大家根据涵数涵数名就大约知道涵数的功效,如果是匿名函数得话,大家还得去看看相对应的逻辑性。

4. 很有可能压根不用开环传递函数

对一个目录开展求饶,大家也许会看见这种的编码


from functools import reducedata=[1,2,3,4,5]

res=reduce(lambda x,y:x y,data)

print(res)

实际上,立即应用sum函数就可以了


data=[1,2,3,4,5]

print(sum(data))

针对一些特殊的要求,许多 情况下 Python 很有可能己经拥有制好的计划方案。我们要有这些方面的观念,尽量简洁的去解决困难。

5. 可以不应用 map/filter

Python 中的 map 和 filter 一般都融合匿名函数在应用,前面一种是在迭代更新的过程中对原素做一些解决,后面一种是过虑掉一些原素。许多 状况下,我们可以应用列表推导式或是制作器关系式替代他们。

用制作器关系式替代 map


data=[1,2,3,4,5]

res=map(lambda x:x**2,data)

#等额的于

res2=(x**2 for x in data)

用制作器关系式替代 filter

data=[1,2,3,4,5]

res=filter(lambda x:x>;3,data)

#等额的于

res2=(x for x in data if x>;3)

显著的还可以看得出,应用制作器关系式的编码易读性更强一些。

更多>同类资讯
更多>相关课程
顶部