在遍历的过程当中,我们应当把序号以及内容都一并获取到。很多初学者在进行列表遍历操作的时候, 最容易犯的一个错误就是, 他们往往会选择手动去维护一个计数器的变量, 目的是为了搞清楚当前正在处理的是第几个元素。# 初级写法——手动计数fruits [苹果, 香蕉, 橘子, 葡萄]i 0for fruit in fruits:print(f第{i 1}个水果是{fruit})i 1# 高手写法——用 enumerate()for i, fruit in enumerate(fruits):print(f第{i 1}个水果是{fruit})当使用枚举的方式时, 系统会同时为你自动分配“序号”以及对应的实际数值。这种做法最大的好处在于, 你再也不用通过手动添加数字来维护一个计数器了。一、关于通过调用一个叫做 range 的函数来生成一连串数字的做法, 其中包含了有关这个函数的具体使用方法, 而在这里所讨论的是这种函数一共存在的三种具体的操作步骤。# range(stop) — 0 到 stop-1for i in range(5):print(i) # 0, 1, 2, 3, 4# range(start, stop) — start 到 stop-1for i in range(2, 7):print(i) # 2, 3, 4, 5, 6# range(start, stop, step) — 步长为 stepfor i in range(0, 20, 3):print(i) # 0, 3, 6, 9, 12, 15, 18# 步长为负数——倒序for i in range(10, 0, -2):print(i) # 10, 8, 6, 4, 21.2 range 不是列表r range(5)print(r) # range(0, 5) —— 不是一个完整的列表print(list(r)) # [0, 1, 2, 3, 4] —— 转成列表才能看到全部# range 的优点省内存# range(1000000) 只占几十个字节# list(range(1000000)) 占几 MB 内存# 判断元素是否在 range 里print(3 in range(5)) # Trueprint(100 in range(5)) # FalseO(1) 速度1.在具体的实际应用场景之中, 我们对于三个范围这样的概念进行了深入的探索与运用分析。# 1. 遍历列表的索引fruits [苹果, 香蕉, 橘子]for i in range(len(fruits)):print(f下标{i}{fruits[i]})# 2. 同时遍历两个列表names [张三, 李四, 王五]scores [85, 92, 78]for i in range(len(names)):print(f{names[i]}{scores[i]}分)# 3. 倒序遍历for i in range(len(fruits) - 1, -1, -1):print(fruits[i]) # 橘子、香蕉、苹果# 4. 每隔一个取一个for i in range(0, 10, 2):print(i) # 0, 2, 4, 6, 8# 5. 生成列表squares [x ** 2 for x in range(1, 11)]print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]二、同时拿出键和值。2.1 基本用法。fruits [苹果, 香蕉, 橘子, 葡萄]# 默认从 0 开始for i, fruit in enumerate(fruits):print(f下标{i}{fruit})# 指定起始编号for i, fruit in enumerate(fruits, start1):print(f第{i}个水果{fruit})# enumerate 返回的是什么enum enumerate(fruits)print(enum) #print(list(enum)) # [(0, 苹果), (1, 香蕉), (2, 橘子), (3, 葡萄)]2.2 的常见写法# 最常用for i, item in enumerate(列表):print(f{i}: {item})# 从1开始编号for i, item in enumerate(列表, 1):print(f第{i}个: {item})# 解包两个列表names [张三, 李四, 王五, 赵六]scores [85, 92, 78, 95]for i, (name, score) in enumerate(zip(names, scores), 1):print(f{i}. {name}{score}分)三、这是一个关于给列表中的每一个元素进行编号操作的实战案例, 具体为第一个实战环节。def show_todo_list(todos):显示带编号的待办事项if not todos:print( 暂无待办事项)returnprint(\n 待办事项)for i, todo in enumerate(todos, 1):print(f {i}. {todo})todos [买牛奶, 写作业, 健身, 看书]show_todo_list(todos)在进行实战2这个任务的时候, 你要做的是去查找那个元素的索引。def find_all_index(lst, target):查找列表中所有匹配项的索引indices [i for i, item in enumerate(lst) if item target]return indicesnumbers [1, 3, 5, 3, 7, 3, 9]print(find_all_index(numbers, 3)) # [1, 3, 5]print(find_all_index(numbers, 10)) # []进行实战训练之三, 其核心内容是为相关的数据打上对应的标签。def label_data(items):根据条件给数据打标签result []for i, item in enumerate(items):label A if item 80 else B if item 60 else Cresult.append((i, item, label))return resultscores [85, 42, 73, 90, 55, 68]labeled label_data(scores)for i, score, label in labeled:print(f 第{i1}项{score}分 → {label})进行实战环节中的第四个部分任务, 也就是生成数据报告。def generate_report(products):生成商品清单报告print( * 45)print(f{序号:4} {商品名:12} {价格:8} {库存:6})print(- * 45)total 0for i, (name, price, stock) in enumerate(products, 1):print(f{i:4d} {name:12s} ¥{price:6.2f} {stock:5d}件)total price * stockprint( * 45)print(f{库存总值¥:28s}{total:.2f})products [(手机, 2999, 50),(笔记本, 5999, 30),(耳机, 299, 200),(充电器, 99, 500),]generate_report(products)四、zip()——同时遍历多个列表另外, 和它关系比较近的zip这个操作方式, 在日常生活中也是经常被使用到的。names [张三, 李四, 王五]ages [25, 30, 28]scores [85, 92, 78]# 同时遍历三个列表for name, age, score in zip(names, ages, scores):print(f{name}{age}岁{score}分)# zip enumerate 强强联合for i, (name, age) in enumerate(zip(names, ages), 1):print(f{i}. {name}{age}岁)五、range 和 的内存对比import sys# range 非常省内存r range(1000000)print(frange 对象大小{sys.getsizeof(r)} 字节) # 48 字节# list(range()) 很费内存lst list(range(1000000))print(f列表大小{sys.getsizeof(lst)} 字节) # 8,000,056 字节# enumerate 也很省fruits [苹果, 香蕉, 橘子] * 10000e enumerate(fruits)print(fenumerate 对象大小{sys.getsizeof(e)} 字节) # 56 字节六、总结range()——生成数字序列range(5) → 0, 1, 2, 3, 4range(2, 7) → 2, 3, 4, 5, 6range(1, 10, 2)→ 1, 3, 5, 7, 9range(5, 0, -1)→ 5, 4, 3, 2, 1enumerate()——同时拿索引和值for i, item in enumerate(lst): → i从0开始for i, item in enumerate(lst, 1): → i从1开始zip()——同时遍历多个列表for a, b in zip(list1, list2): → 配对遍历选型口诀只要下标用 range(len(lst))只要元素用 for item in lst下标元素都用 enumerate(lst)同时遍历多个用 zip(lst1, lst2)全部都要用 enumerate(zip(lst1, lst2))课后练习有一组名单还有一连串的成绩数据, 用打印输出的功能来生成一个带有编号的表格内容, 利用特定的数值范围设置从十开始倒数到一的序列过程, 借助组合匹配函数把两组信息对接起来。字符串a, 字符串b, 字符串c把这两个东西放在一起, 然后弄成一个字典, 这个字典的形式是 {a: 1b: 2c: 3}。
企业数字化 ERP 产品动态
相关推荐
深入理解Python变量与常量 深入理解变量与常量变量其实就是计算机内存里面的一块区域, 这个区域是可以用来存放一些值, 并且这些值都必须在规定的范围以内, 同时这个值还是允许变动的。至于解释器到底会给变量分配多大的内存空间, 以及究竟能存放什么样的数据, 那就得看变量的数据类型是什么了, 它是根据… · 2026/9/26 12:34:37
Atlas 300V部署YOLOv5全攻略:CANN、ATC与推理调优实战 1. 先把硬件底细摸清楚:Atlas 300V是什么卡、能干什么1.1 为什么它会被当成"小主机":从产品定位说起"atlas 300v 24g 是运算加速卡吗"——这个问题我最近在好几个技术群里都看到有人在问。问法五花八门,有的问它是不是显… · 2026/9/26 12:34:31
2026年入行网络安全:三个现实与避坑指南 2026年想干网络安全,这话我最近听身边年轻人提的频率明显变高了。看到培训班广告、SRC漏洞平台上的赏金神话、大赛夺冠的新闻,很多人脑子里都是“黑客攻防”“月入两三万”“在家挖洞”的画面。但作为在这个行业干了快十年的老从业者,我劝你在… · 2026/9/26 13:15:20
护网行动蓝队值守零基础入门指南:面试、研判与应急响应实战 1. 护网行动:圈内一年一度的攻防大考,到底在考什么?先聊个现象:每年那段固定时间,安全厂商开始到处招人,朋友圈里全是“急招XX值守”“XX研判,日薪美丽”,连很多平时只写过两行代码的… · 2026/9/26 13:15:20
软件工程大作业必备:高校社团管理系统全流程开发指南 简介:软件工程课程设计项目《高校社团管理系统》是一套面向计算机相关专业学生、教师的完整实践资源,涵盖需求分析、系统设计、数据库SQL及设计报告,适用于课程设计、毕业设计、项目初期演示与新手进阶学习。资源共305个文件,约19… · 2026/9/26 13:15:20
十款免费降AI率工具实测:从检测原理到修改操作全解析 毕业季一到,“降AI率”这几个字几乎成了宿舍夜谈的固定话题。你辛辛苦苦写了几个月,最后论文在AI检测系统里被标出一大片高亮区域,导师一句“这段有AI痕迹,回去改”,就能让人在图书馆坐到天亮。市面上的降AI率工具五花… · 2026/9/26 13:15:08
元宵节Scratch编程案例:接汤圆、猜灯谜与花灯巡游设计详解 1. 元宵节和Scratch碰撞后的第一个问题:做什么才不像"大杂烩"?每次到传统节日,我的Scratch交流群里都会冒出一批"求节日作品"的帖子。中秋要月亮嫦娥,端午要粽子龙舟,到了元宵节,最常看… · 2026/9/26 13:15:02
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46