”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Python 中使用 Lambda 函数

如何在 Python 中使用 Lambda 函数

发布于2024-11-15
浏览:581

How to Use Lambda Functions in Python

Python 中的 Lambda 函数是动态创建小型匿名函数的强大方法。这些函数通常用于简短的操作,其中不需要完整函数定义的开销。

传统函数是使用 def 关键字定义的,而 Lambda 函数是使用 lambda 关键字定义的,并且直接集成到代码行中。特别是,它们经常用作内置函数的参数。它们使开发人员无需临时函数定义即可编写干净且可读的代码。

在本文中,我们将介绍 Lambda 函数的用途及其语法。我们还将提供一些使用它们的示例和最佳实践,并讨论它们的优点和缺点。

先决条件

Lambda 函数自版本 2.0 起就成为 Python 的一部分,因此您需要:

  • 最低Python版本:2.0.
  • 推荐Python版本:3.10或更高版本。

在本教程中,我们将了解如何将 Lambda 函数与 Pandas 库结合使用:一个快速、强大、灵活且易于使用的开源数据分析和操作库。如果您尚未安装,请运行以下命令:

pip install pandas

Python Lambda 函数的语法和基础知识

首先,让我们定义开发人员创建 Lambda 函数必须使用的语法。

Lambda 函数是使用 lambda 关键字定义的,后跟一个或多个参数和一个表达式:

lambda arguments: expression

假设我们要创建一个将两个数字相加的 Lambda 函数:

add = lambda x, y: x   y

运行以下命令:

result = add(3, 5)
print(result)

这导致:

8

我们创建了一个带有两个参数 x 和 y 的匿名函数。与传统函数不同,Lambda 函数没有名称:这就是我们说它们是“匿名”的原因。

此外,我们不使用 return 语句,就像在常规 Python 函数中那样。所以我们可以随意使用 Lambda 函数:它可以被打印(就像我们在本例中所做的那样)、存储在变量中等等。

现在让我们看看 Lambda 函数的一些常见用例。

Lambda 函数的常见用例

Lambda 函数特别适用于我们需要临时简单函数的情况。特别是,它们通常用作高阶函数的参数。

让我们看一些实际例子。

将 Lambda 函数与 map() 函数结合使用

map() 是一个内置函数,它将给定函数应用于可迭代的每个项目,并返回带有结果的地图对象。

例如,假设我们要计算列表中每个数字的平方根。我们可以使用 Lambda 函数,如下所示:

# Define the list of numbers
numbers = [1, 2, 3, 4]

# Calculate square values and print results
squared = list(map(lambda x: x ** 2, numbers))
print(squared)

这导致:

[1, 4, 9, 16]

我们现在有一个包含初始数字的平方根的列表。

正如我们所看到的,这极大地简化了即时使用不需要稍后重用的函数的流程。

将 Lambda 函数与 filter() 函数结合使用

现在,假设我们有一个数字列表并想要过滤偶数。

我们可以使用 Lambda 函数,如下所示:

# Create a list of numbers
numbers = [1, 2, 3, 4]

# Filter for even numbers and print results
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even)

这导致:

[2,4]

将 Lambda 函数与 Sorted() 函数结合使用

Python中的sorted()函数从任何可迭代的元素中返回一个新的排序列表。使用 Lambda 函数,我们可以对这些列表应用特定的过滤条件。

例如,假设我们有一个二维点列表:(x,y)。我们想要创建一个以增量方式对 y 值进行排序的列表。

我们可以这样做:

# Creates a list of points
points = [(1, 2), (3, 1), (5, -1)]

# Sort the points and print
points_sorted = sorted(points, key=lambda point: point[1])
print(points_sorted)

我们得到:

[(5, -1), (3, 1), (1, 2)]

在列表推导式中使用 Lambda 函数

鉴于其简洁性,Lambda 函数可以嵌入到列表推导式中以进行即时计算。

假设我们有一个数字列表。我们想要:

  • 迭代整个列表
  • 计算并打印双倍初始值。

我们可以这样做:

# Create a list of numbers
numbers = [1, 2, 3, 4]

# Calculate and print the double of each one
squared = [(lambda x: x ** 2)(x) for x in numbers]
print(squared)

我们得到:

[1, 4, 9, 16]

使用 Lambda 函数的优点

鉴于我们已经探索过的示例,让我们来看看使用 Lambda 函数的一些优点:

  • 逻辑简单的简洁性和可读性:Lambda 函数允许简洁的代码,减少对标准函数定义的需求。这提高了函数逻辑简单的情况下的可读性。
  • 增强的函数式编程能力:Lambda 函数与函数式编程原则很好地结合在一起,支持在 Python 代码中进行函数式构造。特别是,它们促进了高阶函数的使用以及函数作为第一类对象的应用。
  • 何时以及为何首选 Lambda 函数:在定义不需要在代码中的其他地方重用的短的“一次性”函数时,Lambda 函数特别有利。因此它们非常适合内联使用,例如高阶函数的参数。

局限性和缺点

让我们简单讨论一下 Python 中 Lambda 函数的一些限制和缺点:

  • 复杂表达式中的可读性挑战:虽然 Lambda 函数很简洁,但在用于复杂表达式时可能会变得难以阅读和理解。这可能会导致代码更难维护和调试。
  • 错误处理和调试的限制:由于 Lambda 函数只能包含单个表达式,因此它们不能包含语句,例如用于错误处理的 try- except 块。此限制使它们不适合需要这些功能的复杂操作。
  • 功能受限:由于 Lambda 函数只能包含单个表达式,因此它们的通用性不如标准函数。这种设计限制将它们的使用限制为简单的操作和转换。

使用 Lambda 函数的最佳实践

现在我们已经考虑了一些优点和缺点,让我们定义一些有效使用 Lambda 函数的最佳实践:

  • 保持简单:为了保持可读性和简单性,Lambda 函数应保持简短并仅限于简单的操作。逻辑复杂的函数应该重构为标准函数。
  • 避免过度使用:虽然 Lambda 函数在许多情况下都很方便,但过度使用它们可能会导致代码难以阅读和维护。当清晰度至关重要时,请明智地使用它们并选择标准功能。
  • 将 Lambda 函数与其他 Python 功能组合:正如我们所见,Lambda 函数可以有效地与其他 Python 功能组合,例如列表推导式和高阶函数。如果使用得当,这可以产生更具表现力和简洁的代码。

Lambda 函数的高级技术

在某些情况下,更先进的 Lambda 函数技术可能会有所帮助。

让我们看一些例子。

嵌套 Lambda 函数

Lambda 函数可以嵌套以进行复杂的操作。

此技术在需要在序列中进行多个小型转换的场景中非常有用。

例如,假设您要创建一个函数来计算数字的平方根,然后加 1。以下是如何使用 Lambda 函数来执行此操作:

# Create a nested lambda function
nested_lambda = lambda x: (lambda y: y ** 2)(x)   1

# Print the result for the value 3
print(nested_lambda(3))

你得到:

10

与 Python 库集成以实现高级功能

许多 Python 库利用 Lambda 函数来简化复杂的数据处理任务。

例如,Lambda 函数可以与 Pandas 和 NumPy 一起使用,以简化数据操作和转换。

假设我们有一个包含两列的数据框。我们想要创建另一列,作为其他两列的总和。在这种情况下,我们可以使用 Lambda 函数,如下所示:

# Create the columns' data
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}

# Create data frame
df = pd.DataFrame(data)

# Create row C as A B and print the dataframe
df['C'] = df.apply(lambda row: row['A']   row['B'], axis=1)
print(df)

我们得到:

   A  B  C
0  1  4  5
1  2  5  7
2  3  6  9

我们的 Python Lambda 函数之旅就到此为止!

总结

在本文中,我们了解了如何在 Python 中使用 Lambda 函数,探讨了它们的优缺点、一些最佳实践,并涉及了一些高级用例。

编码愉快!

附注如果您想在 Python 帖子发布后立即阅读它们,请订阅我们的 Python Wizardry 时事通讯,不错过任何一篇帖子!

版本声明 本文转载于:https://dev.to/appsignal/how-to-use-lambda-functions-in-python-3llj?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-15
  • 为什么 Visual Studio 2010 中 x86 和 x64 的浮点运算不同?
    为什么 Visual Studio 2010 中 x86 和 x64 的浮点运算不同?
    x86 和 x64 之间的浮点算术差异在 Visual Studio 2010 中,x86 和 x64 版本之间的浮点算术存在明显差异当比较某些表达式的值时出现。这种差异体现在以下代码中:float a = 50.0f; float b = 65.0f; float c = 1.3f; float ...
    编程 发布于2024-11-15
  • 如何提高带有通配符的 MySQL LIKE 运算符的性能?
    如何提高带有通配符的 MySQL LIKE 运算符的性能?
    MySQL LIKE 运算符优化问题:使用通配符(例如 '%test% ')?答案: 是的,在查询中使用特定模式时,MySQL 可以优化 LIKE 运算符的性能。前缀通配符: 如果您的查询类似于 foo LIKE 'abc%' 或 foo LIKE 'abc�...
    编程 发布于2024-11-15
  • 如何使用 PHP 通过 POST 向外部网站发送数据?
    如何使用 PHP 通过 POST 向外部网站发送数据?
    在 PHP 中通过 POST 重定向和发送数据在 PHP 中,您可能会遇到需要将用户重定向到外部的情况网站并通过 POST 将数据传递到该网站。与 HTML 表单不同,PHP 本身并不支持此行为。GET 与 POST在 Web 开发中,有两种主要方法用于从源发送数据到目的地:GET:数据作为查询参数...
    编程 发布于2024-11-15
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-15
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-15
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-15
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-15
  • 如何使用 GCC 捕获 Linux 中的分段错误?
    如何使用 GCC 捕获 Linux 中的分段错误?
    捕获 Linux 中的分段错误问:我在第三方库中遇到分段错误,但我无法解决根本问题。是否有跨平台或特定于平台的解决方案来使用 gcc 捕获 Linux 中的这些错误?A:Linux 允许将分段错误作为异常处理。当程序遇到此类故障时,它会收到 SIGSEGV 信号。通过设置信号处理程序,您可以拦截此信...
    编程 发布于2024-11-15
  • 如何在不创建实例的情况下访问Go结构体的类型?
    如何在不创建实例的情况下访问Go结构体的类型?
    在不创建物理结构的情况下访问 Reflect.Type在 Go 中,动态加载问题的解决方案需要访问结构的类型,而无需物理创建它们。虽然现有的解决方案要求在类型注册之前创建结构体并清零,但存在一种更有效的方法。人们可以利用 reflect.TypeOf((*Struct)(nil)).Elem()手术...
    编程 发布于2024-11-15
  • Java中如何高效地将整数转换为字节数组?
    Java中如何高效地将整数转换为字节数组?
    Java 中整数到字节数组的高效转换将整数转换为字节数组可用于多种目的,例如网络传输或数据存储。有多种方法可以实现此转换。ByteBuffer 类:一种有效的方法是使用 ByteBuffer 类。 ByteBuffer 是一个存储二进制数据并提供各种操作来操纵它的缓冲区。使用 ByteBuffer ...
    编程 发布于2024-11-15
  • 如何在 Go 中按多个字段对结构体切片进行排序?
    如何在 Go 中按多个字段对结构体切片进行排序?
    按多个字段对切片对象进行排序按多个条件排序考虑以下 Parent 和 Child 结构:type Parent struct { id string children []Child } type Child struct { id string }假设我们有一个...
    编程 发布于2024-11-15
  • Qt 线程与 Python 线程:我应该在 PyQt 应用程序中使用哪个?
    Qt 线程与 Python 线程:我应该在 PyQt 应用程序中使用哪个?
    PyQt 应用程序中的线程:Qt 线程与 Python 线程寻求使用 PyQt 创建响应式 GUI 应用程序的开发人员经常遇到执行的挑战长时间运行的任务而不影响 UI 的功能。一种解决方案是使用单独的线程来完成这些任务。这就提出了是使用 Qt 线程还是原生 Python 线程模块的问题。Qt 线程提...
    编程 发布于2024-11-15
  • 为什么我的PHP提交按钮没有触发回显和表格显示?
    为什么我的PHP提交按钮没有触发回显和表格显示?
    PHP 提交按钮困境:不可用的回显和表格您的代码打算在单击“提交”按钮时显示回显和表格在 PHP 表单上。但是,您遇到了这些元素仍然隐藏的问题。这是因为您使用 if(isset($_POST['submit'])) 来控制这些元素的显示,但提交按钮缺少 name 属性。解决方案:提供...
    编程 发布于2024-11-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3