学Python3️⃣9️⃣ for … in (3) enumerate(…)
作者:小号🎺
据说,有一个统计,在 for...in 所构造的循环中,in 后面的成分,主要是 list, range(...),和 enumerate(...)。三者合起来基本覆盖了90%的 for...loops 的各种情况。
for i, xx in enumerate(...) ,可能暂时用不着,但不能不知道。
① for a in aList:
② for i inrange(aNum):
③ for i, a in enumerate(aList):
有了一个表(list),我们只需要按预定的步骤对表中的元素依次操作一遍,这时,我们就用①, for a in aList 。(这时我们往往对表的索引不感兴趣。)
如果还没有表,只有一个概念,这个表应该是什么样的。这时我们就用②, for i in range(aNum) 。这时我们根据循环变量 i 来建立一个表。
循环变量 i , 随着循环逐步递增(递减),最后也就构成了表的索引(index),也就是我们在引用表中某一个元素时,那个所谓的“下标”。如:
aList[i]
表的名字后面方括号中间的字母 i ,就是所谓的“下标”(索引, index)。
但有时, 我们已经有了一个表, 但我们仍然需要按照一些规则, 对这个表连同它的索引一起进行一些操作, 我们就用③, for i, a in enumerate(aList) 。
enumerate 不是关键字,它是 Python 的一个标准内置函数,地位和range() 相当。
enumerate(aList, start)
通俗的讲,enumerate() 的操作是:从列表中逐个取出其中的元素,同时计数,并将这个数和取出的元素一起作为函数的返回结果。start指明计数的起点,如省略,则默认从 0 开始计数。
enumerate,英文原意是“枚举”(一个一个地数)。这个 enumerate 和另一个词 iterate (以及它的各种变形)经常在编程类文章中高频出现,很容易混淆,尤其是两个词读音都很“拗口”。iterate,英文原意是“迭代”。两者既有联系,又有区别。要注意区分。
下面举几个例子:
① 把常见花卉的名字与月份对应起来。(前面做过类似题目)

② 有一份奖品清单,已经按顺序(依贵重程度降序排列)排好。现在需要把奖品与奖励名次匹配起来。其中前四名依次是:幸运奖,状元、榜眼、探花。(实操见附录)
③ 有一份已经排好顺序的生肖(文字)列表,另有一份按同样顺序排好的生肖表情(包)列表,尝试将它们拼合起来。
birthnames = ['子鼠','丑牛','寅虎','卯兔','辰龙','巳蛇','午马','未羊','申猴','酉鸡','戌狗','亥猪',]birthfaces = ['🐁', '🐄', '🐅', '🐇','🐉', '🐍', '🐴', '🐑','🐒', '🐓', '🐕', '🐖',]facebirths = []for i, birth in enumerate(birthnames):face_birth = str(i+1)+'.'+birthfaces[i]+birthfacebirths.append(face_birth)print(face_birth)

④ 接导演组通知,在原有的节目前插播三个新节目,原有的节目依次顺延。现在要制作一份新的节目表。前三个节目仅以序号显示。
# 原有节目列表old_programs = ["歌曲:明天会更好","舞蹈:青春飞扬","小品:办公室趣事","相声:刘老根新传"]# 新节目表:前3个只显示序号,后面原有节目顺延new_programs = []# 先加3个空节目(仅序号)for i in range(3):new_programs.append(f"节目{i+1}:")# 原有节目从第4个开始编号for idx, program in enumerate(old_programs, start=4):new_programs.append(f"节目{idx}:{program}")# 打印新节目表print("节目表(新):")for line in new_programs:print(line)

最后,差点忘了:不论是哪一种 for ... loop,第一行的最后一个字符总是一个冒号 : ,切记不要弄丢了。
作业:
① 想象我们正搭乘一列时光穿越的列车,车上的信息屏上有列车的相关信息。我们把问题稍微简化一下:有一条全程10个车站的线路,每当抵达一个车站,信息屏中即显示:“当前到站:XXX”、“下一站:YYY”、“上一站:ZZZ”。每两步循环中间间隔5秒。




