上一篇我们学完了变量和运算符,这一篇进入程序的控制流:条件判断和循环。
一、前言:从"会算数"到"会做决定"
上一篇的代码都是顺序执行的——从上到下按部就班。但真实程序的需求远不止"算个结果":
- 要根据不同的输入走不同的分支 → 条件语句(if / else)
- 要反复执行同一段逻辑 → 循环语句(while / for)
条件 + 循环,构成了程序的控制流。它们是所有编程语言都有的三大基本结构(顺序、选择、循环)里的后两个。
Python 和 C++ 在控制流上逻辑完全一致(毕竟都是图灵完备的语言),但在写法上差异巨大:Python 用缩进表示代码块、用 elif、for 是"遍历式"的;C++ 用大括号、用 else if、for 是"计数式"的。这篇我们依然全部用双代码对比,并补充课程里没展开的内容(三目运算符、for-else、do-while、switch/match 等)。
先看总览对比表:
| 代码块表示 | 缩进(4 空格 / Tab) | 大括号 { } |
| 多条件分支 | elif | else if |
| 条件括号 | if 条件:(无括号) | if (条件) |
| 空语句 | pass | ;(空分号) |
| while 循环 | while 条件: | while (条件) |
| for 循环 | 遍历式:for i in range(…) | 三要素计数式:for(i=1; i<=n; i++) |
| 循环配套 | break / continue | break / continue |
| break 附带 | for/while 可带 else(独有) | 没有 |
| 退出循环 | 无 do-while,用 while True | 有 do-while |
| 三目运算 | a if 条件 else b | 条件 ? a : b |
| switch 分支 | match(Python 3.10+) | switch-case |
| 缩进是否强制 | 强制,错了直接报错 | 不强制(不缩进也能编译) |
二、顺序语句
默认情况下,代码从上到下逐行执行,这就是顺序语句:
print("1")
print("2")
print("3")
结果一定是 123,不会出现 321。这个顺序对计算机来说至关重要——编程是一件"明确无歧义"的事,步骤的顺序直接影响结果。
C++ 同理:
std::cout << "1" << std::endl;
std::cout << "2" << std::endl;
std::cout << "3" << std::endl;
两门语言在这一节没有任何区别。真正的分水岭从条件语句开始。
三、条件语句
3.1 if / elif / else 语法对比
Python 用 if / elif / else 三个关键字表达分支,结构非常清晰:
# Python
choice = input("输入 1 表示认真学习,输入 2 表示躺平摆烂: ")
if choice == "1":
print("你会找到好工作!")
elif choice == "2":
print("你可能毕业就失业了!")
else:
print("你的输入有误!")
C++ 用 if / else if / else:
// C++
#include <iostream>
#include <string>
using namespace std;
int main() {
string choice;
cin >> choice;
if (choice == "1") {
cout << "你会找到好工作!" << endl;
} else if (choice == "2") {
cout << "你可能毕业就失业了!" << endl;
} else {
cout << "你的输入有误!" << endl;
}
return 0;
}
关键差异(高频考点):
| 多条件关键字 | elif(合体) | else if(两个词,有空格) |
| 条件外面括号 | 不写 ( ) | 必须写 ( ) |
| 条件后结尾 | 以 : 结尾 | 无冒号 |
| 代码块 | 缩进 | { } |
| 括号是否可省 | — | 单条语句可省,但建议永远不省 |
记忆技巧:elif 是 "else if" 的缩写合体。写 Python 时忘了冒号、忘了缩进、把 elif 写成 else if,是三大新手报错来源。
3.2 缩进 vs 大括号:代码块的表示方式
这是 Python 和 C++ 在视觉上最直观的差异。
Python 用缩进表示代码块,同一级的缩进就是一个块:
# 代码1:world 属于 if 内部
a = input("请输入一个整数: ")
if a == "1":
print("hello")
print("world") # 有缩进,属于 if
# 代码2:world 在 if 外部
if a == "1":
print("hello")
print("world") # 无缩进,不管条件成不成立都执行
代码块还能嵌套,缩进层级越多,嵌套越深:
if a == "1":
if b == "2":
print("hello") # 两级缩进
print("world") # 一级缩进
print("python") # 无缩进
C++ 用大括号表示代码块,缩进纯粹是"给人看的":
if (a == 1) {
if (b == 2) {
cout << "hello" << endl; // 两层
}
cout << "world" << endl; // 一层
}
cout << "python" << endl; // 外层
本质区别:在 C++ 里缩进写得不齐,编译照样通过,只是可读性差;在 Python 里缩进是语法的一部分,缩进错了直接 IndentationError。 好处:强制大家写整齐的代码,可读性有保障。 坏处:嵌套层次一多就"乱花渐欲迷人眼",于是有了"写 Python 要自备游标卡尺"的梗。 建议:不管哪门语言,都坚持用统一的缩进(团队里定好 4 空格还是 Tab,别混用)。
3.3 空语句:pass vs 空分号
有些场景我们需要一个"什么都不做"的占位,Python 用 pass:
# Python:如果数字不为 1,什么都不做(占个位置)
a = int(input("请输入一个整数:"))
if a != 1:
pass # 空语句,什么都不干,只是让语法合法
else:
print("hello")
如果删掉 pass,if a != 1: 后面没有语句块,直接报语法错误:
if a != 1:
else: # SyntaxError: expected an indented block
print("hello")
C++ 的对应写法是空分号(一条空语句):
if (a != 1) {
; // 空语句,占位
} else {
cout << "hello" << endl;
}
pass 的常见用途:先搭好函数/类/循环的架子,逻辑后面再填;在 except 里吞掉暂时不想处理的异常。C++ 里写 {} 空块或 ; 都能占位。
3.4 补充:三目运算符
C++ 的三目运算符是 条件 ? 值1 : 值2:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 结果是 20
Python 没有 ?:,但它有一个顺序相反的三目写法:值1 if 条件 else 值2
a, b = 10, 20
max_val = a if a > b else b # 结果是 20
记忆口诀:C++ 是"条件放前面"(? : 夹中间);Python 是"条件放中间"(if … else 夹住两个值)。其实读起来像一句英文:"a if a > b else b" —— "如果 a>b 就选 a,否则选 b"。
3.5 补充:多路分支 switch / match
C++ 用 switch-case 处理"一个变量的多个取值":
int grade = 2;
switch (grade) {
case 1: cout << "优秀" << endl; break;
case 2: cout << "良好" << endl; break;
case 3: cout << "及格" << endl; break;
default: cout << "其他" << endl; break;
}
注意 C++ 的 switch 有个大坑:每个 case 结尾必须写 break,否则会穿透(fall-through)继续执行下一个 case。忘记 break 是经典 bug。
Python 3.10+ 引入了 match-case(结构化模式匹配),语法完全不同:
# Python 3.10+
grade = 2
match grade:
case 1:
print("优秀")
case 2:
print("良好")
case 3:
print("及格")
case _:
print("其他")
- case 值: 相当于 C++ 的 case 值:
- case _: 是通配符,相当于 C++ 的 default:
- 不需要 break!每个 case 自动结束,不会穿透。
match 远不止"switch 平替",它还能做结构匹配(解包元组、匹配列表、按类型匹配)。不过注意:match 需要 Python 3.10+,老环境别用。
四、循环语句
4.1 while 循环:两门语言几乎一样
Python 的 while 语法:while 条件: + 缩进循环体。
# Python:打印 1-10
num = 1
while num <= 10:
print(num)
num += 1
// C++:打印 1-10
int num = 1;
while (num <= 10) {
cout << num << endl;
num++;
}
差异只有三点:Python 条件不写括号 + 末尾冒号 + 缩进代替大括号。逻辑完全一致。
实例:求 1-100 的和
# Python
sum = 0
num = 1
while num <= 100:
sum += num
num += 1
print(sum) # 5050
// C++
int sum = 0, num = 1;
while (num <= 100) {
sum += num;
num++;
}
cout << sum << endl; // 5050
实例:求 5 的阶乘
# Python
result = 1
n = 1
while n <= 5:
result *= n
n += 1
print(result) # 120
// C++
int result = 1, n = 1;
while (n <= 5) {
result *= n;
n++;
}
cout << result << endl; // 120
小技巧:sum 这类名字在 Python 里其实是内置函数,用来求列表和。示例代码里用作变量没问题,但正式项目建议换个名字(比如 total),免得覆盖内置函数。
4.2 for 循环:Python 和 C++ 差异最大的地方
这是本篇最重要的对比点。C++ 的 for 是计数式(三要素:初始化、条件、更新):
// C++:打印 1-10
for (int i = 1; i <= 10; i++) {
cout << i << endl;
}
Python 的 for 是遍历式(for-each),没有初始化、条件、更新三要素,而是"把可迭代对象里的元素一个个取出来":
# Python:打印 1-10
for i in range(1, 11):
print(i)
怎么理解? 把 Python 的 for i in xxx 读作"对于 xxx 里的每一个元素 i"。range(1, 11) 会生成一个"能一个一个取出 1,2,3,…,10 的对象"。注意:range(1, 11) 是 左闭右开 区间 [1, 11),所以取到 10,不含 11。
对比记忆:
| 定位 | 计数循环(我要循环 N 次) | 遍历循环(我要取完所有元素) |
| 写法 | for (初始化; 条件; 更新) | for 变量 in 可迭代对象: |
| 更新语句 | 必须自己写 i++ | 不需要,自动取下一个 |
| 作用对象 | 任何能用下标访问的 | 可迭代对象(range、字符串、列表等) |
Python 的 for 遍历的不只是数字,可以遍历字符串、列表、元组……任何"可迭代对象":
for ch in "hello": # 遍历字符串的每个字符
print(ch)
for fruit in ["苹果", "香蕉", "橙子"]: # 遍历列表
print(fruit)
C++ 也有类似的范围 for(C++11 起),但写法上仍要声明类型:
for (char ch : string("hello")) { // 遍历字符串
cout << ch << endl;
}
for (int x : {1, 2, 3}) { // 遍历初始化列表
cout << x << endl;
}
4.3 range() 函数详解(Python 独有)
range 是 Python for 循环最常用的搭档,有三种用法:
range(10) # [0, 1, 2, …, 9] 默认从 0 开始,步长 1
range(1, 11) # [1, 2, …, 10] 指定起始和结束(不含结束)
range(2, 12, 2) # [2, 4, 6, 8, 10] 第三个参数是步长
range(10, 0, -1) # [10, 9, …, 1] 步长为负数就是倒着走
实例对比(求 1-100 的和):
# Python
total = 0
for i in range(1, 101):
total += i
print(total) # 5050
// C++
int total = 0;
for (int i = 1; i <= 100; i++) {
total += i;
}
cout << total << endl; // 5050
步长、倒序对比:
# Python:打印 2,4,6,8,10
for i in range(2, 12, 2):
print(i)
# Python:倒着打印 10-1
for i in range(10, 0, -1):
print(i)
// C++:打印 2,4,6,8,10
for (int i = 2; i <= 10; i += 2) {
cout << i << endl;
}
// C++:倒着打印 10-1
for (int i = 10; i >= 1; i–) {
cout << i << endl;
}
记忆 range 口诀:range(起始, 结束, 步长),含头不含尾(左闭右开)。步长为负表示倒序。Python 里没有 C++ 的 for(i=…; i<=…; i++),想实现同样的效果,用 range + 计算就行。
4.4 break 和 continue:两门语言完全一致
break:结束整个循环。continue:跳过本次循环,进入下一次。逻辑两门语言一模一样。
continue 示例(吃包子,第 3 个有虫,跳过不吃):
# Python
for i in range(1, 6):
if i == 3:
continue
print(f"吃完第 {i} 个包子") # 输出 1,2,4,5
// C++
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
cout << "吃完第 " << i << " 个包子" << endl; // 输出 1,2,4,5
}
break 示例(第 3 个包子半只虫,直接不吃了):
# Python
for i in range(1, 6):
if i == 3:
break
print(f"吃完第 {i} 个包子") # 输出 1,2,循环结束
// C++
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
cout << "吃完第 " << i << " 个包子" << endl; // 输出 1,2
}
经典应用:while True + break 实现"先输入再判断"的模式。比如"输入若干个数字求平均值,输入 ; 结束":
# Python
total = 0
count = 0
while True:
num = input("请输入数字:")
if num == ';':
break
total += float(num)
count += 1
print(total / count)
4.5 补充:Python 独有的循环 else
这是 Python 一个非常好用但很多人不知道的特性:for / while 可以跟一个 else,当循环"正常结束"(没有被 break)时,执行 else 里的代码。
# 循环正常结束 → 执行 else
for i in range(1, 4):
print(i) # 1 2 3
else:
print("循环正常结束!") # 会执行
# 循环被 break 打断 → else 不执行
for i in range(1, 4):
if i == 2:
break
else:
print("不会执行")
实际用途:循环里"找东西",没找到就报个信。
# 判断列表里有没有负数
nums = [1, 2, 3, -4, 5]
for n in nums:
if n < 0:
print("找到了负数:", n)
break
else:
print("没有负数")
用 C++ 实现同样的"没找到"逻辑,要额外加一个标志变量:
bool found = false;
for (int n : {1, 2, 3, -4, 5}) {
if (n < 0) {
cout << "找到了负数: " << n << endl;
found = true;
break;
}
}
if (!found) {
cout << "没有负数" << endl;
}
对比就能看出来:Python 的 for-else 帮我们省掉了 found 标志变量,语义也更直白:"找完了都没找到,就做 xxx"。
4.6 补充:do-while(C++ 独有,Python 怎么模拟)
C++ 有 do-while:先执行一次循环体,再判断条件(保证循环体至少执行一次):
// C++
int x = 0;
do {
x++;
} while (x < 3); // 先做后判,至少执行一次
Python 没有 do-while。想实现"先执行再判断",用 while True + 末尾判断 break 模拟:
# Python:模拟 do-while,保证循环体至少执行一次
x = 0
while True:
x += 1
if not (x < 3):
break
4.7 补充:无限循环 while True vs for(;;)
两门语言都支持"死循环",用 break 退出:
# Python
while True:
cmd = input("请输入命令:")
if cmd == 'quit':
break
// C++
for (;;) { // 或 while (true)
string cmd;
cin >> cmd;
if (cmd == "quit") break;
}
4.8 补充:遍历字符串 / 列表 / enumerate
Python 遍历容器非常自然(见 4.2),还有一个常用神器 enumerate——遍历的同时拿到下标:
names = ["张", "李", "王"]
for idx, name in enumerate(names):
print(f"第{idx}个是{name}")
# 第0个是张
# 第1个是李
# 第2个是王
C++ 要下标就得自己维护,或用 std::map 风格:
vector<string> names = {"张", "李", "王"};
for (size_t i = 0; i < names.size(); i++) {
cout << "第" << i << "个是" << names[i] << endl;
}
enumerate 的第二个参数可以指定起始下标:enumerate(names, start=1)。
4.9 嵌套循环
两门语言都支持循环里套循环(多重循环)。求 1! + 2! + … + 5!:
# Python
num = 1
total = 0
while num <= 5: # 外层循环:1 到 5
factorResult = 1
i = 1
while i <= num: # 内层循环:求 num!
factorResult *= i
i += 1
total += factorResult
num += 1
print(total) # 153
// C++
int total = 0;
for (int num = 1; num <= 5; num++) { // 外层
int factor = 1;
for (int i = 1; i <= num; i++) { // 内层求 num!
factor *= i;
}
total += factor;
}
cout << total << endl; // 153
补充一个 Python 效率技巧:上面用 while 能写,用 for + range 更地道(for num in range(1, 6))。另外 Python 求阶乘可以直接用内置模块 math.factorial(num),开发时记得善用标准库。
五、总结:一张表记住所有差异
| 代码块 | 缩进(强制) | { }(缩进可选) |
| 多条件分支 | elif | else if |
| 条件括号 | 不写 | 必须写 ( ) |
| 条件结尾 | 冒号 : | 无 |
| 空语句 | pass | ; |
| 三目运算 | a if 条件 else b | 条件 ? a : b |
| 多路分支 | match-case(3.10+) | switch-case(要 break) |
| while | while 条件: | while (条件) |
| for | for i in range(…) 遍历式 | for(init; cond; update) 计数式 |
| range 左闭右开 | range(1, 11) 取 1~10 | 无,条件自己写 i <= 10 |
| break / continue | 支持 | 支持 |
| 循环 else | for-else / while-else 独有 | 没有,要标志变量 |
| do-while | 没有,while True + break 模拟 | 有 |
| 无限循环 | while True | while(true) / for(;;) |
| 遍历带下标 | enumerate | 自己维护下标 |
| 范围判断 | 7 <= home <= 9 直接写 | 必须 home >= 7 && home <= 9 |
| 随机数 | random.randint(1, 6) | rand() % 6 + 1 |
一句话总结控制流上的哲学差异:
逻辑上 Python 和 C++ 的条件、循环能力完全相同(都能表达任意控制流),差别全在表达方式:C++ 语法"满"——括号、分号、大括号、三要素 for 全都要写,冗余但明确;Python 语法"瘦"——用缩进、冒号、elif、遍历式 for 把样板代码砍到最少,逼你写整齐,也换来了更接近自然语言的读法。
六、自测练习(答案见文末)
(单选)Python 中,实现多条件分支 if … else if … 的写法是?
- A. else if
- B. elif
- C. elseif
- D. case
(单选)for i in range(1, 11) 会循环几次?
- A. 10 次
- B. 11 次
- C. 9 次
- D. 报错
(单选)以下代码输出什么?
for i in range(1, 6):
if i == 3:
continue
print(i, end=' ')
- A. 1 2 3 4 5
- B. 1 2 4 5
- C. 1 2
- D. 1 2 3
(单选)关于循环 else,以下说法正确的是?
- A. 循环被 break 打断后,else 也会执行
- B. 循环正常结束时,else 不执行
- C. 循环正常结束时,else 会执行
- D. Python 没有循环 else
(单选)C++ 里判断 home 在 [7, 9] 之间,正确的是?
- A. if (7 <= home <= 9)
- B. if (home >= 7 && home <= 9)
- C. if (home > 7 && home < 9)
- D. if (7 <= home, home <= 9)
(单选)Python 中想"循环体至少执行一次",最地道的模拟写法是?
- A. do: … while(条件)
- B. while True: + 末尾 break
- C. for i in range(1, 0)
- D. repeat … until
(单选)match 语句中的通配符(相当于 C++ 的 default)是?
- A. case default:
- B. case *:
- C. case _:
- D. else:
参考答案
下篇预告:学完条件语句和循环,下一步就可以聊函数(def vs 函数声明)和数据结构(列表、字典 vs vector/map)了。控制流熟练之后,写出来的代码才能真正"干活"。



