前言
入门阶段真正的分水岭,不是「会不会写print」,而是「会不会让程序自己做判断、自己重复做事」。条件语句决定「走哪条路」,循环语句决定「重复几遍」。这两件事构成了所有程序的骨架。
初学者的典型误解有三个:一是以为if后面的括号是必需的(那是 C/Java 的习惯,Python 里不需要);二是以为else if是关键字(Python 里写成elif);三是不知道 Python 的循环也带else子句,而且它和if的else含义完全不同。
本文用 Python 3 讲解条件与循环的最基本用法,包括布尔判断、if/elif/else、while、for、break/continue,以及容易被忽略的循环else。文中所有写法都可在 Python 3.8 及以上直接运行。
一、先弄清「真」与「假」
Python 的条件判断不要求必须是bool对象,任何对象都能被判断真假。规则是:
- 假值:
False、None、数值0、空字符串""、空列表[]、空元组()、空字典{}、空集合set() - 真值:其余一切,包括非空容器和非零数值
# 适用于 Python 3 全版本
print(bool("")) # False,空字符串是假
print(bool("0")) # True,非空字符串是真(注意不是数字 0)
print(bool([0])) # True,非空列表是真,哪怕里面装的是 0
print(bool(0.0)) # False理解这一点很重要:if items:和if len(items) > 0:大多数时候等价,但前者会在items是None时也走假分支,而后者会抛TypeError。
比较运算符和逻辑运算符:
| 运算符 | 含义 | 示例 |
|---|
== | 值相等 | 3 == 3为True |
!= | 值不等 | 3 != 4为True |
is | 是否是同一个对象 | 判断None时用 |
and | 逻辑与,短路 | a and b |
or | 逻辑或,短路 | a or b |
not | 逻辑非 | not a |
二、条件语句:if / elif / else
基本形态如下,注意冒号和缩进:
# 适用于 Python 3 全版本
score = 78
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 60:
grade = "C"
else:
grade = "D"
print(grade) # C几个必须记牢的点:
- 条件表达式后面必须有冒号
:。 - 代码块靠缩进表示,同一块内缩进量必须一致(通常 4 个空格)。
elif是「else if」的缩写,一个if后面可以有任意多个elif,最多一个else。- 判断顺序是从上到下,命中第一个为真的分支后就整条
if语句结束,后面的条件不再求值。所以范围判断要从窄到宽排。
Python 还有一种把条件写在一行里的条件表达式(常被叫做三元运算符):
# 适用于 Python 3 全版本
age = 20
label = "成年" if age >= 18 else "未成年"
print(label) # 成年它的形式是「值为真时取的值 if 条件 else 值为假时取的值」,顺序和 C 的? :不一致,别写反。
三、循环语句:while 与 for
3.1 while:条件为真就一直做
# 适用于 Python 3 全版本
count = 0
total = 0
while count < 5:
total += count
count += 1 # 忘掉这一行就会死循环
print(total) # 10while用于「不知道要循环几次」的场景。循环体里必须有机会改变条件,否则就是死循环。
3.2 for:遍历可迭代对象
Python 的for是「遍历」而不是 C 那种「计数器循环」。凡是可迭代对象(列表、字符串、字典、文件、range 对象等)都能直接遍历:
# 适用于 Python 3 全版本
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
for ch in "abc":
print(ch) # 逐个字符
for i in range(3): # range(3) 产生 0, 1, 2
print(i)range()的常见形态:
| 调用 | 产生的序列 |
|---|
range(5) | 0, 1, 2, 3, 4 |
range(2, 6) | 2, 3, 4, 5 |
range(0, 10, 3) | 0, 3, 6, 9 |
range(5, 0, -1) | 5, 4, 3, 2, 1 |
range对象是惰性的,不会一次性生成整张列表,所以在 Python 3 里range(10**9)本身不占内存。这一点和 Python 2 的range返回列表、需要xrange的旧习惯完全不同——xrange在 Python 3 里已被移除。
3.3 需要下标时用 enumerate
不要写for i in range(len(fruits))再去索引,直接用enumerate:
# 适用于 Python 3 全版本
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
print(index, fruit)
# 0 apple
# 1 banana
# 2 cherry四、break、continue 与循环的 else
break:立即结束整个循环continue:跳过本次剩余部分,进入下一次迭代- 循环的
else:只有循环正常结束(条件变假或迭代器耗尽)时才执行;被break打断则不执行
# 适用于 Python 3 全版本
numbers = [1, 3, 5, 6, 7]
for n in numbers:
if n % 2 == 0:
print(f"找到偶数 {n}")
break
else:
print("没有偶数")
# 输出:找到偶数 6循环else的经典用途就是「查找未命中」的分支,能避免额外设一个布尔标记变量。
实战:一个猜数字小游戏
下面这段代码综合了本文全部知识点,可直接保存为guess.py运行(需要 Python 3.8+):
# 适用于 Python 3.8+
import random
def main():
answer = random.randint(1, 100)
tries = 0
while True:
raw = input("猜一个 1 到 100 的整数(q 退出):")
if raw.strip().lower() == "q":
print(f"已退出,答案是 {answer}")
break
if not raw.strip().lstrip("-").isdigit():
print("请输入整数。")
continue
guess = int(raw)
tries += 1
if guess < answer:
print("小了")
elif guess > answer:
print("大了")
else:
print(f"猜对了!共用了 {tries} 次。")
break
if __name__ == "__main__":
main()这段代码同时演示了:while True配合break的输入循环、continue跳过非法输入、if/elif/else三分支、以及input()返回的永远是字符串所以需要int()转换。
常见坑点
- 把
elif写成else if
❌else if score >= 80:—— 这是 C/Java 的写法,Python 会报SyntaxError✅elif score >= 80:
- 漏写冒号
❌if x > 0换行直接写代码块 ✅if x > 0:冒号不能省
- 用
=做比较
❌if x = 1:—— 在 Python 3 里这是语法错误(2 里也只是意外合法) ✅if x == 1:
while里忘了改变量导致死循环
❌while count < 5: total += count✅ 循环体内加上count += 1
- 缩进不一致
❌ 同一代码块里一行 4 空格、一行 2 空格,或空格与制表符混用 ✅ 全文件统一用 4 个空格,混用时 Python 会抛TabError
- 误以为循环
else总会执行
❌ 认为for ... else的else就等于「循环结束后必做」 ✅else只在循环没有被break打断时执行;想无条件收尾应用finally或循环后直接写
- 用
range(len(x))手动索引
❌for i in range(len(fruits)): print(fruits[i])✅for fruit in fruits:直接迭代;需要下标时用enumerate(fruits)
- 以为
range()返回列表
❌ 说「range(5)是一个[0,1,2,3,4]列表」 ✅ 它返回惰性的range对象,要列表得写list(range(5))
总结
| 主题 | 关键结论 |
|---|
| 真假判断 | 空容器、0、None、""为假,其余为真 |
| 条件语句 | if/elif/else,冒号加缩进,从上到下命中即停 |
| 条件表达式 | A if 条件 else B,与 C 的三元顺序不同 |
while | 条件为真就循环,须保证条件会变 |
for | 遍历可迭代对象,不是计数器循环 |
range | 惰性对象,range(start, stop, step) |
| 循环控制 | break跳出、continue跳过 |
循环else | 未被break打断时才执行 |
条件和循环是「能写程序」的最低门槛。把真假判断、elif的匹配顺序和循环else的语义这三件事吃透,后面学函数、类、异常时就不会被语法细节反复绊倒。