<p>正确的方法是使用list或dict数据结构来存储一组选项,然后编写一个简单的函数来提示用户输入,并根据“有效选项”进行验证。你知道吗</p>
<p><strong>示例:</strong></p>
<pre><code>from __future__ import print_function
try:
input = raw_input
except NameError:
input = raw_input # Python 2/3 compatibility
names = ["bob", "jack", "adam", "dom"]
def prompt(prompt, *valid):
try:
s = input(prompt).strip()
while s not in valid:
s = input(prompt).strip()
return s
except (KeyboardInterrupt, EOFError):
return ""
choices = list(enumerate(names))
print("Choices are: {0}".format(", ".join("{0}:{1}".format(i, name) for i, name in choices)))
try:
s = prompt("Your selection? ", *(str(i) for i, _ in choices))
i = int(s)
except ValueError:
print("Invalid input: {0}".format(s))
else:
print("Thanks! You selected {0}".format(choices[i][1]))
</code></pre>
<p>演示:</strong></p>
<pre><code>$ python foo.py
Choices are: 0:bob, 1:jack, 2:adam, 3:dom
Your selection? 0
Thanks! You selected bob
$ python foo.py
Choices are: 0:bob, 1:jack, 2:adam, 3:dom
Your selection? foo
Your selection? 1
Thanks! You selected jack
</code></pre>
<blockquote>
<p>This also correctly handles the scenario of invalid inputs and <code>int()</code> throwing a <code>ValueError</code> as well as silencing <code>^D</code> (<em>EOFError</em>) and <code>^C</code> (<em>KeyboardInterrupt</em>) exceptions.</p>
</blockquote>
<p><strong>注意:</strong>你可以</em>做<code>for name in eval("names{0:d}".format(num)):</code>但是<strong>不要这样做,因为使用<code>eval()</code>任意评估输入被认为是邪恶的,非常危险的。见:<a href="https://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice">Is using eval() in Python bad pracice?</a></p>