循环语句
引言
在前面的章节中,我们学习了顺序语句和条件语句。顺序语句让程序按顺序执行,条件语句让程序根据不同情况做不同决定。
但是,如果需要重复做某些事情呢?
想象一下:
- 老师让你把“我要好好学习“这句话写100遍
- 你要帮妈妈数一共有多少颗糖果
- 计算从1加到100的和
- 画一个正方形,要画4条边
这些都需要重复执行相同的操作。在Python中,我们用循环语句来实现这种功能。
这一章,我们将学习:
- 什么是循环
- while循环(条件循环)
- for循环(计数循环)
- 循环嵌套(循环中的循环)
- break和continue(控制循环)
- 用循环解决实际问题
为什么需要循环
让我们先看一个例子:假设我们要打印5次“Python真有趣!“。
不用循环的方法
print("Python真有趣!")
print("Python真有趣!")
print("Python真有趣!")
print("Python真有趣!")
print("Python真有趣!")
问题:
- 需要写很多重复的代码
- 如果要打印100次,会非常麻烦
- 代码容易出错,难以维护
用循环的方法
# 用循环打印5次
count = 0
while count < 5:
print("Python真有趣!")
count = count + 1
优势:
- 代码简洁,只写一次
- 想打印多少次都可以,只需修改条件
- 容易维护和修改
给家长的小贴士:
- 用生活中的例子解释循环:绕操场跑圈、抄写生字、数数
- 强调循环的好处:省时、省力、不容易出错
- 可以让孩子想想生活中有哪些“重复“的事情
💡 计算机为什么擅长重复工作?
CPU的“超能力“——重复执行
在第6章,我们学习了CPU是如何执行指令的:
- 取指令→译码→执行→重复
现在,我们要学习循环,这正好发挥了CPU最强大的能力——高速重复执行!
比喻时间 🎯 想象你和计算机比赛抄写生字:
- 你:抄写100遍“我要好好学习“,需要1-2小时,手会酸
- CPU:每秒能执行几十亿次运算,100遍对它来说不到0.000001秒!
数学小挑战 🧮 让我们算一算CPU有多快:
示例:假设有一个1GHz的CPU(每秒执行10亿次运算)
- 每秒能执行:1,000,000,000次运算
- 执行100次简单循环需要:100 ÷ 1,000,000,000 = 0.0000001秒!
- 执行1,000,000次(100万次)需要:0.001秒!
- 执行1,000,000,000次(10亿次)需要:1秒
# 让我们感受一下CPU的速度
import time
# 测试:执行1000次循环
start = time.time() # 记录开始时间
for i in range(1000):
result = i * 2 # 简单的乘法
end = time.time() # 记录结束时间
print(f"执行1000次循环用时:{(end - start) * 1000:.4f}毫秒")
print(f"如果每秒能执行10亿次运算,1000次只需要0.000001秒!")
运行结果(因电脑而异):
执行1000次循环用时:0.0980毫秒
如果每秒能执行10亿次运算,1000次只需要0.000001秒!
👨🏫 给家长的Tips
知识点补充(针对家长):
- CPU主频(如2GHz、3GHz)表示每秒的时钟周期数
- 1GHz = 10亿个周期/秒,3GHz = 30亿个周期/秒
- 每个周期可能执行1-4条指令(现代CPU有指令级并行)
- 所以一个3GHz CPU理论上每秒可执行几十亿到上百亿条指令!
如何给孩子讲解:
- 不需要深入技术细节
- 重点让孩子理解:计算机不怕重复,速度极快
- 用“抄写生字“的类比:人讨厌重复,但计算机擅长重复
- 这就是为什么我们用循环——让计算机发挥它的“超能力“!
为什么计算机适合做重复性工作?
人类 vs 计算机:
| 任务 | 人类 | 计算机 |
|---|---|---|
| 抄写100遍生字 | 1-2小时,手酸,无聊 | 不到0.001秒,不会累 |
| 数1到100万 | 几天,数错概率高 | 不到1秒,100%准确 |
| 搜索1000个名字 | 几十分钟,会疲劳 | 不到0.1秒,不会错 |
| 画1000个正方形 | 几小时,画得不一样 | 几秒钟,一模一样 |
人类的优势:
- ✅ 创造力(画画、写作、发明)
- ✅ 情感理解(理解笑话、安慰人)
- ✅ 灵活适应(处理突发情况)
计算机的优势:
- ✅ 高速重复(不嫌累、不嫌烦)
- ✅ 精确无误(不会算错)
- ✅ 海量存储(记住无数数据)
结论 🎯
- 让人类做创造性的工作(设计游戏、写故事、发明)
- 让计算机做重复性的工作(计算、搜索、排序)
- 循环就是让计算机发挥重复工作的“超能力“!
👨🏫 给家长的Tips
教育意义:
- 让孩子理解:学习编程不是为了取代人类
- 而是为了让计算机帮我们做重复、枯燥的工作
- 这样人类就能把精力花在更有创造性的任务上
- 这就是“人机协作“的思想
生活中的例子:
- 计算器:做复杂的数学计算(重复性工作)
- 搜索引擎:在亿万网页中搜索信息(重复性工作)
- Excel:自动计算1000行数据的总和(重复性工作)
- 人类:设计算法、写文章、创作艺术(创造性工作)
while循环:条件循环
while循环是条件循环,只要条件为True,就一直重复执行代码块。
while循环的基本语法
while 条件:
# 条件为True时重复执行的代码
代码块
语法要点:
while后面跟着一个条件(布尔表达式)- 条件后面必须有冒号
: - 要执行的代码必须缩进
- 当条件为False时,循环结束
循环的三个重要元素
- 初始值: 循环变量的初始值
- 条件: 判断是否继续循环
- 更新: 循环变量如何变化
示例模式:
# 1. 初始值
count = 0
# 2. 条件
while count < 5:
print(f"第{count + 1}次: Python真有趣!")
# 3. 更新循环变量
count = count + 1
print("循环结束!")
输出结果:
第1次: Python真有趣!
第2次: Python真有趣!
第3次: Python真有趣!
第4次: Python真有趣!
第5次: Python真有趣!
循环结束!
给家长的小贴士:
- 重点讲解“循环变量更新“的重要性
- 如果忘记更新,会变成“死循环“(无限循环)
- 可以用“计数器“的概念来解释循环变量
- 建议画出表格,记录每次循环时变量的值
示例1:打印数字
# 打印1到5的数字
count = 1
while count <= 5:
print(count)
count = count + 1
print("打印完成!")
输出结果:
1
2
3
4
5
打印完成!
示例2:累加求和
# 计算1到5的和
total = 0 # 累积变量,保存总和
count = 1 # 计数变量
while count <= 5:
total = total + count # 累加
print(f"加{count}, 当前和:{total}")
count = count + 1
print(f"1到5的和是:{total}")
输出结果:
加1, 当前和:1
加2, 当前和:3
加3, 当前和:6
加4, 当前和:10
加5, 当前和:15
1到5的和是:15
给家长的小贴士:
- 用“存钱罐“类比累积变量
- 每次循环往存钱罐里加钱
- 循环结束时,存钱罐里的钱就是总和
- 强调初始值的重要性:total要从0开始
示例3:打印三角形*
# 打印一个直角三角形
line = 1
while line <= 5:
# 每行打印line个*
print("*" * line)
line = line + 1
输出结果:
*
**
***
****
*****
练习1:打印一棵圣诞树
题目:用while循环打印一棵圣诞树。
要求:
- 树冠:3层,每层*数量递增
- 树干:1层,用|表示
👉 点击查看答案
# 打印圣诞树
# 树冠部分
line = 1
while line <= 3:
# 打印空格(居中)
spaces = " " * (3 - line)
# 打印*
stars = "*" * (2 * line - 1)
print(spaces + stars)
line = line + 1
# 树干部分
print(" | ") # 树干
print(" | ") # 树干
输出结果:
*
***
*****
|
|
简单版本:
# 简单的圣诞树
line = 1
while line <= 3:
print("*" * line)
line = line + 1
print("*") # 树干
while循环中嵌套条件
在循环中,我们可以结合条件语句,实现更复杂的逻辑。
示例1:打印偶数
# 打印1到10中所有的偶数
count = 1
while count <= 10:
# 判断是否为偶数
if count % 2 == 0:
print(f"{count}是偶数")
count = count + 1
print("打印完成!")
输出结果:
2是偶数
4是偶数
6是偶数
8是偶数
10是偶数
打印完成!
示例2:标记特殊数字
# 打印1到10,在3的倍数前加标记
count = 1
while count <= 10:
# 判断是否为3的倍数
if count % 3 == 0:
print(f"[3的倍数] {count}")
else:
print(count)
count = count + 1
输出结果:
1
2
[3的倍数] 3
4
5
[3的倍数] 6
7
8
[3的倍数] 9
10
示例3:统计奇数和偶数的和
# 计算1到10之间偶数和奇数的和
even_sum = 0 # 偶数和
odd_sum = 0 # 奇数和
count = 1
while count <= 10:
if count % 2 == 0:
# 偶数加到even_sum
even_sum = even_sum + count
print(f"{count}是偶数, 偶数和:{even_sum}")
else:
# 奇数加到odd_sum
odd_sum = odd_sum + count
print(f"{count}是奇数, 奇数和:{odd_sum}")
count = count + 1
print(f"\n偶数和:{even_sum}")
print(f"奇数和:{odd_sum}")
输出结果:
1是奇数, 奇数和:1
2是偶数, 偶数和:2
3是奇数, 奇数和:4
4是偶数, 偶数和:6
5是奇数, 奇数和:9
6是偶数, 偶数和:12
7是奇数, 奇数和:16
8是偶数, 偶数和:20
9是奇数, 奇数和:25
10是偶数, 偶数和:30
偶数和:30
奇数和:25
给家长的小贴士:
- 解释“累加器“的概念
- 每个累加器都要有自己的初始值
- 建议画图理解:两个篮子,分别装奇数和偶数
- 强调print语句在循环中的调试作用
练习2:倒三角形
题目:用while循环打印倒三角形。
👉 点击查看答案
# 打印倒三角形
line = 5
while line >= 1:
print("*" * line)
line = line - 1
输出结果:
*****
****
***
**
*
练习3:求能被3整除的数字的乘积
题目:计算1到10之间能被3整除的数字的乘积。
👉 点击查看答案
# 计算1到10中能被3整除的数字的乘积
product = 1 # 乘积的初始值是1,不是0!
count = 1
while count <= 10:
if count % 3 == 0:
product = product * count
print(f"乘{count}, 当前乘积:{product}")
count = count + 1
print(f"乘积是:{product}")
输出结果:
乘3, 当前乘积:3
乘6, 当前乘积:18
乘9, 当前乘积:162
乘积是:162
重要提示:
- 乘积的初始值必须是1,不能是0!
- 如果初始值是0,乘积永远是0
for循环和range函数
for循环通常和range()函数一起使用,用于已知循环次数的情况。
range函数
range()函数生成一个数字序列。
基本用法:
# range(开始, 结束, 步长)
# 注意:结束值不包含在内!
示例:
# range(5): 生成0, 1, 2, 3, 4
for i in range(5):
print(i)
print("------")
# range(1, 6): 生成1, 2, 3, 4, 5
for i in range(1, 6):
print(i)
print("------")
# range(1, 10, 2): 生成1, 3, 5, 7, 9 (奇数)
for i in range(1, 10, 2):
print(i)
print("------")
# range(10, 0, -1): 生成10, 9, 8, 7, 6, 5, 4, 3, 2, 1 (倒数)
for i in range(10, 0, -1):
print(i)
给家长的小贴士:
- 重点强调“结束值不包含“
- range(1, 5)生成1, 2, 3, 4,不包括5
- 用“排队“类比:从1号排到4号,5号不排
- 步长可以是负数,实现倒序
for循环的基本语法
for 变量 in range(开始, 结束):
# 循环体
示例1:打印数字
# 用for循环打印1到5
for i in range(1, 6):
print(i)
print("完成!")
输出结果:
1
2
3
4
5
完成!
示例2:求和
# 用for循环计算1到5的和
total = 0
for i in range(1, 6):
total = total + i
print(f"加{i}, 当前和:{total}")
print(f"1到5的和是:{total}")
示例3:遍历字符串
# 遍历字符串中的每个字符
name = "Python"
for ch in name:
print(ch)
输出结果:
P
y
t
h
o
n
while vs for:如何选择?
| 特点 | while循环 | for循环 |
|---|---|---|
| 使用场景 | 不知道循环次数 | 知道循环次数 |
| 循环条件 | 根据条件判断 | 遍历序列 |
| 需要手动 | 更新循环变量 | 自动更新变量 |
| 例子 | “直到用户输入正确” | “打印1到100” |
示例对比:
# while循环版本
count = 1
while count <= 5:
print(count)
count = count + 1
print("------")
# for循环版本(更简洁!)
for i in range(1, 6):
print(i)
给家长的小贴士:
- 如果知道循环次数,优先用for循环
- for循环更简洁,不容易出错(自动更新变量)
- while循环更灵活,适合复杂条件
- 建议让孩子用两种方法写同一个程序,体会区别
break和continue
在循环中,我们可以用break和continue来控制循环的执行。
break:跳出循环
break会立即终止整个循环。
示例:
# 找到第一个能被7整除的数
for i in range(1, 100):
if i % 7 == 0:
print(f"找到了!第一个能被7整除的数是:{i}")
break # 找到就退出循环
print("程序结束")
输出结果:
找到了!第一个能被7整除的数是:7
程序结束
continue:跳过本次循环
continue会跳过本次循环,直接进入下一次循环。
示例:
# 打印1到10中的奇数(跳过偶数)
for i in range(1, 11):
if i % 2 == 0:
continue # 跳过偶数,不执行后面的print
print(i)
print("打印完成")
输出结果:
1
3
5
7
9
打印完成
示例:累加直到和大于等于100
# 计算1+2+3+...,直到和大于等于100
total = 0
count = 1
while True: # 无限循环
total = total + count
print(f"加{count}, 当前和:{total}")
if total >= 100:
print(f"和达到{total}, 停止!")
break # 达到目标,退出循环
count = count + 1
输出结果:
加1, 当前和:1
加2, 当前和:3
加3, 当前和:6
...
加13, 当前和:91
加14, 当前和:105
和达到105, 停止!
示例:QQ登录验证
# 模拟QQ登录
correct_username = "admin"
correct_password = "123456"
while True:
# 输入用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")
# 验证
if username == correct_username and password == correct_password:
print("登录成功!")
break # 登录成功,退出循环
else:
print("用户名或密码错误,请重新输入!\n")
print("欢迎进入系统!")
给家长的小贴士:
break就像“紧急出口“,随时可以离开循环continue就像“跳过“,这次不做,继续下一次while True是一个无限循环,必须有break才能退出- 强调滥用break和continue会让代码难以理解
- 建议先用普通循环写法,熟练后再用这些控制语句
循环嵌套
一个循环内部可以再包含另一个循环,这就是循环嵌套。
示例1:打印数字矩形
# 打印数字矩形
for i in range(1, 4): # 外层循环:控制行
for j in range(1, 4): # 内层循环:控制列
print(f"{i}", end=" ") # end=" "表示不换行
print() # 每行结束后换行
输出结果:
1 1 1
2 2 2
3 3 3
示例2:打印乘法口诀表
# 打印乘法口诀表(9x9)
for i in range(1, 10): # 行:1到9
for j in range(1, i + 1): # 列:1到i
result = i * j
print(f"{j}x{i}={result}", end="\t") # \t是制表符
print() # 换行
输出结果:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
给家长的小贴士:
- 用“时钟“类比嵌套循环:时针和分针
- 外层循环执行一次,内层循环执行完整一轮
- 建议画出执行过程,理解嵌套逻辑
- 强调缩进的重要性:内层循环要多缩进一层
示例3:找出所有三位数
题目:用1、2、3、4四个数字,能组成多少个三位数?
# 用1、2、3、4组成三位数
count = 0 # 计数器
print("可以组成的三位数:")
for i in [1, 2, 3, 4]: # 百位
for j in [1, 2, 3, 4]: # 十位
for k in [1, 2, 3, 4]: # 个位
num = i * 100 + j * 10 + k
print(num, end=" ")
count = count + 1
# 每行打印10个
if count % 10 == 0:
print()
print(f"\n总共可以组成{count}个三位数")
示例4:找出无重复数字的三位数
题目:用1、2、3、4四个数字,能组成多少个无重复数字的三位数?
# 用1、2、3、4组成无重复数字的三位数
count = 0
print("无重复数字的三位数:")
for i in [1, 2, 3, 4]: # 百位
for j in [1, 2, 3, 4]: # 十位
if j == i: # 十位和百位不能相同
continue
for k in [1, 2, 3, 4]: # 个位
if k == i or k == j: # 个位不能和百位、十位相同
continue
num = i * 100 + j * 10 + k
print(num, end=" ")
count = count + 1
# 每行打印10个
if count % 10 == 0:
print()
print(f"\n总共可以组成{count}个无重复数字的三位数")
输出结果:
无重复数字的三位数:
123 124 132 134 142 143 213 214 231 234
241 243 312 314 321 324 341 342 412 413
421 423 431 432
总共可以组成24个无重复数字的三位数
常见循环模式和技巧
模式1:计数器模式
# 计数器:统计满足条件的数量
count = 0
for i in range(1, 101):
if i % 7 == 0:
count = count + 1
print(f"1到100之间有{count}个数能被7整除")
模式2:累加器模式
# 累加器:求和
total = 0
for i in range(1, 101):
total = total + i
print(f"1到100的和是:{total}")
模式3:累乘器模式
# 累乘器:求阶乘(5! = 5x4x3x2x1)
factorial = 1
for i in range(1, 6):
factorial = factorial * i
print(f"5的阶乘是:{factorial}")
模式4:最大值/最小值查找
# 找最大值
numbers = [23, 45, 12, 67, 34, 89, 5]
max_num = numbers[0] # 假设第一个是最大的
for num in numbers:
if num > max_num:
max_num = num
print(f"最大的数是:{max_num}")
模式5:正序和反序遍历
# 正序遍历
for i in range(1, 6):
print(i, end=" ")
print()
# 反序遍历
for i in range(5, 0, -1):
print(i, end=" ")
print()
# 步长为2
for i in range(1, 10, 2):
print(i, end=" ")
给家长的小贴士:
- 这些模式在编程中非常常见
- 建议让孩子记住这些基本模式
- 可以用生活中的例子类比:计数器、存钱罐、找最大数
- 鼓励孩子用这些模式解决新问题
综合练习
练习1:打印30以内的自然数
题目:分别用while和for循环打印30以内的自然数(包含30)。
👉 点击查看答案
while版本:
# while循环
count = 0
while count <= 30:
print(count, end=" ")
count = count + 1
for版本:
# for循环
for i in range(31): # range(31) = range(0, 31) = 0到30
print(i, end=" ")
练习2:挑水问题
题目:一口缸容量有180升,一个和尚每次挑水20升,多少次挑满?
👉 点击查看答案
# 挑水问题
capacity = 180 # 缸的容量
each_time = 20 # 每次挑水量
current = 0 # 当前水量
count = 0 # 挑水次数
while current < capacity:
current = current + each_time
count = count + 1
print(f"第{count}次挑水,当前水量:{current}升")
print(f"需要{count}次才能挑满")
输出结果:
第1次挑水,当前水量:20升
第2次挑水,当前水量:40升
...
第9次挑水,当前水量:180升
需要9次才能挑满
更简洁的写法:
capacity = 180
each_time = 20
# 用整除计算
times = capacity // each_time
# 如果有余数,需要多挑一次
if capacity % each_time != 0:
times = times + 1
print(f"需要{times}次才能挑满")
练习3:统计学生成绩
题目:循环录入Java课的学生成绩,统计分数大于等于80分的学生比例。
👉 点击查看答案
# 统计学生成绩
total_students = int(input("请输入学生人数:"))
pass_count = 0 # 大于等于80分的人数
for i in range(total_students):
score = int(input(f"请输入第{i + 1}个学生的成绩:"))
if score >= 80:
pass_count = pass_count + 1
print(f"成绩{score}:优秀!")
else:
print(f"成绩{score}:继续努力!")
# 计算比例
percentage = (pass_count / total_students) * 100
print(f"\n统计结果:")
print(f"总人数:{total_students}")
print(f"优秀人数:{pass_count}")
print(f"优秀比例:{percentage:.1f}%")
运行示例:
请输入学生人数:5
请输入第1个学生的成绩:85
成绩85:优秀!
请输入第2个学生的成绩:72
成绩72:继续努力!
请输入第3个学生的成绩:90
成绩90:优秀!
请输入第4个学生的成绩:68
成绩68:继续努力!
请输入第5个学生的成绩:82
成绩82:优秀!
统计结果:
总人数:5
优秀人数:3
优秀比例:60.0%
练习4:小芳存钱
题目:小芳的妈妈每天给她2.5元钱,她都会存起来。从存钱开始,每过5天她就会花去6元钱。请问要到第几天,小芳才可以存满100元钱?
👉 点击查看答案
# 小芳存钱问题
money = 0 # 当前存款
day = 0 # 天数
while money < 100:
day = day + 1
money = money + 2.5 # 每天存2.5元
print(f"第{day}天:存2.5元,当前存款:{money}元")
# 每5天花6元
if day % 5 == 0:
money = money - 6
print(f" -> 第{day}天:花6元,剩余存款:{money}元")
print(f"\n第{day}天,小芳存满了100元!")
输出结果:
第1天:存2.5元,当前存款:2.5元
第2天:存2.5元,当前存款:5.0元
第3天:存2.5元,当前存款:7.5元
第4天:存2.5元,当前存款:10.0元
第5天:存2.5元,当前存款:12.5元
-> 第5天:花6元,剩余存款:6.5元
...
第50天:存2.5元,当前存款:97.5元
第51天:存2.5元,当前存款:100.0元
第51天,小芳存满了100元!
练习5:求100以内偶数之和
题目:求100以内的偶数之和。
👉 点击查看答案
方法1:用if判断:
total = 0
for i in range(1, 101):
if i % 2 == 0:
total = total + i
print(f"100以内偶数之和:{total}")
方法2:用步长2(更高效):
total = 0
for i in range(0, 101, 2): # 直接生成偶数
total = total + i
print(f"100以内偶数之和:{total}")
输出结果:
100以内偶数之和:2550
练习6:求100以内6的倍数
题目:求出100以内的所有6的倍数,以及个数。
👉 点击查看答案
# 求100以内6的倍数
count = 0
print("100以内的6的倍数:")
for i in range(1, 101):
if i % 6 == 0:
print(i, end=" ")
count = count + 1
print(f"\n总共{count}个")
输出结果:
100以内的6的倍数:
6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96
总共16个
练习7:打印数字矩形
题目:在控制台输出图形,第一行输出一个1,第二行输出二个2,第n行输出n个n。
👉 点击查看答案
# 打印数字矩形
n = int(input("请输入行数:"))
for i in range(1, n + 1):
# 打印i个i
for j in range(i):
print(i, end=" ")
print() # 换行
运行示例:
请输入行数:5
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
练习8:水仙花数
题目:打印所有水仙花数。
什么是水仙花数?
- 一个三位数
- 例如153,1³ + 5³ + 3³ = 153
- 即:各位数字的立方和等于它本身
👉 点击查看答案
# 打印水仙花数
print("三位数的水仙花数:")
for num in range(100, 1000): # 遍历所有三位数
# 分解百位、十位、个位
hundreds = num // 100 # 百位
tens = (num // 10) % 10 # 十位
ones = num % 10 # 个位
# 计算各位数字的立方和
sum_of_cubes = hundreds ** 3 + tens ** 3 + ones ** 3
# 判断是否为水仙花数
if sum_of_cubes == num:
print(num)
print("查找完成!")
输出结果:
三位数的水仙花数:
153
370
371
407
查找完成!
给家长的小贴士:
- 解释“水仙花数“的含义
- 重点讲解如何分解一个三位数的百位、十位、个位
- 用除法和取余运算:
- 百位 = num // 100
- 十位 = (num // 10) % 10
- 个位 = num % 10
- 这是一个经典的编程练习,锻炼数学和编程结合的能力
练习9:交错数列求和
题目:计算1 - 2 + 3 - 4 + 5 - … + 99的结果。
👉 点击查看答案
# 计算交错数列求和: 1 - 2 + 3 - 4 + ... + 99
total = 0
for i in range(1, 100): # 1到99
if i % 2 == 1:
# 奇数相加
total = total + i
print(f"+{i}", end=" ")
else:
# 偶数相减
total = total - i
print(f"-{i}", end=" ")
print(f"\n结果:{total}")
输出结果:
+1 -2 +3 -4 +5 -6 +7 -8 +9 -10 +11 -12 +13 -14 +15 -16 +17 -18 +19 -20 +21 -22 +23 -24 +25 -26 +27 -28 +29 -30 +31 -32 +33 -34 +35 -36 +37 -38 +39 -40 +41 -42 +43 -44 +45 -46 +47 -48 +49 -50 +51 -52 +53 -54 +55 -56 +57 -58 +59 -60 +61 -62 +63 -64 +65 -66 +67 -68 +69 -70 +71 -72 +73 -74 +75 -76 +77 -78 +79 -80 +81 -82 +83 -84 +85 -86 +87 -88 +89 -90 +91 -92 +93 -94 +95 -96 +97 -98 +99
结果:50
更简洁的写法:
# 方法2:观察规律
# (1-2) + (3-4) + (5-6) + ... + (97-98) + 99
# = -1 + -1 + -1 + ... + -1 + 99
# 共49个-1,最后+99
# = -49 + 99 = 50
# 或者换个角度:
# 1 + 3 + 5 + ... + 99 = 2500 (奇数和)
# 2 + 4 + 6 + ... + 98 = 2450 (偶数和)
# 2500 - 2450 = 50
odd_sum = 0
even_sum = 0
for i in range(1, 100):
if i % 2 == 1:
odd_sum = odd_sum + i
else:
even_sum = even_sum + i
result = odd_sum - even_sum
print(f"奇数和:{odd_sum}, 偶数和:{even_sum}, 结果:{result}")
练习10:猜数字游戏(限制次数)
题目:写一个猜数字游戏,猜对了结束,猜不对继续,最多猜9次。
👉 点击查看答案
# 猜数字游戏
import random # 随机数库
target = random.randint(1, 100) # 生成1到100的随机数
max_attempts = 9
print("=== 猜数字游戏 ===")
print(f"我已经想好了一个1到100之间的数字,你有{max_attempts}次机会猜!")
for attempt in range(1, max_attempts + 1):
guess = int(input(f"\n第{attempt}次猜测,请输入你的猜测(1-100):"))
if guess == target:
print(f"🎉 恭喜你!第{attempt}次就猜对了!数字是:{target}")
break # 猜对了,退出循环
elif guess < target:
print(f"太小了!还有{max_attempts - attempt}次机会")
else:
print(f"太大了!还有{max_attempts - attempt}次机会")
else:
# for循环正常结束(没有break)时执行
print(f"\n😢 很遗憾,你没有猜对。正确答案是:{target}")
print("\n游戏结束!")
运行示例:
=== 猜数字游戏 ===
我已经想好了一个1到100之间的数字,你有9次机会猜!
第1次猜测,请输入你的猜测(1-100):50
太大了!还有8次机会
第2次猜测,请输入你的猜测(1-100):25
太小了!还有7次机会
第3次猜测,请输入你的猜测(1-100):37
太大了!还有6次机会
第4次猜测,请输入你的猜测(1-100):31
🎉 恭喜你!第4次就猜对了!数字是:31
游戏结束!
给家长的小贴士:
- 这是一个综合练习,用到了循环、条件、break、else等
for...else语法:当for循环正常结束(没有break)时,执行else- 可以和孩子一起玩这个游戏,增加趣味性
- 可以讨论如何用“二分查找“策略提高猜测效率
练习11:求素数
题目:输入一个正整数n,判断它是否为素数。
什么是素数?
- 只能被1和它本身整除的数
- 例如:2, 3, 5, 7, 11, 13, 17, 19, 23, …
- 1不是素数
- 2是最小的素数,也是唯一的偶数素数
👉 点击查看答案
# 判断一个数是否为素数
num = int(input("请输入一个正整数:"))
# 处理特殊情况
if num < 2:
print(f"{num}不是素数")
elif num == 2:
print(f"{num}是素数")
elif num % 2 == 0:
print(f"{num}不是素数(能被2整除)")
else:
# 判断从3到num-1是否有能整除的数
is_prime = True # 假设是素数
for i in range(3, num):
if num % i == 0:
is_prime = False
print(f"{num}不是素数(能被{i}整除)")
break # 找到一个因数就够了
# 如果循环正常结束,说明没有找到因数
if is_prime:
print(f"{num}是素数!")
运行示例:
请输入一个正整数:17
17是素数!
请输入一个正整数:15
15不是素数(能被3整除)
进阶:打印100以内的所有素数:
# 打印100以内的所有素数
print("100以内的素数:")
for num in range(2, 101):
if num == 2:
print(num, end=" ")
continue
if num % 2 == 0:
continue
# 判断是否为素数
is_prime = True
for i in range(3, num):
if num % i == 0:
is_prime = False
break
if is_prime:
print(num, end=" ")
输出结果:
100以内的素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
给家长的小贴士:
- 素数判断是一个经典算法问题
- 可以优化:只需要判断到√n,不需要到n-1
- 这是密码学的基础( RSA加密算法用到素数)
- 可以和孩子讨论为什么素数很重要
用循环简化Turtle图形
还记得第6章我们用Turtle画图形吗?当时我们用顺序语句,每个边都要写一遍代码。现在学完循环后,我们可以大大简化这些代码!
回顾:第6章的画图代码
在第6章,我们画正方形时是这样的:
import turtle
t = turtle.Turtle()
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
turtle.done()
问题:这段代码重复了4次相同的内容!如果我们想画正六边形、正八边形,代码会变得很长。
用循环改进:画正n边形
现在我们可以用循环来简化:
import turtle
t = turtle.Turtle()
# 画正方形(4条边)
for i in range(4):
t.forward(100)
t.left(90)
turtle.done()
优势:
- 代码从8行减少到3行!
- 如果要画正六边形,只需要改数字:
for i in range(6): t.forward(100) t.left(60) # 360 ÷ 6 = 60度
👨🏫 给家长的Tips
这是一个绝佳的教学时机!
- 让孩子对比两种写法的代码行数
- 问孩子:“哪种写法更简单?如果我要画正12边形呢?”
- 引导孩子理解:循环就是让计算机帮我们重复做相同的事
- 强调:程序员很“懒“,总在想办法让代码更简洁
练习1:改写长方形画法
第6章的代码(顺序语句):
length = 150
width = 80
t.forward(length)
t.left(90)
t.forward(width)
t.left(90)
t.forward(length)
t.left(90)
t.forward(width)
t.left(90)
用循环改进:
length = 150
width = 80
for i in range(2): # 重复2次
t.forward(length)
t.left(90)
t.forward(width)
t.left(90)
代码从10行减少到5行!
练习2:改写五边形
第6章的代码:
side = 100
angle = 360 / 5 # 72度
t.forward(side)
t.left(angle)
t.forward(side)
t.left(angle)
t.forward(side)
t.left(angle)
t.forward(side)
t.left(angle)
t.forward(side)
t.left(angle)
用循环改进:
side = 100
angle = 360 / 5
for i in range(5):
t.forward(side)
t.left(angle)
代码从11行减少到3行!
练习3:改写五角星
第6章的代码:
t.pencolor("gold")
t.fillcolor("orange")
t.begin_fill()
t.forward(200)
t.right(144)
t.forward(200)
t.right(144)
t.forward(200)
t.right(144)
t.forward(200)
t.right(144)
t.forward(200)
t.right(144)
t.end_fill()
用循环改进:
t.pencolor("gold")
t.fillcolor("orange")
t.begin_fill()
for i in range(5):
t.forward(200)
t.right(144)
t.end_fill()
挑战项目:用循环画复杂图形
现在你掌握了循环,可以尝试画更复杂的图形了!
项目1:彩色多边形螺旋
import turtle
t = turtle.Turtle()
t.speed(0) # 最快速度
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
# 画36个逐渐变大的正方形
for i in range(36):
t.pencolor(colors[i % 6]) # 循环使用6种颜色
t.forward(50 + i * 5) # 每次边长增加
t.left(90) # 转向
t.forward(50 + i * 5)
t.left(90)
t.forward(50 + i * 5)
t.left(90)
t.forward(50 + i * 5)
t.left(90)
t.left(10) # 每次多转10度,形成螺旋
turtle.done()
项目2:花朵(第6章留下的挑战)
在第6章,我们说花朵练习要等学完循环再做。现在可以了!
import turtle
t = turtle.Turtle()
t.speed(10)
colors = ["red", "orange", "yellow", "pink", "purple", "blue"]
# 画6个花瓣
for i in range(6):
t.color(colors[i])
t.begin_fill()
# 画椭圆(通过多次小角度转向实现)
for j in range(36):
t.forward(20)
t.left(10)
t.left(60) # 转到下一个花瓣
t.end_fill()
# 画花心
t.penup()
t.goto(0, -10)
t.pendown()
t.color("green")
t.begin_fill()
t.circle(20)
t.end_fill()
turtle.done()
👨🏫 给家长的Tips
这个花朵项目使用了嵌套循环:
- 外层循环:画6个花瓣
- 内层循环:每个花瓣由36条短线段组成
- 这是循环的高级应用,让孩子看到循环的威力
- 可以让孩子修改参数(如花瓣数量、颜色),观察变化
练习4:创意画图
用循环发挥你的创意!
想法:
- 用循环画一排五角星(10个,位置不同)
- 用循环画同心圆(10个圆,半径逐渐增大)
- 用循环画一个“图案生成器“(旋转对称图形)
示例:旋转的五角星
import turtle
t = turtle.Turtle()
t.speed(0)
# 画12个旋转的五角星
for i in range(12):
t.pencolor("gold")
t.begin_fill()
for j in range(5):
t.forward(100)
t.right(144)
t.end_fill()
t.right(30) # 旋转30度(360 ÷ 12 = 30)
turtle.done()
总结:循环的威力
通过对比第6章和现在的代码,我们发现:
| 图形 | 第6章(顺序语句) | 现在(循环) | 减少行数 |
|---|---|---|---|
| 正方形 | 8行 | 3行 | 减少5行 |
| 五边形 | 11行 | 3行 | 减少8行 |
| 五角星 | 11行 | 3行 | 减少8行 |
| 花朵 | 不现实 | 15行 | 不可想象 |
循环的优势:
- 代码更短:从几十行减少到几行
- 更易修改:想画正12边形?只改一个数字
- 更易阅读:代码意图更清晰
- 减少错误:不用重复写相同的代码
👨🏫 给家长的Tips
这个对比非常重要!
- 让孩子真切感受到循环的价值
- 回顾第6章时留下的“伏笔“,现在终于“解密“了
- 告诉孩子:“这就是为什么我们要学循环——让代码更简洁、更强大”
- 鼓励孩子用循环改写之前的所有画图代码
变量的作用域
在循环中定义的变量,在循环外面可以使用吗?
示例:循环变量的作用域
# 循环变量的作用域
for i in range(1, 6):
print(f"循环内:i = {i}")
print(f"循环外:i = {i}") # 可以访问i!
# 但是,如果循环一次都没执行呢?
for j in range(0): # range(0)是空的
print(f"循环内:j = {j}")
# print(f"循环外:j = {j}") # 错误!j不存在
输出结果:
循环内:i = 1
循环内:i = 2
循环内:i = 3
循环内:i = 4
循环内:i = 5
循环外:i = 5
给家长的小贴士:
- Python中,for循环的变量在循环外仍然可以访问
- 但是,如果循环一次都没执行,变量就不存在
- 建议:在循环外定义好所有需要的变量
- 这样代码更清晰,不容易出错
循环和分支互相嵌套
示例:求和或求乘积
题目:要求用户输入一个正整数n,然后问用户计算求和还是求乘积。如果用户输入求和,则输出1+2+…+n的结果;用户输入求乘积,则输出1×2×…×n的结果。
👉 点击查看答案
# 求和或求乘积
n = int(input("请输入一个正整数n:"))
choice = input("请选择计算方式(求和/求乘积):")
if choice == "求和":
# 计算求和
total = 0
for i in range(1, n + 1):
total = total + i
print(f"1+2+...+{n} = {total}")
elif choice == "求乘积":
# 计算求乘积
product = 1
for i in range(1, n + 1):
product = product * i
print(f"1×2×...×{n} = {product}")
else:
print("Error!!! 输入不正确")
运行示例:
请输入一个正整数n:5
请选择计算方式(求和/求乘积):求和
1+2+...+5 = 15
请输入一个正整数n:5
请选择计算方式(求和/求乘积):求乘积
1×2×...×5 = 120
常见错误和调试
错误1:忘记更新循环变量
# 错误:死循环
count = 0
while count < 5:
print(count)
# 忘记了 count = count + 1
# 正确
count = 0
while count < 5:
print(count)
count = count + 1 # 更新循环变量!
错误2:循环条件错误
# 错误:永远不会执行
count = 5
while count > 10: # 5 > 10是False
print(count)
# 正确
count = 5
while count < 10: # 5 < 10是True
print(count)
count = count + 1
错误3:off-by-one错误
# 常见错误:想打印1到10,但只打印到9
for i in range(1, 10): # 错误!range(1, 10)是1到9
print(i)
# 正确
for i in range(1, 11): # 正确!range(1, 11)是1到10
print(i)
错误4:缩进错误
# 错误:缩进不一致
for i in range(5):
print(i) # 2个空格
print(i * 2) # 4个空格
# 正确:缩进一致
for i in range(5):
print(i)
print(i * 2)
调试技巧
- 使用print语句:
for i in range(1, 6):
print(f"调试:i = {i}") # 调试信息
total = total + i
print(f"调试:total = {total}") # 调试信息
-
画表格追踪变量: | 循环次数 | i | total | |———|—|—––| | 第1次 | 1 | 1 | | 第2次 | 2 | 3 | | 第3次 | 3 | 6 |
-
简化问题:
- 先用小的数字测试(比如1到5,而不是1到100)
- 确认逻辑正确后再扩大范围
-
检查边界条件:
- 0会怎样?
- 1会怎样?
- 最大值会怎样?
给家长的小贴士:
- 教孩子学会看错误信息
- 鼓励孩子用print调试
- 建议先在纸上画出执行过程
- 强调“从小到大“测试策略
章节小结
我们学到了什么
- 循环的概念:重复执行某些操作
- while循环:条件循环,适合不知道循环次数的情况
- for循环:计数循环,适合知道循环次数的情况
- range()函数:生成数字序列
- break和continue:控制循环的执行
- 循环嵌套:循环中的循环
- 常见模式:计数器、累加器、累乘器、最大值查找
重要语法回顾
| 循环类型 | 语法 | 用途 |
|---|---|---|
| while | while 条件: | 条件循环 |
| for | for i in range(): | 计数循环 |
| break | break | 跳出循环 |
| continue | continue | 跳过本次 |
循环的三个要素
- 初始值:循环变量的起点
- 条件:判断是否继续循环
- 更新:循环变量如何变化
编程技巧
- 避免死循环:记得更新循环变量
- 注意边界:range(1, 5)是1到4,不包括5
- 缩进正确:循环体要统一缩进
- 简化测试:先用小数字测试,确认逻辑后再扩大
- 调试方法:用print输出中间结果
下一步
在下一章(第9章),我们将学习流程图,用图形化的方式表示程序的执行流程。流程图能帮助我们更好地理解程序的逻辑!
挑战练习
-
必做:
- 用for循环计算1到1000的和
- 打印所有三位数中,个位、十位、百位都相同的数字(如111, 222, 333)
- 用while循环实现:输入密码,直到输入正确为止
-
选做:
- 打印“斐波那契数列“的前20项(1, 1, 2, 3, 5, 8, 13, …)
- 计算阶乘:n! = 1×2×3×…×n
- 打印“杨辉三角“的前10行
-
挑战:
- 用循环实现“九九乘法表“的倒三角版本
- 找出所有“完全数“:一个数等于它的所有真因数之和(如6=1+2+3)
- 实现“猜数字“游戏,并在猜测次数上设置难度级别
-
综合项目:
- 写一个简单的计算器,可以循环计算,直到用户选择退出
- 写一个成绩管理系统,可以录入、查询、统计成绩
- 用Turtle库和循环,画一个螺旋图形
加油!你已经掌握了让程序重复工作的能力!🎉