Kodewick
第 13 课,共 31 课目录

for 循环

第 13 课,共 31 课 · 第 2 部分 · 容器和循环 · 约 20 分钟

循环就是把同样几行代码一遍一遍地跑,每个东西跑一遍。五盏灯不用写五个 print,写一个,让循环去重复。这一课最适合点单步:能看着循环一圈一圈地转,循环变量每圈都在变。

main.py
1lamps = ["磨坊路", "石桥", "集市"]2for lamp in lamps:3    print("点亮", lamp)4print("全亮了")
输出
点亮 磨坊路
点亮 石桥
点亮 集市
全亮了

for 循环是怎么跑的

部分作用
for lamp in lamps:把 lamps 里的东西一个一个拿出来。每一圈,lamp 就是当前这一个。这一行最后有冒号。
缩进的几行循环体:每个东西都跑一遍。
第一行不缩进的已经在循环外面了,等循环跑完,它跑一次。

循环变量叫什么由你定。起一个能说明「一个东西是什么」的名字:for lamp in lamps、for house in houses。

先猜一猜

完 会显示几次?

1for n in [1, 2, 3]:2    print(n)3print("完")

遍历字符串

字符串是一串字符,所以 for 循环可以一个字符一个字符地走过去。

main.py
1for letter in "ore":2    print(letter, letter.upper())
输出
o O
r R
e E

用 range() 数数

想把一件事做几遍,就遍历 range()。它会按需给出一串数字。套上 list(),可以一次看到全部:

main.py
1print(list(range(5)))2print(list(range(2, 6)))3print(list(range(0, 20, 5)))4print(list(range(5, 0, -1)))
输出
[0, 1, 2, 3, 4]
[2, 3, 4, 5]
[0, 5, 10, 15]
[5, 4, 3, 2, 1]
写法怎么数例子
range(stop)从 0 数到 stop,不包括 stoprange(5) 是 0 到 4
range(start, stop)从 start 数到 stop,不包括 stoprange(2, 6) 是 2 到 5
range(start, stop, step)每次跳 step;步长是负数就倒着数range(5, 0, -1) 是 5 到 1

结尾的数永远不包括在内。range(5) 正好是 5 个数,所以「做 5 遍」通常就这么写:

main.py
1for night in range(3):2    print("第", night + 1, "晚:开灯")
输出
第 1 晚:开灯
第 2 晚:开灯
第 3 晚:开灯
先猜一猜

这段会显示什么?

1for i in range(5, 2):2    print(i)3print("结束")

边走边加

很常用的写法:循环前先建一个变量,循环里更新它,循环后用它。循环里放一个 if,就能只对一部分东西动手。

main.py
1loads = [3, 8, 2, 6]2total = 03big = 04for ore in loads:5    total += ore6    if ore >= 5:7        big += 18print(f"矿石一共:{total}")9print(f"大车:{big}")
输出
矿石一共:19
大车:2

小技巧: 这里点单步,看 total 和 big 每一圈怎么变。要是把 total = 0 放进循环里,它每一圈都会被清零。

用 enumerate() 编号

有时候除了东西本身,还要知道它排第几。enumerate() 两样都给你,是一对值,拆到两个名字里,和元组拆包一样。它从 0 开始数,除非你给 start。

main.py
1houses = ["面包房", "铁匠铺", "磨坊"]2for i, house in enumerate(houses):3    print(i, house)4for number, house in enumerate(houses, start=1):5    print(f"{number}. {house}")
输出
0 面包房
1 铁匠铺
2 磨坊
1. 面包房
2. 铁匠铺
3. 磨坊

用 zip() 并排走两个列表

zip() 让两个列表一起往前走,每一圈各拿一个。两个列表一样长最好;不一样长时,短的走完就停。

main.py
1miners = ["小安", "阿本", "可可"]2amounts = [12, 7, 9]3for name, amount in zip(miners, amounts):4    print(f"{name} 挖了 {amount} 块矿石")
输出
小安 挖了 12 块矿石
阿本 挖了 7 块矿石
可可 挖了 9 块矿石

遍历字典

遍历字典,拿到的是键。遍历 .items(),就能同时拿到键和值。

main.py
1stock = {"铁": 14, "铜": 6, "金": 2}2for item in stock:3    print(item)4for item, count in stock.items():5    print(f"{item}:{count}")
输出
铁
铜
金
铁:14
铜:6
金:2

只要值的话就用 .values()。拿出来的顺序就是放进去的顺序。

break 和 continue

break 马上离开循环,循环里剩下的都不跑了。这里遇到第一辆空车就停,后面的 5 和 9 都没有卸:

main.py
1loads = [4, 7, 0, 5, 9]2for ore in loads:3    if ore == 0:4        print("空车,停")5        break6    print("卸下", ore)
输出
卸下 4
卸下 7
空车,停

continue 跳过这一圈剩下的部分,直接去下一个:

main.py
1lamps = ["亮", "灭", "亮", "灭"]2for i, state in enumerate(lamps):3    if state == "亮":4        continue5    print("点亮第", i, "盏灯")
输出
点亮第 1 盏灯
点亮第 3 盏灯
关键字会怎样
break现在就离开循环,接着跑循环后面的代码。
continue跳到下一个,循环还在继续。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。结果和你想的不一样,就点单步看看。

练习 1

倒数

改一改 range(),让程序倒数 3、2、1,然后显示 出发!。

要显示
3
2
1
出发!
exercise1.py
1for n in range(3):2    print(n)3print("出发!")
输出
点「运行」或按 Ctrl+Enter
练习 2

一加到一百

用循环把 1 到 100 的整数全加起来,然后显示总和。

要显示
5050
exercise2.py
1total = 02# 在这里写循环3print(total)
输出
点「运行」或按 Ctrl+Enter
练习 3

快用完了

只显示剩下不到 5 个的东西,格式是 名字:数量,冒号是中文的全角「:」。

要显示
铜:3
金:0
exercise3.py
1stock = {"铁": 14, "铜": 3, "煤": 22, "金": 0}2for item in stock:3    print(item)
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • for x in 某个东西: 对列表、字符串、字典里的每一个,把缩进的循环体跑一遍。
  • range(stop)、range(start, stop)、range(start, stop, step) 用来数数;终点永远不包括,range 也可能是空的。
  • 循环前建一个变量,循环里更新它,就能求和、计数;用 if 挑出要的东西。
  • enumerate() 给出每个东西的位置;zip() 让两个列表一起走;.items() 给出键和值。
  • break 离开循环;continue 跳到下一个。