所以,我应该已经完成了问题集 4 中 Adieu 练习的代码。我测试了 check50 使用的所有输入,并从我的代码中获得了正确的反馈。但是,当我运行 check50 时,它会抛出“:( EOF 停止程序的输入;预期退出代码 0,而不是 1”,据我了解,这意味着代码未正确编译。之后,它无法检查所有内容以下场景,尽管如果代码未编译则有意义。
from icecream import ic
import sys
def main():
names = []
txt = "Adieu, adieu, to"
while True:
try: names.append(input())
except EOFError:
for i in range(len(names)):
if i == 0: txt = txt + " " + names[i]
elif i == len(names)-1: txt = txt + " and " + names[i]
else: txt = txt + ", " + names[i]
print(txt)
break
main()
忽略 ic 和 sys 导入,我只是用它们来测试代码,但在导入它们之前就失败了,所以它与问题无关。我记得在这之前的几个版本的代码我没有遇到这个问题,尽管我不记得当时和现在之间发生了什么(当时代码不起作用,否则我就不会碰它)
我在语法、嵌套和运行顺序上做了很多改变,但似乎没有什么能让 check50 喜欢它。
找到了问题,但我的推理可能不正确: 退出代码 1 表示执行异常终止,这可能隐藏了运行时错误。我环顾了一下我的代码,发现尽管我测试了它并且没有收到错误,但这里可能隐藏着一个运行时错误:
while True:
try: names.append(input())
except EOFError: break
如果用户使用 ctrl+d 退出,输入函数会提前结束,这意味着附加操作要么无法正常工作,要么只是不向列表附加任何内容。因此,当我稍后调用
names[i]
时,它没有什么可调用的,因为列表是空的。
我添加了一个
sys.exit()
,它在列表为空时运行,以防止它运行以下几行。最后看起来像这样:
import sys
def main():
names = []
txt = "Adieu, adieu, to"
while True:
try: names.append(input())
except EOFError: break
if len(names) == 0: sys.exit()
for i in range(len(names)):
if i == 0: txt = txt + " " + names[i]
elif i == len(names)-1: txt = txt + " and " + names[i]
else: txt = txt + ", " + names[i]
print(txt)
if __name__ == "__main__": main()
正如我所说,这有效,但我不确定我的分析是否正确,所以欢迎任何更正。