第4章 分支与循环:控制程序的“大脑”
学编程,说白了就是学怎么让计算机听你的话。前面我们学了变量、数据类型,那都是“静态”的东西。真正让程序活起来的,是分支和循环。这两个东西,我做了这么多年项目,几乎每天都在用。没有它们,程序就是一潭死水。
核心思想:程序默认是“顺序执行”的——从上往下,一行一行跑。但现实世界哪有这么简单?你需要根据条件做选择(分支),也需要重复做某件事(循环)。这就是控制流的本质。
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:控制循环的“刹车”和“跳过”。
说实话,分支和循环是编程的“骨架”。你以后写的每一个程序,几乎都离不开它们。多练、多写,慢慢就会形成肌肉记忆。