匿名函数lambdapython
除了def语句,python还提供了一种生成函数对象的表达式形式。因为它与LISP语言中的一个工具相似,因此称为lambda。express
就像def同样,这个表达式建立了一个以后可以调用的函数,可是它返回一个函数而不是将这个函数赋值给一个变量。这些就是lambda叫作匿名函数的缘由。实际上,他经常以一种行内进行函数定义的方式使用,或者用做推迟执行一些代码。数据结构
lambda的通常形式是关键字lambda以后跟着一个或多个参数(与一个def头部内用括号括起来的参数列表相似),紧跟着是一个冒号,以后是表达式app
lambda arg1,arg2,argn:expression using arguments
由lambda表达式所返回的函数对象与由def建立并复制后的函数对象工做起来是彻底一致的,但lambda有一些不一样之处,让其扮演特定的角色时更有用:ide
lambda是一个表达式,而不是一个语句函数
由于这一点,lambda能够出如今python语法不容许def出现的地方。
此外,做为一个表达式,lambda返回一个值(一个新的函数),能够选择性的赋值给一个变量
相反,def语句老是得在头部将一个新的函数赋值给一个变量,而不是将这个函数做为结果返回。工具
lambda的主题是单个表达式,而不是一个代码块学习
这个lambda的主题简单的就好像放在def主体return语句中的代码同样。
简单的将结果写成一个顺畅的表达式,而不是明确的返回。
但因为它仅限于表达式,故lambda一般要比def功能少…你仅可以在lambda主体中封装有限的逻辑进去,由于他是一个为编写简单函数而设计的。
除了上述这些差异,def和lambda都能过作一样种类的工做设计
def与lambda的相同用法code
x = lambda x, y, z: x + y + z x(2, 3, 4) >>> 9 y = (lambda a='hello', b='world': a + b) y(b='Python') >>> 'hellopython'
为何使用lambda
看过上面的两个小例子,不少人会说这个和def没什么差异,咱们又为何要使用lambda呢?
一般来讲,lambda起到一种函数的速写做用,容许在使用的代码内嵌一个函数的定义,他彻底是可选的(是可使用def代替他们),可是在你仅须要切入一段可执行代码的状况下,它会带来一个更简洁的书写效果。
lambda一般用来编写跳转表,也就是行为的列表或者字典,可以按照需求执行操做,好比:
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4] for f in l: print(f(2)) >>> 4 >>> 8 >>> 16 print(l[0](3)) >>> 9
当须要把小段的可执行代码编写进def语句从语法上不能实现的地方是,lambda表达式做为def的一种速写来讲,是最为有用的,若是上面的代码用def编写,则变为:
def f1(x): return x ** 2 def f2(x): return x ** 3 def f3(x): return x ** 4 l = [f1, f2, f3] for f in l: print(f(2)) print(l[0](3))
实际上,咱们能够用python中的字典或者其余的数据结构来构建更多种类的行为表,从而作一样的事情。
lambda中实现if-else
Python中具有的单行表达式:if a:b else c语法在lambda中一样适用:
lower = lambda x,y:x if x<y else y lower(4,5) >>> 4
看了半天,你们可能也并未以为lambda在python中到底比def优越与便利在哪里,那么说到lambda,就必需要说起三个函数map、filter、reduce,当你接触了这三个函数,那么你才能感觉到lambda真实的方便之处
map 函数
程序对列表或者其余序列经常要作的一件事就是对每一个元素进行一个操做,并把其结果集合起来。
python提供了一个工具map,它会对一个序列对象中的每个元素应用该的函数,并返回一个包含了全部函数调用结果的列表。
举个栗子,咱们有一个列表,须要将列表的每个字段+10,咱们该如何操做?
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' list_show = [1, 2, 3, 4] # 方式1 new_list_show = [] for i in list_show: new_list_show.append(i + 10) print(new_list_show) # 方式2 def adds(x): return x + 10 print(list(map(adds, list_show))) # 更优雅的方式3: print(list(map(lambda x: x + 10, list_show)))
看看上面三个实现方式,你以为那种更加Pythonic?
eg:须要注意一点,map在python3中是一个可迭代对象,引入须要使用列表调用来使它生成全部的结果用于显示,python2没必要如此。
固然map的阐述函数,不只仅支持本身编写的,一样也支持python自带的多种函数,好比:
list_show = [1, -2, 3, -4, 5, -6] print(list(map(abs, list_show))) >>> [1, 2, 3, 4, 5, 6]
filter函数
filter经过字面意思,你们就知道它的用处了,用于数据的过滤操做,它也是lambda的一个好基友,举个栗子。
咱们须要过滤0-9中,能被2整除的数字组成一个列表,咱们该如何操做?只须要一行代码:
print(list(filter(lambda x: x % 2 == 0, range(10)))) >>> [0, 2, 4, 6, 8]
没错,filter就是这么的简单实用….
reduce的妙用
reduce在python2中是一个简单的函数,但在python3中它责备收录与functools中。
它接收一个迭代器来处理并返回一个单个的结果。
list_show = [1, 2, 3, 4] print(reduce(lambda x, y: x + y, list_show)) >>> 10 print(reduce(lambda x, y: x * y, list_show)) >>> 24
lambda的实用与它的好基友就介绍到这里,但愿对你们有所帮助。