while True:
race = int(input('1. Roegadyn\n'
'2. Hyur\n'
'3. Elezen\n'
'4. Mi\'Qote\n'
'5. Lalafell\n'
'Choose a race: '))
if (race not in range(1,6)):
print('\nInvalid Entry.\n')
else:
break
当我试图打破这一点时,这很容易,现在看起来很明显为什么它如此糟糕。任何关于给出我的查询结构完整性的建议都将非常感激。谢谢你帮助一个菜鸟。
答案 0 :(得分:1)
将您的条目拆分为单独的结构,并将其用于适当的值。并检查例外情况。
rmap = {n: r for (n, r) in enumerate(['Roegadyn', 'Hyur',…], 1)}
while True:
for n, r in sorted(rmap.items()):
print('{}. {}'.format(n, r))
rval = input('Choose a race: ')
try:
rnum = int(rval)
except ValueError:
pass
else:
if rnum in rmap:
break
print('Invalid Entry')
答案 1 :(得分:0)
为了完整起见,我想提一个更简单的解决方案:
races = ["Roegadyn", "Hyur", "Elezen", "Mi'Qote | Seekers of the Sun", "Lalafell"]
while True:
print(*("{}. {}".format(*race_info) for race_info in enumerate(races, 1)),
sep="\n")
try:
race = races[int(input('Choose a race: '))-1]
except (ValueError, IndexError):
print('\nInvalid Entry.\n')
else:
break
这种解决方案的优点是两个问题(非数字输入和索引超出范围)都在相同的基础上处理,这使得代码更清晰。特别是,不需要对数字输入进行明确检查。
伊格纳西奥的解决方案很好,但它将“先看你跳跃”方法(rnum in rmap
)与“更容易请求宽恕而非许可相混合“(try
)。由于这两个错误通常都很少见,因此最好将正常行为(break
)放在try… else
子句中。
旁注:您的比赛列表中不需要\'
转义,因为可以使用"…"
引号,就像这里一样。在原始问题中,您可以使用相同的方式使用字符串连接:'Roegadyn' … "Mi'Qote" …
。
PS:在这个解决方案中,race
实际上是一个种族而不是种族参考号,与原始问题相反。对于数字race
,可以改为try: race = int(…); races[race] except…
(但这看起来不太好)。