三:条件判断与循环——if、for、while

一、回顾与本篇目标

上一篇我们学了 Python 的变量、数据类型、输入输出和字符串操作。你已经能写出和用户交互的小程序了——比如输入两个数字然后计算它们的和。

但程序不能只会“直线走”。真正的程序需要做选择重复做事:如果用户输入的密码正确就登录,否则提示错误;把用户列表里的每一个人都打印出来;只要用户没点“退出”,就继续提供服务。

这就是本篇要学的两个核心结构:条件判断循环。学完之后,你的程序就能“根据情况做不同的事”和“自动重复做某件事”了。

本篇的目标:

  1. 掌握 if/elif/else 条件判断的完整用法
  2. 理解 Python 中代码块和缩进的规则
  3. 学会 for...in 循环和 range() 函数
  4. 学会 while 循环
  5. 掌握 breakcontinuepass 的用法

二、条件判断: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:循环的控制开关

breakcontinue 让循环的控制更灵活。

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 可以和 forwhile 配合使用。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 Truebreak 实现。

练习 4:找水仙花数

新建 practice3-4.py。“水仙花数”是一个三位数,它的每个位上的数字的立方和等于它本身。例如 153 = 1³ + 5³ + 3³ = 153。用 for 循环找出所有三位数中的水仙花数。

十一、本篇小结

这一篇你学会了控制程序流程的两个核心结构:

  • 条件判断 if/elif/elseelif 是 Python 的 else if。条件不需要小括号,代码块靠冒号和缩进。支持连续比较(0 < x < 10)。空代码块用 pass 占位。
  • for 循环:遍历任何可迭代对象(列表、字符串、range 等)。range() 生成数字序列,enumerate() 同时获取索引和值。
  • while 循环:只要条件成立就一直重复。适合不知道循环次数的场景。while Truebreak 是一个常见模式。
  • breakcontinuebreak 退出整个循环,continue 跳过本轮继续下一次。
  • for...elsewhile...else:循环正常结束(没被 break)时执行 else。这是 Python 独有的特性。

条件判断和循环是编程中最基础也最重要的控制结构。把它们练熟,下一篇我们学习 Python 的四种核心容器——列表、元组、字典、集合,让你的程序能处理更复杂的数据。

下一篇预告

下一篇——《列表、元组、字典、集合——Python 的四种容器》:详细介绍 Python 中四种最重要的数据结构。列表的增删改查和切片、元组的不可变性、字典的键值对操作、集合的去重和交并差运算。每种都会和 JavaScript 的数组/对象做对比。

Python 零基础入门,每周更新。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容