程序之所以有"智能",全靠它能在岔路口做选择、在重复里转圈。这一篇把 Python 的三种控制流一次讲透。
有了变量和运算符,接下来最关键的一步就是:让程序自己决定走哪条路、重复做哪件事。这就是控制流。
你将学到
if/elif/else分支,以及 Python 的缩进哲学while循环,break/continue,还有冷门的while ... elsefor循环与range(),遍历序列、字典- 嵌套循环,以及怎么优雅地跳出多层
- 三元表达式(条件一行写)
- 三个动手小题:猜数字、九九乘法表、求素数
前置知识
先读 上一篇:运算符与表达式,特别是"真值测试"那节。
if / elif / else:分支
score = 85
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")
# 输出: 及格
elif 是 "else if" 的缩写,可以有多个。判断从上往下走,命中一个就整体结束:
n = 0
if n > 0:
print("正数")
elif n == 0:
print("零")
else:
print("负数")
# 输出: 零
缩进哲学
Python 用缩进表示代码块,而不是花括号。这逼着你把代码写整齐。
# ❌ 缩进错误:IndentationError
# if True:
# print("没有缩进")
# ✅ 冒号后面统一缩进(推荐 4 个空格)
if True:
print("这行在 if 块里")
print("这行不在 if 块里")
同一个代码块里缩进必须一致。混用 Tab 和空格是最坑的新手错误,统一用 4 个空格就没问题。
while 循环
while 在条件为真时反复执行。
count = 0
while count < 3:
print(f"第 {count + 1} 次")
count += 1 # 千万别忘了更新,否则死循环
# 输出: 第 1 次 / 第 2 次 / 第 3 次
break 与 continue
break:立刻跳出整个循环。continue:跳过本次剩余代码,直接进入下一次。
# break:找到 5 就停
n = 1
while True:
if n == 5:
print("找到了", n) # 输出: 找到了 5
break
n += 1
# continue:跳过偶数
for i in range(6):
if i % 2 == 0:
continue
print(i, end=" ")
# 输出: 1 3 5
while ... else
一个很多人不知道的特性:循环正常结束(没被 break)时,执行 else。
n = 7
i = 2
while i < n:
if n % i == 0:
print(f"{n} 可以被 {i} 整除")
break
i += 1
else:
print(f"{n} 是素数")
# 输出: 7 是素数(循环自然结束,没 break,触发 else)
这个 else 常用来表示"搜索了一圈都没找到"。
for 循环与 range()
for 用来遍历一个序列里的每个元素。
for ch in "abc":
print(ch, end=" ") # 输出: a b c
for fruit in ["苹果", "香蕉", "橘子"]:
print(f"爱吃{fruit}") # 输出: 爱吃苹果 / 爱吃香蕉 / 爱吃橘子
range() 三种用法
print(list(range(5))) # 输出: [0, 1, 2, 3, 4]
print(list(range(2, 6))) # 输出: [2, 3, 4, 5]
print(list(range(0, 10, 3))) # 输出: [0, 3, 6, 9]
print(list(range(5, 0, -1))) # 输出: [5, 4, 3, 2, 1](倒着数)
total = 0
for i in range(1, 101): # 经典用法:循环 n 次
total += i
print(total) # 输出: 5050
遍历字典
person = {"name": "小明", "age": 18}
for key, value in person.items(): # 同时拿到键和值(最常用)
print(f"{key} = {value}")
# 输出: name = 小明 / age = 18
enumerate 与 zip
for i, fruit in enumerate(["苹果", "香蕉"]): # 带索引
print(i, fruit)
# 输出: 0 苹果 / 1 香蕉
names = ["小明", "小红"]
ages = [18, 20]
for name, age in zip(names, ages): # 并行遍历
print(f"{name} {age} 岁")
# 输出: 小明 18 岁 / 小红 20 岁
嵌套循环
循环里再套循环,通常用来处理"二维"的事情。
for i in range(1, 4):
for j in range(1, 4):
print(f"({i},{j})", end=" ")
print() # 每行结束换行
# 输出:
# (1,1) (1,2) (1,3)
# (2,1) (2,2) (2,3)
# (3,1) (3,2) (3,3)
想一次跳出多层循环,可以用标志变量(外层循环检查 found 再 break),或干脆把这段逻辑封进函数、用 return 退出,后者更清爽。
三元表达式
if 可以写成一行,叫三元表达式:值1 if 条件 else 值2
age = 20
if age >= 18: # 普通写法
label = "成年"
else:
label = "未成年"
label = "成年" if age >= 18 else "未成年" # ✅ 一行搞定
print(label) # 输出: 成年
动手小题
练习一:猜数字
import random
target = random.randint(1, 100)
tries = 0
while True:
guess = int(input("猜一个 1~100 的数字:"))
tries += 1
if guess < target:
print("小了,再试试")
elif guess > target:
print("大了,再试试")
else:
print(f"猜对了!用了 {tries} 次")
break
练习二:九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}x{i}={i*j}", end="\t")
print()
# 输出:
# 1x1=1
# 1x2=2 2x2=4
# 1x3=3 2x3=6 3x3=9
# ...
练习三:求素数(用 while ... else 的优雅写法)
primes = []
for n in range(2, 31):
for d in range(2, n):
if n % d == 0:
break # 找到因子,不是素数
else:
primes.append(n) # 没 break,说明是素数
print(primes)
# 输出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
常见坑
坑一:死循环
# ❌ 忘了更新变量,程序卡死
# n = 0
# while n < 5:
# print(n)
# ✅
n = 0
while n < 5:
print(n)
n += 1
坑二:for 循环中改列表
nums = [1, 2, 3, 4, 5]
# ❌ 边遍历边删除,会漏掉元素
# for x in nums:
# if x % 2 == 0:
# nums.remove(x)
# ✅ 生成新列表
nums = [x for x in nums if x % 2 != 0]
print(nums) # 输出: [1, 3, 5]
坑三:误以为 else 只在条件为假时执行
# ✅ 记住:while/for-else 的执行条件 = "循环没被 break"
for i in [1, 2, 3]:
print(i)
else:
print("正常结束") # 输出: 正常结束
坑四:忘记 int() 转换导致比较出错
# ❌ input 返回字符串,跟数字比较会 TypeError
# age = input("年龄:")
# if age > 18: ...
# ✅
age = int(input("年龄:"))
if age > 18:
print("成年")
小结
if/elif/else从上往下匹配,命中即止;缩进用 4 个空格。while用于条件驱动的循环,注意别死循环。break跳出整个循环,continue跳过本次。while/for的else在"循环未被 break"时执行,适合"搜索未果"场景。range()、enumerate()、zip()是 for 循环的三大好帮手。- 嵌套循环处理二维问题,跳多层用标志变量或函数封装。
- 三元表达式
A if 条件 else B能一行解决简单分支。 - 猜数字、九九乘法表、求素数是三个经典练手题,值得亲手敲一遍。
延伸阅读
- 25-函数基础:把上面这些逻辑装进函数,代码会清爽很多
- 27-列表元组字典集合:循环遍历的各种容器
上一篇:运算符与表达式 · 下一篇:函数基础
文章回复
0 条公开回复