2

このコード スニペットは、質問を表す乱数を生成することになっていました。ナンバ ジェネレータは 1 から 10 までの数字を生成します。ただし、その数字が数字のリストにない場合は、"numlist"別の数字を生成することになっています。これは、プログラムが同じ質問を 2 回しないようにするためのものです。を使用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()
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)

そのリストから選択するには、 choiceを使用する必要があります。

var = random.choice(choices)

次に、その選択を削除します。

choices.remove(var)
于 2013-01-21T00:59:07.140 に答える
1

質問ごとに 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クラスのメソッドによって処理されます。その間、1 つの質問に固有のすべての情報は、その質問に固有のデータ メンバー (この場合は と であり、他の変数が存在する可能性があります) に保持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))

次に、メイン関数は のメソッドを呼び出します。これによりQuestion、質問をする動作がカプセル化されます。これにより、コードを繰り返す必要がなくなり (すべてのコードは 1 つの場所 (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 に答える