第二章 · 流程控制

循环

本节目标

学完这一节,你会知道:

  1. 为什么程序需要循环
  2. for 循环适合什么场景
  3. while 循环适合什么场景
  4. 如何用 breakcontinue 控制循环
  5. 如何写出九九乘法表和猜数字游戏

这一节最重要的是:看到重复的事情,就想想能不能交给循环。

先跑一个例子

新建文件 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}")

小结

这一节你学会了:

  1. 循环可以让代码重复执行
  2. for 适合遍历一组数据,或者循环固定次数
  3. while 适合不知道次数、只知道停止条件的场景
  4. range() 可以生成数字序列
  5. break 用来结束循环,continue 用来跳过本次循环
  6. 嵌套循环可以写出九九乘法表

下一节我们会学习异常处理。它可以让程序遇到输入错误、文件错误时,不至于直接崩掉。

循环有点绕,但绕明白了就很省力

第一次看 for 和 while,脑子打个结很正常。马哥建议你先改 range() 的数字,观察输出怎么变;再把水果、名字、分数都放进去转一圈。重复的事交给循环,人就可以少当复读机。

讨论 (0)

还没有评论,来抢沙发吧!