如何修复这个迭代的python代码并减少重复?

时间:2013-01-21 00:53:54

标签: python

这段代码应该生成一个代表问题的随机数。数字生成器生成从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()

5 个答案:

答案 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类的方法处理。与此同时,特定于一个问题的所有信息都将保存在数据成员中(在本例中为questionhintsanswers,尽管可能存在其他变量)那个问题。

你会创建一个这样的问题:

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