Skip to content

第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)  # 5

a、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.500000

round(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)  # banana

replace 产生新字符串,原来的 text 没变。接住结果才会得到 bnn:

python
text = "banana"
text = text.replace("a", "")
print(text)  # bnn

2. 次数参数不是作业里的模式编号 ​

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.55150
[1, 4]2.532
[1, 5]333

对于本题的整数端点,可以用 (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. 三个环不能混用 ​

字符起点长度前进一位
小写字母a26z → a
大写字母A26Z → A
数字0109 → 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 / 边数,配合填充

课程资料由授课教师、助教与同学共同积累。