python lambda 表达式形式分析

作者:yerikyu 时间:2021-05-06 06:05:58 

前言:

在日常开发的过程中,有时候会临时用到一些简单的函数,她们的业务逻辑会相对简单,简单到并不值得让他们留下名字,这个时候,就很值得使用匿名函数 lambda函数来完成这个需求。

lambda表达式格式

lambda arguments : statement

表达式以 lambda关键字开头,冒号 ":" 左侧是函数的传入参数,当有多个入参时使用逗号划分开,冒号右侧是返回值的表达式语句,函数会根据表达式计算结果并将其返回。lambda表达式会创建一个函数对象,可以对其赋值并如同普通函数一样使用。下面定义了一个求平方的 lambda 表达式:

>>> lambda x : x * x
<function <lambda> at 0x000001C98ED8E040>

其中x是该函数的参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求该变量的平方,但作为一个函数,没有名字如何使用呢?
这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能。

>>> square = lambda x : x * x
>>> square
<function <lambda> at 0x000001C98F24B040>
>>> square(8)
64

它等同于常规函数

>>> def square(x: int) -> int:
... return x * x
...
>>> square
<function square at 0x000001C98ED8E040>
>>> square(8)
64

通过这个例子可以很明显观察到,lambda表达式和普通函数表达式在表现上的区别,lambda声明之后在python虚拟机中是记录为lambda,而普通函数会吧函数名直接体现出来,试想当发生异常的时候,Traceback打印了异常信息,但是不标记准确位置,也不跟你说哪个函数出问题,这样排错效率将极大的降低。

>>> div1 = lambda x : 1 / x
>>> div1(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
ZeroDivisionError: division by zero
>>> def div2(x: int) ->int:
... return 1 / 0
...
>>> div2(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in div2
ZeroDivisionError: division by zero

如代码所示,对于div1来说,发生异常了,之跟你说你写的某个lambda函数有异常,而且是在它的第一行,但就不跟你说是哪个函数:),但对于div2来说,就会很直接的说明,div2的第二行出问题了,这很容易定位啊,喏,这也很直观的暗示我们,写lambda不能太复杂,要尽最大努力的令其简洁,永不出错,如果有可能会有异常发生,倒还不如写成普通函数来的痛快。这个以上《Effective Python》所提倡的:使用辅助函数来取代复杂的表达式,并赋予函数清晰的名称以提高代码可读性。

匿名的用法

对于lambda来说,更多时候是用在高阶函数中,将其自己作为参数传入高阶函数中,比如在mapfilterreduce 函数,这些函数接收一个函数作为参数,如果不想额外定义函数,那么使用 lambda 表达式创建匿名函数就是最佳的应用场景。

>>> list(map(lambda x : x * x, [1, 2, 3, 4, 5, 6, 7, 8]))
[1, 4, 9, 16, 25, 36, 49, 64]
>>> list(filter(lambda x : x < 2, [1, 2, 3, 4, 5, 6, 7, 8]))
[1]
>>> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6, 7, 8])
36

python lambda 表达式形式分析

来源:https://blog.51cto.com/nu1l/5169490

标签:python,lmabda,表达式
0
投稿

猜你喜欢

  • python numpy元素的区间查找方法

    2021-12-22 17:10:31
  • Python对切片命名的实现方法

    2023-09-30 09:43:15
  • Python+Pygame实现代码雨动画效果

    2023-12-03 18:43:57
  • SQL server高级应用 收藏版

    2012-10-07 11:04:06
  • 浅谈python新式类和旧式类区别

    2023-03-16 16:47:37
  • asp删除mssql数据库中没有记录的图片代码

    2011-03-11 11:22:00
  • Kears+Opencv实现简单人脸识别

    2022-06-22 05:42:06
  • Python进阶篇之多线程爬取网页

    2023-01-15 13:22:39
  • Vue系列之Element UI表单自定义校验规则

    2024-04-30 08:41:17
  • 详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法

    2021-04-13 08:17:01
  • Python聚类算法之基本K均值实例详解

    2023-07-14 12:49:08
  • python中关于日期时间处理的问答集锦

    2023-08-16 08:18:48
  • Python数据分析之缺失值检测与处理详解

    2021-10-04 01:09:08
  • Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例

    2024-05-13 09:29:17
  • Python实现朴素贝叶斯的学习与分类过程解析

    2023-08-17 15:15:23
  • 用python下载百度文库的代码

    2023-07-31 00:40:44
  • 浅析mysql 定时备份任务

    2024-01-17 07:21:01
  • access改mdb为asp所带来的灾难 附mdb防下载方法

    2011-03-03 11:07:00
  • oracle数据库下统计专营店的男女数量的语句

    2024-01-17 04:18:17
  • Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式

    2021-01-07 20:38:33
  • asp之家 网络编程 m.aspxhome.com