欢迎光临
我们一直在努力

Python 基础语法(二):条件语句与循环语句

上一篇我们学完了变量和运算符,这一篇进入程序的控制流:条件判断和循环

一、前言:从"会算数"到"会做决定"

上一篇的代码都是顺序执行的——从上到下按部就班。但真实程序的需求远不止"算个结果":

  • 要根据不同的输入走不同的分支 → 条件语句(if / else)
  • 要反复执行同一段逻辑 → 循环语句(while / for)

条件 + 循环,构成了程序的控制流。它们是所有编程语言都有的三大基本结构(顺序、选择、循环)里的后两个。

Python 和 C++ 在控制流上逻辑完全一致(毕竟都是图灵完备的语言),但在写法上差异巨大:Python 用缩进表示代码块、用 elif、for 是"遍历式"的;C++ 用大括号、用 else if、for 是"计数式"的。这篇我们依然全部用双代码对比,并补充课程里没展开的内容(三目运算符、for-else、do-while、switch/match 等)。

先看总览对比表:

知识点PythonC++
代码块表示 缩进(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;
}

关键差异(高频考点):

对比点PythonC++
多条件关键字 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。

对比记忆:

C++ forPython for
定位 计数循环(我要循环 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),开发时记得善用标准库。


五、总结:一张表记住所有差异

场景PythonC++
代码块 缩进(强制) { }(缩进可选)
多条件分支 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:

  • 参考答案

  • B(Python 用 elif,C++ 用 else if)
  • A(range(1, 11) 左闭右开,取 1 到 10,共 10 次)
  • B(continue 跳过 i=3,输出 1 2 4 5)
  • C(循环被 break 打断时 else 不执行;正常结束才执行)
  • B(C++ 不能连续比较,必须用 && 连接;A 是 C 系经典错误写法)
  • B(Python 没有 do-while,用 while True + 末尾 break 模拟)
  • C(case _: 是 Python match 的通配符,对应 C++ 的 default)

  • 下篇预告:学完条件语句和循环,下一步就可以聊函数(def vs 函数声明)和数据结构(列表、字典 vs vector/map)了。控制流熟练之后,写出来的代码才能真正"干活"。

    赞(0)
    未经允许不得转载:171主机测评 » Python 基础语法(二):条件语句与循环语句
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址