WEEK 04 / 16 语言核心 · 控制流与函数
PYTHON 程序设计 · V2 · 第 4 周(100 分钟 · L8–L9)

程序会「做决定」
也会「重复做事」

分支让程序做决定,循环让程序重复做事;函数给逻辑起名字。 本周还引出一个贯穿全课程的思维:好的函数契约 = 好的 prompt。

所属模块 M2 语言核心← → 翻页 · F 全屏

今日课表(100 分钟)

时间环节要点
0–8导入上周取了数据——只想看 token>100 的记录怎么办?需要「条件判断」
8–20分支if/elif/else;and/or 组合;缩进即代码块
20–32循环for/range 三用法;while 多轮对话;break vs continue
32–42两大杀手off-by-one(range(5) 是 0–4)与死循环(Ctrl+C)现场演示
42–55动手练习运行场:筛选 token>200 + 按模型分组统计 + 找最大
55–68函数语法def/参数/返回值/docstring;默认值;*args **kwargs 认得出
68–80契约四要素名字/参数/返回值/示例——好的契约=好的 prompt
80–92动手练习运行场:补全 top_questions 函数(TODO 版)
92–100lambda + 小测max(logs, key=lambda...);随堂小测 3 题

两个运行场练习是本课核心——写完当堂运行验证。

分支:让程序做决定

# 按 token 消耗分级——来自真实的 API 日志场景
for log in api_logs:
    if log["tokens"] < 50:
        level = "轻量"
    elif log["tokens"] <= 200:
        level = "正常"
    else:
        level = "高消耗"

# 组合条件:高消耗 且 调用失败
if log["tokens"] > 200 and not log["ok"]:
    print("⚠ 需要排查:", log)

循环:重复做事

# for:遍历已知集合
for i in range(5):
    print(i)        # 0 1 2 3 4

# while:满足条件就一直做
while True:
    q = input("你:")
    if q == "退出":
        break           # 跳出整个循环
    reply(q)
循环两大杀手
  • off-by-one:range(5) 是 0–4,不是 1–5
  • 死循环:忘写 break / 条件永真 → Ctrl+C 终止
break vs continue break 跳出循环;continue 跳过本轮进入下一轮。

动手:筛选与统计 API 日志

交互 · 浏览器内运行(L8 课堂主线)

函数:给逻辑起名字

def estimate_cost(tokens: int, price: float = 0.001) -> float:
    """估算一次 API 调用的费用(元)。

    >>> estimate_cost(730)
    0.73
    """
    return tokens * price / 1000

cost = estimate_cost(730)          # 位置参数
cost = estimate_cost(tokens=730)     # 关键字参数

函数契约四要素

①名字它做什么 count_words 而不是 func1——名字即文档,AI 也靠名字理解代码。
②参数它需要什么 类型 + 含义 + 默认值:text: str, topk: int = 3
③返回值它给出什么 返回 dict 还是 list?空输入返回什么?异常时抛还是返 None?
④示例怎么用 docstring 里放 doctest 示例——既是文档也是测试。
好的函数契约 = 好的 prompt。把契约四要素写给 AI,AI 就能一次写出正确的函数; 反过来,看不懂 AI 函数时,先问自己「它的契约是什么」。

动手:补全一个函数契约

交互 · 补全 TODO 再运行

随堂小测(3 题)

交互 · 点击选项作答

课后与下周预告

本周课后
  • 练习:把课堂的两个运行场练习补完并改参数重跑
下周:W5 IO、异常与类 程序「重启就失忆、断网就崩溃」怎么救——文件持久化、异常处理,再用类把状态打包。 提前看下周课件 →

深入阅读:M2 模块页 · 经典笔记 5.3 循环 · 5.4 函数