一、回顾与本篇目标
上一篇我们学了 Python 的变量、数据类型、输入输出和字符串操作。你已经能写出和用户交互的小程序了——比如输入两个数字然后计算它们的和。
但程序不能只会“直线走”。真正的程序需要做选择和重复做事:如果用户输入的密码正确就登录,否则提示错误;把用户列表里的每一个人都打印出来;只要用户没点“退出”,就继续提供服务。
这就是本篇要学的两个核心结构:条件判断和循环。学完之后,你的程序就能“根据情况做不同的事”和“自动重复做某件事”了。
本篇的目标:
- 掌握
if/elif/else条件判断的完整用法 - 理解 Python 中代码块和缩进的规则
- 学会
for...in循环和range()函数 - 学会
while循环 - 掌握
break、continue和pass的用法
二、条件判断:if/elif/else
条件判断让程序能根据不同的情况执行不同的代码。它的逻辑和你在生活中做决策是一样的:如果今天下雨,就带伞;否则,不带。
基本结构
if 条件:
# 条件成立时执行的代码
elif 另一个条件:
# 第一个条件不成立,但第二个条件成立时执行
else:
# 所有条件都不成立时执行
用上一篇学过的成绩判断来演示:
score = 85
if score >= 90:
print('优秀')
elif score >= 80:
print('良好')
elif score >= 60:
print('及格')
else:
print('不及格')
# 输出:良好
执行逻辑:Python 从上到下依次检查每个条件。第一个成立的条件对应的代码会被执行,然后整个 if 结构结束,后面的条件不再检查。如果所有条件都不成立,执行 else 里的代码。
在上面的例子中,score >= 90 不成立(85 小于 90),继续检查 score >= 80,成立,输出“良好”。后面的 score >= 60 虽然也成立,但不会被检查,因为已经有一个条件命中了。
和 JavaScript 的对比
// JavaScript
if (score >= 90) {
console.log('优秀');
} else if (score >= 80) {
console.log('良好');
}
三个核心区别:
- Python 条件不需要小括号包裹(写小括号也可以,但不推荐)。
- Python 用冒号
:结束条件行。 - Python 用缩进而不是花括号表示代码块。
可以有任意多个 elif
day = input('请输入今天星期几(一/二/三/四/五/六/日):')
if day == '一':
print('今天是周一,要上班')
elif day == '二':
print('今天是周二,还要上四天班')
elif day == '三':
print('今天是周三,一周过半')
elif day == '四':
print('今天是周四,明天再熬一天')
elif day == '五':
print('今天是周五,马上周末了!')
elif day == '六':
print('今天是周六,睡个懒觉')
elif day == '日':
print('今天是周日,明天又要上班了')
else:
print('输入有误,请输入一到日之间的一个字')
elif 不是必须的,else 也不是必须的
最简单的条件判断可以只有一个 if:
temperature = float(input('请输入当前温度:'))
if temperature > 37:
print('高温预警!')
print('程序结束') # 这行无论条件是否成立都会执行
if...else 没有 elif:
age = int(input('请输入你的年龄:'))
if age >= 18:
print('你已成年')
else:
print('你还未成年')
嵌套条件判断
在一个条件判断的代码块里,可以再写条件判断:
has_ticket = input('你有票吗?(y/n):')
height = float(input('你的身高是多少厘米?'))
if has_ticket == 'y':
if height >= 120:
print('请进,祝您玩得愉快')
else:
print('抱歉,身高不够,不能进入')
else:
print('请先去购票')
外层判断有没有票,有票的话再内层判断身高够不够。两个层级用不同的缩进深度区分。
三、Python 中的代码块和缩进规则
这是个非常重要的话题,值得单独一节来讲。Python 没有花括号,代码块完全靠缩进来界定。
基本规则
- 同一个代码块里的所有语句必须有相同的缩进。
- 推荐用 4 个空格 作为一级缩进。
- VS Code 里按 Tab 键默认会插入 4 个空格,不需要手动敲空格。
缩进错误的常见情形
# 错误一:混用空格和 Tab(虽然都是空白,但 Python 不认)
if True:
print('用4个空格缩进')
print('用Tab缩进') # 报错!缩进不一致
# 错误二:缩进层级不对
if True:
print('这行没有缩进') # 报错!条件成立后必须有缩进的代码块
空代码块怎么办?用 pass
有时候你想先占个位,以后再写具体的逻辑。但 Python 不允许空代码块:
# 这样写会报错
if score >= 60:
# 暂时没想好做什么
# 正确写法:用 pass 占位
if score >= 60:
pass # 什么也不做,但语法正确
pass 是一个空操作语句,用来“占坑”。它什么也不做,但能让代码在语法上正确。在以后的函数、类定义中也会用到。
四、Python 特有的:连续比较
上一篇提过这个特性,现在正式讲解。在 JavaScript 中,如果要判断一个值是否在某个范围内,你需要用 && 连接两个条件:
// JavaScript
if (x > 0 && x < 10) {
console.log('x 在 0 和 10 之间');
}
Python 可以直接写连续比较:
# Python
if 0 < x < 10:
print('x 在 0 和 10 之间')
这背后是 Python 的链式比较机制:0 < x < 10 等价于 0 < x and x < 10,但写法更自然。
age = 25
print(18 <= age <= 60) # True —— age 在 18 到 60 之间
score = 85
print(0 <= score <= 100) # True —— score 在 0 到 100 之间
五、for 循环:重复做一件事
循环让程序能自动重复执行一段代码。Python 的 for 循环和 JavaScript 的 for 循环设计理念完全不同。
JavaScript 的 for 是“计数循环”——你告诉它从哪开始、到哪结束、每次增加多少:
// JavaScript:计数循环
for (let i = 0; i < 5; i++) {
console.log(i);
}
Python 的 for 是遍历循环——你给它一个“可迭代对象”(比如列表、字符串、range 生成的序列),它会依次取出每个元素:
# Python:遍历循环
fruits = ['苹果', '香蕉', '橘子']
for fruit in fruits:
print(fruit)
# 输出:
# 苹果
# 香蕉
# 橘子
这里 fruit 是一个临时变量名,每次循环它会被赋值为列表中的当前元素。你可以起任何名字:
for item in fruits: # 叫 item 也行
for f in fruits: # 叫 f 也行
for 水果 in fruits: # 叫中文也行(但不太推荐)
range():生成数字序列
如果你需要“执行 N 次”这样的计数循环,就用 range() 函数。它是 Python 中最常用的循环搭档:
# range(5) 生成 0, 1, 2, 3, 4
for i in range(5):
print(i)
# 输出:0 1 2 3 4
range() 有三种用法:
| 写法 | 含义 | 生成的序列 |
|---|---|---|
range(5) |
从 0 开始,到 5 结束(不包括 5) | 0, 1, 2, 3, 4 |
range(1, 6) |
从 1 开始,到 6 结束(不包括 6) | 1, 2, 3, 4, 5 |
range(1, 10, 2) |
从 1 开始,每次加 2,到 10 结束 | 1, 3, 5, 7, 9 |
规则总结:range(开始, 结束, 步长)
- 只有一个参数:从 0 开始。
- 两个参数:从第一个开始,到第二个结束。
- 三个参数:步长可以为负数,生成递减序列。
- 包含开始,不包含结束——这和切片规则一致。
遍历字符串
字符串也是“可迭代”的,可以用 for 循环逐个取出每个字符:
text = 'Hello'
for char in text:
print(char)
# 输出:H e l l o(每个字母一行)
遍历时获取索引:enumerate()
有时候你既需要元素的值,也需要它的位置(第几个)。用 enumerate():
fruits = ['苹果', '香蕉', '橘子']
for index, fruit in enumerate(fruits):
print(f'第{index + 1}个水果是:{fruit}')
# 输出:
# 第1个水果是:苹果
# 第2个水果是:香蕉
# 第3个水果是:橘子
enumerate() 把列表中的每个元素包装成了 (索引, 值) 的元组,for 循环用两个变量分别接收。
六、while 循环:只要条件成立就一直重复
while 循环的逻辑是:每次循环开始前检查条件,条件成立就执行一次,执行完再检查,直到条件不成立为止。
count = 1
while count <= 5:
print(f'第{count}次执行')
count += 1
# 输出:
# 第1次执行
# 第2次执行
# 第3次执行
# 第4次执行
# 第5次执行
for 和 while 怎么选?
- 知道循环次数(比如遍历列表、执行 N 次)→ 用
for。 - 不知道循环次数(比如让用户一直输入直到输入正确)→ 用
while。
经典 while 示例:密码验证
correct_password = '123456'
input_password = ''
while input_password != correct_password:
input_password = input('请输入密码:')
if input_password != correct_password:
print('密码错误,请重试')
print('密码正确,登录成功!')
只要用户输入的密码不对,循环就会继续。输入正确后,循环条件 input_password != correct_password 变成 False,循环结束。
无限循环与 break
如果条件永远为真,循环就永远不会停——这叫无限循环。无限循环本身不一定是坏事,很多程序的主逻辑就是无限循环(比如服务器一直等待请求),关键是要有一个退出机制。
while True:
user_input = input('输入 q 退出:')
if user_input == 'q':
print('再见!')
break # 立即跳出循环
print(f'你输入了:{user_input}')
while True 创建一个永远为真的条件,循环会一直执行。当用户输入 'q' 时,break 语句强制退出循环。
七、break 和 continue:循环的控制开关
break 和 continue 让循环的控制更灵活。
break:立即退出整个循环
# 找到第一个能被 7 整除的数就停止
for num in range(1, 50):
if num % 7 == 0:
print(f'找到了:{num}')
break
print(f'{num} 不是')
# 输出:
# 1 不是
# 2 不是
# ...
# 6 不是
# 找到了:7
循环在 num = 7 时就终止了,后面 8 到 49 都不会执行。
continue:跳过本次循环,继续下一次
# 只打印偶数
for num in range(1, 11):
if num % 2 != 0: # 如果是奇数
continue # 跳过,不执行后面的 print
print(num)
# 输出:2 4 6 8 10
continue 不会退出循环,只是跳过当前这轮剩下的代码,直接进入下一轮。
break 和 continue 的区别
| break | continue | |
|---|---|---|
| 作用 | 终止整个循环 | 跳过本次循环的剩余部分 |
| 之后发生什么 | 执行循环后面的代码 | 进入下一轮循环(如果条件还成立) |
| 类比 | 直接下班回家 | 跳过这个任务,做下一个任务 |
八、for…else 和 while…else:Python 特有的结构
这是 Python 中一个不太为人知但很有用的特性。else 可以和 for 或 while 配合使用。else 块中的代码会在循环正常结束(没有被 break 中断)时执行。
# 示例:找质数
num = 15
for i in range(2, num):
if num % i == 0:
print(f'{num} 不是质数,可以被 {i} 整除')
break
else:
# 如果循环没有被 break 中断,就会执行这里
print(f'{num} 是质数')
如果 for 循环跑完了所有次数都没有触发 break,就执行 else 里的代码。如果中途被 break 打断了,else 就不会执行。
这个特性在判断“有没有找到某样东西”时特别有用,可以省掉一个额外的标记变量。
九、综合演示:猜数字游戏
下面这段代码综合运用了本篇学到的所有知识:
import random
# 生成 1 到 100 之间的随机数
secret = random.randint(1, 100)
guess = 0
attempts = 0
print('=== 猜数字游戏 ===')
print('我想了一个 1 到 100 之间的数字,你猜猜看?')
while guess != secret:
guess = int(input('请输入你猜的数字:'))
attempts += 1
if guess > secret:
print('太大了,再小一点')
elif guess < secret:
print('太小了,再大一点')
else:
print(f'恭喜!你猜对了,答案就是 {secret}')
print(f'你一共猜了 {attempts} 次')
代码解释:
import random:引入随机数模块。random.randint(1, 100):生成 1 到 100 之间的随机整数。while guess != secret::只要没猜对,就一直循环。if/elif/else:根据用户猜的数字给出提示。attempts += 1:每次猜测,计数器加 1。
十、本篇动手练习
练习 1:判断闰年
新建 practice3-1.py。闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。用户输入一个年份,判断它是不是闰年。
练习 2:乘法口诀表
新建 practice3-2.py,用嵌套循环输出 1 到 9 的乘法口诀表。效果如下:
1×1=1 1×2=2 1×3=3 ...
2×1=2 2×2=4 2×3=6 ...
...
练习 3:统计输入的数字
新建 practice3-3.py,让用户不断输入数字(输入 0 表示结束)。结束后输出:输入了多少个数字、所有数字的和、平均值。用 while True 加 break 实现。
练习 4:找水仙花数
新建 practice3-4.py。“水仙花数”是一个三位数,它的每个位上的数字的立方和等于它本身。例如 153 = 1³ + 5³ + 3³ = 153。用 for 循环找出所有三位数中的水仙花数。
十一、本篇小结
这一篇你学会了控制程序流程的两个核心结构:
- 条件判断
if/elif/else:elif是 Python 的else if。条件不需要小括号,代码块靠冒号和缩进。支持连续比较(0 < x < 10)。空代码块用pass占位。 for循环:遍历任何可迭代对象(列表、字符串、range 等)。range()生成数字序列,enumerate()同时获取索引和值。while循环:只要条件成立就一直重复。适合不知道循环次数的场景。while True加break是一个常见模式。break和continue:break退出整个循环,continue跳过本轮继续下一次。for...else和while...else:循环正常结束(没被 break)时执行 else。这是 Python 独有的特性。
条件判断和循环是编程中最基础也最重要的控制结构。把它们练熟,下一篇我们学习 Python 的四种核心容器——列表、元组、字典、集合,让你的程序能处理更复杂的数据。
下一篇预告
下一篇——《列表、元组、字典、集合——Python 的四种容器》:详细介绍 Python 中四种最重要的数据结构。列表的增删改查和切片、元组的不可变性、字典的键值对操作、集合的去重和交并差运算。每种都会和 JavaScript 的数组/对象做对比。
Python 零基础入门,每周更新。













暂无评论内容