2012-05-10 8 views
0

私はPythonの初心者です。私は自分自身にPythonを教えるためのゲームを構築しています。このゲームには、質問と回答を含む数多くのレッスンがあります。ユーザーは回答の正当性に応じてポイントを獲得し失うことになります。Python:辞書を含む関数を別の関数に渡すには?

私は各レッスンで質問される質問と回答を辞書で保存しています。

辞書のキーと値を特定のポイント(たとえば、ユーザーがコマンドを入力した後)で表示し、チェックしたいとします。これを行うために、辞書を含む関数を作成し、必要に応じてそれらを主関数に渡すことができると想像しました。

しかし、私は以下のコードを実行すると、私は次のエラーを取得する:はAttributeError:「関数」オブジェクトが無属性「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) 

と動作するコード:あなたはlesson1機能ではなく(ディレクトリ)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) 
+2

ここでは、[OOPアプローチ](http://docs.python.org/tutorial/classes.html)を試してみる必要があると思います。 – DrTyrsa

+2

ちょうど興味深い...あなたはJavaScriptのプログラマーですか? – parselmouth

+0

リファレンス、@DrTyrsaありがとうございます。 – user1186742

答えて

1

あなたが書く必要があります:

main(lesson1()) 

ところで、lesson1も仕事に、このために作成したディレクトリを返す必要があります。

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

ありがとうございます!それは意味があり、完璧に働いた。 – user1186742

+0

関数内に辞書を置くのがベストプラクティスですか、外に置いても大丈夫でしょうか? – user1186742

1

あなたが呼び出す必要がありますので、辞書を返す関数を渡しますその関数はまず辞書を取得します。辞書を取得するために最初の関数を実行するためにあなたが本当にその関数を渡すしたい場合

main(lesson1()) 

あなたはあなたのmainを変更する必要があります。メイン辞書を受け入れるようにあなたのコードを変更することができるように、(コードでは、実際には辞書が期待します) :

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

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

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

+0

ありがとうございます。レッスンをオブジェクトにパックする利点は何ですか? – user1186742

+0

この小さなコードでは、必要ないかもしれません。 'Lesson'オブジェクトは単なる質問以上のものを持つことができます。レッスンのタイトルのように、文学などについての情報があるため、コードがはっきりと分かりやすくなります。 https://en.wikipedia.org/wiki/Object-oriented_programmingを参照してください。 – uhz

関連する問題