当前位置:首页>python>Python篇 第三章:循环结构——让程序不知疲倦地工作

Python篇 第三章:循环结构——让程序不知疲倦地工作

  • 2026-09-09 08:53:32
Python篇 第三章:循环结构——让程序不知疲倦地工作

Python篇 第三章:循环结构

"重复是学习的母亲,也是效率的源泉。让循环帮你自动化一切重复的工作!"

上一章我们学会了让程序做选择。这一章,我们将学习循环——让程序能够重复执行某些操作。想象一下,如果你要让程序打印100次"Hello",难道要写100行print吗?当然不用!用循环,3行代码就够了。


一、为什么需要循环?

🤔 生活中的重复

生活中充满了重复:

  • 🏃 每天跑步10圈(重复10次)
  • 📚 背诵课文5遍(重复5次)
  • 🍎 数篮子里的苹果(直到数完为止)
  • 🔍 在人群中找朋友(直到找到为止)

这些重复的事情,在编程中都可以用循环来实现。

💡 程序中的重复

不用循环(糟糕的做法):

print("Happy Birthday!")print("Happy Birthday!")print("Happy Birthday!")# ... 重复100次

用循环(优雅的写法):

for i inrange(100):print("Happy Birthday!")

好处:

  • ✅ 代码更短
  • ✅ 容易修改(改一处就行)
  • ✅ 不容易出错
  • ✅ 可以处理不确定次数的情况

二、for 循环——遍历的力量

📝 基本语法

for 变量 in 可迭代对象:# 重复执行的代码# 注意缩进!

🔢 range() 函数——生成数字序列

range() 是 for 循环的好伙伴,用来生成一串数字。

三种用法:

# 用法1:range(结束) —— 从0开始到结束-1for i inrange(5):print(i)# 输出:0, 1, 2, 3, 4# 用法2:range(开始, 结束) —— 从开始到结束-1for i inrange(1, 6):print(i)# 输出:1, 2, 3, 4, 5# 用法3:range(开始, 结束, 步长) —— 每隔几个取一个for i inrange(0, 10, 2):print(i)# 输出:0, 2, 4, 6, 8

记忆口诀:

"前包后不包" —— 包含开始的数字,不包含结束的数字

🎯 实战:打印乘法表

# 打印5的乘法表print("5的乘法表:")for i inrange(1, 10):    result = 5 * iprint(f"5 × {i} = {result}")

输出:

5的乘法表:5 × 1 = 55 × 2 = 105 × 3 = 15...5 × 9 = 45

🎯 实战:计算累加和

# 计算 1+2+3+...+100sum = 0for i inrange(1, 101):sum = sum + i# 简写:sum += iprint(f"1到100的和是:{sum}")  # 5050

理解过程:

初始:sum = 0i=1:  sum = 0 + 1 = 1i=2:  sum = 1 + 2 = 3i=3:  sum = 3 + 3 = 6...i=100: sum = 4950 + 100 = 5050

三、while 循环——条件驱动

📝 基本语法

while 条件:# 条件为真时重复执行# 注意缩进!

关键点:

  • 先检查条件,再执行
  • 条件为 True 就继续循环
  • 条件为 False 就退出循环
  • ⚠️ 要确保条件最终会变为 False,否则会无限循环!

🎯 实战:用户输入验证

password = ""while password != "123456":    password = input("请输入密码:")if password != "123456":print("密码错误,请重试!")print("密码正确,欢迎进入!")

🎯 实战:猜数字游戏(完整版)

import randomsecret = random.randint(1, 100)attempts = 0max_attempts = 7print("我想了一个1-100的数字,你来猜!")while attempts < max_attempts:    guess = int(input(f"第{attempts + 1}次猜测:"))    attempts += 1if guess == secret:print(f"🎉 恭喜你,猜对了!用了{attempts}次")breakelif guess < secret:print("📈 太小了!")else:print("📉 太大了!")print(f"还剩{max_attempts - attempts}次机会")else:print(f"😢 机会用完了!答案是{secret}")

四、循环控制语句

🛑 break——立即退出循环

遇到 break,循环马上结束,跳到循环后面的代码。

# 找第一个能被7整除的数for i inrange(1, 100):if i % 7 == 0:print(f"找到了!{i}")breakprint(f"{i}不能被7整除")print("循环结束")

输出:

1不能被7整除2不能被7整除...6不能被7整除找到了!7循环结束

⏭️ continue——跳过本次循环

遇到 continue,跳过本次循环剩下的代码,直接进入下一次循环。

# 打印1-10中的奇数for i inrange(1, 11):if i % 2 == 0:      # 如果是偶数continue# 跳过,不打印print(i)# 输出:1, 3, 5, 7, 9

🆚 break vs continue

语句
作用
比喻
break
完全退出循环
直接离开教室
continue
跳过本次,继续下次
这节课不听,下节课再来

五、循环嵌套

🏠 循环里面还有循环

就像大盒子套小盒子:

# 打印一个简单的矩形for i inrange(3):          # 外层:3行for j inrange(5):      # 内层:每行5个print("*", end="")  # end="" 表示不换行print()                 # 换行

输出:

***************

执行过程:

i=0: j=0 j=1 j=2 j=3 j=4 → 打印 *****i=1: j=0 j=1 j=2 j=3 j=4 → 打印 *****i=2: j=0 j=1 j=2 j=3 j=4 → 打印 *****

🎯 实战:九九乘法表

# 打印九九乘法表for i inrange(1, 10):          # 被乘数for j inrange(1, i + 1):   # 乘数(只打印到被乘数)print(f"{j}×{i}={i*j}", end="\t")print()  # 换行

输出:

1×1=11×2=2 2×2=41×3=3 2×3=6 3×3=9...

🎯 实战:打印三角形

# 打印直角三角形height = 5for i inrange(1, height + 1):# 打印空格for j inrange(height - i):print(" ", end="")# 打印星星for k inrange(2 * i - 1):print("*", end="")print()

输出:

    *   ***  ***** ****************

六、遍历字符串和列表

📝 for 循环的强大之处

for 循环不仅可以遍历数字,还可以遍历任何可迭代对象。

🔤 遍历字符串

word = "Python"for char in word:print(char)# 输出:# P# y# t# h# o# n

实战:统计元音字母

text = "Hello World"vowels = "aeiouAEIOU"count = 0for char in text:if char in vowels:        count += 1print(f"元音字母有{count}个")  # 3个

📋 遍历列表

fruits = ["苹果", "香蕉", "橙子", "葡萄"]for fruit in fruits:print(f"我喜欢吃{fruit}")# 输出:# 我喜欢吃苹果# 我喜欢吃香蕉# ...

同时获取索引和值:

fruits = ["苹果", "香蕉", "橙子"]for index, fruit inenumerate(fruits):print(f"{index + 1}. {fruit}")# 输出:# 1. 苹果# 2. 香蕉# 3. 橙子

七、循环中的 else 子句

🔄 特殊的用法

Python 的循环可以带 else 子句,当循环正常结束(没有被 break)时执行。

for i inrange(5):print(i)else:print("循环正常结束")# 输出:# 0# 1# 2# 3# 4# 循环正常结束

🎯 实战:判断质数

num = int(input("请输入一个正整数:"))if num < 2:print(f"{num}不是质数")else:for i inrange(2, num):if num % i == 0:print(f"{num}不是质数,可以被{i}整除")breakelse:# 循环正常结束,说明没有找到因数print(f"{num}是质数!")

八、常见错误与调试

❌ 错误1:无限循环

# ❌ 危险!永远不会停止whileTrue:print("停不下来!")# ✅ 正确的做法:确保条件会改变n = 5while n > 0:print(n)    n -= 1# 逐渐减少

❌ 错误2:忘记缩进

for i inrange(5):print(i)    # ❌ 没有缩进# IndentationError: expected an indented block

❌ 错误3:修改循环变量

# ❌ 不好的习惯for i inrange(5):print(i)    i += 2# 修改循环变量没用!# ✅ 如果需要控制步长,用 range 的第三个参数for i inrange(0, 10, 2):print(i)  # 0, 2, 4, 6, 8

❌ 错误4:在循环中修改正在遍历的列表

# ❌ 危险!可能导致意外结果numbers = [1, 2, 3, 4, 5]for n in numbers:if n % 2 == 0:        numbers.remove(n)  # 删除元素# ✅ 正确做法:创建新列表numbers = [1, 2, 3, 4, 5]numbers = [n for n in numbers if n % 2 != 0]

九、综合项目:学生成绩管理系统

📝 项目功能

  1. 输入多个学生的成绩
  2. 计算平均分、最高分、最低分
  3. 统计各分数段人数
  4. 显示成绩分布图

📝 完整代码

print("=" * 50)print("📊 学生成绩管理系统")print("=" * 50)# 存储成绩scores = []# 输入成绩whileTrue:    score_input = input("请输入学生成绩(输入q结束):")if score_input.lower() == 'q':breaktry:        score = float(score_input)if0 <= score <= 100:            scores.append(score)print(f"已记录,当前共{len(scores)}人")else:print("⚠️ 成绩应在0-100之间")except ValueError:print("⚠️ 请输入有效的数字")iflen(scores) == 0:print("没有录入成绩")else:# 计算统计数据    total = sum(scores)    average = total / len(scores)    highest = max(scores)    lowest = min(scores)print("\n" + "=" * 50)print("📈 统计结果")print("=" * 50)print(f"总人数:{len(scores)}")print(f"平均分:{average:.2f}")print(f"最高分:{highest}")print(f"最低分:{lowest}")# 统计各分数段    ranges = {"优秀(90-100)": 0,"良好(80-89)": 0,"中等(70-79)": 0,"及格(60-69)": 0,"不及格(<60)": 0    }for score in scores:if score >= 90:            ranges["优秀(90-100)"] += 1elif score >= 80:            ranges["良好(80-89)"] += 1elif score >= 70:            ranges["中等(70-79)"] += 1elif score >= 60:            ranges["及格(60-69)"] += 1else:            ranges["不及格(<60)"] += 1print("\n📊 分数段分布:")for range_name, count in ranges.items():        percentage = count / len(scores) * 100        bar = "█" * int(percentage / 2)print(f"{range_name}: {count}人 ({percentage:.1f}%) {bar}")

运行示例:

==================================================📊 学生成绩管理系统==================================================请输入学生成绩(输入q结束):85已记录,当前共1人请输入学生成绩(输入q结束):92已记录,当前共2人请输入学生成绩(输入q结束):78已记录,当前共3人请输入学生成绩(输入q结束):q==================================================📈 统计结果==================================================总人数:3平均分:85.00最高分:92最低分:78📊 分数段分布:优秀(90-100): 1人 (33.3%) ████████████████良好(80-89): 1人 (33.3%) ████████████████中等(70-79): 1人 (33.3%) ████████████████及格(60-69): 0人 (0.0%)不及格(<60): 0人 (0.0%)

十、本章知识点总结

知识点
内容
示例
for 循环
遍历可迭代对象
for i in range(5):
range()
生成数字序列
range(1, 10, 2)
while 循环
条件为真时循环
while n > 0:
break
退出循环
break
continue
跳过本次
continue
嵌套循环
循环里有循环
for...for...
循环+else
正常结束时执行
for...else...

📝 课后作业

必做题

  1. 编写程序:打印1-100中的所有偶数
  2. 编写程序:计算阶乘(如 5! = 5×4×3×2×1 = 120)
  3. 编写程序:判断一个字符串是否是回文(正读反读相同,如"level")

选做题

  1. 打印斐波那契数列的前20个数(1, 1, 2, 3, 5, 8, 13...)
  2. 制作倒计时器:输入秒数,显示倒计时,到0时播放提示音
  3. 完善学生成绩系统:添加保存到文件的功能

思考题

  1. for 循环和 while 循环有什么区别?什么时候用哪个?
  2. 如何避免写出无限循环?
  3. 你能想到生活中哪些事情可以用循环来编程实现?

🚀 预告下一章

第四章我们将学习 《列表与字典——数据的组织艺术》,你将学会:

  • 列表的增删改查
  • 列表推导式
  • 字典的使用
  • 数据的排序和筛选

准备好让你的程序处理大量数据了吗?我们下节课见!


记住:循环是自动化的核心。掌握了循环,你就掌握了让计算机为你工作的秘诀!🔄✨

最新文章

随机文章