← 返回周历 Python 起步 视频 DeepInfer 101
起步 0

起步 0:让一个函数把结果交回来

浏览文字约 4 分钟 · 手算与练习请按正文分段完成 源文件:Markdown 本地渲染版 · 无需联网
本页目录 · 4 节

目标:能追踪赋值,调用一个函数,并通过 Q1。先会整数加法和乘法即可。

1. 值、表达式、名字

本节路线:第1–2节先追踪现成示例,第3节再做foundations Q1;不要先读Q2的条件分支。命令从含 course 的课程根目录运行,目录准备见 起步入口。离开本节要能交出一次函数调用的“参数→局部值→返回值”,而不只是终端截图。

3 是一个整数值。3 * 2 是表达式,Python 求值得到 6。count = 3 把名字 count 绑定到值 3。随后写 count * 2,Python 先查到 count 的值,再做乘法。

count = 3
other = count
count = count + 1
print(count, other)

先预测最后一行,再放进自己的临时 .py 文件运行。第三行先计算等号右侧,再更新左侧;other 保存的是先前的整数值,不会跟着 count 自动变化。

预测核对

输出 4 3。运行第三行前,两个名字都表示 3;运行后 count 表示 4,other 仍表示 3。整数的这个例子不能直接推广为“所有赋值都会复制数据”,列表会在起步 2 讨论。

2. 函数是可复用的计算步骤

def add_example(left, right):
    total = left + right
    return total

answer = add_example(2, 5)
print(answer)

def 定义一个函数。圆括号里的 left、right 是参数名字。冒号后面缩进四个空格的行属于函数体。定义时只记住这些步骤,调用 add_example(2, 5) 时才执行。

时刻本次调用里的状态含义
刚进入函数left=2, right=5实参绑定到参数
加法后total=7得到局部结果
return total返回 7当前调用结束
回到外面answer=7调用表达式的值交给调用者

return 让调用者得到一个值;print 把内容显示到终端。只写 print(total) 而没有 return,调用者拿到的会是 None,即“没有返回具体结果”。这是初学者最常见的测试失败之一。

3. 从例子迁移到 Q1

假设每个元素占 2 字节,5 个元素就是 2+2+2+2+2=10 字节。一般写成“元素个数 × 每元素字节数”。这里统计数据本身的存储量,不是 Python 列表对象的实际内存占用。

打开 foundations.py。三引号包住的是说明文字;# 后面是注释,都用于帮助人阅读。raise NotImplementedError(...) 是有意留下的占位;在 Q1 中把这个占位换成自己的 return,保留已经写好的参数检查。

python course/tools/grade.py foundations --question q1 --failfast

动手前先写三个期望:(5, 2)、(0, 4)、(3, 8)。解释最后结果的单位为什么是字节。再运行测试;测试的是返回值,终端看见 10 并不等于函数返回了 10。

4. 理解检查

有人写了 return count + element_bytes,输入 (2, 2) 恰好通过。给一个能区分加法和乘法的输入,并写出两种结果。再把示例中的return换成print,在纸上预测调用者收到什么;不必修改学生文件中的正确部分。

独立尝试后的核对

例如 (3,8):乘法24,加法11。只打印结果却没有return,调用者得到None。一个返回值正确、一个把数字显示出来,是不同的行为;测试检查前者。

完成Q1单题测试并能解释这个反例后,进入 起步1。