2013-01-21 175 views
2

这段代码应该生成一个表示问题的随机数。数字发生器生成1到10的数字。但如果数字不在数字列表"numlist"中,它应该生成另一个数字。这应该是这样,程序不会问两次相同的问题。使用numlist.remove()不适用于此目的。什么会起作用?或者,什么是更好的方法。如何解决这个迭代python代码并减少重复?

此外,我想知道如何使它在代码(循环?)中少重复。

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

刚刚'numlist.remove(var)'怎么样? –

+1

但也有q *() – drum

+0

什么不行? – Volatility

回答

1

每个问题保持一个函数不是一个好策略。如果你想稍微改变问题,提示和答案,会怎么样?你会改变几十甚至几百个功能?

更好的方法是面向对象 - 例如,每个问题都是类的对象。例如:

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,hintsanswers,尽管可能存在其他变量),这些信息是特定于该问题的。

您可以创建这样一个问题:

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)) 

然后你的主要功能会调用方法Question,其中提出了问题提问行为。这样可以防止您重复执行代码(所有代码只存在于一个地方:Question对象的方法),并且可以将所有问题保留为灵活的格式。

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) 
+0

不必要的(可能是灾难性的,尽管这不太可能)递归。我会使用'random.choice'来代替。 – DSM

+0

@Trufa是正确的,你应该重写'q'是更通用的,所以它的一个功能,而不是10. – Nix

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不会是引起堆栈溢出的列表中的一个,但是如果您想确保这种情况不会发生,您应该:

做出与选择列表:

choices = range(1,11) 

你应该使用choice从列表中选择:

var = random.choice(choices) 

,然后除去叔帽子的选择:

choices.remove(var) 
0

你可以把所有的功能列表,随机播放列表,然后弹出的结果问题的功能:

>>> import random 
>>> 
>>> l = [q1, q2, q3, q4, q5, q6, q7, q8, q9, q10] 
>>> random.shuffle(l) 
>>> qfunc = l.pop() 
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#()功能得到他们,他们可以被调用时,它的方便来电者。

+0

另一种选择是重复使用'random.choice'选择一个问题并将其删除。 –