闭包和range

概念

闭包包含了函数的入口地址和其关联的环境

闭包和普通函数

最大的区别在于,闭包函数中可以引用闭包外的变量

闭包与range

当闭包和range同时使用,可能会出现下面的错误,最终协程会打印出values切片的最后一个值,因为当前的val值引用的是同一个地址的数据,在range循环的过程中,会不断的在val地址中更新数据,但是在闭包中,由于引用了外部的变量val,所以在访问时会获取val地址中的值,可能会获取最后放入其中的值,而不是遍历所有值,从而导致错误


import (
	"fmt"
	"time"
)

func main() {
	links := []string{"https://www.baidu.com",
		"https://www.jd.com/",
		"https://www.taobao.com"}

	for _, val := range links {
		go func() {
			fmt.Println(val)
		}()
	}
	time.Sleep(2 * time.Second)
}

运行结果

https://www.taobao.com
https://www.taobao.com
https://www.taobao.com

修复

修复该问题的办法是通过函数传递参数

package main

import (
	"fmt"
	"time"
)

func main() {
	links := []string{"https://www.baidu.com",
		"https://www.jd.com/",
		"https://www.taobao.com"}

	for _, val := range links {
		go func(val string) {
			fmt.Println(val)
		}(val)
	}
	time.Sleep(2 * time.Second)
}

运行结果

https://www.baidu.com
https://www.taobao.com
https://www.jd.com/

 

航拍图像多类别实例分割数据集 一、基础信息 • 数据集名称:航拍图像多类别实例分割数据集 • 图片数量: 训练集:1283张图片 验证集:416张图片 总计:1699张航拍图片 • 训练集:1283张图片 • 验证集:416张图片 • 总计:1699张航拍图片 • 分类类别: 桥梁(Bridge) 田径场(GroundTrackField) 港口(Harbor) 直升机(Helicopter) 大型车辆(LargeVehicle) 环岛(Roundabout) 小型车辆(SmallVehicle) 足球场(Soccerballfield) 游泳池(Swimmingpool) 棒球场(baseballdiamond) 篮球场(basketballcourt) 飞机(plane) 船只(ship) 储罐(storagetank) 网球场(tennis_court) • 桥梁(Bridge) • 田径场(GroundTrackField) • 港口(Harbor) • 直升机(Helicopter) • 大型车辆(LargeVehicle) • 环岛(Roundabout) • 小型车辆(SmallVehicle) • 足球场(Soccerballfield) • 游泳池(Swimmingpool) • 棒球场(baseballdiamond) • 篮球场(basketballcourt) • 飞机(plane) • 船只(ship) • 储罐(storagetank) • 网球场(tennis_court) • 标注格式:YOLO格式,包含实例分割的多边形坐标,适用于实例分割任务。 • 数据格式:航拍图像数据。 二、适用场景 • 航拍图像分析系统开发:数据集支持实例分割任务,帮助构建能够自动识别分割航拍图像中各种物体的AI模型,用于地理信息系统、环境监测等。 • 城市
内容概要:本文详细介绍了一个基于YOLO系列模型(YOLOv5/YOLOv8/YOLOv10)的车祸检测与事故报警系统的设计与实现,适用于毕业设计项目。文章从项目背景出发,阐述了传统人工监控的局限性智能车祸检测的社会价值,随后对比分析了YOLO不同版本的特点,指导读者根据需求选择合适的模型。接着,系统明确了核心功能目标,包括车祸识别、实时报警、多场景适配可视化界面开发。在技术实现部分,文章讲解了数据集获取与标注方法、数据增强策略、模型训练与评估流程,并提供了完整的代码示例,涵盖环境搭建、训练指令、推理测试以及基于Tkinter的图形界面开发,实现了视频加载、实时检测与弹窗报警功能。最后,文章总结了项目的全流程实践意义,并展望了未来在智慧城市、车联网等方向的扩展潜力。; 适合人群:计算机相关专业本科毕业生,具备一定Python编程基础机器学习基础知识,正在进行毕业设计的学生;; 使用场景及目标:①完成一个具有实际社会价值的毕设项目,展示从数据处理到模型部署的全流程能力;②掌握YOLO目标检测模型的应用与优化技巧;③开发具备实时检测与报警功能的交通监控系统,用于答辩演示或科研展示; 阅读建议:建议按照“背景—数据—模型—界面—总结”的顺序逐步实践,结合提供的代码链接进行动手操作,在训练模型时注意调整参数以适应本地硬件条件,同时可在基础上拓展更多功能如短信报警、多摄像头接入等以提升项目创新性。
### 闭包与装饰器的定义 #### 闭包 在 Python 中,闭包是指一个嵌套函数可以访问其外层函数作用域内的变量,即使这个外层函数已经执行完毕并返回[^1]。这种特性使得闭包能够记住它创建时所处的作用域中的状态。 ```python def outer_function(x): def inner_function(y): return x + y # 访问外部函数的变量 x return inner_function closure_example = outer_function(10) print(closure_example(5)) # 输出 15 ``` 上述代码展示了如何通过内部函数 `inner_function` 来捕获外部函数 `outer_function` 的局部变量 `x` 并形成闭包[^5]。 --- #### 装饰器 装饰器是一种用于修改其他函数行为的高阶函数。它可以接受一个函数作为输入,并返回一个新的函数,在不改变原函数源码的情况下增强或修改其功能[^2]。 ```python def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() # 输出: # Something is happening before the function is called. # Hello! # Something is happening after the function is called. ``` 在此例子中,`my_decorator` 是一个装饰器,它增强了 `say_hello` 函数的功能[^4]。 --- ### 区别与联系 尽管闭包装饰器都涉及函数嵌套以及对外部作用域的引用,但两者的用途不同: - **闭包** 主要关注的是保存状态,允许内部函数在其生命周期结束后仍然能访问外部作用域的数据。 - **装饰器** 则更侧重于动态地扩展已有函数的行为,而无需更改原始函数的内容。 两者之间的一个重要联系在于:装饰器通常利用闭包机制实现其核心逻辑[^3]。 --- ### 编程中的应用 #### 应用场景一:延迟计算 闭包可用于推迟某些昂贵运算直到真正需要的时候才被执行。 ```python def create_adder(x): def adder(y): return x + y return adder add_five = create_adder(5) result = add_five(7) # 延迟到此处才完成加法操作 print(result) # 输出 12 ``` 此案例体现了闭包对于封装数据的强大能力。 #### 应用场景二:日志记录 装饰器常用来为多个函数添加统一的日志处理逻辑而不影响原有业务流程。 ```python import time def log_execution_time(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} executed in {end_time - start_time:.4f}s") return result return wrapper @log_execution_time def heavy_computation(n): total = sum(i * i for i in range(n)) return total heavy_computation(1_000_000) # 自动打印运行耗时 ``` 这里展示了一个典型的基于装饰器的时间测量工具。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值