0

Michael Dawson 著の「絶対初心者向けの Python」という本の中で、リストと辞書に関する章で、私は多くのことを学び、古い Magic 8-Ball をインスピレーションとして使用して、練習として新しいプログラムを作成しようとしています。以下は、これまでに思いついたコードです。

それはある程度まで機能します...ランダムに生成された数値は生成されますが、elifは機能していないようです。より良い方法とより簡単な方法があることは知っていますが、辞書の理解を深めるためにこれを行っています.

いくつかの print ステートメントを入れて、番号が選択されているかどうかを確認しました。else ステートメントは、すべてがうまくいかない場合です。コードが現在立っているので、印刷された数字だけが得られ、else は「計算しません。終了は正常に動作します。また、コメントアウトされた print "ball" ステートメントを使用して、辞書が正常であることを確認しました。

したがって、私の問題は、elif ステートメントが生成された乱数を処理しないように見える理由です。誰が答えてくれたのか、心から感謝します。

# Import the modules
import sys
import random

 # define magic 8-ball dictionary
ball = {"1" : "It is certain.",
        "2" : "Outlook is good.",
        "3" : "You may rely on it.",
        "4" : "Ask again later.",
        "5" : "Concentrate and ask again.",
        "6" : "Reply is hazy, try again later.",
        "7" : "My reply is no.",
        "8" : "My sources say no"}
# for items in ball.items():
#              print(items)

ans = True

while ans:
    question = input("Ask the Magic 8 Ball a question: (press enter to quit) ")

    answer = random.randint(1,8) 
    print(answer)

    if question == "":
        sys.exit()

    elif answer in ball:
        response = ball[answer]
        print(answer, response)
    else:
        print("\nSorry", answer, "does not compute.\n")    
4

3 に答える 3

3

random.randint()整数を返します。辞書のキーはすべて文字列です。したがって、 を実行するanswer in ballと、常にになりますFalse"1" != 1

できることは、すべてのキーを整数にする (引用符を削除する) か、次のようanswerにして文字列を作成することです。

answer = str(random.randint(1,8))

hereを使用しないでelifください。入力が何もない場合、 と の両方ifelifTrue になり、ほとんどの場合、これは望ましくありません。代わりに、を次のように変更elif/elseif/elseます。

if question == "":
    sys.exit()

if answer in ball:
    response = ball[answer]
    print(answer, response)
else:
    print("\nSorry", answer, "does not compute.\n")    

最後に 1 つ。ディクショナリを動的に作成したため、answer常に になります。ballここでは、 を使用できますdict.get()。例えば:

if not question: # You can do this instead
    sys.exit()

print(ball.get(answer))
于 2013-09-21T09:59:21.413 に答える