1. 引言

不管大家是Python新手还是老手 ,一定都听说过Lambda 函数。它的语法简单而且用起来相当方便。

本文主要是介绍Python lambda 函数的,为了阅读方便,分为以下 3 个部分来进行讲解——语法、用法和常见错误。

2. 语法

在Python中函数一般分为以下两种类型:

  • 普通函数 – 使用def关键字定义,并且有用户自定义的函数名
  • 匿名函数 – 使用lambda关键字定义,没有函数名

让我们来看个例子,不妨我们来定义一个普通函数来求解圆的周长,代码如下:

import math
def circle_circum(radius):return 2 * math.pi * radius

上述中,circle_circum为函数名,是由用户定义的,radius为输入参数。

接着我们来将上述函数修改成Lambda函数,代码如下:

import math
lambda radius: 2 * math.pi * radius

上述代码中,我们使用lambda关键字来替换def关键字,需要注意的是lambda函数为匿名函数,不需要指定函数名,并且没有显示的return关键字。

接着我们再来看一个含有多个参数的例子,比如计算长方形的面积,普通函数的代码实现如下:

def rect_area(length, width):return length * width

使用lambda函数的实现如下:

lambda length, width: length * width

因此,一般来说,Lambda函数的通用语法如下:

lambda <arguments>: <single expression>
  • 一个lambda函数可以有0个或多个参数,参数间使用逗号隔开
  • 一个lambda函数只能有一个表达式,该表达式根据参数来定义函数相关功能。
  • 表达式和参数之间使用分号隔开
  • 上述所有代码必须在一行的一个语句中完成

3. 用法

一般来说,在以下情形下lambda函数为首选:

  • 当只需要使用某函数一次调用时。
  • 在函数的定义中只有一个简单的表达式的时候。

在以下情形,并不推荐你使用lambda函数:

  • 当你需要重复使用某个函数多次时
  • 在函数实现中有多个复杂的表达式的时候

Lambda函数经常和 filter(),map(),reduce()以及sorted()函数搭配使用,以下举例来进行讲解。

3.1 Lambda with filter()

filter()函数为Python的内置函数,它主要用于从迭代数据类型(list tuple等)中根据条件来挑选元素,语法如下:

filter(function, iterable)

观察上述函数,我们可以把lambda函数作为filter()函数的参数。接下来我们来举个栗子:

iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]
list(filter(lambda x: x % 3 == 0, iterable))

上述代码,实现了从迭代列表中挑选出可以被3整除的元素,输出如下:

[3,6,9,15,21]

3.2 Lambda with map()

map()函数也是Python的内置函数之一,它可以将迭代类型的每一个元素进行相应的转换,语法如下:

map(function, iterable)

同理,我们也可以把lambda函数作为map()函数的参数。接下来我们来举个栗子:

iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]
list(map(lambda x: x ** 2, iterable))

上述代码,实现了对迭代列表中的每个元素执行求平方操作,输出如下:

[1,9,25,36,81,121,225,256,441]

3.3 Lambda with reduce()

reduce()函数不是Python的内置函数,它包含在functools里,需要专门导入。该函数可以对参数序列中的元素进行累计操作。语法如下:

reduce(function, iterable)

我们也可以把reduce()函数作为map()函数的参数。接下来我们来举个栗子:

# First import the reduce function
from functools import reduce
iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]
reduce(lambda x, y: x + y, iterable)

上述代码,实现了对迭代列表中的所有元素执行累加求和操作,输出如下:

87

3.4 Lambda with sorted()

sorted()函数是Python的内置函数之一,它可以用来将迭代类型中的元素进行升序或者降序排列,语法如下:

sorted(iterable, key, reverse)

上述声明中,sorted函数的默认值为reverse=False 即默认为升序排列,如果我们将其设置为True,那么排序将变为降序排列。我们来看个栗子:

iterable = [1, 5, 3, 9, 6, 11, 16, 21, 15]
sorted(iterable) # Ascending order

输出如下:

[1,3,5,6,9,11,15,16,21]

同时,对于参数key我们可以传递lamda函数来实现自定义的排序,样例如下:

iterable = [1, 5, 3, 9, 6, 11, 16, 21, 15]
sorted(iterable, key=lambda x: x % 5)

输出如下:

[5,15,1,6,11,16,21,3,9]

上述代码将列表中的元素按照对5求余后进行排序,排序的标准主要是通过lambda函数传递给参数key。

4. 常见错误

当你没有正常使用lambda函数时,会有错误出现。这里列举常见的几种错误类型。

4.1 语法错误

当我们忘记每个参数之间的逗号,或者忘记分隔表达式和参数名称之间的冒号,或者没有在一行中编写 Lambda 函数时,可能会发生这种情况。

举例如下:

iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]
reduce(lambda x y: x + y, iterable) # 缺失逗号
reduce(lambda x, y x + y, iterable) # 缺失分号
reduce(lambda x y: x +y, iterable)    # 多行

上述代码中,运行的错误提示如下:

4.2 类型错误

当我们在表达式中包含的参数名称多于参数部分中给出的参数名称时,就会发生这种情况。举例如下:

iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]
reduce(lambda x: x + y, iterable)

此时,上述代码运行的错误提示如下:

5. 总结

本文重点介绍了lambda表达式的语法,用法和常见错误,并详细地给出了代码示例和相应的讲解。

您学废了吗?


关注公众号《AI算法之道》,获取更多AI算法资讯。

参考

一文弄懂Python中的Lambda表达式相关推荐

  1. 一文弄懂python中的函数(自定义函数,匿名函数,高阶函数与解析式)

    什么是函数,如何在 Python 程序中定义函数呢? 说白了,函数就是为了实现某一功能的代码段,只要写好以后,就可以重复利用. python中的自定义函数 Python 的函数具有非常灵活多样的参数形 ...

  2. 一文弄懂Python中的*args 和 **kwargs

    1. 引言 在本文中,我们将讨论 Python 中的 *args 和 **kwargs 及其用法和示例. 闲话少说,我们直接开始吧. 2. 问题引入 在Python中写函数的时候,我们经常需要给函数传 ...

  3. 一文弄懂Python中的 if __name__ == __main__

    1. 引言 在Python相关代码中,我们经常会遇到如下代码段: # stuff if __name__ == "__main__":# do stuff 本文将尽可能使用简单的样 ...

  4. 一文弄懂Python中的pprint

    1. 引言 pprint的英文全称Data pretty printer,顾名思义就是让显示结果更加直观漂亮. print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是 ...

  5. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  6. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  7. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  8. 彻底弄懂Python中的GIL锁

    彻底弄懂Python中的GIL锁 转载:https://blog.csdn.net/yushuaigee/article/details/86537474 刚学习python时,我关注了许多介绍pyt ...

  9. Python中的Lambda表达式

    Lambda表达式 (Lambda Expressions) Lambda Expressions are ideally used when we need to do something simp ...

最新文章

  1. 一直在构建工作空间_基于用户场景构建的建筑工程弱电设计工作设想
  2. tomcat多个端口对应多个web应用
  3. Pytorch 加载和保存模型
  4. C#:解决WCF中服务引用 自动生成代码不全的问题。
  5. CUDA + QT Creator + Win7的集成
  6. 简单的Tomcat中配置访问本地资源(含idea配置)
  7. c语言分数乘法,ATmega32中文资料.pdf
  8. oracle12c cdb修改,Oracle 12c 配置和修改 CDB 和 PDB 参数
  9. 路由器与计算机的ip地址,路由器ip地址,教您怎么样查看路由器的IP地址
  10. IDEA突然不能输入中文
  11. arc120C - Swaps 2
  12. word生成目录右对齐
  13. 图解NodeJS【基于事件、回调的单线程高性能服务器】原理
  14. 浅谈搜索引擎排序2020-09-04
  15. 牛逼啊!一顿火锅钱+一台旧手机 = 自主导航机器人?
  16. 完美修复损坏的系统文件
  17. 将军百战声名裂:泣血说李陵
  18. LeetCode算法题-Goat Latin Easy(Java实现)
  19. 面渣逆袭:Spring三十五问,四万字+五十图详解
  20. 生死存亡之数字炸弹(1.0)

热门文章

  1. np.ceil的用法
  2. 遗传算法解整数规划IntCon
  3. 金仓数据库KingbaseES Clusterware配置手册(集群搭建前置操作 )
  4. 【Linux-52】Linux系统目录架构
  5. AI技术再升级:2022年最流行的10大人工智能技术
  6. 金三银四铜五铁六,Offer收到手软!
  7. python周环比增长率怎么算_平均增长速度可以根据各个环比增长速度直接求得。()...
  8. 电工学复习【4】--三相交流电路
  9. 符合FDA标准的邮件安全证书(S/MIME)有哪些?
  10. 最纯洁的科研工作者——狄拉克