Python3 【闭包】项目实战:5个新颖的学习案例

Python3 【闭包】项目实战:5个新颖的学习案例

以下是 5个闭包应用项目,涵盖实际场景并附带完整代码、解释和测试案例。


项目1:待办事项列表(Todo List)

功能:使用闭包管理待办事项的添加、删除和展示。

def todo_manager():tasks = []def add_task(task):tasks.append(task)return f"任务 '{task}' 已添加。"def remove_task(task):if task in tasks:tasks.remove(task)return f"任务 '{task}' 已移除。"else:return f"任务 '{task}' 不存在。"def show_tasks():return "当前任务列表:" + ", ".join(tasks) if tasks else "无任务。"return add_task, remove_task, show_tasks# 测试案例
add, remove, show = todo_manager()
print(add("写报告"))      # 输出: 任务 '写报告' 已添加。
print(add("开会"))       # 输出: 任务 '开会' 已添加。
print(show())            # 输出: 当前任务列表:写报告, 开会
print(remove("开会"))    # 输出: 任务 '开会' 已移除。
print(show())            # 输出: 当前任务列表:写报告

项目2:用户会话超时检测

功能:检测用户是否在指定时间内无操作(模拟会话超时)。

def session_timeout_checker(timeout):last_activity = time.time()  # 导入 time 模块def update_activity():nonlocal last_activitylast_activity = time.time()def is_expired():return (time.time() - last_activity) > timeoutreturn update_activity, is_expired# 测试案例
import timeupdate, check = session_timeout_checker(5)  # 5秒超时
update()  # 模拟用户操作
time.sleep(3)
print(check())  # 输出: False(未超时)
time.sleep(3)
print(check())  # 输出: True(已超时)

项目3:配置文件管理器

功能:动态读取和更新配置文件中的参数。

def config_manager(config_path):config = {}# 假设配置文件格式为 key=value(示例)with open(config_path, 'r') as f:for line in f:key, value = line.strip().split('=')config[key] = valuedef get(key):return config.get(key, None)def set(key, value):config[key] = valuewith open(config_path, 'w') as f:for k, v in config.items():f.write(f"{k}={v}\n")return f"已更新 {key}{value}"return get, set# 测试案例(假设文件 config.txt 内容为 theme=dark)
get_config, set_config = config_manager("config.txt")
print(get_config("theme"))  # 输出: dark
print(set_config("theme", "light"))  # 输出: 已更新 theme 为 light
print(get_config("theme"))  # 输出: light

项目4:购物车(支持折扣策略)

功能:管理购物车商品,并根据闭包动态应用折扣策略。

def shopping_cart(discount_strategy):items = []def add_item(item, price):items.append((item, price))def total():total_price = sum(price for _, price in items)return discount_strategy(total_price)return add_item, total# 测试案例
def no_discount(total):return totaldef student_discount(total):return total * 0.9  # 打九折add_item, total = shopping_cart(student_discount)
add_item("书", 50)
add_item("笔", 20)
print(f"总价(含折扣): {total()}")  # 输出: 总价(含折扣): 63.0# 切换折扣策略
add_item, total = shopping_cart(no_discount)
add_item("书", 50)
print(f"总价(无折扣): {total()}")  # 输出: 总价(无折扣): 50

项目5:缓存计算结果

功能:缓存复杂计算结果,避免重复计算(如API调用或耗时计算)。

def cached_calculator():cache = {}def calculate(func, arg):if arg in cache:return f"缓存结果: {cache[arg]}"result = func(arg)cache[arg] = resultreturn f"新计算结果: {result}"return calculate# 测试案例
def heavy_computation(n):return n * n  # 模拟复杂计算calc = cached_calculator()
print(calc(heavy_computation, 5))  # 输出: 新计算结果: 25
print(calc(heavy_computation, 5))  # 输出: 缓存结果: 25

总结

这些项目覆盖了闭包的典型应用场景:

  1. 状态保持(如待办事项、会话超时)。
  2. 动态策略(如购物车折扣)。
  3. 数据封装(如配置文件管理)。
  4. 性能优化(如缓存计算)。

闭包通过封装变量和逻辑,使代码更模块化且安全,适合需要隐藏状态或动态行为的场景。

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

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

相关文章

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…

Spring Boot项目中解决跨域问题(四种方式)

目录 一,跨域产生的原因二,什么情况下算跨域三,实际演示四,解决跨域的方法 1,CrossOrigin注解2,添加全局过滤器3,实现WebMvcConfigurer4,Nginx解决跨域5,注意 开发项目…

浅析DNS污染及防范

DNS污染(DNS Cache Poisoning)是一种网络攻击手段,通过篡改DNS服务器的缓存数据,将域名解析结果指向错误的IP地址,从而误导用户访问恶意网站或无法访问目标网站。这种攻击利用了DNS协议的特性,例如“只认第…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…

大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探

以下视频内容为叶梓分享DeepSeek多模态大模型janus的部署,并验证其实际效果,包括图生文和文生图两部分。 叶梓老师人工智能培训分享DeepSeek多模态大模型janus初探 DeepSeek 的多模态大模型 Janus 是一款强大的 AI 模型,专注于图像和文本的多…

Linux系统上安装与配置 MySQL( CentOS 7 )

目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …

17.2 图形绘制7

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.9 字体 17.2.9.1 Font类 Font类定义特定的文本格式,包括字体、字号和样式特性。 Font常用属性: Na…

浅析DDOS攻击及防御策略

DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

HarmonyOS NEXT:保存应用数据

用户首选项使用 用户首选项的特点 数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。 用户搜选项&#xff08;Preferences&#xff09;提供了轻量级配置数据的持久化能力&#xff0c;支持订阅数据变化的通知能力。不支持分布式同…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

[Linux]从零开始的STM32MP157 U-Boot移植

一、前言 在上一次教程中&#xff0c;我们了解了STM32MP157的启动流程与安全启动机制。我们还将FSBL的相关代码移植成功了。大家还记得FSBL的下一个步骤是什么吗&#xff1f;没错&#xff0c;就是SSBL&#xff0c;而且常见的我们将SSBL作为存放U-Boot的地方。所以本次教程&…

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

高速稳定,功能强大的免费下载工具!!

今天&#xff0c;我向你们介绍一款超强的下载器——破姐版本&#xff0c;它完全免费&#xff0c;支持高速下载&#xff0c;将彻底解决你的下载难题。 01 软件介绍 P2P下载器免费下载工具&#xff0c;它以高速稳定、功能强大、无广告的特点&#xff0c;为你提供卓越的下载体验…