这个程序正好在被接受为列表/字典和最好用类编写之间的边界。如果它有任何增长的可能性,您可能希望将其重组为面向对象的程序 (OOP),如下所示:
import sys
import random
class Question(object):
def __init__(self, question, answer, options):
self.question = question
self.answer = answer
self.options = options
def ask(self):
print self.question + "?"
for n, option in enumerate(self.options):
print "%d) %s" % (n + 1, option)
response = int(sys.stdin.readline().strip()) # answers are integers
if response == self.answer:
print "CORRECT"
else:
print "wrong"
questions = [
Question("How many legs on a horse", 4, ["one", "two", "three", "four", "five"]),
Question("How many wheels on a bicycle", 2, ["one", "two", "three", "twenty-six"]),
# more verbose formatting
Question(question="What colour is a swan in Australia",
answer=1,
options=["black", "white", "pink"]), # the last one can have a comma, too
]
random.shuffle(questions) # randomizes the order of the questions
for question in questions:
question.ask()
这使得如何使用数据结构的逻辑更接近于定义数据结构的位置。此外(解决您的原始问题),很容易将问题与答案相关联,因为它们不再位于单独的列表中。
没有理由不这样做,因为 Python 不需要太多额外的工作来创建一个类。这与 dict-of-lists 解决方案(它所基于)的长度大致相同,并且可以说更容易阅读,更接近您在坐下来开始编程之前的想法。即使在四行程序中,我也经常使用类:OOP 并不是什么大问题。
编辑:您可以像操作整数或字符串列表一样操作类实例列表。例如,
del questions[0]
从列表中删除第一项,
questions.append(Question("What is a new question", 1, ["This is."]))
在列表末尾添加一个新问题,pop
让您可以将列表用作堆栈等。(有关更多信息,请参阅 Python 教程。)如果您想使用列表的remove
方法删除特定问题,而不是通过索引删除它(什么del
确实),那么你需要告诉 Python 两个问题相同意味着什么。
尝试将这两个方法添加到类中:
def __eq__(self, other):
return self.question == other.question
def __repr__(self):
return "<Question: %s? at %0x>" % (self.question, id(self))
第一个定义两个Question
实例相等,如果它们的问题字符串相同。您可以通过要求他们的答案相同来扩展定义,但您明白了。它允许您这样做:
questions.remove(Question("How many legs on a horse", 0, []))
删除马腿问题。
第二个在 Python 命令行上漂亮地打印问题对象,以便您在试验这些命令时可以看到自己在做什么。最好的学习方法是反复试验,这使反复试验更有效率。