第4章:分支和循环——让程序学会“思考”和“重复”

各位同学,欢迎来到第4章。从这一章开始,Python 程序将不再是“一条道走到黑”的线性执行。它会学会判断,学会重复。说白了,就是程序开始有了“智能”的雏形。

我个人习惯把这一章看作编程的“分水岭”。前面学的变量、数据类型,那是基本功。而分支和循环,才是真正让代码“活”起来的灵魂。你想想看,一个只会从上往下执行的程序,跟一个能根据不同情况做出不同反应的程序,哪个更像“人工智能”?

4.1 if 判断语句:程序的第一双“眼睛”

if 语句,就是让程序“看”条件。它的语法非常简单:

if 条件:
    执行代码

注意那个冒号,还有缩进。Python 用缩进来表示代码块,这是它的特色,也是很多新手踩坑的地方。

我在项目中遇到过这样一个场景:用户输入年龄,程序判断是否成年。代码写出来是这样的:

age = int(input("请输入你的年龄:"))
if age >= 18:
    print("你已经成年了,可以考驾照。")

嗯,这里要注意:input() 返回的是字符串,必须用 int() 转成整数才能比较。我曾经见过一个新手,忘了转换类型,结果 "18" >= 18 永远返回 False,因为字符串和整数比较时,Python 会直接返回 False。

4.2 运算符:判断的“工具”

判断离不开运算符。常用的有这几类:

类型 运算符 说明
比较运算符 ==, !=, >, <, >=, <= 比较两个值
逻辑运算符 and, or, not 组合多个条件
成员运算符 in, not in 检查是否在序列中

这里我特别想说说逻辑运算符。很多初学者会写成 if 18 <= age <= 60,这在 Python 里是合法的,叫“链式比较”。但在其他语言里,你得写成 if age >= 18 and age <= 60。我个人习惯用链式比较,代码更简洁,可读性也更好。

小技巧: 判断一个数是否在某个范围内,用链式比较最直观。比如:if 0 <= score <= 100: 表示分数在0到100之间。

4.3 if-else 语句:二选一

生活不只有“是”,还有“否”。if-else 就是处理这种二选一的情况。

age = int(input("请输入你的年龄:"))
if age >= 18:
    print("欢迎进入网吧。")
else:
    print("未成年人禁止入内。")

为什么会有这种结构?因为程序需要处理所有可能的情况。你想想看,如果只写 if,那当条件不满足时,程序就什么都不做,直接跳过。但很多时候,我们需要在条件不满足时也做点事情。

我曾经在做一个用户权限系统时,就用了多层 if-else。不过后来发现嵌套太深,代码像“箭头”一样往右偏,可读性很差。后来我改用“提前返回”的方式,代码清爽多了。

避坑指南: 我曾经见过有人把 if-else 嵌套了七八层,调试的时候自己都看晕了。记住:超过三层的嵌套,就该考虑重构了。

4.4 while 循环:重复到条件不满足为止

while 循环,说白了就是“只要条件成立,就一直做”。它的语法:

while 条件:
    执行代码

这里有个大坑:死循环。如果条件永远为 True,程序就会一直跑下去,直到你强制终止它。

我记得刚学编程时,写过一个 while True 的循环,忘了加 break,结果程序卡死了,电脑风扇呼呼转。嗯,从那以后,我每次写 while 循环都会先确认:这个循环能结束吗?

一个经典的例子:猜数字游戏。

import random
target = random.randint(1, 100)
guess = -1
while guess != target:
    guess = int(input("猜一个1到100之间的数字:"))
    if guess < target:
        print("小了,再大点。")
    elif guess > target:
        print("大了,再小点。")
print("恭喜你,猜对了!")

这个例子展示了 while 循环的典型用法:我们不知道要循环多少次,只知道什么时候结束。

4.5 for 循环:遍历一切

for 循环,是用来遍历序列的。字符串、列表、元组、字典……只要是可迭代对象,都能用 for 循环。

fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
    print(f"我喜欢吃{fruit}")

我个人觉得,for 循环比 while 循环更常用。因为在实际开发中,我们更多时候是在处理一组数据,而不是等待某个条件成立。

配合 range() 函数,for 循环可以模拟传统的计数循环:

for i in range(5):  # 0, 1, 2, 3, 4
    print(f"第{i+1}次循环")

range(5) 生成 0 到 4 的整数序列。如果你想要 1 到 5,可以写 range(1, 6)。如果你想要步长,可以写 range(1, 10, 2),得到 1, 3, 5, 7, 9。

重点: for 循环的循环变量(比如上面的 i 和 fruit)只在循环内部有效。循环结束后,这个变量仍然保留最后一次的值。这在某些场景下会引发 bug,要注意。

4.6 break 和 continue:循环的“刹车”和“跳过”

break 是终止整个循环,continue 是跳过当前这次循环,继续下一次。

举个例子:

for i in range(10):
    if i == 5:
        break  # 当 i 等于 5 时,整个循环结束
    print(i)
# 输出:0 1 2 3 4
for i in range(10):
    if i % 2 == 0:
        continue  # 偶数跳过,不打印
    print(i)
# 输出:1 3 5 7 9

我在项目中遇到过这样一个需求:从数据库里读取用户列表,遇到第一个 VIP 用户就停止读取。这时候用 break 就非常合适。

还有一个场景:处理一批数据,遇到无效数据就跳过,继续处理下一个。这时候用 continue。

避坑指南: 我曾经在嵌套循环里用了 break,结果只跳出了内层循环,外层还在继续。后来我才知道,break 只跳出当前这一层循环。如果想跳出多层,要么用标志变量,要么把循环封装成函数,用 return 来跳出。

4.7 综合案例:用户登录系统

把今天学的知识串起来,写一个简单的用户登录系统:

# 预设的用户名和密码
username = "admin"
password = "123456"

# 最多尝试3次
max_attempts = 3
attempt = 0

while attempt < max_attempts:
    input_username = input("请输入用户名:")
    input_password = input("请输入密码:")
    
    if input_username == username and input_password == password:
        print("登录成功!欢迎回来。")
        break
    else:
        attempt += 1
        remaining = max_attempts - attempt
        if remaining > 0:
            print(f"用户名或密码错误,还剩{remaining}次机会。")
        else:
            print("尝试次数过多,账户已锁定。")

这个例子用到了:if-else 判断、while 循环、break 跳出、逻辑运算符 and。你看,一个完整的程序,就是这些基础知识的组合。

好了,第4章的内容就到这里。分支和循环是编程的“骨架”,掌握了它们,你就能写出真正有用的程序了。下一章,我们会学习函数——把代码“打包”成可复用的模块。

公众号:蓝海资料掘金营,微信deep3321