当我尝试通过输入2
打开Flamma时,它会指出Tetraites is not defined
。我相信它与我的代码组织有关,但我不知道如何解决它。
import time
Intro = open('#Intro.txt', mode='r')
for line in Intro:
line = line.replace("\n","")
print(line)
name = input("Which gladiator do you choose? (use the numbers before the name): ")
if name == '1':
Tetraites = open('1 Tetraites.txt', mode='r')
for line in Tetraites:
line = line.replace("\n","")
print(line)
if name == "2":
Flamma = open('2 Flamma.txt', mode='r')
for line in Flamma:
line = line.replace("\n","")
print(line)
if name == "3":
Verus = open('3 Verus.txt', mode='r')
for line in Verus:
line = line.replace("\n","")
print(line)
回溯:
追踪(最近一次通话): 文件“/Volumes/Data/Users/david.twohill/Desktop/python/choose adventure / Adventure.py”,第14行,在Tetraites中的行:NameError:名称'Tetraites'未定义
答案 0 :(得分:1)
您的问题是您的代码缩进。请看一下这段代码:
if name == '1':
Tetraites = open('1 Tetraites.txt', mode='r')
for line in Tetraites:
line = line.replace("\n","")
print(line)
Tetraites
在if语句中定义,但由于您已将2
作为输入,因此永远不会定义,但for
循环会尝试访问它。
请更改代码的缩进:
if name == '1':
Tetraites = open('1 Tetraites.txt', mode='r')
for line in Tetraites:
line = line.replace("\n","")
print(line)
elif name == "2":
Flamma = open('2 Flamma.txt', mode='r')
for line in Flamma:
line = line.replace("\n","")
print(line)
elif name == "3":
Verus = open('3 Verus.txt', mode='r')
for line in Verus:
line = line.replace("\n","")
print(line)
答案 1 :(得分:1)
naltipar已经向您展示了如何解决因缩进不良而导致的错误。但是,这是一种更紧凑的组织代码的方式。
编码的一个重要原则是Don't repeat yourself。这不仅可以缩短您的代码并使其更易于阅读,还可以更轻松地进行修改。
当经验丰富的程序员正在阅读其他人的代码并且我们看到重复的块时,我们必须放慢速度以检查代码块是否重复并且没有一些微妙的变化。然后我们想知道为什么是那些重复的代码块。 :)
不必要地重复代码块会很容易在一个(或多个)块中意外引入一个小错误。这可能导致难以追踪的错误,因为很难判断哪些块是正确的,哪些是错误的。
我已经使用了jonrsharpe的建议将角斗士信息文件存储在字典中;我还添加了一个while
循环,以确保我们从用户那里获得一个有效的角斗士号码字符串。
def print_file(fname, 'r'):
with open(fname) as f:
print(f.read())
gladiator_filenames = {
'1': '1 Tetraites.txt',
'2': '2 Flamma.txt',
'3': '3 Verus.txt',
}
print_file('#Intro.txt')
prompt = "Which gladiator do you choose? (use the numbers before the name): "
#Loop until we get a valid number string
while True:
numstring = input(prompt)
fname = gladiator_filenames.get(numstring)
if fname is None:
print("Unknown gladiator number!")
else:
break
print_file(fname)