请修改pleaseConformOnePass:优化打印指令并修复空列表崩溃问题
修改pleaseConformOnePass函数:生成自然指令并兼容空列表
问题背景
我正在学习Srini Devadas所著《Programming for the Puzzled》第一章中的pleaseConform与pleaseConformOnePass程序。章节末尾的第二个练习要求修改pleaseConformOnePass函数,使其满足:
- 输出更自然的指令(示例如下)
- 传入空列表时不会崩溃
自然指令示例
'People in positions 2 through 4 flip your caps!'
'People in positions 6 through 8 flip your caps!'
'Person at position 11 flip your cap!'
原代码问题
原演示代码如下:
def pleaseConformOnePass(caps): caps = caps + [caps[0]] for i in range(1, len(caps)): if caps[i] != caps[i - 1]: if caps[i] != caps[0]: print(f"People in positions {i}", end="") else: print(f" through {i-1}, please flip your caps!")
存在两个问题:
- 传入空列表时,
caps[0]会触发索引错误,导致程序崩溃。 - 输出格式生硬,无法区分单个位置和区间的情况,也不符合示例的自然表述。
解决方案
以下是修改后的函数,同时解决了这两个问题:
def pleaseConformOnePass(caps): # 处理空列表,直接返回避免崩溃 if not caps: return # 复制原列表并添加哨兵元素,避免修改输入列表本身 caps_copy = caps.copy() caps_copy.append(caps_copy[0]) start_pos = None for i in range(1, len(caps_copy)): if caps_copy[i] != caps_copy[i-1]: if caps_copy[i] != caps_copy[0]: # 记录翻转区间的起始位置(题目中位置从1开始计数) start_pos = i else: # 翻转区间结束,生成对应指令 end_pos = i - 1 if start_pos == end_pos: print(f'Person at position {start_pos} flip your cap!') else: print(f'People in positions {start_pos} through {end_pos} flip your caps!')
修改说明
- 空列表兼容:函数开头增加
if not caps: return判断,直接返回避免访问空列表的索引。 - 避免副作用:使用
caps.copy()复制原列表,再添加哨兵元素,不会修改传入的原始列表。 - 自然指令生成:
- 用
start_pos记录每个翻转区间的起始位置。 - 当区间结束时,判断起始和结束位置是否相同:
- 相同则输出单个位置的指令(用
Person和position单数形式)。 - 不同则输出区间指令(用
People和positions复数形式,搭配through连接区间)。
- 相同则输出单个位置的指令(用
- 用
内容的提问来源于stack exchange,提问作者Ozzy
相关产品推荐
相关产品推荐

