
本文介绍如何编写 Python 函数 count_pages(p),正确解析形如 "5-7, 2" 或 "18-12, 20-20" 的页码字符串,自动处理单页、正向/反向页码范围,并准确返回总打印页数。
本文介绍如何编写 python 函数 `count_pages(p)`,正确解析形如 `"5-7, 2"` 或 `"18-12, 20-20"` 的页码字符串,自动处理单页、正向/反向页码范围,并准确返回总打印页数。
在模拟打印机逻辑的程序中,用户常以字符串形式输入页码指令,例如 "5-7, 2" 表示打印第 5、6、7 和第 2 页,共 4 页;而 "12-18, 20-20" 表示打印第 12 至 18 页(7 页)加第 20 页(1 页),总计 8 页。原始实现直接对每个子串调用 r.split('-') 并解包为两个整数,但忽略了两种关键情况:一是单页编号(如 "2",不含 -),二是反向范围(如 "18-12"),这会导致 ValueError: not enough values to unpack 或计算错误。
正确的解决方案需显式判断每段是否含连字符 -,并使用 abs() 确保范围长度恒为正:
def count_pages(p):
ranges = p.split(', ')
total_pages = 0
for r in ranges:
r = r.strip() # 去除可能的首尾空格(增强鲁棒性)
if '-' in r:
start, end = map(int, r.split('-'))
total_pages += abs(end - start) + 1
else:
total_pages += 1
return total_pages
该函数已通过全部测试用例:
- count_pages('5-7, 2') → 4(页 5、6、7、2)
- count_pages('12-18, 20-20') → 8(12–18 共 7 页,20–20 为 1 页)
- count_pages('18-12, 20-20, 5-6') → 10(|12−18|+1 = 7,+1 + 2 = 10)
注意事项:
- 输入字符串中页码项之间应以 ', ' 分隔(逗号+空格),若分隔符不统一(如 ',\t' 或 ','),建议先用正则 re.split(r'\s*,\s*', p) 替代 split(', ') 提升兼容性;
- 当前实现不校验页码是否为正整数,生产环境可增加 try-except 或类型检查;
- 若需支持更复杂语法(如排除页码 5-10,~7),应引入正则表达式或专用解析器。
此方案简洁、健壮、无需外部依赖,适用于教学与轻量级打印模拟场景。











