Python篇 第三章:循环结构
"重复是学习的母亲,也是效率的源泉。让循环帮你自动化一切重复的工作!"
上一章我们学会了让程序做选择。这一章,我们将学习循环——让程序能够重复执行某些操作。想象一下,如果你要让程序打印100次"Hello",难道要写100行print吗?当然不用!用循环,3行代码就够了。
一、为什么需要循环?
🤔 生活中的重复
生活中充满了重复:
这些重复的事情,在编程中都可以用循环来实现。
💡 程序中的重复
不用循环(糟糕的做法):
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 条件:# 条件为真时重复执行# 注意缩进!
关键点:
- ⚠️ 要确保条件最终会变为 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
五、循环嵌套
🏠 循环里面还有循环
就像大盒子套小盒子:
# 打印一个简单的矩形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]
九、综合项目:学生成绩管理系统
📝 项目功能
📝 完整代码
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... |
📝 课后作业
必做题
- 编写程序:计算阶乘(如 5! = 5×4×3×2×1 = 120)
- 编写程序:判断一个字符串是否是回文(正读反读相同,如"level")
选做题
- 打印斐波那契数列的前20个数(1, 1, 2, 3, 5, 8, 13...)
- 制作倒计时器:输入秒数,显示倒计时,到0时播放提示音
思考题
- for 循环和 while 循环有什么区别?什么时候用哪个?
🚀 预告下一章
第四章我们将学习 《列表与字典——数据的组织艺术》,你将学会:
准备好让你的程序处理大量数据了吗?我们下节课见!
记住:循环是自动化的核心。掌握了循环,你就掌握了让计算机为你工作的秘诀!🔄✨