Python函数:匿名函数(lambda)④

news2024/11/23 8:28:48

在这里插入图片描述

文章目录

    • 引言
    • 1. 什么是匿名函数(lambda)?
      • 1.1 lambda 函数的语法
      • 1.2 示例
    • 2. lambda 函数的使用场景
      • 2.1 作为参数传递给高阶函数
        • 2.1.1 使用 `map`
        • 2.1.2 使用 `filter`
        • 2.1.3 使用 `reduce`
      • 2.2 排序
      • 2.3 在数据结构中使用lambda函数
    • 3. lambda 函数的优缺点
      • 3.1 优点
      • 3.2 缺点
    • 4. 综合示例
      • 4.1 任务管理系统
      • 4.2 解释
      • 4.3 执行结果
    • 5. 总结

引言

在Python中,函数是一等公民,意味着函数可以像变量一样被传递和操作。除了使用def关键字定义命名函数外,Python还提供了创建匿名函数的简洁方法,即使用lambda关键字。匿名函数,顾名思义,是没有名字的函数,它们通常用于需要简单函数的地方,比如作为其他函数的参数。本文将详细介绍Python匿名函数的概念、语法、使用场景,并通过一个综合详细的例子来展示其应用。

1. 什么是匿名函数(lambda)?

匿名函数,也称为lambda函数,是一种简洁的函数定义方式。与常规函数不同,lambda函数没有名字,只能包含一个表达式。其主要目的是在需要一个简单函数的场合下使用,避免定义一个完整的函数。

1.1 lambda 函数的语法

lambda函数的语法如下:

lambda 参数1, 参数2, ... : 表达式
  • lambda 关键字用于定义匿名函数。
  • 参数1, 参数2, ... 是输入参数,可以有多个,也可以没有参数。
  • : 冒号后面跟着一个表达式,该表达式的结果即为函数的返回值。

1.2 示例

# 定义一个lambda函数,实现两个数相加
add = lambda x, y: x + y

# 调用lambda函数
result = add(3, 5)
print(result)  # 输出:8

2. lambda 函数的使用场景

匿名函数通常用于需要短小函数的地方,特别是在一些高阶函数(如 map, filter, reduce 等)的参数中。以下是一些常见的使用场景:

2.1 作为参数传递给高阶函数

高阶函数是指接受函数作为参数或返回函数的函数。在Python中,常见的高阶函数包括 map, filter, 和 reduce 等。

2.1.1 使用 map

map 函数将一个函数应用于一个序列中的每个元素,并返回一个包含结果的新列表。

# 使用lambda函数将一个列表中的每个元素平方
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)  # 输出:[1, 4, 9, 16, 25]
2.1.2 使用 filter

filter 函数将一个函数应用于一个序列中的每个元素,返回一个包含使函数返回 True 的元素的新列表。

# 使用lambda函数过滤出列表中的偶数
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]
2.1.3 使用 reduce

reduce 函数将一个函数应用于序列中的元素,从而将序列归约为一个单一的值。需要 functools 模块的支持。

from functools import reduce

# 使用lambda函数计算列表中所有元素的乘积
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出:120

2.2 排序

sorted 函数和 sort 方法可以接受一个 key 参数,用于指定排序的依据。lambda函数常用于此处。

# 使用lambda函数根据第二个元素对列表中的元组进行排序
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs)  # 输出:[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

2.3 在数据结构中使用lambda函数

lambda函数还可以用于数据结构中的特定操作,例如字典的键排序。

# 使用lambda函数根据字典中的值对字典进行排序
my_dict = {'apple': 5, 'banana': 2, 'cherry': 7, 'date': 1}
sorted_dict = sorted(my_dict.items(), key=lambda item: item[1])
print(sorted_dict)  # 输出:[('date', 1), ('banana', 2), ('apple', 5), ('cherry', 7)]

3. lambda 函数的优缺点

3.1 优点

  1. 简洁性:lambda函数语法简洁,可以减少代码量,特别是在需要简单函数的地方。
  2. 匿名性:lambda函数是匿名的,适合用作临时函数,避免为简单函数命名。

3.2 缺点

  1. 可读性:由于lambda函数没有名字,且只能包含一个表达式,当表达式复杂时,可能会降低代码的可读性。
  2. 调试困难:匿名函数没有名字,在调试时不易区分和跟踪。

4. 综合示例

下面我们将通过一个综合示例来展示lambda函数的实际应用。我们将创建一个任务管理系统,使用lambda函数进行各种操作。

4.1 任务管理系统

假设我们要实现一个简单的任务管理系统,该系统可以添加任务、完成任务、获取所有任务、获取未完成任务、获取已完成任务以及根据任务的截止日期进行排序。

import datetime

class Task:
    def __init__(self, title, description, due_date):
        self.title = title
        self.description = description
        self.due_date = due_date
        self.completed = False

    def mark_completed(self):
        self.completed = True

    def __str__(self):
        status = "已完成" if self.completed else "待完成"
        return f"任务: {self.title}, 状态: {status}, 截止日期: {self.due_date}"

class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, title, description, due_date):
        task = Task(title, description, due_date)
        self.tasks.append(task)

    def remove_task(self, title):
        self.tasks = [task for task in self.tasks if task.title != title]

    def get_pending_tasks(self):
        return list(filter(lambda task: not task.completed, self.tasks))

    def get_completed_tasks(self):
        return list(filter(lambda task: task.completed, self.tasks))

    def sort_tasks_by_due_date(self):
        self.tasks.sort(key=lambda task: task.due_date)

    def __str__(self):
        return "\n".join(str(task) for task in self.tasks)

def log_activity(func):
    def wrapper(*args, **kwargs):
        print(f"执行 {func.__name__}{datetime.datetime.now()}")
        result = func(*args, **kwargs)
        print(f"完成执行 {func.__name__}")
        return result
    return wrapper

@log_activity
def main():
    task_manager = TaskManager()

    task_manager.add_task("买杂货", "牛奶, 面包, 奶酪", datetime.date(2024, 7, 15))
    task_manager.add_task("完成作业", "完成数学作业", datetime.date(2024, 7, 10))
    task_manager.add_task("打扫房间", "客厅和厨房", datetime.date(2024, 7, 20))

    print("所有任务:")
    print(task_manager)

    print("\n待完成任务:")
    pending_tasks = task_manager.get_pending_tasks()
    for task in pending_tasks:
        print(task)

    print("\n将'完成作业'标记为已完成。")
    for task in task_manager.tasks:
        if task.title == "完成作业":
            task.mark_completed()

    print("\n已完成任务:")
    completed_tasks = task_manager.get_completed_tasks()
    for task in completed_tasks:
        print(task)

    print("\n根据截止日期排序任务。")
    task_manager.sort_tasks_by_due_date()
    print(task_manager)

    print("\n移除'买杂货'任务。")
    task_manager.remove_task("买杂货")

    print("\n移除后的所有任务:")
    print(task_manager)

if __name__ == "__main__":
    main()

4.2 解释

  1. Task:表示一个任务,包含任务的标题、描述、截止日期和完成状态。提供了标记任务为已完成的方法 mark_completed,以及返回任务信息的字符串表示方法 __str__

  2. TaskManager:管理多个任务,提供添加任务、移除任务、获取未完成任务、获取已完成任务和按截止日期排序任务的方法。

  3. 装饰器 log_activity:装饰

主函数 main,在执行函数前后打印日志信息。

  1. 主函数 main
    • 创建一个 TaskManager 实例。
    • 添加几个任务。
    • 打印所有任务。
    • 获取并打印未完成任务。
    • 将一个任务标记为已完成,并打印已完成任务。
    • 按截止日期排序任务,并打印排序后的任务列表。
    • 移除一个任务,并打印移除后的任务列表。

4.3 执行结果

在这里插入图片描述

5. 总结

本文详细介绍了Python中的匿名函数(lambda函数),包括其语法、使用场景、优缺点以及一个综合详细的示例。lambda函数是一种简洁的函数定义方式,适合在需要简单函数的场合下使用。虽然lambda函数具有简洁性和匿名性的优点,但在可读性和调试方面存在一定的缺点。因此,在实际使用中应根据具体情况权衡利弊,选择适当的函数定义方式。希望本文对您理解和使用Python的lambda函数有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

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

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

相关文章

油耳要怎么清洁耳朵才干净?比较推荐哪种可视耳勺

油耳朵的小伙伴们有没有这样的烦恼呢?一两天不清理耳朵就会发痒,日常用棉签清洁耳朵老是清理不干净,而且在转动棉签时还会把棉絮残留在耳道中;用普通耳勺清理又容易刮破耳道,导致耳朵感染。对于油耳朵的小伙伴&#xf…

潘多拉的盒子还是阿拉丁的神灯:揭示RAG噪声在大语言模型中的作用

一、结论写在前面 论文来自清华大学、北京国家信息科学与技术研究中心 论文标题:Pandora’s Box or Aladdin’s Lamp: A Comprehensive Analysis Revealing the Role of RAG Noise in Large Language Models 论文链接:https://arxiv.org/pdf/2408.135…

参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制

关联比赛: 2021第二届云原生编程挑战赛2:实现一个柔性集群调度机制 参赛心得 历时快两个月的第二届云原生编程挑战赛结束了,作为第一次参赛的萌新,拿下了28名的成绩,与第一名差了19万分,因为赛制时间太长&#xff0c…

【C语言进阶】C语言动态内存管理:深入理解malloc、calloc与realloc

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言自定义类型 🌹🌹期待您的关注 🌹🌹 ❀C语言动态内存管理 &#…

线路及接口基础知识

目录 一、常见视频接口 一、常见视频接口

电话外呼系统对比普通电销有什么区别

电话外呼系统与普通电销在多个方面存在显著差异,这些差异主要体现在效率、成本、智能化程度、数据管理和客户体验等方面。以下是具体的对比分析: ### 一、效率差异 * **电话外呼系统**: - **高效性**:可以同时拨打大量电话&…

刚开始学精益六西格玛管理方法?这份指南建议收藏

精益六西格玛管理方法,作为两大管理哲学的完美结合,正逐渐成为众多企业转型升级的利器。对于刚开始接触这一领域的你来说,掌握精益六西格玛管理的精髓并有效应用于实践中,无疑是一项既具挑战性又极具价值的任务。本文,…

[Linux#48][网络] 令牌环网 | IPv4 | socket 套接字 | TCP | UDP | 网络字节序列

目录 1.网络 1.0 令牌环网(了解) 1.1 IP 地址 1.3 网络通信的基本脉络 IPv4地址解释 2.Socket 编程预备 2.1 端口号 2.2 传输层协议 2.3 网络字节序列 库函数定义 函数说明 1.网络 1.0 令牌环网(了解) 相同令牌时&am…

Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息

前言 假如系统又一个这样的业务场景:已登录的用户发起流程或者发布消息之后,需要弹窗通知其他已登录的用户,我们应该如何实现? 在设计实时通信场景时,我们面临的主要挑战是如何有效地通知所有已登录的用户有关新流程…

关于 PreparedStatement

Mysql 层面的语法也支持 prepare 这个确实第一次见 PREPARE prepares a statement for execution (see Section 13.5.1, “PREPARE Statement”).EXECUTE executes a prepared statement (see Section 13.5.2, “EXECUTE Statement”).DEALLOCATE PREPARE releases a prepared…

半天玩转大模型技术之RAG

引 言 当前大模型在金融行业最广泛的应用之一就是知识问答,而支撑该应用的技术正是当下火热的检索增强生成(Retrieval Augmented Generation)技术,简称 RAG。因企业具体的业务往往需要注入特定的知识,比如ChatBI中企业…

Google出了一个黑科技,可以把书变成真人多角色对话的音频,效果真的很牛!

大家有没有想过,像读书、查资料这种事情,如果可以用听的,效率会不会更高?我想大部分人都曾有过这种念头。尤其是在这信息爆炸的时代,手头上有大量的书籍、论文等资源,但我们根本没时间一页一页地去翻。对吧?这时,Google Illuminate 的出现,简直像是为我们解了燃眉之急…

力扣: 赎金信

文章目录 需求分析及编码结尾 需求 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次…

kubernetes中的微服务Service(ClusterIP、NodePort、LoadBalancer)

目录 一 、什么是微服务 二 、微服务的类型 三、 ipvs模式 3.1 ipvs模式配置方式 四、微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2…

【大模型专栏—入门篇】CUDA入门与AutoDL“炼丹”

大模型专栏介绍 😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文为大模型专栏子篇,大模型专栏将持续更新,主要讲解大模型从入门到实战打怪升级。如有兴趣,欢迎您的阅读。 &#x1f4…

PointNet++改进策略 :模块改进 | SWA| PVT,融入Transformer的点云与体素的模块同时提升模型精度和效率

目录 介绍PVT原理PVT的核心思想和结构PVT模块结构体素分支点分支 代码实现 论文题目:PVT: Point-Voxel Transformer for Point Cloud Learning发布期刊:International Journal of Intelligent Systems通讯地址:杭州电子科技大学&伦敦大学…

善于善行——贵金属回收

在当今社会,贵金属回收已成为一项日益重要的产业。随 着科技的不断进步和人们对资源可持续利用的认识逐渐提高,贵金属回收的现状也备受关注。 目前,贵金属回收市场呈现出蓬勃发展的态势。一方面,贵金属如金、银、铂、钯等在众多领…

【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)

目录 1.什么是结构体类型 2.结构体变量的创建 3.结构体变量的初始化 4.结构体的特殊声明 5.typedef重定义结构体变量(两种方式) 6.结构体自引用 7.创建结构体指针变量 8.结构体内容的访问 8.1直接访问: 8.2 结构体指针访问 9.结构体内…

IPD推行成功的核心要素(二十二)IPD流程持续优化性地推出具备商业成功潜力的产品与解决方案

产品开发是非常复杂的。随着创新环境的快速发展,大部分研发型企业普遍会面临着这些核心问题:如何快速响应市场的变化?如何推出更有竞争力的产品?如何在竞争中脱颖而出?因此,往往随着企业的规模化发展&#…

深度优先搜索(DFS)在图的运行过程

深度优先搜索(DFS)在图的运行过程 深度优先搜索算法(DFS)C语言实现运行DFS并记录结果节点发现时间和完成时间:图a是一个有向图,为了清晰起见,我们首先假设图a的具体结构如下(节点和边的集合): 图a: 节点集合: {A, B, C, D, E, F} 边集合: {(A, B), (A, C), (B, D),…