Python中tqdm进度条工具和enumerate函数的使用详解

tqdm进度条工具

tqdm 是 Python 中一个非常流行的 进度条显示工具库,常用于迭代操作的可视化,比如训练神经网络、批量数据处理等任务。


一、tqdm 是什么?

tqdm 全称是 taqaddum(阿拉伯语,意为“进展”),它会在控制台输出一个带进度条的实时反馈,常用于 for 循环中追踪当前执行状态和速度。


二、常用方法

1. 对普通 for 循环添加进度条

from tqdm import tqdm
for i in tqdm(range(100)):# 模拟耗时任务time.sleep(0.01)

2. 与 DataLoader 搭配(最常见)

from tqdm import tqdm
for batch in tqdm(trainloader):# 处理 batchpass

3. 自定义描述信息

for i in tqdm(range(100), desc="Processing"):time.sleep(0.01)

4. 显示时间与速率信息

tqdm 会自动显示:

  • 当前进度
  • 已耗时间
  • 平均耗时
  • 预计剩余时间

例如:

Processing:  45%|██████████████████▋                | 45/100 [00:01<00:01, 34.56it/s]

5. 嵌套进度条(多层循环)

from tqdm import tqdm
for i in tqdm(range(3), desc="Outer loop"):for j in tqdm(range(100), desc="Inner loop", leave=False):time.sleep(0.01)

三、使用注意事项

问题建议
卡住无响应?避免在 Jupyter 中用旧版本 tqdm,使用 tqdm.notebook 替代
速度不准?小任务迭代速度快可能导致显示误差大,可加 mininterval=0.5
配合 DataLoader 卡顿?添加 num_workers=0 测试排查线程冲突
重定向被清空?若与 print() 频繁混用建议设 tqdm(..., leave=True)

四、完整代码示例

from tqdm import tqdm
import timeprint("普通进度条演示:")
for i in tqdm(range(50), desc="任务A"):time.sleep(0.02)print("\n嵌套进度条演示:")
for epoch in tqdm(range(2), desc="Epoch"):for batch in tqdm(range(10), desc="Batch", leave=False):time.sleep(0.05)

五、进阶用法(如更新、写日志)

from tqdm import tqdm
import timepbar = tqdm(total=100)
for i in range(10):time.sleep(0.1)pbar.update(10)
pbar.close()

六、安装

pip install tqdm

在 Jupyter Notebook 中建议使用:

from tqdm.notebook import tqdm

enumerate函数

enumerate 是 Python 的一个内建函数,用于在遍历可迭代对象(如列表、元组等)时,同时获得元素的索引和值。相比使用传统的 range(len(x)) 方式,enumerate 更简洁、可读性更强,是写 Pythonic 代码的重要工具。


一、基本语法

enumerate(iterable, start=0)
参数说明
iterable可迭代对象(如列表、字符串、元组、集合、字典等)
start起始索引,默认是 0,也可以设定为任意整数

二、基本示例

fruits = ["apple", "banana", "cherry"]for index, fruit in enumerate(fruits):print(index, fruit)

输出:

0 apple
1 banana
2 cherry

三、与传统 range(len(...)) 的对比

✅ 推荐写法:

for i, val in enumerate(my_list):...

不推荐写法:

for i in range(len(my_list)):val = my_list[i]...

使用 enumerate 语义更清晰、减少索引出错。


四、start 参数作用

可以自定义索引起始值:

for i, fruit in enumerate(fruits, start=1):print(f"第{i}个水果是 {fruit}")

输出:

第1个水果是 apple
第2个水果是 banana
第3个水果是 cherry

五、常见用法场景

1. 遍历列表时获取索引

names = ["Alice", "Bob", "Charlie"]
for i, name in enumerate(names):print(f"{i}: {name}")

2. 与字典构造器配合使用

d = dict(enumerate(["a", "b", "c"]))
print(d)  # {0: 'a', 1: 'b', 2: 'c'}

3. 使用 enumerate 修改可变对象

nums = [1, 2, 3]
for i, num in enumerate(nums):nums[i] = num ** 2
print(nums)  # [1, 4, 9]

4. 配合 zip() 遍历多个列表并附带索引

a = ["x", "y", "z"]
b = [10, 20, 30]
for idx, (ai, bi) in enumerate(zip(a, b)):print(f"{idx}: {ai} - {bi}")

六、使用注意事项

问题建议或说明
只能用于可迭代对象否则抛出 TypeError
可用于字符串、元组、列表、集合、字典等注意集合和字典遍历顺序是无序的(除非使用 OrderedDict 或 Python 3.7+)
不能直接修改不可变对象(如字符串)修改要借助列表或其它中间变量
注意 enumerate 返回的是迭代器想多次使用可以 list(enumerate(...))

七、进阶示例

1. 从 enumerate 得到索引和值,并过滤条件

items = ["car", "bike", "train", "plane"]
for i, item in enumerate(items):if "a" in item:print(f"Index {i}: {item}")

2. 解包 enumerate 生成器

e = enumerate(["A", "B", "C"], start=10)
print(list(e))  # [(10, 'A'), (11, 'B'), (12, 'C')]

3. 使用 enumerate 生成 <index, value> 字符串格式

for i, ch in enumerate("abc", 1):print(f"{i}: {ch.upper()}")

输出:

1: A
2: B
3: C

八、与 tqdm 配合使用(进度+索引)

from tqdm import tqdmfor i, data in enumerate(tqdm(dataloader)):# i 是 batch 的编号pass

九、结语

enumerate() 是你写优雅、清晰、高效 Python 循环结构的必备技能,特别适用于:

  • 遍历时需要索引信息
  • 提高可读性、避免 range(len(...)) 出错
  • 搭配列表推导或 zip() 使用更灵活

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

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

相关文章

yum命令常用选项

刷新仓库列表 sudo yum repolist清理 Yum 缓存并生成新的缓存 sudo yum clean all sudo yum makecache验证 EPEL 源是否已正确启用 sudo yum repolist enabled安装软件包 sudo yum install <package-name> -y更新软件包 sudo yum update -y仅更新指定的软件包。 su…

linux debug技术

Linux是当今应用最广泛的免费和开源操作系统&#xff0c;它是一个复杂的分布式操作系统。它的内核的强大和灵活性已成为引用它的原因之一。在掌握Linux内核的过程中&#xff0c;调试工具可以帮助开发人员获得更深入的反思和理解。下面有25种不可或缺的Linux内核调试工具&#x…

【LinkedList demo 内部类讲说】

LinkedList demo 内部类讲说 1. Node节点2.MyLinkedList3. LinkedListTest 测试类 1. Node节点 public class Node<T> {private Node<T> pre;private Node<T> next;private T data;public Node() {}public Node getPre() {return pre;}public void setPre(N…

html主题切换小demo

主题切换功能为网页和应用程序提供了多样化的视觉风格与使用体验。实现多主题切换的技术方案丰富多样&#xff0c;其中 CSS 变量和 JavaScript 样式控制是较为常见的实现方式。 以下是一个简洁的多主题切换示例&#xff0c;愿它能为您的编程之旅增添一份趣味。 代码展示 <…

【数据结构】

一、架构梳理 线性&#xff08;1:1) 线性表 顺序存储 –> arr 链式存储 –> 指针 &#xff08;有头&#xff0c;无头&#xff09; 有头是指有一个不存数据的头&#xff0c;始终作为这个链表的起点。 会更加简单&#xff0c;无头的话&#xff0c;更改首部节点会麻烦。 头…

UML学习指南:从零入门到实战应用

为零基础学习者设计的UML技术文档&#xff0c;旨在通过详细解释和实际案例&#xff0c;从零开始掌握UML。 UML学习指南&#xff1a;从零入门到实战应用 目录 引言&#xff1a;UML是什么&#xff1f;为什么学习UML&#xff1f; 1.1 什么是UML&#xff1f;1.2 为什么我们需要UM…

Matlab实战训练项目推荐

以下是一系列适合不同技能水平的 MATLAB 实战训练项目&#xff0c;涵盖基础编程、数据分析、信号处理、图像处理、控制系统、机器学习等领域。这些项目可帮助你巩固理论知识并提升实际应用能力。 一、基础项目&#xff08;适合初学者&#xff09; 矩阵运算与可视化 目标&#x…

从零开始:Python语言进阶之异常处理

一、认识异常&#xff1a;程序运行中的“意外事件” 在编写Python程序时&#xff0c;即使代码语法完全正确&#xff0c;运行过程中也可能遭遇各种意外情况。这些意外被称为异常&#xff0c;它们会打断程序的正常执行流程。例如&#xff0c;当我们尝试打开一个不存在的文件、用0…

Groovy:Java 的简洁版

Groovy 是一种 动态、面向对象的编程语言&#xff0c;运行在 Java 虚拟机&#xff08;JVM&#xff09;上&#xff0c;并与 Java 高度兼容。你可以把它理解为“Java 的简洁版 动态特性 脚本语言的灵活性”。 &#x1f9e0; Groovy 的核心特点 特性说明✅ 与 Java 高度兼容可以…

生成模型——PixelRNN与PixelCNN

一、PixelRNN PixelRNN 是一种基于循环神经网络&#xff08;RNN&#xff09;的像素级生成模型&#xff0c;通过逐个像素地生成图像来构建完整的图像&#xff0c;其核心思想是将图像中的像素视为序列&#xff0c;并利用 RNN 的能力来捕捉像素之间的依赖关系。 序列生成&#xf…

每日算法刷题Day14 5.24:leetcode不定长滑动窗口求子数组个数越长越合法4道题,用时1h20min

3. 3325.字符至少出现K次的子字符串I(中等&#xff0c;学习优化) 3325. 字符至少出现 K 次的子字符串 I - 力扣&#xff08;LeetCode&#xff09; 思想 1.给你一个字符串 s 和一个整数 k&#xff0c;在 s 的所有子字符串中&#xff0c;请你统计并返回 至少有一个 字符 至少…

怎么判断一个Android APP使用了Capacitor这个跨端框架

要判断一个 Android 应用是否使用了 Capacitor 跨端框架&#xff0c;可以通过以下方法逐步验证&#xff1a; 一、安装包结构分析 1. 解压 APK 将 .apk 文件重命名为 .zip 并解压&#xff0c;检查以下特征文件&#xff1a; • assets/public/ 目录&#xff1a; Capacitor 的核心…

Vue3性能优化: 大规模列表渲染解决方案

# Vue3性能优化: 大规模列表渲染解决方案 一、背景与挑战 背景 在大规模应用中&#xff0c;Vue3的列表渲染性能一直是开发者关注的焦点。大规模列表渲染往往会导致卡顿、内存占用过高等问题&#xff0c;影响用户体验和系统整体性能。 挑战 渲染大规模列表时&#xff0c;DOM操作…

数据仓库,扫描量

有五种通用技术用于限制数据的扫描量&#xff0c;正如图3 - 4所示。第一种技术是扫描那些被打上时戳的数据。当一个应用对记录的最近一次变化或更改打上时戳时&#xff0c;数据仓库扫描就能够很有效地进行&#xff0c;因为日期不相符的数据就接触不到了。然而&#xff0c;目前的…

反射在spring boot自动配置的应用

目录 一&#xff0c;背景 二&#xff0c;知识回顾 2.1 理解使用反射技术&#xff0c;读取配置文件创建目标对象&#xff08;成员变量&#xff0c;方法&#xff0c;构造方法等&#xff09; 三&#xff0c;springboot自动配置 3.1 反射在自动配置中的工作流程 3.2 浏览源码…

机器学习 Day1

机器学习概述 机器学习与人工智能、深度学习关系什么是机器学习数据集算法 机器学习与人工智能、深度学习关系 什么是机器学习 机器学习是从数据中自动分析获取模型&#xff0c;并利用模型对未知数据进行预测。 直观理解: 所以是从历史数据中获取规律&#xff0c;那么这些历…

Disruptor—2.并发编程相关简介

大纲 1.并发类容器 2.volatile关键字与内存分析 3.Atomic系列类与UnSafe类 4.JUC常用工具类 5.AQS各种锁与架构核心 6.线程池的最佳使用指南 1.并发类容器 (1)ConcurrentMap (2)CopyOnWrite容器 (3)ArrayBlockingQueue (4)LinkedBlockingQueue (5)SynchronousQueue …

开盘啦 APP 抓包 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包 这是一个记录贴。 这个APP是数…

YOLOv8损失函数代码详解(示例展示数据变换过程)

本文将展示YOLOv8中损失函数计算的完整代码解析&#xff0c;注释中提供了详尽的解释&#xff0c;并结合示例演示了数据维度的转换&#xff0c;以帮助更好地理解。 YOLOv8的损失函数计算代码位于ultralytics/utils/loss.py文件中&#xff08;如下所示&#xff09;&#xff0c;我…

微信小程序调用蓝牙API “wx.writeBLECharacteristicValue()“ 报 errCode: 10008 的解决方案

1、问题现象 问题:在开发微信小程序蓝牙通信功能时,常常会遇到莫名其妙的错误,查阅官方文档可能也无法找到答案。如在写入蓝牙数据时,报了这样的错误: {errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOW…