Python 条件判断与循环

AI 辅助生成本文由 AI 起草并经人工核查,示例均标明软件版本;发现错误请以官方文档为准。

Python 3.13

程序之所以有用,是因为它能根据条件做不同的事、把重复动作交给循环。这一篇把判断与循环的写法和坑一次说清。

环境准备

本文示例在 Python 3.13 下验证:

python --version
# Python 3.13.x

把代码存成 flow.py,用 python flow.py 运行即可看到输出。

if / elif / else

score = 85

if score >= 90:
    print("优秀")
elif score >= 60:
    print("及格")
else:
    print("需要努力")

elif 可以有任意多个,else 可选。判断从上到下执行,命中第一个为真的分支后就不再看后面的分支,所以条件顺序要从严到宽。

什么是「假」

Python 不需要写 len(items) > 0,这些值本身就代表假:

for value in [None, False, 0, 0.0, "", [], (), {}, set()]:
    print(repr(value), "→", bool(value))
# None → False
# False → False
# 0 → False
# ...
# set() → False

其他对象默认为真。想显式判断「有没有值」,用 is None:

if name is not None:
    print(name)

注意区分:if not items 会把 0 和空字符串也当成空,而 if items is None 只认 None。

三元表达式与海象运算符

status = "成年" if age >= 18 else "未成年"

Python 3.8+ 可以在表达式里顺手赋值(海象运算符 :=):

if (count := len(items)) > 10:
    print(f"太多了:{count} 个")

for 循环

for 遍历的是可迭代对象,不是下标:

for name in ["python", "go", "rust"]:
    print(name)

需要下标时用 enumerate:

for index, name in enumerate(["python", "go", "rust"], start=1):
    print(index, name)
# 1 python
# 2 go
# 3 rust

需要计数循环时用 range:

for i in range(3):        # 0 1 2,不含 3
    print(i)

list(range(1, 10, 2))     # [1, 3, 5, 7, 9],起点含、终点不含、步长 2

同时遍历两个序列用 zip,长度以短的为准:

for key, value in zip(["a", "b"], [1, 2]):
    print(key, value)
# a 1
# b 2

while 循环

count = 3
while count > 0:
    print(count)
    count -= 1

while True 配合 break 是常见的「先执行再判断」写法:

while True:
    line = input("输入 q 退出:")
    if line == "q":
        break
    print(f"你输入了:{line}")

break / continue / else

  • break:直接跳出整个循环。
  • continue:跳过本轮剩下的代码,进入下一轮。
  • else:循环没有被 break 中断时才执行。
for n in [2, 4, 5, 6]:
    if n % 2 != 0:
        print(f"{n} 不是偶数")
        break
else:
    print("全部是偶数")
# 5 不是偶数(else 不执行)

else 用在查找场景很顺手:找到就 break,没找到走 else 处理默认值。

match 语句(3.10+)

多分支匹配结构时,match 比一长串 elif 清楚:

match command.split():
    case ["quit"]:
        print("退出")
    case ["load", filename]:
        print(f"加载 {filename}")
    case _:
        print("未知命令")

case _ 是兜底分支,类似 else。

常见错误与注意事项

1. 遍历时修改列表

items = [1, 2, 3, 4]
for item in items:
    if item % 2 == 0:
        items.remove(item)   # 结果不可预期:[1, 3] 还是 [1, 3]?取决于迭代器内部位置

改为遍历副本,或用推导式新建列表:

items = [item for item in items if item % 2 != 0]

2. 用 is 比较值

a = 1000
b = 1000
a is b      # False(不同对象),要用 ==

is 只用于和 None、True、False 这类单例比较。

3. 忘了更新循环变量导致死循环

while 里必须有让条件变假的语句,否则程序卡住(可用 Ctrl+C 中断)。

4. 缩进混用空格与 Tab

Python 靠缩进划分代码块。统一用 4 个空格,编辑器开启「Tab 转空格」。

小结

  • 判断靠真值规则,空容器、0、None 都是假;判断 None 用 is。
  • for 遍历可迭代对象,要下标用 enumerate,要计数用 range。
  • break 跳出、continue 跳过本轮、循环 else 只在没被 break 时执行。
  • 别在遍历过程中增删同一个列表。

下一步