2

这段代码应该生成一个代表问题的随机数。数字生成器生成从 1 到 10 的数字。但如果该数字不在数字列表中,"numlist"它应该生成另一个数字。这应该是为了使程序不会两次问同一个问题。usingnumlist.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()
4

5 回答 5

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#()直接调用函数而是生成它们,只要调用者方便,就可以调用它们。

于 2013-01-21T01:05:56.093 回答
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)
于 2013-01-21T00:57:40.003 回答
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 不太可能发生,但如果你想确保这不会发生,你应该:

列出选择:

choices = range(1,11)

您应该使用选择从该列表中进行选择:

var = random.choice(choices)

然后删除该选择:

choices.remove(var)
于 2013-01-21T00:59:07.140 回答
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对象的方法),并将您的所有问题以灵活的格式保存。

于 2013-01-22T01:59:52.687 回答
0

您可以将所有功能放在一个列表中,将列表打乱,然后弹出结果问题功能:

>>> import random
>>>
>>> l = [q1, q2, q3, q4, q5, q6, q7, q8, q9, q10]
>>> random.shuffle(l)
>>> qfunc = l.pop()
于 2013-01-21T01:05:08.737 回答