一文弄懂Python中的Lambda表达式

本文深入浅出地介绍了Python中的Lambda函数,包括其语法特点、典型应用场景及常见错误示例。并通过filter()、map()、reduce()和sorted()等内置函数结合Lambda函数的具体实例,帮助读者更好地理解和掌握Lambda函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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算法资讯。

参考

### YOLOv1 原理与实现 #### 2.1 YOLOv1 简介 YOLO (You Only Look Once) v1 是一种用于实时对象检测的单阶段神经网络框架。该方法通过将输入图像划分为多个网格单元,并让每个网格负责预测固定数量的边界框及其对应的类别概率来完成物体检测任务[^3]。 #### 2.2 核心算法原理与具体操作步骤 YOLOv1 将整个图片分成 S×S 的网格结构,如果某个物体中心落在这个格子内部,则此格子就负责预测该物体的位置以及其属于各个类别的条件概率 P(C_i|Object)。对于每一个网格,模型会输出 B 个边框坐标(x, y, w, h),其中 x 和 y 表示相对于网格左上角位置的比例偏移量;w 和 h 则表示宽度和高度相对于整张图的比例尺寸。此外还会给出这些候选区域存在目标的概率 C。 为了提高定位准确性并减少冗余预测,在训练过程中引入了 IOU(Intersection Over Union)作为评价标准之一,即真实标签包围盒与预测结果之间的重叠程度比率。当两个矩形框完全吻合时IOU=1,而没有任何交集则为0。因此优化过程旨在最大化正样本间的平均IOU值的同时最小化负样本得分。 #### 数学模型和公式 在数学建模方面,YOLOv1 设计了一种特殊的损失函数用来衡量预测值同标注数据间差异: \[ L_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B}(1^{obj}_{ij})[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]\] 这里 \(L_{coord}\) 控制着坐标的权重系数;\(1^{obj}_{ij}\) 是指示变量,只有当第 i 个 grid cell 中确实含有 object 并且 jth 边界框负责预测它的时候才取 1 。上述表达式计算的是所有含object 的grid cells里所对应的最佳box 对应的真实center point 同预测值之间差距平方之和。 另外还有关于宽高误差项、置信度误差项及分类误差项等部分共同构成了最终的整体loss function 形式。 ```python def compute_loss(predictions, targets): """ 计算YOLOv1损失函数 参数: predictions -- 模型预测的结果向量 targets -- 数据集中给定的目标真值 返回: total_loss -- 总体损失数值 """ # 初始化各项损失分量 coord_mask = ... conf_pos_mask = ... conf_neg_mask = ... class_mask = ... # ... (省略中间具体的mask构建逻辑) # 计算各部分损失 loss_coord = torch.sum(coord_mask * (pred_box_xy - true_box_xy)**2) loss_conf_pos = torch.sum(conf_pos_mask * (pred_box_confidence - true_box_confidence)**2) loss_conf_neg = torch.sum(conf_neg_mask * pred_noobj_confidence**2) loss_class = torch.sum(class_mask * F.cross_entropy(pred_class_probabilities, target_classes)) # 加权求和得到总损失 total_loss = lambda_coord*loss_coord + loss_conf_pos + loss_conf_neg + loss_class return total_loss ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值