0

次のコードがあります。

#AON = Amount of Numbers to average
def general():
print "Enter how many numbers you will enter."
print "Maximum amount is 10: "
aon = raw_input()
try:
    aon = int(aon)
    if aon >= 10:
        print "I cannot average more than 10 numbers."
        general()
    else:
        start_average()
except ValueError:
    print "You entered an invalid input, try again."
    general()

def start_average():
    if aon == 1:
        print "You cannot average one number."
        general()
    elif aon == 2:
        def first_number():
            print "First number: "
            first_ni = raw_input()
            second_number()
        first_number()
        def second_number():
            print "Second number: "
            second_ni = raw_input()
            ans_two = first_ni / second_ni
        second_number()
        final_two()
    elif aon == 3:
        def third_number():
            first_number()
            second_number()
            print "Third number: "
            third_ni = raw_input()
            ans_three = ans_two / third_ni
        third_number()
        final_three()
    elif aon == 4:
        def fourth_number():
            first_number()
            second_number()
            third_number()
            print "Fourth number: "
            fourth_ni = raw_input()
            ans_four = ans_three / fourth_ni
        fourth_number()
        final_four()
    elif aon == 5:
        def fifth_number():
            first_number()
            second_number()
            third_number()
            fourth_number()
            print "Fifth number: "
            fifth_ni = raw_input()
            ans_five = ans_four / fifth_ni
        fifth_number()
        final_five


    def final_two():
        final_input = ans_two
        final_answer()
    def final_three():
        final_input = ans_three
        final_answer()
    def final_four():
        final_input = ans_four
        final_answer
    def final_five():
        final_input = ans_five
        final_answer()
    def final_six():
        final_input = ans_six
        final_answer()
    def final_seven():
        final_input = ans_seven
        final_answer()
    def final_eight():
        final_input = ans_eight
        final_answer()  
    def final_nine():
        final_input = ans_nine
        final_answer()  

    def final_answer():
        listofnumbers = [first_ni, second_ni, third_ni, fourth_ni, fifth_ni, sixth_ni, seventh_ni, eight_ni, ninth_ni]
        print "The average of your numbers:"
        print listofnumbers

        print "Is = %d." % final_input

general()

目的は数値の平均を見つけることですが、PowerShell で実行すると、次のエラーが発生します。

Traceback (most recent call last):
File "average.py", line 97, in <module>
general()
File "average.py", line 10, in general
general()
File "average.py", line 10, in general
general()
File "average.py", line 12, in general
start_average()
UnboundLocalError: local variable 'start_average' referenced before assignment

おそらくコード全体でこれを行ったことがあり、これを作成したばかりですが、修正方法や表示されるエラーがわかりません! 理解できない。

4

2 に答える 2

2

明らかにくぼみが壊れているため、貼り付けたものから判別するのは困難です。

しかし、次のコードのようになります。

print "Enter how many numbers you will enter."
print "Maximum amount is 10: "

… は の中にあることを意味していますがgeneral、このコードは次のとおりです。

aon = raw_input()
try:
    aon = int(aon)
    if aon >= 10:
        print "I cannot average more than 10 numbers."
        general()
    else:
        start_average()
except ValueError:
    print "You entered an invalid input, try again."
    general()

… モジュールレベルであることを意味します。

コードは表示順に実行されます。関数定義は、他のものと同様に単なるコードです。したがって、関数がまだ存在しないため、定義する前に関数を呼び出すことはできません。


次のような例で、おそらく異議を唱えようとしています。

def foo():
    bar()

def bar():
    print('Hi!')

foo()

存在する前に呼び出しているように見えますbarが、それでも機能します。どのように?

まあ、fooの定義barは存在する前に実行されていますが、それで問題ありません。barこれは、実行時にあらゆる手段を呼び出す関数を定義するだけです。barそれを呼び出す前に定義している限り、そしてそれを定義している限り、すべて問題ありません。


ただし、コードには多くの同様の問題があります。たとえば、次の部分を見てみましょう。

elif aon == 2:
    def first_number():
        print "First number: "
        first_ni = raw_input()
        second_number()
    first_number()
    def second_number():
        print "Second number: "
        second_ni = raw_input()
        ans_two = first_ni / second_ni
    second_number()
    final_two()

これfirst_niは、関数内のローカル変数ですfirst_number。を呼び出すたびfirst_numberに、新しいfirst_niが定義されますが、その関数内でのみ表示されます。独自のローカル変数とグローバル変数しか見ることができず、どちらでもないsecond_numberため、 では使用できません。second_numberfirst_ni


理解する必要がある概念は、スコープと呼ばれます。Python には、スコープを理解するのに役立つ便利なツールがいくつかあります。locals()プログラムの任意の部分でand globals()andを印刷してdir()、スコープ内にあるものを確認できます。ただし、最初にチュートリアルを読む必要があります。

于 2013-07-03T23:29:36.807 に答える
1

インデントと他のいくつかの点が疑わしいです。これらすべての関数を他の関数内で定義している理由がわかりません...これはあなたが望むことをすると思います。ただし、さらに多くのエラー チェックが必要になります (入力が整数であることを確認する、0 で割るなど)。

>>> def getMean(maxNumsToDivide):
...     listNums = []
...     for i in range(maxNumsToDivide):
...         num = raw_input("Please enter a number: ")
...         if not num:
...             break
...         listNums.append(int(num))
...     return float(sum(listNums))/len(listNums)
... 
>>> getMean(100)
Please enter a number: 2
Please enter a number: 3
Please enter a number: 4
Please enter a number: 5
Please enter a number: 3
Please enter a number: 
3.4
于 2013-07-03T23:34:32.607 に答える