本文介绍如何实现 count_pages(p) 函数,正确解析形如 "5-7, 2" 或 "18-12, 20-20" 的页码字符串,自动处理单页、正向/反向范围,并返回实际打印页数。
本文介绍如何实现 `count_pages(p)` 函数,正确解析形如 `"5-7, 2"` 或 `"18-12, 20-20"` 的页码字符串,自动处理单页、正向/反向范围,并返回实际打印页数。
在模拟打印机逻辑的 Python 程序中,用户常以字符串形式输入页码指令(如 "5-7, 2" 表示打印第 5、6、7 和第 2 页),需将其可靠转换为总页数。原始实现因未区分「单页」(无 -)和「范围页」(含 -)而抛出 ValueError: not enough values to unpack;同时,当起始页大于结束页(如 "18-12")时,直接相减会得到负值,导致计数错误。
以下是健壮、清晰且无需正则表达式的解决方案:
def count_pages(p):
"""
计算页码字符串对应的实际打印页数。
支持格式:
- 单页: "2", "20"
- 页码范围: "5-7", "12-18", "20-20"
- 混合格式: "5-7, 2", "18-12, 20-20, 5-6"
注意:范围起止顺序无关("18-12" 等价于 "12-18")
Args:
p (str): 逗号分隔的页码描述字符串,可含空格
Returns:
int: 总打印页数
"""
# 去除首尾空格并按逗号分割(兼容空格前后不一致的情况)
ranges = [part.strip() for part in p.split(',')]
total_pages = 0
for r in ranges:
if not r: # 跳过空项(如 ", , 5" 中的空段)
continue
if '-' in r:
try:
start, end = map(int, r.split('-'))
total_pages += abs(end - start) + 1
except ValueError:
raise ValueError(f"无效的页码范围格式: '{r}'")
else:
try:
total_pages += 1 # 单页
except ValueError:
raise ValueError(f"无效的页码数值: '{r}'")
return total_pages
使用示例:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
print(count_pages('5-7, 2')) # 输出: 4 (5,6,7,2 → 共4页)
print(count_pages('12-18, 20-20')) # 输出: 8 (12~18共7页 + 20共1页)
print(count_pages('18-12, 20-20, 5-6')) # 输出: 10 (12~18→7页 + 20→1页 + 5~6→2页)
✅ 关键改进点总结:
- 使用 in 判断 '-' 存在性,避免对单页调用 split('-') 导致解包失败;
- 用 abs(end - start) + 1 统一处理正向与反向范围("18-12" 和 "12-18" 均得 7);
- 添加 .strip() 和空项过滤,提升对输入空格的鲁棒性;
- 内置 try-except 提供清晰错误提示,便于调试和用户反馈;
- 文档字符串明确说明支持格式与边界行为,符合生产级函数规范。
该函数简洁、可读性强,适用于教学、脚本工具或轻量级打印模拟系统,无需依赖 re 模块即可安全处理真实场景中的页码输入变体。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










