Python: 循环结构

写代码时,你经常会遇到这样的场景:重复做同一件事。比如,打印 1 到 100 的数字、处理列表中的每一个元素、或者不断询问用户输入直到得到正确答案。

如果用手写,100 个数字就要写 100 行 print(),显然不现实。这时候就需要 循环 来帮忙了。Python 提供了两种循环方式:


1. for 循环基础

for 循环是 Python 中最常用的循环形式。它的核心思想是:从序列中逐个取出元素,每次都执行一遍相同的代码块

基本语法:

TEXT 📖 仅展示
for 变量 in 序列:
    要重复执行的代码

变量会依次被赋值为序列中的每一个元素,然后执行缩进块中的代码。

▶ 示例:遍历列表和字符串(⭐)

PYTHON
# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
    print(f"我喜欢吃 {fruit}")

print("---")

# 遍历字符串 —— 每个字符依次输出
for char in "Python":
    print(char)
▶ 试一试

输出:

TEXT 📖 仅展示
我喜欢吃 苹果
我喜欢吃 香蕉
我喜欢吃 橙子
我喜欢吃 葡萄
---
P
y
t
h
o
n
💡 命名技巧:循环变量用单数形式命名。列表是 fruits,变量就用 fruit;列表是 students,变量就用 student。代码读起来就像自然语言一样顺畅。



2. range() 函数 —— 生成数字序列

当你需要重复执行固定次数时,range() 是最佳搭档。

range() 有三种用法:

写法 含义 示例 结果
range(stop) 0 → stop-1 range(5) 0,1,2,3,4
range(start, stop) start → stop-1 range(2, 6) 2,3,4,5
range(start, stop, step) 带步长 range(1, 10, 2) 1,3,5,7,9

注意:range() 生成的序列不包含 stop 值,和切片规则一致,都是"顾头不顾尾"。

▶ 示例:用 range 控制循环次数(⭐)

PYTHON
# 打印 1 到 5
for i in range(1, 6):
    print(f"第 {i} 次循环")

print("---")

# 步长为 2:打印 0 到 10 的偶数
for i in range(0, 11, 2):
    print(i, end=" ")  # end=" " 让输出不换行
# 输出: 0 2 4 6 8 10
▶ 试一试

输出:

TEXT 📖 仅展示
---

▶ 示例:结合 range 和 len 遍历列表下标(⭐⭐)

PYTHON
students = ["Charlie", "Diana", "Eric", "Grace"]

# 同时获取下标和元素
for i in range(len(students)):
    print(f"第 {i + 1} 号同学:{students[i]}")
▶ 试一试

输出:

TEXT 📖 仅展示
第 1 号同学:Charlie
第 2 号同学:Diana
第 3 号同学:Eric
第 4 号同学:Grace
💡 更优雅的方式:在 Python 中,如果需要同时拿到下标和元素,推荐用 enumerate(),我们会在后面的课程中讲到。



3. while 循环

while 循环和 for 循环的区别在于:for 知道要循环多少次,while 只知道什么时候停止

基本语法:

TEXT 📖 仅展示
while 条件:
    要重复执行的代码

每次循环开始前,先判断条件是否为 True,如果是就执行代码块,执行完再回来判断……直到条件变成 False

▶ 示例:猜数字前的准备工作——倒计时(⭐)

PYTHON
count = 5
while count > 0:
    print(f"倒计时:{count}")
    count -= 1  # 每次减 1,非常重要!不然会死循环

print("发射!🚀")
▶ 试一试

输出:

TEXT 📖 仅展示
倒计时:5
倒计时:4
倒计时:3
倒计时:2
倒计时:1
发射!🚀
⚠️ 死循环警告:如果忘记写 count -= 1,条件 count > 0 永远为 True,程序就会无限循环下去,直到你强制终止。写 while 循环时,一定要确认循环条件能在某个时刻变成 False

▶ 示例:while 的典型用法——直到遇到特定值(⭐⭐)

PYTHON
# 不断取半,直到小于 1
num = 100
while num >= 1:
    print(num, end=" → ")
    num /= 2
# 输出: 100 → 50.0 → 25.0 → 12.5 → 6.25 → 3.125 → 1.5625 → 0.78125
▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

这个例子很好地展示了 while 的优势:我们事先不知道需要循环多少次,只知道什么时候停下来。



4. breakcontinue —— 循环的"刹车"与"跳过"

(1) break —— 立即结束循环

当某个条件满足时,用 break 可以直接跳出整个循环,不再执行后面的循环。

(2) continue —— 跳过本次循环

当某个条件满足时,用 continue 可以跳过本次循环的剩余代码,直接进入下一次循环。

▶ 示例:break 和 continue 对比(⭐)

PYTHON
print("=== break 示例 ===")
for i in range(1, 10):
    if i == 5:
        break  # 遇到 5 就彻底结束
    print(i, end=" ")
# 输出: 1 2 3 4

print("\n=== continue 示例 ===")
for i in range(1, 10):
    if i == 5:
        continue  # 跳过 5,继续后面的
    print(i, end=" ")
# 输出: 1 2 3 4 6 7 8 9
▶ 试一试

输出:

TEXT 📖 仅展示
=== break 示例 ===
\n=== continue 示例 ===

▶ 示例:break 的实战——搜索即停止(⭐⭐)

PYTHON
# 在列表中搜索第一个偶数
numbers = [3, 7, 9, 2, 5, 8, 1]

for num in numbers:
    if num % 2 == 0:
        print(f"找到第一个偶数:{num}")
        break  # 找到就不找了
else:
    print("列表中没有偶数")  # 注意:这个 else 属于 for,后面会讲
▶ 试一试

输出:

TEXT 📖 仅展示
列表中没有偶数

▶ 示例:continue 的实战——只处理有效数据(⭐⭐)

PYTHON
# 只处理正数,跳过负数和零
data = [3, -5, 0, 8, -2, 7, 0, 4]
positive_sum = 0

for num in data:
    if num <= 0:
        continue  # 跳过无效数据
    positive_sum += num

print(f"正数之和为:{positive_sum}")  # 输出: 22 (3+8+7+4)
▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功


5. for-elsewhile-else —— 循环的"正常结束奖励"

这是 Python 一个特有的语法特性,其他很多语言中没有。

else 块在循环正常结束(没有被 break 中断)时执行。可以理解为:"如果循环没有被中途打断,就执行这个奖励代码"。

▶ 示例:检查数字是否为质数(⭐⭐)

PYTHON
num = 17

for i in range(2, num):
    if num % i == 0:
        print(f"{num} 不是质数,能被 {i} 整除")
        break
else:
    print(f"{num} 是质数!")  # 没有 break 才会执行
▶ 试一试

输出:

TEXT 📖 仅展示
# 执行成功

在这个例子中:

💡 很多初学者觉得 for-else 有点反直觉。你可以这样记:else 的意思是 "如果没有 break 的话,就……"



6. 嵌套循环

循环里面再套循环,就是嵌套循环。外层循环每执行一次,内层循环会完整地执行一轮

▶ 示例:打印九九乘法表(⭐⭐)

PYTHON
for i in range(1, 10):        # 外层循环:行
    for j in range(1, i + 1):  # 内层循环:列
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # 每行结束后换行
▶ 试一试

输出:

TEXT 📖 仅展示
1×1=1
1×2=2    2×2=4
1×3=3    2×3=6    3×3=9
1×4=4    2×4=8    3×4=12   4×4=16
1×5=5    2×5=10   3×5=15   4×5=20   5×5=25
1×6=6    2×6=12   3×6=18   4×6=24   5×6=30   6×6=36
1×7=7    2×7=14   3×7=21   4×7=28   5×7=35   6×7=42   7×7=49
1×8=8    2×8=16   3×8=24   4×8=32   5×8=40   6×8=48   7×8=56   8×8=64
1×9=9    2×9=18   3×9=27   4×9=36   5×9=45   6×9=54   7×9=63   8×9=72   9×9=81
⚠️ 性能提示:嵌套循环的总执行次数 = 外层次数 × 内层次数。n 层嵌套就是 n 次方级别。三层以上嵌套要格外小心,数据量大时执行时间会暴增。

▶ 示例:嵌套循环的 break 只作用于当前层(⭐⭐)

PYTHON
for i in range(1, 4):
    for j in range(1, 10):
        if j > i:
            break  # 只跳出内层循环
        print(f"({i},{j})", end=" ")
    print()
▶ 试一试

输出:

TEXT 📖 仅展示
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)


7. 综合示例

▶ 示例 1:猜数字游戏(⭐⭐)

系统随机生成一个 1~100 之间的数字,玩家猜测,系统提示"大了"或"小了",直到猜中为止。

TEXT 📖 仅展示
import random

# 生成随机目标数字
target = random.randint(1, 100)
attempts = 0

print("🎯 猜数字游戏!我心中有一个 1~100 之间的数字。")

while True:  # 无限循环,靠 break 退出
    try:
        guess = int(input("请输入你的猜测:"))
    except ValueError:
        print("请输入有效的数字!")
        continue

    attempts += 1

    if guess < target:
        print("小了,再大一点!")
    elif guess > target:
        print("大了,再小一点!")
    else:
        print(f"🎉 恭喜你猜对了!就是 {target}!")
        print(f"你一共猜了 {attempts} 次。")
        break  # 猜中后退出循环

关键点分析:

▶ 示例 2:密码强度检测器(⭐⭐⭐)

根据用户输入的密码,逐项检查并给出强度评分。

PYTHON
password = input("请输入密码:")
score = 0
feedback = []

# 1. 检查长度
if len(password) >= 8:
    score += 1
else:
    feedback.append("❌ 密码长度不足 8 位")

# 2. 遍历检查字符类型
has_upper = False
has_lower = False
has_digit = False
has_special = False
special_chars = "!@#$%^&*"

for char in password:
    if char.isupper():
        has_upper = True
    elif char.islower():
        has_lower = True
    elif char.isdigit():
        has_digit = True
    elif char in special_chars:
        has_special = True

# 根据检查结果评分
checks = [has_upper, has_lower, has_digit, has_special]
score += sum(checks)

if not has_upper:
    feedback.append("❌ 缺少大写字母")
if not has_lower:
    feedback.append("❌ 缺少小写字母")
if not has_digit:
    feedback.append("❌ 缺少数字")
if not has_special:
    feedback.append("❌ 缺少特殊字符")

# 3. 输出结果
print(f"\n密码强度评分:{score}/5")
if feedback:
    print("改进建议:")
    for item in feedback:
        print(f"  {item}")
else:
    print("🎉 密码强度优秀!")
▶ 试一试

运行示例:

TEXT 📖 仅展示
请输入密码:Hello123
密码强度评分:3/5
改进建议:
  ❌ 缺少特殊字符
TEXT 📖 仅展示
请输入密码:P@ssw0rd!
密码强度评分:5/5
🎉 密码强度优秀!

这个示例综合运用了 for 循环遍历字符串、sum() 统计布尔值、以及循环中的条件判断。每个字符依次过检,体现了"遍历处理"的编程思维。



8. 常见应用场景

场景 推荐循环 说明
遍历列表/元组/集合 for 元素逐个处理
遍历字典的键值对 for 配合 .items()
重复 N 次操作 for + range() 次数明确
直到条件满足才停止 while 次数不确定
读取文件直到末尾 for / while 文件对象可迭代
用户输入验证 while + break 直到输入合法
无限循环(服务器、游戏主循环) while True 靠 break 退出

❓ 常见问题

Q forwhile 到底怎么选?
A 知道循环次数(遍历列表/range/字符串)用 for;知道什么时候停(等待输入/逼近值)用 while。两者往往可以互换,但选对的那一方代码更清晰。
Q for i in range(len(list)) 是 Python 风格吗?
A 不算。Python 推崇直接遍历元素 for item in list。只有确实需要下标时才用 range(len(...)),这种情况用 enumerate() 更优雅。
Q 嵌套循环太多层怎么办?
A 嵌套超过 3 层可读性会大幅下降。解决办法:把内层循环封装成函数、用 itertools 简化组合、或重新思考是否有更优的算法。

📖 小节


📝 作业

⭐ 第一题:偶数求和

使用 for 循环和 range(),计算 1 到 100 之间所有偶数的和。

提示:range(2, 101, 2) 一步到位。

⭐⭐ 第二题:斐波那契数列

斐波那契数列的定义:前两个数都是 1,从第三个数开始,每个数等于前两个数之和。 即:1, 1, 2, 3, 5, 8, 13, 21, ...

请用 while 循环,输出斐波那契数列中不超过 1000 的所有项。

提示:用三个变量 a, b 表示当前两个数,每次计算 a + b 得到下一个数,然后向前滚动。

⭐⭐⭐ 第三题:简易计算器

编写一个程序,让用户反复输入两个数字和一个运算符(+、-、*、/),输出计算结果。 输入 q 退出程序。

要求:

  1. 使用 while Truebreak
  2. 处理除零错误(除数不能为 0)
  3. 处理无效运算符(打印提示,不退出)
  4. 使用 continue 让程序在输入无效时重新询问,而不是崩溃

示例运行:

TEXT 📖 仅展示
输入第一个数字:10
输入运算符(+ - * /):/
输入第二个数字:3
= 3.333...

输入第一个数字:8
输入运算符(+ - * /):%
无效的运算符,请使用 + - * /

输入第一个数字:8
输入运算符(+ - * /):/
输入第二个数字:0
错误:除数不能为 0

输入第一个数字:q
再见!
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏