循环综合应用实例
极难3循环综合应用——让程序更聪明地处理数据
学完循环嵌套和分支,我们来挑战一些综合应用吧!这些例子会把循环、条件判断、列表甚至输入输出结合起来,就像做一道复杂的菜,需要把各种调料都用到。掌握这些技巧后,你就能用 Python 解决很多实际生活中的问题,比如统计零花钱、判断密码、生成有趣的数列等等。
下面我们通过三个贴近生活的例子,一步步学会如何灵活搭配循环和分支。
? 实例1:统计全班同学的成绩等级
这是干什么的?
老师想快速知道班里有多少人拿A、多少人拿B……手动数太麻烦,用循环和判断就能一键搞定。
代码怎么工作的?
- 有一个列表
scores,里面存了5个同学的分数。 - 创建一个字典
count,用来记录每个等级的人数,初始都是0。 for score in scores:这个循环会依次取出每个分数,然后用if-elif-else判断属于哪个区间,并把对应的等级人数加1。- 最后打印出字典,就能看到各等级的人数。
scores = [85, 92, 73, 58, 88] # 成绩列表
# 字典记录各等级人数,初始全部为0
count = {"A":0, "B":0, "C":0, "D":0, "E":0}
for score in scores: # 循环每个分数
if score >= 90:
count["A"] += 1
elif score >= 80:
count["B"] += 1
elif score >= 70:
count["C"] += 1
elif score >= 60:
count["D"] += 1
else:
count["E"] += 1
print(count) # 输出:{'A':1, 'B':2, 'C':1, 'D':0, 'E':1}
? 补充解释:为什么用字典?
字典就像是一个“标签抽屉”:每个等级是一个标签(如 "A"),抽屉里放的是人数。用字典比用5个独立变量更干净,也更容易扩展(比如增加等级F)。
⚠️ 新手常犯的错误
- 忘记缩进:
if-elif里面的代码必须缩进4个空格(或一个Tab),否则会报错。 - 区间重叠:代码中先判断
>=90,再判断>=80,这样90分只会进入A,不会进入B。如果把顺序搞反(先判断>=80),那么90分也会被当成B。判断顺序一定要从高分往低分写。 - 字典拼写:写
count["A"]时,冒号必须是英文半角:吗?其实字典的键是用方括号[]访问,不是冒号。这里容易和定义字典时的:弄混,留意区分。
生活中的类似场景
- 统计班级里生日在春天的同学数量(用月份判断)。
- 统计你一周花掉的零花钱额度:每天花多少,然后判断是“节省”“普通”还是“超支”。
? 实例2:密码验证程序
这是干什么的?
就像手机解锁,最多输错3次,否则就被锁住。程序中让用户输入密码,正确则显示欢迎,错误则继续尝试。
password = "python123" # 正确的密码
for attempt in range(3): # 允许尝试3次,attempt 从0到2
user_input = input("请输入密码:")
if user_input == password:
print("欢迎进入系统!")
break # 正确就退出循环
else: # 循环正常结束(没break)时执行
print("尝试次数已用完,程序退出。")
? for-else 的妙用
Python 的 for 循环后面可以跟一个 else 块:只有当循环没有被 break 中断时,才会执行 else 里的代码。这里如果三次都输错,循环正常走完,就执行 else 输出“尝试次数已用完”。如果中途正确,break 跳出,else 就不会执行。
? 补充解释:range(3) 生成什么?
range(3) 会生成 0, 1, 2 三个数,所以循环会执行3次。attempt 这个变量虽然没在循环体里用到,但可以用来显示是第几次尝试(比如 print(f"第{attempt+1}次尝试"))。
⚠️ 新手常犯的错误
- 把
else和for对齐错:else必须和for在同一缩进级别,而不是和if对齐。 - 忘记写
break:如果没有break,就算输入正确,程序也会继续要求输入直到3次结束。 - 密码匹配用错符号:
==比较两个值是否相等,一个等号=是赋值。 - input 得到的始终是字符串:如果密码是数字,也要写成字符串(如
"1234")来比较,否则会一直不匹配。
生活中的类似场景
- 银行卡ATM输入密码,错误3次吞卡。
- 游戏里输入激活码,限定3次机会。
? 实例3:生成斐波那契数列的前10个数
这是什么数列?
斐波那契数列特别有意思:从0和1开始,后面每个数都是前两个数的和。0, 1, 1, 2, 3, 5, 8, 13, 21, 34……它在自然界里也能找到,比如向日葵花盘上的螺旋线数量。
a, b = 0, 1 # a是第一个数,b是第二个数
for i in range(10): # 打印10个数
print(a, end=" ") # 打印当前a,不换行,用空格隔开
a, b = b, a + b # 同时更新a和b:新的a变成原来的b,新的b变成原来的a+b
输出:0 1 1 2 3 5 8 13 21 34
? 解释:a, b = b, a + b 这条语句
这是 Python 特有的“多重赋值”。它会先计算右边的两个值(原来的b,原来的a+b),然后再同时赋值给左边的a和b。所以不需要临时变量,非常简洁。如果分成两行写:
temp = a
a = b
b = temp + b
效果一样,但更啰嗦。
⚠️ 新手常犯的错误
- 写成
a = b; b = a + b:如果先执行a = b,那么a已经变成了原来的b,接着计算a + b时,a 已经变了,结果会出错(变成 2*b)。一定要同时赋值。 - 循环次数搞错:range(10) 循环10次,打印10个数;如果只想打印10个数,初始a和b要设置好。有人会把
a,b=1,1开始,那打印的就是另一个版本的斐波那契(少了第一个0)。
生活中的类似场景
- 小兔子繁殖问题:一对大兔子每个月生一对小兔子,小兔子出生后第二个月才能生,每个月兔子总对数正好是斐波那契数列(意大利数学家斐波那契当年就是用这个问题提出的)。
- 楼梯台阶:上10级台阶,每次可以走1级或2级,有多少种走法?答案也是斐波那契数列。
? 综合挑战:一个完整的“成绩+密码+数列”小程序
下面的代码把三个例子整合成一个简单的菜单程序。用户可以选择要执行的功能,体会循环、分支、列表、字典的配合使用。
# 功能菜单
def show_menu():
print("1. 统计成绩等级")
print("2. 密码验证")
print("3. 打印斐波那契数列")
print("0. 退出")
while True: # 主循环,一直运行直到用户选择退出
show_menu()
choice = input("请选择功能(0-3):")
if choice == "1":
# 实例1:成绩等级统计
scores = [85, 92, 73, 58, 88] # 成绩列表
count = {"A":0, "B":0, "C":0, "D":0, "E":0} # 字典记录各等级人数
for score in scores:
if score >= 90:
count["A"] += 1
elif score >= 80:
count["B"] += 1
elif score >= 70:
count["C"] += 1
elif score >= 60:
count["D"] += 1
else:
count["E"] += 1
print("成绩等级统计结果:", count)
elif choice == "2":
# 实例2:密码验证(最多3次)
password = "python123" # 正确密码
for attempt in range(3):
user_input = input("请输入密码:")
if user_input == password:
print("欢迎进入系统!")
break
else:
print("尝试次数已用完,程序退出。")
elif choice == "3":
# 实例3:斐波那契数列前10项
n = int(input("你想打印前几项?请输入数字:"))
a, b = 0, 1
for i in range(n):
print(a, end=" ")
a, b = b, a + b
print() # 换行
elif choice == "0":
print("再见!")
break
else:
print("输入无效,请重新选择。")
运行这个程序,你可以反复选择不同功能,直到输入0退出。这里用了一个 while True 无限循环,直到用户输入 0 才 break 跳出。
? 相关指引
掌握了这三个例子,你就学会了如何把循环(for、while)、分支(if-elif-else)、列表、字典以及输入输出结合起来。想要更进一步,可以学习:
- 循环嵌套:比如用一个循环套另一个循环,生成乘法口诀表。
- 列表推导式:用简洁的一行代码生成新列表。
- 函数的定义和调用:把常用功能封装成函数,让主程序更清晰(就像上面菜单里用了
def show_menu())。 - 更多数据结构:如元组、集合,以及如何用循环处理它们。
继续加油!代码写得越多,这些“综合应用”就会变得像搭积木一样简单有趣。
例题精讲
以下关于嵌套循环的描述,哪个是正确的?
在Python中,使用嵌套for循环可以打印出九九乘法表。
下面的代码使用嵌套循环打印一个5行5列的星号矩形,请填空。
for i in range(5):
for j in range(___):
print('*', end='')
print()执行以下代码后,输出结果中数字10出现了多少次? for i in range(3): for j in range(4): print(i*10 + j)
下面的代码使用while循环嵌套打印一个高度为h的直角三角形(第一行1个*,第二行2个*...)。请填空。
h = 5
i = 1
while i <= h:
j = 1
while j <= ___:
print('*', end='')
j += 1
print()
i += 1