深入建议 50 分钟学习等级 1/8

PYTHON LESSON 010

考点精讲:条件与循环进阶

把条件写准(含边界)、把循环写稳(起点、条件、变化),掌握“循环套分支”这一考级核心结构。

00 · 学习目标

这一课要解决什么?

先想一想60 分到底算不算及格?答案藏在一个符号里。
完成任务拍手游戏与发射倒计时
学习顺序正式定义 → 机制推演 → 边界与反例 → 迁移

学完后,你应该能够

  • and / or 组合多个条件
  • >= 与 > 的边界差别
  • while 三要素:起点、条件、变化

01 · 核心概念

条件组合、边界判断与循环三要素

结构化程序由顺序、分支和循环组合而成。循环内的分支在每一轮独立判断;边界条件和状态更新共同决定程序处理哪些数据、执行多少次。

本课术语结构组合循环不变量边界条件状态追踪终止性
考级对应GESP Python 1 级 · 分支结构GESP Python 1 级 · 循环结构GESP Python 1 级 · 逻辑运算
学习边界

一级以单层结构及其组合为主;多层分支和多层循环是二级核心。

02 · 语法与规则

先记住这 3 条,再开始写程序

01and / or 组合多个条件

先准确读出这条写法的结构与作用。

02>= 与 > 的边界差别

换一组最小数据,手工推演一次结果。

03while 三要素:起点、条件、变化

再用边界值或反例确认它的适用条件。

03 · 完整实例

代码、运行结果和解释放在一起看

g1-branch-loop-deep.pyPYTHON 3.12
# 拍手游戏:1 到 15,逢 3 的倍数喊“啪”
for n in range(1, 16):
    if n % 3 == 0:
        print(n, ":啪!")
    else:
        print(n, ":过")

print("——————")

# 边界测试:60 分到底算不算及格?
for score in range(59, 62):
    if score >= 60:
        print(score, "分:及格")
    else:
        print(score, "分:不及格")

print("——————")

# 火箭发射倒计时(while 三要素:起点、条件、变化)
t = 5
while t > 0:
    print(t)
    t = t - 1
print("发射!")
运行结果OUTPUT
1 :过
2 :过
3 :啪!
4 :过
5 :过
6 :啪!
7 :过
8 :过
9 :啪!
10 :过
11 :过
12 :啪!
13 :过
14 :过
15 :啪!
——————
59 分:不及格
60 分:及格
61 分:及格
——————
5
4
3
2
1
发射!

for 循环里套 if 是考级主力结构;while 要备齐起点、条件、变化三要素。

在新标签运行和修改这个实例已装入本课代码 · 可自定义输入 · 可提交判题

04 · 逐步理解

每一步只解决一个问题

  1. 01

    条件是能回答是/否的式子

    if 后面跟的条件,本质是一个只会回答“成立 / 不成立”的式子。n % 3 == 0 在 n 是 3 的倍数时成立,否则不成立。写条件前先问自己:这个式子到底在什么情况下成立?

    PYTHON
    n % 3 == 0
  2. 02

    边界:>= 和 > 只差一分

    “60 分及格”到底含不含 60?含,就要写 score >= 60;写成 score > 60,60 分的同学就被冤枉了。考级读题时把“以上”“以内”“不超过”“至少”这些词圈出来,它们全是边界信号。

    PYTHON
    if score >= 60:
        print("及格")
  3. 03

    and 与 or 组合条件

    “8 到 12 岁”其实是两个条件:age >= 8 并且 age <= 12,用 and 连起来;or 则是“满足一个就行”。组合条件变长时可以用括号分组,让计算机和你都不迷糊。

    PYTHON
    if age >= 8 and age <= 12:
  4. 04

    循环套分支:每轮判断一次

    拍手游戏的核心结构是 for 里面放 if:每数一个数,就判断一次是不是 3 的倍数。这个“循环里做判断”的结构是考级编程题的绝对主力,达标统计、奇偶分类都靠它。

    PYTHON
    for n in range(1, 16):
        if n % 3 == 0:
            print(n, "啪!")
  5. 05

    while 三要素与死循环防线

    while 循环要写对三件事:起点(t = 5)、条件(t > 0)、变化(t = t - 1)。漏掉“变化”,条件永远成立,程序就停不下来了。写完 while 先检查这三件,一个都不能少。

    PYTHON
    t = 5
    while t > 0:
        print(t)
        t = t - 1
  6. 06

    预测—运行—核对

    看到一段循环代码,先在纸上写出你预测的输出,再运行核对:拍手游戏哪几个数喊“啪”?倒计时打印几行?这个习惯就是考级“程序阅读题”的满分法宝。

05 · 练习与检验

自己写出来,才算真正学会

本课实作步骤
  1. 1运行拍手游戏,核对哪些数喊“啪”
  2. 2把倍数从 3 改成 4 再运行
  3. 3把及格线换成 70 观察边界变化
  4. 4让倒计时从 10 开始发射
打开本课编程实验室编辑、运行、测试、判题都在一个页面完成

06 · 完整知识

继续理解定义、规则和适用边界

第一次学习先完成上面的六个步骤;需要查定义、核对规则、分析误区或理解“为什么”时,再展开对应知识章。

Python 基础条件、循环与程序流程准确理解 if、for、while、range、break、continue 和循环嵌套,而不是背代码模板。

正式定义

控制流决定下一条要执行的语句。分支依据布尔条件选择路径;循环在满足规则时重复执行代码块。Python 用冒号和缩进界定代码块。

必须掌握

  • if/elif/else 从上到下判断,只执行第一个为真的分支;else 不写条件。
  • for 依次取得可迭代对象中的元素;range(start, stop, step) 包含 start、不包含 stop,step 不能为 0。
  • while 在每轮开始前检查条件;循环体必须让状态向终止条件推进。
  • break 结束最内层循环,continue 跳过本轮剩余语句,循环的 else 仅在没有被 break 终止时执行。
  • 嵌套循环的总执行次数通常需要把各层次数相乘;内层 break 不会结束外层循环。
  • 边界测试至少覆盖空范围、单个元素、第一项命中、最后一项命中和始终不命中。

常见误区

  • range 的右端点多算或少算一次
  • while 忘记更新状态造成死循环
  • 把两个互斥条件写成两个独立 if
  • 误以为 break 会跳出所有嵌套循环

适用边界

  • 流程图是算法的表示方法,不是 Python 语法。
  • 递归也能表达重复,但有调用开销和递归深度限制,不能无条件代替循环。
打开本章完整示例与独立阅读页 →
Python 基础运算符、表达式与优先级完整区分算术、比较、逻辑、成员、身份和位运算,并用优先级表消除歧义。

正式定义

表达式求值得到一个值。运算符规定如何组合操作数;当一个表达式含多个运算符时,优先级和结合方向决定求值顺序,括号可以明确改变顺序。

必须掌握

  • / 总是得到浮点结果;// 是向负无穷方向取整的整除;% 与 // 满足 a == (a // b) * b + a % b。
  • 比较可以链式书写,如 0 <= x < 10;and/or 会短路并返回最后求值的操作数,不一定返回 bool。
  • == 比较值是否相等,is 比较是否为同一个对象;判断 None 应写 is None。
  • in/not in 做成员测试;对 dict 测试的是键。
  • 位运算作用于整数的二进制位;负整数按无限长二进制补码语义理解。
  • 复杂表达式即使能靠优先级正确运行,也应使用括号表达意图。

常见误区

  • 把 // 当成简单截断
  • 用 is 比较数字或字符串的值
  • 忘记 and 的优先级高于 or
  • 连续位移、比较和逻辑运算却不加括号

适用边界

  • 浮点数比较受二进制表示误差影响,需要按问题选择容差。
  • 运算符可由自定义类重载,因此相同符号对不同类型可能有不同语义。
打开本章完整示例与独立阅读页 →
程序组织类、对象、属性与方法理解对象模型和封装边界,用类表达有状态的实体,而不是把所有程序都强行改成类。

正式定义

类描述一类对象的数据与行为;实例是类创建的具体对象。实例方法的第一个参数通常命名为 self,用来访问当前实例;__init__ 在实例创建后负责初始化状态。

必须掌握

  • 实例属性通常在 __init__ 中通过 self.name = value 建立。
  • 实例方法通过 object.method() 调用;Python 会自动把实例绑定给 self。
  • 类属性由实例共享,实例属性属于单个对象;同名实例属性会遮蔽类属性。
  • __repr__ 面向开发与调试,__str__ 面向用户显示;特殊方法应遵守其协议。
  • 继承表达“是一种”关系,组合表达“拥有一个”关系;能用组合清晰表达时不要滥用继承。
  • 对象相等默认仍是身份比较;需要按内容相等时要定义相应协议。

常见误区

  • 在方法中漏写 self
  • 把每个实例独有的可变数据写成类属性
  • 只为包装几个无状态函数而建类
  • 继承层次过深导致行为难以追踪

适用边界

  • 课程使用普通类解释对象模型;dataclass、property、抽象基类和元类是后续工程工具。
  • 算法题常用函数和基本容器更直接,不要求为了“面向对象”而增加结构。
打开本章完整示例与独立阅读页 →
完整速查Python 关键字、内置名称与语法速查集中查阅 Python 3.12 的 35 个硬关键字、4 个软关键字和课程常用内置函数,避免知识碎片化。

正式定义

关键字是 Python 语法保留的词,不能作为普通标识符;软关键字只在特定语法位置有特殊含义。内置名称由 builtins 模块提供,可以直接使用,但仍可能被同名变量遮蔽。

必须掌握

  • Python 3.12 有 35 个硬关键字;False、None、True 首字母大写。
  • match、case、_、type 是软关键字,只在对应模式匹配或类型参数语法环境中特殊。
  • 内置函数无需 import,但不要把变量命名为 list、str、sum、max、input 等。
  • help(name) 查看运行时帮助,dir(object) 查看可用名称,type(object) 查看类型。
  • 内置异常类也是内置名称;捕获异常时应使用具体异常类型。
  • 本站课程运行基线是 Python 3.12,跨版本新增语法必须先核对目标运行环境。

常见误区

  • 把内置名称误称为关键字
  • 用 list = [] 遮蔽 list()
  • 照搬其他 Python 版本的关键字表
  • 见到陌生函数名就假定无需导入

适用边界

  • 本页完整列出语言关键字,并列出课程实际依赖的内置函数;Python 的全部内置异常类和对象协议应按具体错误与主题查阅。
  • 第三方库 API 不属于 Python 语言本身,也不属于内置名称。
打开本章完整示例与独立阅读页 →

完成检查

确认自己会解释、会编写、会验证