这段代码应该生成一个代表问题的随机数。数字生成器生成从1到10的数字。但如果数字不在数字列表"numlist"
中,则应该生成另一个数字。这应该是为了让程序不会两次问同一个问题。使用numlist.remove()
不能用于此目的。什么会奏效?或者,什么是更好的方法。
另外,我想知道怎么做才能减少代码中的重复次数(循环?)。
def roll():
var = random.randint(1,10)
if var not in numlist:
roll()
elif var == 1:
numlist.remove(1)
q1()
elif var == 2:
numlist.remove(2)
q2()
elif var == 3:
numlist.remove(3)
q3()
elif var == 4:
numlist.remove(4)
q4()
elif var == 5:
numlist.remove(5)
q5()
elif var ==6:
numlist.remove(6)
q6()
elif var == 7:
numlist.remove(7)
q7()
elif var == 8:
numlist.remove(8)
q8()
elif var == 9:
numlist.remove(9)
q9()
elif var == 10:
numlist.remove(10)
q10()
答案 0 :(得分:4)
您似乎只使用这些数字进行调度。可以实现相同的结果(以随机顺序调用10个函数中的每一个),而无需首先通过数字,如下所示:
import random
def roll():
qs = [q1, q2, q3, q4, q5, q6, q7, q8, q9, q10]
random.shuffle(qs)
for q in qs:
yield q
# ...
for rolled in roll():
rolled()
通过不直接调用q#()
函数而不是产生它们,只要方便调用者就可以调用它们。
答案 1 :(得分:1)
怎么样:
def roll():
var = random.randint(1,10)
if var not in numlist:
roll()
else:
numlist.remove(var)
call_me = getattr(module, 'q%s'% var)
答案 2 :(得分:1)
我不确定你是否可以,但不是有10个函数q1().. q10我会创建一个以这种方式接受参数的函数:
def roll():
var = random.randint(1,10)
if var not in numlist:
roll()
else:
numlist.remove(var)
q(var)
您还应该检查numlist
是否为空(以防万一)。
此外,随机int永远不会是列表中的那个导致堆栈溢出的可能性,但是10个int尽管不太可能,但如果你想确保这不会发生,你应该:< / p>
列出包含以下选项的列表:
choices = range(1,11)
您应该使用choice从该列表中进行选择:
var = random.choice(choices)
然后删除该选项:
choices.remove(var)
答案 3 :(得分:1)
每个问题保留一个功能不是一个好策略。如果您想稍微改变问题,提示和答案的方式怎么办?你要改变几十个甚至几百个函数吗?
更好的方法是面向对象的方法 - 例如,每个问题都是Question
类的对象。例如:
class Question:
def __init__(self, question, hints, answer):
self.question = question
self.hints = hints
self.answer = answer
def ask_question(self):
print "Here is your question:"
print self.question
def give_hint(self):
if len(self.hints) == 0:
print "That's all the hints I have!"
else:
print self.hints.pop(0)
def guess(self, guess):
if guess == self.answer:
print "You guessed correctly!"
else:
print "No, try again!"
您最初封装在问题函数中的任何行为(限制猜测次数,有限的时间量,以某种格式显示,等等)都将由Question
类的方法处理。与此同时,特定于一个问题的所有信息都将保存在数据成员中(在本例中为question
,hints
和answers
,尽管可能存在其他变量)那个问题。
你会创建一个这样的问题:
q1 = Question("How many roads must a man walk down?", ["Think Douglas Adams.", "It's more than 40 and less than 50"], "42")
或者更好的是,从制表符分隔文件创建它们,文件类似于:
How many roads must a man walk down? Think Douglas Adams./It's more than 40 and less than 50 42
它们的创建方式如下:
questions = []
with open("questions.txt") as inf:
for l in inf:
question, hints, answer = l[:-1].split("\t")
questions.append(Question(question, hints.split("/"), answer))
然后你的main函数将调用Question
的方法,它封装了它的问题行为。这将使您不必重复代码(所有代码仅存在于一个地方:Question
对象的方法)并且将以灵活的格式保留您的所有问题。
答案 4 :(得分:0)
您可以将所有功能放入列表中,随机播放列表,然后弹出结果问题功能:
>>> import random
>>>
>>> l = [q1, q2, q3, q4, q5, q6, q7, q8, q9, q10]
>>> random.shuffle(l)
>>> qfunc = l.pop()