2016-04-03 21 views
1

私はまだPythonに来て、私のコードは私にそれを実行しようとするとエラーを与えている非常に新しい初心者です。合計が定義されていないと私に伝えています。"total"変数が定義されていないのはなぜですか?

def main(): 
    total = 0 
    avg = 0 
    abc_grade = 0 

def calc_average(total): 
    return total/5 

def letterGrade(grade): 
    if 90 <= grade <= 100: 
     return "A" 
    elif 80 <= grade <= 89: 
     return "B" 
    elif 70 <= grade <= 79: 
     return "C" 
    elif 60 <= grade <= 69: 
     return "D" 
    else: 

     return "F" 

while(True): 
    grade = int(input("Enter a Grade: ")) 
    total += grade 
    avg = calc_average(total) 
    abc_grade = letterGrade(grade) 

    print("Average: " +str(avg)) 
    print("Grades: " +str(abc_grade)) 

main() 

私は、mainの下に "total = 0"を与えることでそれを定義すると考えました。繰り返しますが、私はすべての初心者ですので、どんな助けや説明も素晴らしいでしょう。

+2

あなたの 'total'変数は' main'に対してローカルであり、グローバルスクープではアクセスできない – styvane

答えて

2

外側の範囲では、whileループが定義されていません。あなたは、関数の中で、あなたのwhileループをラップしmainからそれを呼び出す、またはこれとmainを置き換えることができ、次のいずれか

total = 0 
avg = 0 
abc_grade = 0 

は、すなわちグローバルスコープの変数を定義します。

0

あなたのwhileループが最初に呼び出されます。

ステートメントtotal += gradeは、合計がまだ初期化されていないためにエラーが発生する場所です。 whileループの前にtotal = 0を追加します。サイドノートでは

total = 0 #Defining total 
while(True): 
    grade = int(input("Enter a Grade: ")) 
    total += grade 
    avg = calc_average(total) 
    abc_grade = letterGrade(grade) 

、whileループは無限に実行され、main()が実行されないことに注意してください。だからあなたのプログラムの流れは次のようになり、現在書かれ

0

確かに、いくつかのものを追加している間は、いくつかの平均化を行い、その結果を印刷します。その後、メインメソッドを実行します。

インデントはPythonで大した問題です。したがって、whileループをMain()と同じ字下げにすることで、すべてを最初に実行します。だから、あなたのプログラムが合計を見た最初の時間はあなたが言うときである合計+ =グレード

私はロジックがあなたの主な方法の一部であると、このような何か見ている間、あなたはそのすべてのためのものと思われる:

def main(): 
    total = 0 
    avg = 0 
    abc_grade = 0 
    input = 5 
    while(input > 0): 
     grade = int(input("Enter a Grade: ")) 
     total += grade 
     input -= 1 

    avg = calc_average(total) 
    abc_grade = letterGrade(grade) 
    print("Average: " +str(avg)) 
    print("Grades: " +str(abc_grade)) 

def calc_average(total): 
    return total/5 

def letterGrade(grade): 
    if 90 <= grade <= 100: 
     return "A" 
    elif 80 <= grade <= 89: 
     return "B" 
    elif 70 <= grade <= 79: 
     return "C" 
    elif 60 <= grade <= 69: 
     return "D" 
    else: 
     return "F" 

main() 

whileループを終了するには、いくつかのロジックを追加する必要もあります。現在、私はそれを偽に設定するものは見ません。あなたの平均的な方法は5つの入力の平均しかないので、whileループを修正して5つの入力を取ります。

0

main()関数で定義された変数はmain関数内でのみ使用できます。問題を解決するために、メイン関数内で合計を参照するコードを移動することができます。

def main(): 
     total = 0 
     avg = 0 
     abc_grade = 0 


    grade = int(input("Enter a Grade: ")) 
    total += grade 
    avg = calc_average(total) 
    abc_grade = letterGrade(grade) 

    print("Average: " + str(avg)) 
    print("Grades: " + str(abc_grade)) 

def calc_average(total): 
    return total/5 

def letterGrade(grade): 
    if 90 <= grade <= 100: 
     return "A" 
    elif 80 <= grade <= 89: 
     return "B" 
    elif 70 <= grade <= 79: 
     return "C" 
    elif 60 <= grade <= 69: 
     return "D" 
    else: 

     return "F" 

while(True): 
    main() 
0

実際にコードには多くの問題があります。

  • 私はすでにあなたの質問にコメントセッションで述べたように、まず、あなたのtotal変数は、このように世界的なスクープでアクセスごmain関数に対してローカルではありません。ここにはShort Description of Python Scoping Rulesがあります。

  • また、そこには無限のwhileループがあります。満足しているときにループから脱出する方法を示すAsking the user for input until they give a valid responseを読むことを検討する必要があります。

私はあなたがあなたのmain()機能にあなたのwhileループを移動して、完了したら、あなたのwhileループから抜け出すために上記のリンク方法のいずれかを使用することを示唆しているでしょう言われていること。このような何か:

def main(): 
    # variable declaration 
    total = 0 
    avg = 0 
    abc_grade = 0 

    while(True): 
     # do something 
     .... 
     # break out when done 

なく、少なくとも最後に、あなたがこれを行うには良い方法がはるかにあるprint機能であなたの文字列を連結するstring + str(expression)を使用する必要があります。私はこのようにformatを使用することをお勧めします:

print("Average: {avg}".format(avg=avg) 
関連する問題