分支与循环综合嵌套
困难3循环里面加判断,程序更聪明——分支与循环综合嵌套
你有没有遇到过这种情况:老师让你在班里依次点名,但遇到请假的同学就不喊,遇到生病的同学就祝他早日康复?这其实就是“循环 + 条件判断”的场景——按顺序一个一个来,但中间根据情况做不同处理。在编程中,我们把这种在循环结构里嵌入条件判断的方式,叫做分支与循环综合嵌套。
简单说,就是:重复做某件事,但每次做的时候要看情况决定怎么做。比如走路时每走一步都要判断前面是不是路口,是路口就拐弯,不是就直走。学会这种嵌套,你写程序就能处理很多真实世界里复杂又有规律的任务。
一、在 for 循环里做判断:一边重复一边选择
最常见的嵌套是 for 循环里放 if 语句。每次循环到一个新值时,先判断它满足什么条件,再执行对应的代码。
经典例子:“叮咚”游戏
从1数到10,遇到3的倍数说“叮”,遇到5的倍数说“咚”,同时是3和5的倍数(比如15)说“叮咚”。我们只用1到10,所以没有同时是3和5的倍数(15不在范围内),但程序里仍然要写好这个判断,防止后面扩充。
for i in range(1, 11): # 循环从1到10,i代表当前数字
if i % 3 == 0 and i % 5 == 0: # 既是3又是5的倍数
print("叮咚")
elif i % 3 == 0: # 是3的倍数(但不是5的倍数)
print("叮")
elif i % 5 == 0: # 是5的倍数(但不是3的倍数)
print("咚")
else: # 其他情况
print(i)
运行结果:
1
2
叮
4
咚
叮
7
8
叮
咚
注意顺序很重要:一定要把“既是3又是5的倍数”放在最前面,否则会先被 elif i % 3 == 0 或 elif i % 5 == 0 捕获,就轮不到“叮咚”了。你可以试试把第一行判断和后面的交换位置,看看结果会变成什么样。
生活中的例子:检查零花钱是否超支
假设你每天花一点零花钱,把一周的花费存在一个列表里。你想知道哪些天花的钱超过了10元,并打印“超支”,否则打印“正常”。
daily_costs = [8, 12, 5, 15, 10, 7, 9] # 一周每天的花费(单位:元)
day = 1 # 记录第几天
for cost in daily_costs: # 遍历每天的花费
if cost > 10:
print("第", day, "天超支啦,花了", cost, "元")
else:
print("第", day, "天正常花了", cost, "元")
day = day + 1 # 天数增加1
输出:
第 1 天正常花了 8 元
第 2 天超支啦,花了 12 元
第 3 天正常花了 5 元
第 4 天超支啦,花了 15 元
第 5 天正常花了 10 元
第 6 天正常花了 7 元
第 7 天正常花了 9 元
二、在 while 循环里做判断:不固定次数,边跑边看
while 循环一般用于“直到满足某个条件才停止”的场景。在里面加判断,可以让程序在循环过程中根据当前情况决定是否继续或做什么。
例子:猜数字游戏(简易版)
程序生成一个1~10的随机数,你每次猜一个数,程序会告诉你猜大了还是猜小了,直到猜对为止。
import random
secret = random.randint(1, 10) # 系统随机生成一个1到10的秘密数字
guess = 0 # 初始化猜的数字为0(保证进入循环)
print("猜一个1到10之间的数字")
while guess != secret: # 只要没猜对,就一直循环
guess = int(input("请输入你的猜测:")) # 用户输入数字
if guess > secret: # 如果猜大了
print("猜大了,再小一点")
elif guess < secret: # 如果猜小了
print("猜小了,再大一点")
else: # 猜对了
print("恭喜!猜对了!")
每次猜完都会根据条件给出提示,循环继续或结束。这种“循环 + 条件判断”的结构在游戏、输入验证中非常常见。
三、新手最容易犯的错误
-
缩进错误
if下面的代码一定要多缩进一个空格(或一个Tab)。如果缩进不对,Python会报错或逻辑混乱。
❌ 错误写法:for i in range(5): if i > 2: # 缩进不对,超出了循环体 print(i) -
条件顺序搞反
前面“叮咚”例子已经说明了。还有比如判断“大于5且是偶数”,如果写成num % 2 == 0 and num > 5是一样的,但千万别写成num > 5 and num % 2 == 0 and ...却忘记加括号,其实顺序本身不碍事,但逻辑要清晰。 -
忘记冒号
if、elif、else、for、while后面都要加英文冒号:。漏掉它程序会报语法错误。 -
变量名拼写不一致
比如循环变量写了i,后面判断里用成了I(大写i),Python会认为没定义。建议用有意义的英文单词,并保持大小写一致。 -
忘记更新循环控制变量
在while循环里,如果条件永远不变,会变成死循环。比如猜数字游戏里,如果没写guess = input(...)更新猜测值,就会一直在同一个值上循环。
四、完整可运行示例:FizzBuzz 游戏(带统计)
FizzBuzz 是编程面试中很经典的小问题,规则和“叮咚”相似:从1数到30,3的倍数说“Fizz”,5的倍数说“Buzz”,同时是3和5的倍数说“FizzBuzz”,其他数字直接打印。我们再加一个功能:统计一共说了多少次“Fizz”和“Buzz”。
fizz_count = 0 # 统计Fizz出现次数
buzz_count = 0 # 统计Buzz出现次数
for num in range(1, 31): # 从1到30
if num % 3 == 0 and num % 5 == 0: # 同时是3和5的倍数
print("FizzBuzz")
elif num % 3 == 0: # 只是3的倍数
print("Fizz")
fizz_count = fizz_count + 1 # 计数加1
elif num % 5 == 0: # 只是5的倍数
print("Buzz")
buzz_count = buzz_count + 1 # 计数加1
else:
print(num)
print("-------------")
print("Fizz出现了", fizz_count, "次")
print("Buzz出现了", buzz_count, "次")
运行结果(只展示部分输出):
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...
Fizz出现了 8 次
Buzz出现了 4 次
你可以试试修改范围,比如从1到100,看看Fizz、Buzz各出现几次。
五、相关知识点指引
- 条件判断:
if、elif、else的基本用法([链接到条件判断文章]) - for循环:遍历列表、字符串、range() 等([链接到for循环文章])
- while循环:无限循环与控制条件([链接到while循环文章])
- 列表:存储多个数据并逐个处理([链接到列表文章])
- range函数:生成整数序列([链接到range函数文章])
掌握了循环里加判断,你就已经可以用程序解决很多需要“重复检查”的问题了。比如:统计考试成绩的优良中差、找出列表里所有符合条件的元素、控制机器人沿着路线走但遇到障碍就转向…… 大胆去试一试吧!
例题精讲
以下Python代码段运行后,输出结果是什么? sum = 0 for i in range(1, 6): if i % 2 == 0: continue sum += i print(sum)
在while循环中,如果条件永远为真,并且循环体内没有break语句,那么循环将无限执行下去。这种结构通常称为“死循环”。请判断该说法是否正确。
下面的程序使用while循环和if语句,统计输入的正整数中偶数的个数。当输入0时结束。请补全代码。
count = 0
num = int(input())
while num != 0:
if ___:
count += 1
num = int(input())
print(count)阅读以下代码,输出的结果是? for i in range(1, 4): for j in range(1, 4): if i == j: print(i, end=' ')
以下程序通过for循环遍历字符串s,统计其中大写字母的个数。请补全代码。
s = "Hello World!"
count = 0
for ch in s:
if ___:
count += 1
print(count)