【python】python进阶——Lambda 函数

目录

引言

一、简介

1.1 基本语法

1.2 优势

1.3 局限性

二、基本用法

2.1 无参数lambda 函数

2.2 多参数 lambda 函数

三、常见使用场景

3.1 与高阶函数配合使用

3.2 作为排序键

3.3 在 GUI 编程中作为回调函数

3.4 在 Pandas 中的应用

四、高级技巧

4.1 条件表达式

4.2 嵌套 Lambda 函数

4.3 默认参数

总结


引言

        Python 中的 lambda 函数是一种创建匿名函数(没有名称的函数)的方式,它可以使代码更加简洁和易读。虽然功能有限,但在适当的场景下,lambda 函数能大大简化代码结构。

一、简介

1.1 基本语法

Lambda 函数是使用 lambda 关键字创建的匿名函数,其基本语法如下:

lambda arg1, arg2 : expression

参数:

  • lambda:定义 lambda 函数的关键字

  • arg:函数参数,可以是零个或多个,用逗号分隔

  • expression:函数体,只能是一个表达式,不能包含多条语句

1.2 Lambda 函数的优势

  • 当函数只需要使用一次时

  • 当函数体非常简单,只有一条表达式时

  • 作为参数传递给高阶函数时

1.3 Lambda 函数的局限性

  • 只能包含一个表达式:Lambda 函数不能包含多条语句或复杂的逻辑结构。

  • 没有语句:不能包含 ifforwhile 等语句(但可以使用条件表达式)。

  • 可读性:过于复杂的 lambda 函数会降低代码的可读性。

二、基本用法

2.1 无参数的 lambda 函数

# 普通函数定义
def square(x):print("hello world!")
​
# 等效的 lambda 函数
square = lambda : print("hello world!")

2.2 多参数的 lambda 函数

# 普通函数
def add(x, y):return x + y
​
# 等效的 lambda 函数
add = lambda x, y: x + y
​
print(add(3, 5))  # 输出: 8

三、常见使用场景

3.1 与高阶函数配合使用

Lambda 函数经常与 map(), filter(), reduce() 等高阶函数一起使用。

  • 使用 map()
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]
  • 使用 filter()
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4, 6, 8, 10]
  • 使用 reduce()
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 120

3.2 作为排序键

# 按姓名排序
students = [{'name': 'Alice', 'age': 25},{'name': 'Bob', 'age': 22},{'name': 'Charlie', 'age': 28}
]
​
# 按姓名排序
students_sorted_by_name = sorted(students, key=lambda x: x['name'])
print(students_sorted_by_name)
# 输出: [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 28}]
​
# 按年龄排序
students_sorted_by_age = sorted(students, key=lambda x: x['age'])
print(students_sorted_by_age)
# 输出: [{'name': 'Bob', 'age': 22}, {'name': 'Alice', 'age': 25}, {'name': 'Charlie', 'age': 28}]

3.3 在 GUI 编程中作为回调函数

import tkinter as tk
​
root = tk.Tk()
button = tk.Button(root, text="Click me!", command=lambda: print("Button clicked!"))
button.pack()
root.mainloop()

3.4 在 Pandas 中的应用

import pandas as pd
​
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# 创建新列,其值为 A 列和 B 列的和
df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
print(df)

四、高级技巧

4.1 条件表达式

# 返回两个数中较大的数
max_value = lambda x, y: x if x > y else y
print(max_value(10, 20))  # 输出: 20

4.2 嵌套 Lambda 函数

# 返回一个函数,该函数计算 x 的 n 次方
power = lambda n: lambda x: x ** n
​
square = power(2)
cube = power(3)
​
print(square(4))  # 输出: 16
print(cube(3))    # 输出: 27

4.3 默认参数

greet = lambda name, greeting="Hello": f"{greeting}, {name}!"
print(greet("Alice"))          # 输出: Hello, Alice!
print(greet("Bob", "Hi"))      # 输出: Hi, Bob!

总结

        Lambda 函数是 Python 中一个强大而简洁的特性,当正确使用时,可以使代码更加简洁和易读。它们特别适合与高阶函数配合使用,或者作为简单的回调函数。

        然而,重要的是要记住,lambda 函数并不总是最佳选择,特别是当逻辑变得复杂时。如在这些情况下,使用传统的 def 关键字定义函数通常是更好的选择:

  • 当函数逻辑复杂,需要多条语句时

  • 当函数需要文档字符串或注释时

  • 当函数会被多次重用时

选择使代码最清晰、最易维护的方法,而不是一味追求简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95066.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机电动车充电桩/充电车棚环境监测设计

传送门 👉👉👉👉其他作品题目速选一览表 👉👉👉👉其他作品题目功能速览 概述 随着电动车普及,充电桩的环境安全监测成为重要课题。基于单片机的电动车充电桩环境检…

Linux初始——编译器gcc

编译器gcc编译器编译器自举动静态库动静态库的差异gcc编译器 众所周知,代码运行的前提是经过四个步骤的 预处理,其进行宏替换,去注释,条件编译,头文件展开的工作,在gcc的选项中对应gcc -E,其就…

Three.js + AI预测:在数字孪生中实现数据可视化智能决策

某智慧工厂的数字孪生系统曾陷入尴尬:3D 模型里的生产线数据实时跳动,却没人能预判 “2 小时后哪台机器会停机”。这就像有了高清监控,却不会分析监控画面 ——Three.js 做出的可视化是 “眼睛”,AI 预测才是 “大脑”。不少团队用…

刀客doc:亚马逊持续猛攻程序化广告

文/刀客doc(头条深一度精选作者)一7月的尾声和8月的开端,广告市场见证了两场截然不同的场面。7月31日,亚马逊公布了截至6月30日的2025年第二季度财报。广告业务表现尤为亮眼:单季收入达到157亿美元,同比增长约22%,成为…

政府网站IPv6检测怎么做?检测指标有哪些?

随着信息技术的飞速发展,IPv6作为下一代互联网的核心协议,已成为全球互联网发展的必然趋势。我国政府高度重视IPv6的规模部署和应用推广,明确要求各级政府网站必须完成IPv6改造,以提升网络基础设施的现代化水平,增强网…

有N个控制点的三次B样条曲线转化为多段三阶Bezier曲线的方法

将具有N 个控制点的三次B样条曲线转换为多段三阶Bezier曲线,是计算机图形学和CAD系统中常见的操作。这种转换基于B样条曲线的局部性质以及其与Bezier曲线之间的关系。基本原理三次B样条曲线由一组控制点 P₀, P₁, ..., Pₙ₋₁ 和一个节点向量 U {u₀, u₁, ..., …

chrome好用的浏览器插件

https://ad.infread.com/?utm_sourcebaidu_sem&utm_mediumweb_pc&utm_campaignkeywords_website_translate&bd_vid2831968530895394443 目前我自己觉得比较用的谷歌浏览器翻译插件->沉浸式翻译 个人觉得无论时速度还是准确度都是比较好的

k8s---prometheus 监控

目录 环境准备 下载 kube-prometheus 软件包 下载prometheus 镜像 master节点 master节点导入prometheus软件包 解压 node节点 node节点导入镜像 解压 从tar包中加载镜像 部署 prometheus 修改映射端口 提交 查看pod pod和svc正常启动 deployment daemonset se…

华大时空组学空转图像处理

华大时空组学空转图像处理 library(png) library(tiff) st <- readRDS(01.Stereo-seq/output_all/Demo_Mouse_Kidney/outs/feature_expression/seurat_out.rds) dim(stassays$Spatialcounts) stassays$Spatialcounts[1:4,1:4] coord.df <- data.frame(imagerow st$x, im…

如何在SptingBoot项目中引入swagger生成API文档

目录 背景介绍&#xff0c;swagger的必要性 swagger的引入&#xff1a; 1.首先我们需要在 pom.xml文件中导入jar包 2.给swagger创建一个配置类&#xff1a; 3.为实体类添加注解 4.为controller添加注解 背景介绍&#xff0c;swagger的必要性 自从在2005年前端工程师诞生之…

GD32入门到实战21--输入捕获

我们新建capture_drv.c#include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO…

MyBatis 与 MyBatis-Plus 的对比与选择

&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择 文章目录&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择&#x1f9e0; 一、MyBatis 核心回顾&#x1f4a1; 核心思想与架构定位⚡ 基础使用示例⚠️ MyBatis 的痛点⚡ 二、MyBatis-Plus 功能特性解析&#x1f4a1; M…

大数据-湖仓一体

数据仓库 这是一个传统的概念了&#xff0c;趋向于结构化数据&#xff0c;简单来说就是进过数据治理后的标准数据更易于数据分析使用&#xff0c;代价就是存储比较昂贵了 数据湖 近些年来新出的一种概念&#xff0c;就是存储了结构化&#xff0c;非结构化&#xff0c;半结构…

Java视觉跟踪入门:使用OpenCV实现实时对象追踪

视觉跟踪是计算机视觉领域的一个重要分支&#xff0c;它允许我们在视频序列中持续定位移动对象。本文将介绍如何使用Java和OpenCV库来实现一个简单的视觉跟踪系统。什么是视觉跟踪&#xff1f;视觉跟踪是指通过分析视频帧来自动追踪一个或多个移动对象的过程。这项技术广泛应用…

【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]

特别难调&#xff0c;洛谷题解区很多人代码可读性不强&#xff0c;做的我怀疑人生。 &#xff08;虽然我的码风也一般就是了&#xff09; 前置知识&#xff1a; Kruskal 求最小生成树。 题面&#xff1a; 洛谷 P4208 两种做法&#xff0c;一种矩阵树一种枚举。 &#xff08…

光谱相机多层镀膜技术如何提高透过率

光谱相机多层镀膜技术通过精密的光学设计与材料组合实现透过率提升&#xff0c;其核心原理与技术特性如下&#xff1a;一、多层镀膜的光学优化机制‌复合相位调控‌ 通过交替沉积高折射率&#xff08;如TiO₂, n2.3&#xff09;与低折射率材料&#xff08;如SiO₂, n1.46&#…

ubantu安装配置hive

在Ubuntu系统上安装Hive通常涉及几个步骤&#xff0c;包括安装Java&#xff08;因为Hive依赖于Java&#xff09;&#xff0c;安装Hadoop&#xff0c;然后安装Hive本身。以下是一个基本的步骤指南&#xff1a; 安装Java 首先&#xff0c;确保你的系统上安装了Java。你可以通过运…

大模型RAG项目实战:文本向量模型>Embedding模型、Reranker模型以及ColBERT模型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

基于uni-app的校园综合服务平台开发实战

闪递校园&#xff1a;基于uni-app的校园综合服务平台开发实战作为一名全栈开发者&#xff0c;我用6个月时间开发了这款校园综合服务平台——闪递校园。本文将详细分享项目从0到1的开发经验&#xff0c;包括技术选型、核心功能实现、踩坑记录以及性能优化等方面的干货内容。&…

Qt::Q_INIT_RESOURCE用法

q_init_resource 用法 q_init_resource 是 Qt 框架中用于初始化嵌入式资源的一个函数。它通常用于将编译到应用程序二进制文件中的资源&#xff08;如图像、QML文件、翻译文件等&#xff09;注册到Qt的资源系统中。 基本用法 cpp Q_INIT_RESOURCE(resourcename); 其中 resource…