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 知识体系总览

下面这张图把本章的核心知识点串起来了,建议你保存下来对照学习:

分支与循环知识体系 分支结构(判断) 循环结构(重复) if 单分支 if-else 双分支 if-elif-else 多分支 while 循环 for 循环 break 跳出 continue 跳过 核心:运算符(比较、逻辑、成员)是判断的基础 range() 常与 for 配合生成数字序列

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。这种「重构练习」对培养编程思维特别有帮助。