Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何加强代码以应对意外输入?_Python 3.x - Fatal编程技术网

Python 3.x 如何加强代码以应对意外输入?

Python 3.x 如何加强代码以应对意外输入?,python-3.x,Python 3.x,当我试图打破这个,它是相当容易的,真的看现在很明显,为什么它是如此糟糕。如果您对我的查询结构完整性有任何建议,我们将不胜感激。感谢您对noob的帮助。将条目拆分为单独的结构,并将其用于适当的值。并检查例外情况 while True: race = int(input('1. Roegadyn\n' '2. Hyur\n' '3. Elezen\n' '4. Mi\

当我试图打破这个,它是相当容易的,真的看现在很明显,为什么它是如此糟糕。如果您对我的查询结构完整性有任何建议,我们将不胜感激。感谢您对noob的帮助。

将条目拆分为单独的结构,并将其用于适当的值。并检查例外情况

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

为了完整起见,我想提一个更简单的解决方案:

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')
此解决方案的优点是,这两个问题(非数字输入和索引超出范围)都是在同一基础上处理的,这使得代码更清晰。特别是,不需要对数值输入进行显式检查

Ignacio的解决方案很好,但它混合了“三思而后行”(rmap中的rnum)方法和“请求原谅比请求许可更容易”(尝试)。由于这两种错误通常都非常罕见,因此最好将正常行为(
break
)放在
try…else
子句中

旁注:在你的种族列表中没有必要使用
\'
转义,因为你可以使用
“…”
引号,就像这里一样。在最初的问题中,可以用相同的方式使用字符串连接:
'Roegadyn'…“Mi'Qote”…


PS:在这个解决方案中,
种族
实际上是一个种族,而不是一个种族参考号,与原来的问题相反。对于数值
竞赛
,可以改为尝试:race=int(…);比赛[比赛]除了…(但这看起来不太好)。

+1:结构很好!建议将
try
子句保持尽可能小(以便更好地控制和指示异常来自何处):我缩短了它。我还修复了当用户输入字符串时失败的
input()
。我个人会跳过
rval=…
步骤,因为
rval
不会被多次使用,但这多少是一个品味问题。哦,你说得对,我错过了那部分。将恢复到
input()
。我还修复了您的
iteritems()
,因为它在Python 3中不存在。哎呀,是的,错过了方法更改。谢谢。我还自动创建了编号的选项列表,因为在这种情况下,选项是连续的数字。在这种情况下,这是正确的。但总的来说,为了清晰和灵活,最好进行扩展。我也喜欢这样。。。我可能应该在早些时候澄清(我没想到会有这么多帮助)的一点是,每个种族有两个子种族。因此,实际上我的rmap变量的值是用
|
表示的,我的另一个函数从.txt文件读取数据并打印出所选种族的统计数据
“Mi'Qote | Sequeers of the Sun”
就是一个例子,因此字典在这种情况下运行良好,尽管我认为列表也会运行良好。如果你想知道我到目前为止有什么代码,我很乐意向你发送源代码。是的,一个列表也是一样的:我更新了答案,以便在种族名称中留出空格。
(种族不在范围(1,6))
通常被写为更有效的
1
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