循环
本节目标
学完这一节,你会知道:
- 为什么程序需要循环
for循环适合什么场景while循环适合什么场景- 如何用
break和continue控制循环 - 如何写出九九乘法表和猜数字游戏
这一节最重要的是:看到重复的事情,就想想能不能交给循环。
先跑一个例子
新建文件 repeat.py,写入:
for i in range(1, 6):
print(f"第 {i} 次:Python 真有趣!")
运行:
python3 repeat.py
你会看到:
第 1 次:Python 真有趣!
第 2 次:Python 真有趣!
第 3 次:Python 真有趣!
第 4 次:Python 真有趣!
第 5 次:Python 真有趣!
这就是循环:让一段代码重复执行。
为什么需要循环?
如果没有循环,想输出 5 次内容,你可能会这样写:
print("第 1 次:Python 真有趣!")
print("第 2 次:Python 真有趣!")
print("第 3 次:Python 真有趣!")
print("第 4 次:Python 真有趣!")
print("第 5 次:Python 真有趣!")
如果要输出 100 次,就很痛苦。
使用循环:
for i in range(1, 101):
print(f"第 {i} 次:Python 真有趣!")
代码更短,也更容易修改。
for 循环
for 循环适合“知道要处理哪些东西”的场景。
遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
输出:
我喜欢吃苹果
我喜欢吃香蕉
我喜欢吃橙子
我喜欢吃葡萄
可以这样理解:
fruits是一组水果fruit每次拿到其中一个水果- 循环体里的代码会对每个水果执行一次
range() 生成数字
range() 常用来生成一串数字。
for i in range(5):
print(i)
输出:
0
1
2
3
4
注意:range(5) 从 0 开始,到 4 结束,不包含 5。
更常见的写法:
for i in range(1, 6):
print(i)
输出:
1
2
3
4
5
带步长:
for i in range(0, 10, 2):
print(i)
输出:
0
2
4
6
8
逐行拆解
for i in range(1, 6):
print(f"第 {i} 次")
第一行:
for i in range(1, 6):
意思是:让变量 i 依次拿到 1, 2, 3, 4, 5。
第二行:
print(f"第 {i} 次")
前面有 4 个空格,表示这行代码属于循环体。循环体会重复执行。
如果忘记缩进,代码会报错。
遍历字典
字典里有键和值:
user = {"name": "马哥", "age": 30, "city": "成都"}
遍历键:
for key in user:
print(key)
遍历值:
for value in user.values():
print(value)
同时遍历键和值:
for key, value in user.items():
print(f"{key}: {value}")
刚入门时,记住最常用的是 .items()。
enumerate():同时拿到编号和值
如果你想给列表加序号,可以用 enumerate():
names = ["Alice", "Bob", "Charlie"]
for i, name in enumerate(names, start=1):
print(f"{i}. {name}")
输出:
1. Alice
2. Bob
3. Charlie
这比自己写 range(len(names)) 更清楚。
zip():并排处理两组数据
如果两个列表一一对应,可以用 zip():
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score} 分")
输出:
Alice: 85 分
Bob: 92 分
Charlie: 78 分
while 循环
while 循环适合“不知道要循环几次,只知道什么时候停”的场景。
count = 1
while count <= 5:
print(f"第 {count} 次")
count += 1
输出:
第 1 次
第 2 次
第 3 次
第 4 次
第 5 次
while count <= 5 的意思是:只要 count 小于等于 5,就继续执行循环。
count += 1 很重要。它会让 count 每次加 1。没有这一行,循环可能永远停不下来。
for 和 while 怎么选?
已知要处理一组数据,通常用 for:
for fruit in ["苹果", "香蕉", "橙子"]:
print(fruit)
已知要循环几次,通常也用 for:
for i in range(10):
print(i)
不知道要循环几次,只知道满足某个条件才停,通常用 while:
password = ""
while password != "123456":
password = input("请输入密码:")
print("登录成功")
含有 input() 的代码建议在本机终端运行。网页里的“运行”按钮不适合交互式输入。
break 和 continue
break:立刻结束整个循环
for i in range(1, 10):
if i == 5:
break
print(i)
输出:
1
2
3
4
当 i == 5 时,break 会直接结束循环。
continue:跳过本次,继续下一次
for i in range(1, 6):
if i == 3:
continue
print(i)
输出:
1
2
4
5
当 i == 3 时,continue 会跳过这一次,不执行后面的 print(i)。
实战 1:九九乘法表
先看完整代码:
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i * j:2d}", end=" ")
print()
输出大概是:
1×1= 1
1×2= 2 2×2= 4
1×3= 3 2×3= 6 3×3= 9
...
这里用了嵌套循环:
- 外层循环控制行数
- 内层循环控制每一行输出几个算式
print()用来换行
刚开始看嵌套循环会有点绕,这是正常的。你可以先把 range(1, 10) 改成 range(1, 4),只输出前三行,更容易观察。
实战 2:猜数字游戏
这个例子适合在本机终端运行:
import random
target = random.randint(1, 20)
attempts = 0
max_attempts = 5
print("猜数字游戏:答案在 1 到 20 之间")
while attempts < max_attempts:
guess = int(input("请输入你猜的数字:"))
attempts += 1
if guess < target:
print("太小了")
elif guess > target:
print("太大了")
else:
print(f"猜对了!你用了 {attempts} 次")
break
else:
print(f"机会用完了,答案是 {target}")
这个程序用到了:
while:只要次数没用完,就继续猜input():读取用户输入int():把输入的字符串转成整数break:猜对后立刻结束循环
了解即可:for/else
Python 的循环可以带 else。当循环没有被 break 打断时,else 会执行。
names = ["Alice", "Bob", "Charlie"]
for name in names:
if name == "马哥":
print("找到了")
break
else:
print("没找到")
这个语法不必一开始就熟练使用。先知道它存在即可。
自己改一改
改造 1:倒计时
写一个倒计时:
5
4
3
2
1
开始!
提示:可以使用 range(5, 0, -1)。
改造 2:只输出偶数
输出 1 到 20 之间的偶数。
提示:可以使用 % 判断是否能被 2 整除。
改造 3:水果清单
给下面列表加编号输出:
fruits = ["苹果", "香蕉", "橙子"]
目标输出:
1. 苹果
2. 香蕉
3. 橙子
常见错误
1. 忘记冒号
错误写法:
for i in range(5)
print(i)
正确写法:
for i in range(5):
print(i)
2. 缩进不对
错误写法:
for i in range(5):
print(i)
正确写法:
for i in range(5):
print(i)
3. while 忘记更新条件
下面这段会一直运行:
count = 1
while count <= 5:
print(count)
应该加上:
count = 1
while count <= 5:
print(count)
count += 1
4. range 的结束值不包含
for i in range(1, 5):
print(i)
输出的是 1, 2, 3, 4,不包含 5。
参考答案
倒计时:
for i in range(5, 0, -1):
print(i)
print("开始!")
只输出偶数:
for i in range(1, 21):
if i % 2 == 0:
print(i)
水果清单:
fruits = ["苹果", "香蕉", "橙子"]
for i, fruit in enumerate(fruits, start=1):
print(f"{i}. {fruit}")
小结
这一节你学会了:
- 循环可以让代码重复执行
for适合遍历一组数据,或者循环固定次数while适合不知道次数、只知道停止条件的场景range()可以生成数字序列break用来结束循环,continue用来跳过本次循环- 嵌套循环可以写出九九乘法表
下一节我们会学习异常处理。它可以让程序遇到输入错误、文件错误时,不至于直接崩掉。
循环有点绕,但绕明白了就很省力
第一次看 for 和 while,脑子打个结很正常。马哥建议你先改 range() 的数字,观察输出怎么变;再把水果、名字、分数都放进去转一圈。重复的事交给循环,人就可以少当复读机。
还没有评论,来抢沙发吧!