4. 分支和循环:让代码学会做决定和重复
写代码最核心的两件事是什么?我个人觉得,就是判断和重复。
你想想看,现实中的程序要么在「做选择」——如果用户登录了就跳转首页,否则显示登录框;要么在「重复做一件事」——把100个商品的价格挨个算一遍。今天这一章,我们就彻底搞定这两个基本功。
4.1 if判断语句:最简单的选择
先看一个最基础的场景。你写了个程序,要判断用户年龄是否成年:
age = 18
if age >= 18:
print("已成年,可以注册")
嗯,这里要注意:if后面跟的是条件表达式,条件为True就执行缩进里的代码。冒号千万别漏,缩进必须统一(我习惯用4个空格)。
小技巧:Python里任何非零数字、非空字符串、非空列表都会被当作
True。0、空字符串、None会被当作False。这个特性在很多场景下能简化代码。
4.2 运算符:判断的基石
条件判断离不开运算符。我把常用的分成了三类,列个表你一看就明白:
| 类型 | 运算符 | 示例 | 说明 |
|---|---|---|---|
| 比较运算符 | == != > < >= <= |
5 > 3 |
返回True/False |
| 逻辑运算符 | and or not |
a > 0 and b < 10 |
组合多个条件 |
| 成员运算符 | in not in |
"py" in "python" |
判断是否包含 |
我在项目中遇到过一个问题:新手容易把=(赋值)和==(等于)搞混。写if age = 18会直接报语法错误,因为Python不允许在条件里赋值。
4.3 if-else语句:两条路
单分支不够用?那就上if-else:
score = 85
if score >= 60:
print("及格了")
else:
print("不及格,需要补考")
如果条件不止两个呢?用elif:
score = 85
if score >= 90:
grade = "优秀"
elif score >= 80:
grade = "良好"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
print(f"等级:{grade}")
避坑指南:我曾经在写多分支时,把条件顺序搞反了——先判断
score >= 60再判断score >= 90。结果85分直接进了「及格」分支,因为第一个条件就满足了。记住:范围类条件要从严格到宽松。
4.4 while循环:重复直到条件不成立
说白了,while就是「只要条件为真,就一直做」。看个猜数字的例子:
import random
target = random.randint(1, 100)
guess = None
while guess != target:
guess = int(input("猜一个1-100的数字:"))
if guess > target:
print("大了")
elif guess < target:
print("小了")
print("恭喜猜对了!")
这里有个关键点:循环体内一定要有改变条件的语句,否则会变成死循环。我刚开始学的时候,就写过忘记更新计数器的代码,程序直接卡死。
4.5 for循环:遍历一切可迭代对象
for循环在Python里用得比while多得多。它专门用来遍历列表、字符串、字典等可迭代对象:
# 遍历列表
fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 配合range()生成数字序列
for i in range(5): # 0,1,2,3,4
print(f"第{i+1}次循环")
# 遍历字典
scores = {"张三": 90, "李四": 85}
for name, score in scores.items():
print(f"{name}得了{score}分")
我个人习惯用for而不是while来遍历,因为for自动处理了迭代和结束条件,不容易出错。
4.6 break和continue:控制循环的节奏
这两个关键字是循环的「遥控器」:
- break:立即跳出整个循环
- continue:跳过本次循环,进入下一次
看个实际例子:
# break示例:找到第一个偶数就停止
numbers = [1, 3, 5, 8, 9, 10]
for num in numbers:
if num % 2 == 0:
print(f"找到偶数:{num}")
break
# continue示例:跳过所有奇数
for num in range(10):
if num % 2 != 0:
continue
print(f"偶数:{num}")
核心区别:break是「全剧终」,continue是「这一集跳过」。我在处理数据清洗时经常用continue跳过无效数据,用break在找到目标后提前结束,能省不少时间。
4.7 知识体系总览
下面这张图把本章的核心知识点串起来了,建议你保存下来对照学习:
4.8 实战:用循环和判断写个菜单程序
把今天学的串起来,写个简单的命令行菜单:
while True:
print("\n===== 学生成绩管理系统 =====")
print("1. 录入成绩")
print("2. 查看平均分")
print("3. 退出")
choice = input("请选择操作:")
if choice == "1":
scores = []
while True:
s = input("输入成绩(输入-1结束):")
if s == "-1":
break
scores.append(int(s))
print(f"已录入{len(scores)}个成绩")
elif choice == "2":
if len(scores) == 0:
print("还没有成绩数据")
continue
avg = sum(scores) / len(scores)
print(f"平均分:{avg:.1f}")
elif choice == "3":
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入")
这个例子把while、if-elif-else、break、continue全用上了。你想想看,如果不用循环和判断,要实现这个功能得写多少重复代码?
我的建议:学完这一章后,试着用分支和循环改写你之前写过的线性代码。比如把三个独立的print改成循环,把硬编码的判断改成if-else。这种「重构练习」对培养编程思维特别有帮助。