第4章 分支与循环:控制程序的“大脑”

学编程,说白了就是学怎么让计算机听你的话。前面我们学了变量、数据类型,那都是“静态”的东西。真正让程序活起来的,是分支和循环。这两个东西,我做了这么多年项目,几乎每天都在用。没有它们,程序就是一潭死水。

核心思想:程序默认是“顺序执行”的——从上往下,一行一行跑。但现实世界哪有这么简单?你需要根据条件做选择(分支),也需要重复做某件事(循环)。这就是控制流的本质。

第4章 知识体系:分支与循环 程序控制流 分支结构 循环结构 if 判断 if-else 运算符 while 循环 for 循环 break/continue 分支让程序会“思考”,循环让程序会“重复”。两者结合,能解决90%的逻辑问题。

4.1 运算符:判断的“语言”

要写判断,首先得会“说话”。运算符就是你和计算机沟通判断逻辑的语言。我个人习惯把运算符分成三类:比较、逻辑、成员。

4.1.1 比较运算符

说白了就是比大小、比相等。结果只有两种:True 或 False。

运算符 含义 示例 结果
== 等于 5 == 5 True
!= 不等于 5 != 3 True
> 大于 5 > 3 True
< 小于 5 < 3 False
>= 大于等于 5 >= 5 True
<= 小于等于 5 <= 3 False

我曾经踩过一个坑:把 == 写成了 =。在 Python 里,= 是赋值,== 才是判断相等。这个错误,我至少见过新手犯一百次。嗯,我自己也犯过。

4.1.2 逻辑运算符

一个条件不够?那就组合起来。逻辑运算符就是“胶水”。

  • and:两边都真才真。我管它叫“一票否决制”。
  • or:一边为真就真。这叫“一票通过制”。
  • not:取反。真的变假,假的变真。
age = 25
has_id = True

# 检查是否成年并且有身份证
if age >= 18 and has_id:
    print("可以进入")  # 输出:可以进入

# 检查是否未成年或者没有身份证
if not (age >= 18) or not has_id:
    print("禁止进入")  # 不会执行

4.1.3 成员运算符

这个我特别喜欢用。判断一个东西在不在“集合”里,用 in 和 not in。

fruits = ["苹果", "香蕉", "橘子"]
if "苹果" in fruits:
    print("苹果在列表里")  # 输出:苹果在列表里

if "西瓜" not in fruits:
    print("西瓜不在列表里")  # 输出:西瓜不在列表里

4.2 if 判断语句:让程序做选择

你想想看,程序如果只能顺序执行,那跟流水账有什么区别?if 就是给程序装上了“大脑”。

4.2.1 基本 if 语句

格式很简单:if 条件: 执行代码。注意那个冒号,还有缩进。Python 靠缩进区分代码块,这是硬规矩。

score = 85
if score >= 60:
    print("及格了!")  # 输出:及格了!

4.2.2 if-else 语句

非此即彼。条件成立走 if,不成立走 else。

score = 45
if score >= 60:
    print("及格了!")
else:
    print("不及格,继续努力。")  # 输出:不及格,继续努力。

4.2.3 if-elif-else 语句

多个条件怎么办?用 elif。它相当于“否则如果”。

score = 85
if score >= 90:
    grade = "优秀"
elif score >= 80:
    grade = "良好"  # 执行这个分支
elif score >= 70:
    grade = "中等"
elif score >= 60:
    grade = "及格"
else:
    grade = "不及格"
print(f"等级:{grade}")  # 输出:等级:良好

我的习惯:写 if-elif 时,把最可能成立的条件放前面。这样程序能少判断几次,效率更高。虽然 Python 不在乎这点性能,但这是个好习惯。

4.3 while 循环:重复直到条件不成立

循环就是让程序“反复做同一件事”。while 循环的逻辑是:只要条件为真,就一直执行。

count = 0
while count < 5:
    print(f"第 {count + 1} 次循环")
    count += 1  # 别忘了更新计数器,否则会死循环

我曾经犯过一个低级错误:忘记在 while 循环里更新条件变量,结果程序跑成了死循环,CPU 直接飙到 100%。嗯,从那以后我写 while 都会先检查“退出条件”有没有写对。

4.4 for 循环:遍历一切

for 循环是我用得最多的循环。它专门用来“遍历”一个序列——列表、字符串、元组、字典,甚至文件行。

4.4.1 遍历列表

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

4.4.2 使用 range()

想循环指定次数?用 range()。它生成一个数字序列。

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

# range(2, 6) 生成 2,3,4,5
for i in range(2, 6):
    print(i)

# range(1, 10, 2) 生成 1,3,5,7,9(步长为2)
for i in range(1, 10, 2):
    print(i)

4.4.3 遍历字典

student = {"name": "小明", "age": 18, "score": 95}
for key, value in student.items():
    print(f"{key}: {value}")

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

有时候,循环需要提前结束,或者跳过某一次。这时候 break 和 continue 就派上用场了。

4.5.1 break:立即跳出循环

找到目标就停,别浪费资源。

numbers = [1, 3, 5, 7, 9, 10, 11]
for num in numbers:
    if num % 2 == 0:
        print(f"找到第一个偶数:{num}")
        break  # 找到就停

4.5.2 continue:跳过本次,继续下一次

不满足条件的,直接跳过。

for i in range(1, 11):
    if i % 2 == 0:
        continue  # 偶数跳过
    print(i)  # 只打印奇数:1,3,5,7,9

实战经验:我在写爬虫时,经常用 break 控制爬取页数,用 continue 跳过无效数据。这两个小东西,用好了能省不少时间。

4.6 综合实战:猜数字游戏

光说不练假把式。我们来写一个完整的猜数字游戏,把今天学的都用上。

import random

# 生成1-100之间的随机数
target = random.randint(1, 100)
guess_count = 0
max_attempts = 7

print("猜数字游戏开始!范围1-100,你有7次机会。")

while guess_count < max_attempts:
    try:
        guess = int(input("请输入你猜的数字:"))
    except ValueError:
        print("请输入有效的数字!")
        continue  # 跳过本次,不消耗次数

    guess_count += 1

    if guess == target:
        print(f"恭喜你!猜对了!用了{guess_count}次。")
        break  # 猜对就结束
    elif guess < target:
        print("猜小了,再大一点。")
    else:
        print("猜大了,再小一点。")

    # 提示剩余次数
    remaining = max_attempts - guess_count
    if remaining > 0:
        print(f"还剩{remaining}次机会。")
    else:
        print(f"很遗憾,机会用完了。正确答案是{target}。")

我建议你:把这个代码自己敲一遍,然后改一改——比如把次数改成10次,或者把范围改成1-500。动手改代码,是学编程最快的方式。

4.7 本章小结

这一章我们学了控制程序的“大脑”:

  • 运算符:比较、逻辑、成员,是判断的“语言”。
  • if 判断:让程序做选择,if-elif-else 是最常用的结构。
  • while 循环:条件为真就一直跑,别忘了更新条件。
  • for 循环:遍历一切,配合 range() 特别好用。
  • break 和 continue:控制循环的“刹车”和“跳过”。

说实话,分支和循环是编程的“骨架”。你以后写的每一个程序,几乎都离不开它们。多练、多写,慢慢就会形成肌肉记忆。