for 循环
循环就是把同样几行代码一遍一遍地跑,每个东西跑一遍。五盏灯不用写五个 print,写一个,让循环去重复。这一课最适合点单步:能看着循环一圈一圈地转,循环变量每圈都在变。
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("完")
print("完") 没有缩进,不属于循环。循环先显示 1、2、3,跑完以后它跑一次。
遍历字符串
字符串是一串字符,所以 for 循环可以一个字符一个字符地走过去。
1for letter in "ore":2 print(letter, letter.upper())
o O r R e E
用 range() 数数
想把一件事做几遍,就遍历 range()。它会按需给出一串数字。套上 list(),可以一次看到全部:
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,不包括 stop | range(5) 是 0 到 4 |
range(start, stop) | 从 start 数到 stop,不包括 stop | range(2, 6) 是 2 到 5 |
range(start, stop, step) | 每次跳 step;步长是负数就倒着数 | range(5, 0, -1) 是 5 到 1 |
结尾的数永远不包括在内。range(5) 正好是 5 个数,所以「做 5 遍」通常就这么写:
1for night in range(3):2 print("第", night + 1, "晚:开灯")
第 1 晚:开灯 第 2 晚:开灯 第 3 晚:开灯
这段会显示什么?
1for i in range(5, 2):2 print(i)3print("结束")
range(5, 2) 是从 5 往上数,到 2 之前停,所以一个数也没有,循环体一次也不跑。想倒着数,要给负的步长:range(5, 2, -1)。
边走边加
很常用的写法:循环前先建一个变量,循环里更新它,循环后用它。循环里放一个 if,就能只对一部分东西动手。
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。
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() 让两个列表一起往前走,每一圈各拿一个。两个列表一样长最好;不一样长时,短的走完就停。
1miners = ["小安", "阿本", "可可"]2amounts = [12, 7, 9]3for name, amount in zip(miners, amounts):4 print(f"{name} 挖了 {amount} 块矿石")
小安 挖了 12 块矿石 阿本 挖了 7 块矿石 可可 挖了 9 块矿石
遍历字典
遍历字典,拿到的是键。遍历 .items(),就能同时拿到键和值。
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 都没有卸:
1loads = [4, 7, 0, 5, 9]2for ore in loads:3 if ore == 0:4 print("空车,停")5 break6 print("卸下", ore)
卸下 4 卸下 7 空车,停
continue 跳过这一圈剩下的部分,直接去下一个:
1lamps = ["亮", "灭", "亮", "灭"]2for i, state in enumerate(lamps):3 if state == "亮":4 continue5 print("点亮第", i, "盏灯")
点亮第 1 盏灯 点亮第 3 盏灯
| 关键字 | 会怎样 |
|---|---|
break | 现在就离开循环,接着跑循环后面的代码。 |
continue | 跳到下一个,循环还在继续。 |
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。结果和你想的不一样,就点单步看看。
倒数
✓改一改 range(),让程序倒数 3、2、1,然后显示 出发!。
3 2 1 出发!
1for n in range(3):2 print(n)3print("出发!")
一加到一百
✓用循环把 1 到 100 的整数全加起来,然后显示总和。
5050
1total = 02# 在这里写循环3print(total)
快用完了
✓只显示剩下不到 5 个的东西,格式是 名字:数量,冒号是中文的全角「:」。
铜:3 金:0
1stock = {"铁": 14, "铜": 3, "煤": 22, "金": 0}2for item in stock:3 print(item)
这一课学会了
for x in 某个东西:对列表、字符串、字典里的每一个,把缩进的循环体跑一遍。range(stop)、range(start, stop)、range(start, stop, step)用来数数;终点永远不包括,range 也可能是空的。- 循环前建一个变量,循环里更新它,就能求和、计数;用
if挑出要的东西。 enumerate()给出每个东西的位置;zip()让两个列表一起走;.items()给出键和值。break离开循环;continue跳到下一个。