Lambda 函数是 Python 中的匿名函数。当你需要完成一件小工作时,在本地环境中使用它们可以让工作得心应手。有些人将它们简称为 lambdas,它们的语法如下:lambdaarguments:expression

lambda关键字可以用来创建一个 lambda 函数,紧跟其后的是参数列表和用冒号分割开的单个表达式。例如,lambda x: 2 * x是将任何输入的数乘2,而lambda x, y: x+y是计算两个数字的和。语法十分直截了当,对吧?

假设您知道什么是 lambda 函数,本文旨在提供有关如何正确使用 lambda 函数的一些常规准则。

#1. 不要返回任何值

看看语法,您可能会注意到我们在 lambda 函数中并没有返回任何内容。这都是因为 lambda 函数只能包含一个表达式。然而,使用return关键字会构成不符合规定语法的语句,如下所示:

>>>integers=[(3,-3),(2,3),(5,1),(-4,4)]
>>>sorted(integers,key=lambdax:x[-1])
[(3,-3),(5,1),(2,3),(-4,4)]
>>>sorted(integers,key=lambdax:returnx[-1])
...
File"<input>",line1
sorted(integers,key=lambdax:returnx[-1])
^
SyntaxError:invalidsyntax

该错误可能是由于无法区分表达式和语句而引起的。像是包含return、try、with以及if的语句会执行特殊动作。然而,表达式指的是那些可以被计算出一个值的表达,例如数值或其他 Python 对象。

通过使用 lambda 函数,单个表达式会被计算为一个值并且参与后续的计算,例如由sorted函数排序。

#2. 不要忘记更好的选择

lambda 函数最常见的使用场景是将它作为一些内置工具函数中key的实参,比如上面展示的sorted()和max()。根据情况,我们可以使用其他替代方法。思考下面的例子:

>>>integers=[-4,3,7,-5,-2,6]
>>>sorted(integers,key=lambdax:abs(x))
[-2,3,-4,-5,6,7]
>>>sorted(integers,key=abs)
[-2,3,-4,-5,6,7]
>>>scores=[(93,100),(92,99),(95,94)]
>>>max(scores,key=lambdax:x[]+x[1])
(93,100)
>>>max(scores,key=sum)
(93,100)

在数据科学领域,很多人使用 pandas 库来处理数据。如下所示,我们可以使用 lambda 函数通过map()函数从现有数据中创建新数据。除了使用 lambda 函数外,我们还可以直接使用算术函数,因为 pandas 是支持的:

>>>importpandasaspd
>>>data=pd.Series([1,2,3,4])
>>>data.map(lambdax:x+5)
6
17
28
39
dtype:int64
>>>data+5
6
17
28
39
dtype:int64

#3. 不要将它赋值给买手机游戏账号变量

我曾见过一些人将 lambda 函数误认为是简单函数的另一种声明方式,您可能也见过有人像下面这么做:

>>>doubler=lambdax:2*x
>>>doubler(5)
10
>>>doubler(7)
14
>>>type(doubler)
<class'function'>

对 lambda 函数命名的唯一作用可能是出于教学目的,以表明 lambda 函数的确是和其他函数一样的函数——可以被调用并且具有某种功能。除此之外,我们不应该将 lambda 函数赋值给变量。

为 lambda 函数命名的问题在于这使得调试不那么直观。与其他的使用常规def关键字创建的函数不同,lambda 函数没有名字,这也是为什么有时它们被称为匿名函数的原因。思考下面简单的例子,找出细微的区别:

>>>inversive=lambdax:1/x
>>>inversive(2)
.5
>>>inversive()
Traceback(mostrecentcalllast):
File"<input>",line1,in<module>
File"<input>",line1,in<lambda>
ZeroDivisionError:divisionbyzero
>>>definversive1(x):
...return1/x
...
>>>inversive1(2)
.5
>>>inversive1()
Traceback(mostrecentcalllast):
File"<input>",line1,in<module>
File"<input>",line2,ininversive1
ZeroDivisionError:divisionbyzero

当您的代码存在关于 lambda 函数的问题(即 inversive0),Traceback 错误信息只会提示您 lambda 函数存在问题。

相比之下,使用正常定义的函数,Traceback会清晰地提示您有问题的函数(即 inversive1)。

与此相关,如果您想多次使用 lambda 函数,最佳实践是使用通过def定义的允许使用文档字符串的常规函数。

#4. 不要忘记列表推导式

有些人喜欢将 lambda 函数和高阶函数一起使用,比如map或filter。思考下面用法示例:

>>>#创建一个数字列表
>>>numbers=[2,1,3,-3]
>>>#使用带有lambda函数的map函数
>>>list(map(lambdax:x*x,numbers))
[4,1,9,9]
>>>#使用带有lambda函数的filter函数
>>>list(filter(lambdax:x%2,numbers))
[1,3,-3]

我们可以使用可读性更强的列表推导式代替 lambda 函数。如下所示,我们使用列表推导式来创建相同的列表对象。如您所见,与列表推导式相比,之前将map或filter函数与 lambda 函数一起使用更麻烦。因此,在创建涉及高阶函数的列表时,应考虑使用列表推导式。

>>>#Uselistcomprehensions
>>>[x*xforxinnumbers]
[4,1,9,9]
>>>[xforxinnumbersifx%2]
[1,3,-3]

#结论

在本文中,我们回顾了使用 lambda 函数可能会犯的四个常见错误。通过避免这些错误,您应该能在代码中正确使用 lambda 函数。

使用 lambda 函数的经验准则是保持简单以及只在本地使用一次。



更多相关文章

  1. oracle学习笔记
  2. 作用域 常用函数 三元运算符及if条件
  3. isset()与empty()函数 switch语句改写简易计算器
  4. 必须掌握的30种SQL语句优化
  5. PHP基础:COOKIE/SESSION和命名空间
  6. 数据库mysql——MySQL 性能优化的最佳20多条经验分享
  7. 看看函数库
  8. Python 炫技操作:连接列表的八种方法
  9. 为什么使用PreparedStatement?

随机推荐

  1. Android深度定制化TabLayout:圆角,渐变色,背
  2. Android: Android学习的几点建议
  3. Android的数据处理:使用annotation实现JSO
  4. Android Retrofit与Spring后台配合,实现单
  5. Android如何获取APP启动时间
  6. [置顶] Android防止内存溢出浅析
  7. Java OR Android
  8. Android(安卓)读取MCC, MNC
  9. Android 内存管理 &Memory Leak & OOM 分
  10. android sqlite数据库 删除数据 where多