匿名函数lambda

除了def语句,python还提供了一种生成函数对象的表达式形式。由于它与LISP语言中的一个工具类似,所以称为lambda。

就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回一个函数而不是将这个函数赋值给一个变量。这些就是lambda叫做匿名函数的原因。实际上,他常常以一种行内进行函数定义的方式使用,或者用作推迟执行一些代码。

lambda的一般形式是关键字lambda之后跟着一个或多个参数(与一个def头部内用括号括起来的参数列表类似),紧跟着是一个冒号,之后是表达式

lambda arg1,arg2,argn:expression using arguments

由lambda表达式所返回的函数对象与由def创建并复制后的函数对象工作起来是完全一致的,但lambda有一些不同之处,让其扮演特定的角色时更有用:

lambda是一个表达式,而不是一个语句

因为这一点,lambda可以出现在python语法不允许def出现的地方。

此外,作为一个表达式,lambda返回一个值(一个新的函数),可以选择性的赋值给一个变量

相反,def语句总是得在头部将一个新的函数赋值给一个变量,而不是将这个函数作为结果返回。

lambda的主题是单个表达式,而不是一个代码块

这个lambda的主题简单的就好像放在def主体return语句中的代码一样。

简单的将结果写成一个顺畅的表达式,而不是明确的返回。

但由于它仅限于表达式,故lambda通常要比def功能少…你仅能够在lambda主体中封装有限的逻辑进去,因为他是一个为编写简单函数而设计的。

除了上述这些差别,def和lambda都能过做同样种类的工作

def与lambda的相同用法

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通常用来编写跳转表,也就是行为的列表或者字典,能够按照需求执行操作,比如:

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,我们该如何操作?

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的实用与它的好基友就介绍到这里,希望对大家有所帮助。

Python中lambda的使用,与它的三个好基友介绍!的更多相关文章

  1. python中lambda

    lambda_expr ::= "lambda" [parameter_list]: expression python中lambda可以理解为一个匿名函数,它的要求是函数的运算部 ...

  2. 14.在Python中lambda函数是什么

    在Python中lambda函数是什么? It is a single expression anoymous function often used as inline function. lamb ...

  3. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  4. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  5. Python中Lambda表达式使用

    软件环境 Python: 2.7.13; win10 Lambda描述 python 使用 lambda 表达式来创建匿名函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是 ...

  6. python中 Lambda,Map,Filter,Itertools,Generator高级函数的用法

    Lambda 函数 Lambda 函数是一种比较小的匿名函数--匿名是指它实际上没有函数名. Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda ...

  7. python中lambda的用法

    一.lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 g = l ...

  8. python中lambda使用

    一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...

  9. python中lambda,map,reduce,filter,zip函数

    函数式编程 函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.简单来讲,函 ...

  10. Python 中lambda 简单介绍

    转自:https://www.cnblogs.com/AlwaysWIN/p/6202320.html 在学习python的过程中,lambda的语法经常出现,现在将它整理一下,以备日后查看. 1.l ...

随机推荐

  1. 百万年薪python之路 -- 装饰器

    装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  2. 百万年薪python之路 -- 并发编程之 多进程 一

    并发编程之 多进程 一. multiprocessing模块介绍 ​ python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  3. NetworkManager网络通讯_networkReader/Writer(六)

    unet客户端和服务端进行消息发送时可以采用上一节中方法,也可以直接用networkReader/Writer类进行发送 (一)服务端/客户端注册消息 ; m_Server.RegisterHandl ...

  4. unity 截屏总结

    转载与https://www.cnblogs.com/MissLi/p/8005342.html 1.针对指定的相机进行截屏 此中方式要添加yield return waitfortheEndofFr ...

  5. 条件渲染vue

    v-if:只渲染一次的情况下,性能更好v-show:频繁切换性能更好 vue虚拟DOM技术 浏览器:渲染引擎(慢)+JS引擎(快) 用1个JS对象来充当DOM对象,因为JS对象性能比较快,所以用虚拟D ...

  6. Spring AOP 知识整理

    通过一个多月的 Spring AOP 的学习,掌握了 Spring AOP 的基本概念.AOP 是面向切面的编程(Aspect-Oriented Programming),是基于 OOP(面向对象的编 ...

  7. [Luogu5384][Cnoi2019] 雪松果树

    传送门 虽然这题是一道二合一,也不算难,但还是学到了很多东西啊,\(k\) 级儿子个数的五种求法!!我还是觉得四种比较好( \(k\) 级儿子个数有五种求法,你知道么? --鲁迅 首先 \(k\) 级 ...

  8. 区块链之Hyperledger(超级账本)Fabric v1.0 的环境搭建(超详细教程)

    https://blog.csdn.net/so5418418/article/details/78355868

  9. JS中获取元素属性的逆天大法

    给大家聊下js中获取元素属性的逆天大法,胆小慎入,切记切记!!! innerHTML.outerHTML.innerText .outerText.value.text().html(),val() ...

  10. STL.h

    最近老是被系统的一些STL卡到飞起,然后就手打了一个STL.h 库函数还没有打完,以后打新的还会再更,大家也可以使用,顺便帮我找一下bug,然后我再改进! template< typename ...