挨个处理一串东西。比重复做里的「数数循环」更省事——不用自己管编号。
设 同学们 = ["小明", "小红", "小刚"]
遍历 同学们 每个 名字
打印(名字)
输出:
小明
小红
小刚
遍历 同学们 每个 名字 读作「遍历同学们,每个(叫它)名字」。它自动从头走到尾,把每个元素轮流交给 名字,不用像重复做那样自己写 i = i + 1。
💡 语序是「集合在前、名字在后」——「遍历成绩的每个名字」,自然中文,这是推荐写法。
习惯英文 for x in y 的人,也能这样写:
对于 名字 在 ["小明", "小红", "小刚"]
打印(名字)
和 遍历 … 每个 … 完全等价,两种语序能混用。对每个 是 对于 的别名。
也可以这么写:遍历有两种语序,都是 CNplus 的「一种意思多种写法」特性,详见关键字与别名。
对于 名 在 {"甲": 1, "乙": 2} # 旧语序遍历字典,一样逐个取标签
打印(名)
两种语序只是写法不同,解析成同一个遍历语句,行为一模一样。用顺口的那个。
| 遍历什么 | 得到什么 |
|---|---|
| 列表 | 每个元素 |
| 字典 | 每个标签 |
| 字符串 | 每个字 |
| 范围 | 一串数字 |
# 字典:遍历标签
设 成绩 = {"小明": 85, "小红": 92}
遍历 成绩 每个 名
打印(名) # 小明 / 小红
# 字符串:逐字
遍历 "你好" 每个 字
打印(字) # 你 / 好
范围 造出一串数字,配合遍历是常用套路:
遍历 范围(5) 每个 i
打印(i) # 0 1 2 3 4
三种写法:
| 写法 | 得到 |
|---|---|
范围(5) |
0, 1, 2, 3, 4 |
范围(1, 6) |
1, 2, 3, 4, 5(从 1 到 6 的前一个) |
范围(1, 10, 2) |
1, 3, 5, 7, 9(每次加 2) |
遍历 范围(1, 6) 每个 i
打印(i) # 1 2 3 4 5
注意
范围(1, 6)是 1 到 5,不含 6。和编号从 0 开始一样,是约定俗成。
范围(1, 10, 2) 是造出一串间隔为 2 的数字。如果名单已经存在,只想隔一个处理一个,先切片再遍历更直接:
设 同学们 = ["小明", "小红", "小刚", "小美", "小华"]
遍历 同学们[::2] 每个 名字
打印(名字)
输出:
小明
小刚
小华
这里的 同学们[::2] 先取位置 0、2、4 的人,遍历再逐个处理。不需要自己造编号,也不用判断编号是奇数还是偶数。
怎么选?要生成一串数字,用
范围;已有列表、只想按位置挑一部分,用切片。 两处的步长都写在最后,但范围的步长控制数字相差多少,切片的步长控制位置相差多少。
统计总分(遍历列表):
设 分数们 = [80, 90, 70]
设 总分 = 0
遍历 分数们 每个 分
总分 = 总分 + 分
打印(总分) # 240
打印每个标签和值(遍历字典的标签):
设 成绩 = {"小明": 85, "小红": 92}
遍历 成绩 每个 名
打印(名 + ":" + 文本(成绩[名]))
# 小明:85
# 小红:92
遍历 里的那个名字(比如 名字、i)只在循环里有效,出了循环就没了:
遍历 范围(3) 每个 i
打印(i)
# 这里再写 i,会报 CN0302(未声明)
数字、布尔、空都不能遍历,会报 CN0309:
遍历 42 每个 x
打印(x)
# 运行时错误 CN0309:整数不能遍历
学过 Python 的人,看这里——这一章学的,用 Python 写是这样。零基础可以直接跳过,去下面做「练一练」。
先把这一章串成一个完整程序(CNplus):
设 同学们 = ["小明", "小红", "小刚"]
遍历 同学们 每个 名字
打印(名字)
同一个程序,用 Python 写:
同学们 = ["小明", "小红", "小刚"]
for 名字 in 同学们: # 遍历 同学们 每个 名字
print(名字)
| CNplus | Python |
|---|---|
遍历 集合 每个 x |
for x in 集合 |
范围(5) |
range(5) |
范围(1, 6) |
range(1, 6)(都不含终点) |
范围(1, 10, 2) |
range(1, 10, 2) |
语序注意:CNplus 是「集合在前、名字在后」(遍历 同学们 每个 名字,自然中文语序),Python 是 for 名字 in 同学们(名字在前)。方向相反,别搞混。
下一步:做练习,然后继续下一课。