外观
第7周:第四次上机课
完整版 · py 作业 4 · py 练习 3 · py 作业 5
一、函数:参数传进去,结果返回来
对应 数列求和;PPT 第4章第4–6页(定义、调用和参数)、第8页(返回值)、第10页(局部变量)。
1. 一次调用到底执行了什么
先用“两个数相加”看清楚数据的去向:
python
def add(a, b):
result = a + b
return result
answer = add(2, 3)
print(answer) # 5a、b 是定义时的形参;调用时的 2、3 是实参。进入函数后 a=2、b=3,计算出 result=5,return 将 5 交回调用处,赋给 answer。函数里的 result 是局部变量,函数外用接收到的 answer。
2. print 和 return 不一样
下面是用于对照的课堂例子:
python
def add(a, b):
print(a + b)
answer = add(2, 3)
print(answer)运行时先输出 5,再输出 None。print 把内容显示出来;没有 return,调用者拿到的是 None。将第2行改成 return a + b,由主程序负责输出。
3. 累加完,再返回
python
def total(numbers):
result = 0
for number in numbers:
result += number
return result
print(total([2, 4, 6]))这个教学例子输出 2:第一轮就结束整个函数。将 return result 向左退一层,与 for 对齐,才会得到 12。数列求和同样需要处理完全部分母再返回。
4. 算对之后,还要显示六位小数
本次读取的数列求和 WA 样本中,出现了算完直接 print(sumV) 的写法。输入 2 时显示 0.5,题目要求 0.500000。
python
value = 0.5
print(f"{value:.6f}") # 0.500000round(value, 6) 仍是数字 0.5,不负责补零。PPT 第2章第36–38页:格式化输出。
二、字符串:replace 返回一个新字符串
对应 删除子串;PPT 第2章第30、32页(字符串方法),第4章第5–8页(参数和返回值)。
1. 调用了方法,原变量为什么没变
python
text = "banana"
text.replace("a", "")
print(text) # bananareplace 产生新字符串,原来的 text 没变。接住结果才会得到 bnn:
python
text = "banana"
text = text.replace("a", "")
print(text) # bnn2. 次数参数不是作业里的模式编号
python
print("banana".replace("a", "", 1)) # bnana,只删一次
print("banana".replace("a", "")) # bnn,删全部
print("banana".replace("a", "", 0)) # banana,一次也不删作业中的模式 0 表示“至多删除一次”,模式 1 表示“全部删除”。要先把模式翻译成操作,不能直接把模式传给 replace 的第三个参数。
3. 全部删除,不是反复删到没有为止
"aababa".replace("aba", "") 得到 "aba":删除原串的一处匹配后,剩余部分拼出了新的 aba,本次不再处理它。若套上 while target in text 反复替换,就变成另一种规则。
三、循环:每轮缩小范围,结束时看清条件
对应 机器猜数;PPT 第3章第14–17页(循环)、第2章第14–17页(数字运算)。
1. 中点是向上取整
| 范围 | 平均值 | 本题中点 | 向下整除的结果 |
|---|---|---|---|
[1, 100] | 50.5 | 51 | 50 |
[1, 4] | 2.5 | 3 | 2 |
[1, 5] | 3 | 3 | 3 |
对于本题的整数端点,可以用 (left + right + 1) // 2。不能把普通二分查找的中点公式直接照搬过来。
2. 猜过的中点要排除
| 比较结果 | 下一步 |
|---|---|
| 中点比目标大 | 右端点改成 middle - 1 |
| 中点比目标小 | 左端点改成 middle + 1 |
| 中点等于目标 | 本轮计数后停止 |
3. 猜中与只剩一个数,是两种结束方式
目标为 51,第一次就猜中,计数是 1。目标为 5,猜测顺序为 51 → 26 → 13 → 7 → 4 → 6,范围最后变成 [5,5],答案是 6,不用再猜一次。
所以要分别检查:循环是否只在 left < right 时继续;猜中时有没有漏记当前一轮。
四、自动判题:先拆结构,再转换类型
对应 自动判题;PPT 第2章第30、35页(拆分)、第46–47页(类型转换)、第19页(round),第3章第5–11页(分支)。
1. 先拆等号,再拆左侧
python
line = "1-2=-1.00"
expression, answer = line.split("=")
print(expression) # 1-2
print(answer) # -1.00右侧可以有负号;直接对整行按 - 拆分,会误拆答案。题目保证左侧两个操作数非负,可以只在左侧查找四种运算符。
2. 比较数字,输出指定文字
python
value = 1 / 3
answer = float("0.33")
print(value == answer) # False
print(round(value, 2) == answer) # True按题目先保留两位再比较。最后输出题面要求的 "true" 或 "false";直接 print(True) 会输出大写开头的 True。
五、凯撒密码:先分类,再在各自范围内移动
对应 凯撒密码;PPT 第2章第41–44页(字符对应与加密),第3章第5–11、14–17页(分支与循环),第4章第3–8页(函数)。
1. 三个环不能混用
| 字符 | 起点 | 长度 | 前进一位 |
|---|---|---|---|
| 小写字母 | a | 26 | z → a |
| 大写字母 | A | 26 | Z → A |
| 数字 | 0 | 10 | 9 → 0 |
以小写字母为例,先把字符变成从零开始的位置,再移动,最后变回字符:
python
ch = "z"
position = ord(ch) - ord("a") # 25
position = (position + 1) % 26 # 0
print(chr(ord("a") + position)) # a解密要往反方向移动。空格、标点保留原样;消息用 input() 整行读取,不能用 split() 丢掉其中的空格。
2. 模式必须完整匹配
题目接受 e、E、encrypt、Encrypt 和 d、D、decrypt、Decrypt。检查第一个字符就决定模式,会把 example 也误当成加密;应与题目列出的完整字符串比较。其他模式输出 Wrong Mode。
六、课程作业:py作业5 模块与库
两道必做题,三道课后练习。 完整题目、老师给出的函数框架和逐步提示见 py作业5 网页。
提交: 必做题 1、2 的源代码和运行结果截图,提交到 教学网;截止 10 月 27 日(周二)中午 12:00。OJ 的 py作业4 同一天 13:00 截止,两个作业的提交位置与时间不同。
1. 必做:正方形螺旋线
从外往里画连续螺旋,最大边长由用户输入,必须是 100–400 的偶数;相邻正方形间距 2,竖边绿色、横边黄色。

PPT 第5章第10–16页。沿用老师的 main → initializeBrush → drawSquareHelix → recoverBrush 框架,需要补充 getMaxSide() 与 drawSquareHelix(length)。
- 起点为
(-length / 2, -length / 2),朝向为 90 度;移动到起点前先抬笔。 - 0、180 度是水平,90、270 度是垂直。每条边先根据
heading()设置颜色,再前进,再右转 90 度。 - 先追踪长度
L、L、L-2、L-2、L-4、L-4,理解如何持续向内收缩;不要画成多个闭合正方形。 - 边长变为 0 后停止,结束使用
t.done()保留窗口。
2. 必做:随机发红包
PPT 第5章第27–28页。总金额、红包数只输入一次,用相同参数模拟 10 次;每次返回一个列表,保证 数量正确、每份至少 1 元、总额不变。
老师给出的方法 1 逐个随机发金额,给后面每份预留 1 元;方法 2 先生成随机权重,再按占比分配,需要补全。
| 情形 | 先检查什么 |
|---|---|
| 10 元分给 3 人 | 先各预留 1 元,再按权重分配剩下的 7 元 |
| 3 元分给 3 人 | 只能是 [1, 1, 1],没有金额变化是正常的 |
| 2 元分给 3 人 | 无法满足每份至少 1 元,应提示输入不合法 |
| 10 元分给 1 人 | 唯一一份就是 10 元 |
取整后把余款留给最后一份;不要让各份独立随机后总和超过总额,也不要每轮重新输入。append() 修改列表而不返回新列表,函数最后要 return 整个结果。
3. 课后练习
| 练习 | 核心问题 |
|---|---|
| 自动出题并判分 | 10 道题,包含除法和乘方;答对题数与总得分分开统计,特定题型答对得 2 分 |
| 同心圆 | drawMCircle(radius, dist, num);每个圆的起笔位置、方向要保证圆心相同 |
| 随机多边形装饰画 | 随机边数、边长、颜色与位置;每次转外角 360 / 边数,配合填充 |