02 流程控制:条件判断、模式匹配与循环

02 流程控制:条件判断、模式匹配与循环

学习方式:对照黑马 Python+AI 讲义第 2 章第 2 节(流程控制语句)边看边敲,代码验证文件 02.py。已有 C++/Java 基础,重点记录 Python 与它们的写法差异。

一、if 条件判断

1.1 if…else 基本用法

1
2
3
4
5
a = 17
if a >= 18:
print('你已经成年')
else:
print('你未成年')

条件不需要括号(C++/Java 需要 if (a >= 18)),代码块靠缩进区分,没有大括号,也没有分号。

1.2 if…elif…else 多分支

1
2
3
4
5
6
7
a = -5
if a > 0:
print("a>0")
elif a == 0:
print("a==0")
else:
print("a<0")

Python 没有 else if,多分支用 elif。执行顺序从上到下,满足第一个分支就不再往下判断,else 放最后兜底。

1.3 语法要点与坑

  • 缩进是语法不是风格:同一代码块缩进必须一致,混用 Tab 和空格直接报错。
  • 条件不用加括号,组合条件用 and/or(不是 &&/||)。
  • 多分支顺序很重要:成绩等级这类要先写高分条件再写低分,顺序反了会提前命中。
  • 换行续写用 \:
1
2
3
if (account == "admin" and password == "666888") or \
(account == "root" and password == "547527"):
print("登录成功")

二、match 模式匹配(Python 3.10+)

针对同一个变量的多个固定值分支,比 if-elif 简洁。case 值1 | 值2 表示或,case _ 是默认兜底:

1
2
3
4
5
6
7
8
9
10
a = 3
match a:
case 10:
print('10')
case 5:
print('5')
case 2 | 4:
print('2|4')
case _:
print('Error') # a=3 时输出 Error

选择原则:

  • 固定值分支(星期、运算符、指令)→ match...case;
  • 范围判断、组合条件(score >= 85)→ if...elif。

三、while 循环

3.1 基本用法与 while…else

1
2
3
4
5
6
i = 0
while i < 10:
print(f'我爱python :{i}')
i += 1
else:
print("循环结束")
  • while 靠条件控制是否继续,条件结果必须是布尔。
  • 可带 else:循环正常结束(条件变 False)时执行;被 break 跳出则不执行。
  • 必须规划终止条件,否则死循环卡死。

3.2 死循环 + break 模式

“直到满足才退出”的标准写法(登录重试、猜数字):

1
2
3
4
5
6
7
8
9
10
11
12
import random
target = random.randint(1, 100) # 随机 1-100

while True:
guess = int(input("请输入你猜的数字:"))
if guess == target:
print("猜对了")
break
elif guess > target:
print("猜大了")
else:
print("猜小了")

四、for 循环与 range

4.1 遍历机制

for 本质是遍历(对数据集逐个处理),不是 C++ 那种计数循环。遍历字符串:

1
2
3
4
5
s = 'hello world'
for i in s:
print(i)
else:
print("循环结束")

4.2 range 生成数字序列

三种写法,都不含结束值。实际运行结果(02.py):

1
2
3
4
5
6
7
8
for i in range(10):
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9

for i in range(3, 8):
print(i, end=' ') # 3 4 5 6 7

for i in range(3, 10, 2):
print(i, end=' ') # 3 5 7 9

4.3 while 与 for 怎么选

  • while:条件满足就一直循环,次数通常未知,关注循环条件。
  • for:遍历已知数据集或已知次数的循环,关注每个元素。

五、嵌套循环:99 乘法表

用 while 和 for 各写了一遍,{y:>2} 是 f-string 右对齐占 2 位,让输出对齐。

5.1 while 版本(完整运行结果)

1
2
3
4
5
6
7
8
9
x = 1
while x < 10:
y = 1
while y < 10:
if x >= y:
print(f'{y:>2} *{x:>2}={x*y:>2}', end=" ")
y += 1
print()
x += 1
1
2
3
4
5
1 * 1= 1
1 * 2= 2 2 * 2= 4
1 * 3= 3 2 * 3= 6 3 * 3= 9
...
1 * 9= 9 2 * 9=18 3 * 9=27 ... 9 * 9=81

5.2 for 版本(两版写法)

1
2
3
4
5
6
7
8
9
10
11
12
# 写法一:内层全遍历 + if 过滤(y<=x 才输出)
for x in range(1, 10):
for y in range(1, 10):
if y <= x:
print(f'{y:>2} *{x:>2} = {x*y:>2}', end=' ')
print()

# 写法二:内层范围直接用 x 控制(推荐,少一次判断)
for x in range(1, 10):
for y in range(1, x + 1):
print(f'{y:>2} *{x:>2} = {x*y:>2}', end=' ')
print()

要点:外层循环控制行(第二个数),内层循环控制列(第一个数);写法二用 range(1, x+1) 天然限定三角范围,比写法一更简洁。

六、补充知识点与易踩坑

6.1 三元表达式

对应 C++ 的 cond ? a : b,Python 写法是 a if cond else b:

1
2
3
a = 66
s = '好' if a == 67 else '坏'
print(s) # 坏

6.2 enumerate():遍历同时拿索引和值

1
2
3
a = ['a', 'b', 'c']
for i, x in enumerate(a):
print(i, x) # 0 a / 1 b / 2 c

6.3 break/continue 与 for-else 的坑

  • break:结束整个循环;continue:跳过本次进入下一次。
  • for-else / while-else 的坑:只有循环”自然跑完”才执行 else,被 break 跳出时 else 不执行:
1
2
3
4
5
for i in range(5):
if i == 3:
break
else:
print("循环正常结束") # 被 break,这行不会打印

6.4 短路运算、pass、in

1
2
3
4
5
6
7
8
9
10
11
12
13
# and/or 短路:返回的不一定是布尔
print(0 and "abc") # 0 左边假直接返回左边
print(1 and "abc") # abc 两边真返回右边
print(0 or "abc") # abc
# 常见用法:x = user_input or "默认值"

# pass 占位符:空分支先占坑
if a > 100:
pass # 还没想好写啥

# in 成员判断
print("a" in "abc") # True
print(5 in [1, 2, 3]) # False

今日总结

模块 核心要点
if 判断 无括号无大括号,缩进即代码块;多分支用 elif;条件组合用 and/or
match…case 3.10+ 新语法,固定值分支专用;case 值|值、case _ 兜底
while 循环 条件控制,可带 else(正常结束才执行);死循环用 while True + break
for 循环 遍历机制不是计数;range(start, end, step) 不含结束值
嵌套循环 外层控制行、内层控制列;内层范围可用外层变量限定(99 乘法表)
补充 三元 a if c else b;enumerate 拿索引;break 跳出时 else 不执行;and/or 短路;pass 占位;in 判断