我目前正在阅读 Srini Devadas 的《Programming for the Puzzled》一书的第 1 章,他在其中讨论了 PleaseConform 和 PleaseConformOnePass 程序。
他在本章末尾设置了一些练习,他希望对现有代码进行某些调整。我特别坚持第二个练习,它指出了以下内容:
修改pleaseConformOnePass以打印更自然的命令并确保它不会在空列表上崩溃
提示,您需要记住内部的开头(而不是在第 6 行打印)
他所说的自然命令是这样的:
“位置 2 到 4 的人翻转你的帽子!” “位置 6 到 8 的人翻转你的帽子!” “11号位的人翻转你的帽子!
他在第一章中演示的代码是:
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”为空列表(caps[0]没有值/元素,因此程序抛出错误)时,第2行导致程序崩溃,但删除 caps[0] 会产生正确的结果.
打印语句我完全陷入困境,不知道如何调整它们。
我用 if 语句实现了空列表管理,我这样做是为了记住内部变量“start_interval”的开始。
为了改进我使用的自然语言,该句子有两个版本:位置1的人,请翻转你的帽子!和位置5到6的人,请翻转你的帽子!
代码下方:
def pleaseConformOnePass(caps):
if caps:
start_interval = None
caps += [caps[0]]
for i in range(1, len(caps)):
if caps[i] != caps[0]:
if start_interval is None:
start_interval = i
if start_interval not in [None, i] and caps[i] != caps[i-1]:
if i-1 == start_interval:
print(f"Person at position {start_interval}, please flip your cap!")
else:
print(f"People in positions {start_interval} through {i-1}, please flip your caps!")
start_interval = None
# Example usage:
caps_list = [1, 0, 1, 1, 1, 0, 0, 1, 0, 0]
pleaseConformOnePass(caps_list)
我希望我正确理解了这个请求。