0

私はPythonを初めて使用し、Pythonを自分で学ぶためのゲームを作成しています。このゲームには、質問と回答を含む多くのレッスンがあります。ユーザーは、回答の有効性に応じてポイントを獲得および失います。

私は辞書を使用して、各レッスンで尋ねられる質問と回答を保存しています。

特定のポイント(ユーザーがコマンドを入力した後など)でのみ辞書のキーと値を表示および確認したい。これを行うために、辞書を含む関数を作成し、必要に応じてそれらをメイン関数に渡すことができると想像しました。

しかし、以下のコードを実行すると、次のエラーが発生します。AttributeError:'function'オブジェクトに属性'iteritems'がありません

だから私は2つの質問があります:

  1. 関数内から辞書を削除してみましたが、問題なく動作します。関数内で機能させる方法(または理由)はありますか?
  2. 1つの辞書だけを使用して、特定の時点でそのセクションのキーと値を確認することは可能ですか?

これが私のこれまでのコードです。どんなアドバイスでも大歓迎です!

points = 10 # user begins game with 10 pts 

def point_system(): 
    global points

    #help user track points
    if 5 >= points: 
        print "Careful. You have %d points left." % points 
    elif points == 0: 
        dead("You've lost all your points. Please start over.")
    else:
        print "Good job. Spend your points wisely." 

def lesson1(): 
    #create a dictionary 
    mydict = {
    "q1":"a1", 
    "q2":"a2"
    }

return mydict

def main(lesson):
    global points

    #get key:value pair from dictionary
    for k, v in lesson.iteritems():
        lesson.get(k,v) # Is the .get step necessary? It works perfectly well without it.
        print k
        user_answer = raw_input("What's your answer?: ") 

#test if user_answer == value in dictionary, and award points accordingly 
        if user_answer == v:
            user_answer = True
            points += 1 #increase points by 1 
            print "Congrats, you gained a point! You now have %d points" % points 
            point_system()
        elif user_answer != v: 
            points -= 1 #decrease points by 1 
            print "Oops, you lost a point. You now have %d points" % points 
            point_system()
        else: 
            print "Something went wrong."
            point_system()


main(lesson1) 

および機能するコード:

points = 10 # user begins game with 10 pts 

#create a dictionary 
lesson1 = {
"q1":"a1", 
"q2":"a2"
}

def point_system(): 
    global points

    #help user track points
    if 5 >= points: 
    print "Careful. You have %d points left." % points 
    elif points == 0: 
    dead("You've lost all your points. Please start over.")
    else:
    print "Good job. Spend your points wisely." 

def main(lesson):
    global points

    #get key:value pair from dictionary
    for k, v in lesson.iteritems():
        lesson.get(k,v) # Is the .get step necessary? It works perfectly well without it.
        print k
        user_answer = raw_input("What's your answer?: ") 

#test if user_answer == value in dictionary, and award points accordingly 
        if user_answer == v:
            user_answer = True
            points += 1 #increase points by 1 
            print "Congrats, you gained a point! You now have %d points" % points 
            point_system()
        elif user_answer != v: 
            points -= 1 #decrease points by 1 
            print "Oops, you lost a point. You now have %d points" % points 
            point_system()
        else: 
            print "Something went wrong."
            point_system()


main(lesson1) 
4

2 に答える 2

1

レッスン1関数(ディレクトリ)の結果ではなく、レッスン1関数を使用してmain()を呼び出しています。

あなたは書くべきです:

main(lesson1())

ちなみに、これが機能するには、lesson1は作成されたディレクトリも返す必要があります。

def lesson1(): 
    #create a dictionary 
    mydict = {
        "q1":"a1", 
        "q2":"a2"
    }
    return mydict
于 2012-05-10T07:49:23.927 に答える
1

辞書を返す関数を渡したので、最初に関数を呼び出して辞書を取得する必要があります。したがって、mainが辞書を受け入れるようにコードを変更できます(コードは実際には辞書を想定しています)。

main(lesson1())

本当に関数を渡したい場合は、main最初に関数を実行して辞書を取得するように変更する必要があります。

def main(lessonFunc):
    global points
    lesson = lessonFunc()

    #get key:value pair from dictionary
    for k, v in lesson.iteritems():

しかし、最初のオプションの方がおそらく優れています。レッスンをオブジェクトにパックすることもできます。

于 2012-05-10T07:51:09.113 に答える