字符串处理与函数入门
A 段七题练字符串、格式化与函数,其中一道专门暴露 print 和 return 的混淆,最后一道把 Lab 2 的海伦公式写成函数再搭出两个新函数;B 段把一行原始数据变成一张对齐的表,最后会遇到中文名对不齐的问题;C 段学在终端里跑 Python 和重定向。
本页目录
本次目标
- 熟练使用 f-string 控制小数位与对齐
- 正确处理
input()返回的字符串 - 写出带参数和返回值的函数
- 彻底分清
print()和return
A 段 · 必做
3-1 温度转换
实现 c_to_f(c),摄氏度转华氏度(F = C * 9/5 + 32),返回保留一位小数的浮点数。
c_to_f(0) → 32.0
c_to_f(37) → 98.6
c_to_f(-40) → -40.0
3-2 学号脱敏
实现 mask_id(sid):保留学号的前四位和后四位,中间一律换成 *。
mask_id("526030910001") → "5260****0001"
mask_id("12345678") → "12345678"
只用切片和拼接,不需要循环。
3-3 对齐的成绩表
实现 format_row(name, score),返回一行格式化字符串:姓名左对齐占 10 格,
分数右对齐占 6 格、保留 1 位小数。
format_row("Alex", 87.5) → "Alex 87.5"
format_row("Blake", 92.0) → "Blake 92.0"
format_row("Chen", 65.25) → "Chen 65.2"
用 f-string 的 :<10 和 :>6.1f。
3-4 找出并修正 print/return 的误用
下面这段代码想算出两个数的平均值再乘以 2,但会报 TypeError。
指出原因,改对它,并在答题卡上用一两句话解释。
def average(a, b):
print((a + b) / 2)
result = average(10, 20) * 2
print(result)
3-5 安全的数字输入
实现 read_int(prompt):显示提示、读入一行、转成整数并返回。
暂时不用处理输入非数字的情况(那要等 L11 的异常处理),但自己试一次:
输入 abc,看它抛的是哪一类错误。答题卡上问的是 input() 的返回类型,
和这件事是同一个根。
3-6 返回多个值
实现 stats(a, b, c),返回三个数的最小值、最大值、平均值三个值。
stats(3, 9, 5) → (3, 9, 5.666666666666667)
调用方应该能这样接:
low, high, mean = stats(3, 9, 5)
平均值不要四舍五入,原样返回。
3-7 三角形的外接圆与内切圆(平台判分)
Lab 2 你用海伦公式算过三角形面积,那时候是一段顺序代码。这次把它写成函数, 再用它搭出两个新函数。
def area(a, b, c): ...
def circles(a, b, c): ... # 返回 (外接圆半径 R, 内切圆半径 r)
公式:
S = 海伦公式算出的面积
s = (a + b + c) / 2 外接圆 R = a·b·c / (4S)
内切圆 r = S / s
area(3, 4, 5) → 6.0
circles(3, 4, 5) → (2.5, 1.0)
circles(5, 5, 6) → (3.125, 1.5)
circles 里面要调用 area,不要把海伦公式再抄一遍。
这道题考的就是这件事 —— 判题会检查。
B 段 · 深入:把一行原始数据变成一张对齐的表
真实的数据很少是现成可用的。它通常是一行文本,你得先把它拆开、转成对的类型, 再排成人能读的样子。这一段四问,每问建立在前一问上,都不需要循环。
原始数据长这样,一行一条记录:
张三,87.5
李四,65.25
欧阳修远,92
B-1 拆开一条
实现 parse(record),把一条记录拆成姓名和分数,分数要是浮点数:
parse("张三,87.5") → ("张三", 87.5)
parse("欧阳修远,92") → ("欧阳修远", 92.0)
B-2 排成一行
用 A 段的 format_row 把 parse 的结果排成一行:姓名左对齐占 10 格,
分数右对齐占 6 格保留一位小数。
把三条记录各处理一次(写三次调用,不用循环),输出贴进答题卡。
B-3 中文名对不齐
看你 B-2 的输出。ASCII 名字那几行是齐的,中文名那几行歪了。
请回答:
len("张三")是多少?len("Alex")呢?- 但它们在屏幕上占的宽度一样吗?
- 所以
f"{名字:<10}"到底按什么补空格?
B-4 凑合的办法
在不引入新知识的前提下,想一个能让这三行大致对齐的办法,写出来并说明它的局限。
C 段 · 基本功:在终端里跑 Python,以及把输出接走
前两周学了走动(pwd ls cd)和增删改(mkdir touch cp mv rm)。
这周学两件事:在终端里跑 Python 的两种方式,和把输出接到别处去。
交互式与脚本
直接运行 python 进入交互式(提示符是 >>>),一行一行试,适合验证一个想法:
python
>>> 2 ** 100
>>> exit() # 或者按 Ctrl+D
运行 python 文件名.py 是执行脚本,从头到尾跑一遍。写程序用这个。
| 按键 | 作用 |
|---|---|
Ctrl+C | 打断正在跑的程序 |
Ctrl+D | 退出交互式(Windows 上是 Ctrl+Z 再回车) |
↑ ↓ | 翻之前敲过的命令 |
重定向:把输出接到文件里
python hello.py > out.txt # 输出写进文件,覆盖
python hello.py >> out.txt # 追加到文件末尾
python guess.py < input.txt # 把文件内容当作键盘输入喂给程序
C-1 走一遍
把命令和输出从终端复制出来,填进答题卡(不必截图):
- 进交互式,算一下
2 ** 100,然后退出 - 把 B-2 的程序输出重定向到
table.txt,再用cat table.txt看一眼 - 建一个
input.txt,里面写两行数字;用<喂给你 A 段 3-5 那个读数字的程序
C-2 想一想
>和>>差在哪?你怎么验证?- 用了
>之后屏幕上还看得到输出吗?为什么?
提交前自查
- 每个函数都是
return而不是print(3-5 的提示除外) - 3-1 返回的是浮点数,不是字符串
- 3-7 的
circles是调用area的,没有把海伦公式抄第二遍 - A 段答题卡交了(3-2 的边界、3-4 的解释、连读三个数那一问都在里面)
- B 段答题卡交了
- C 段答题卡交了