在赋值之前引用Python

在赋值之前引用Python,python,python-2.7,average,Python,Python 2.7,Average,我有以下代码: #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 numbe

我有以下代码:

#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
回溯(最近一次呼叫最后一次):
文件“average.py”,第97行,在
一般()
文件“average.py”,第10行,通常
一般()
文件“average.py”,第10行,通常
一般()
文件“average.py”,第12行,通常
开始平均值()
UnboundLocalError:赋值前引用的局部变量“start\u average”

在我的代码中,我可能做得更多,我只是做了这个,但我不知道如何修复它,或者显示了什么错误!我不明白。

很难从你粘贴的内容中分辨出来,因为你显然弄坏了压痕

但它看起来像这样的代码:

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()
…应位于
常规
内,而此代码:

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 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\u ni
first\u number
函数中的局部变量。每次调用
first\u number
,都会定义一个新的
first\u ni
,但仅在该函数中可见。您不能在
second\u number
中使用它,因为
second\u number
只能看到它自己的局部变量和全局变量,
first\u ni
两者都不是



您需要理解的概念称为范围。Python有一些很好的工具来帮助您理解范围。您可以在程序的任何部分打印出
locals()
globals()
dir()
,查看其中的作用域。但您需要先阅读本教程。

很难从粘贴的内容中分辨出来,因为您显然已经破坏了缩进

但它看起来像这样的代码:

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()
…应位于
常规
内,而此代码:

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 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\u ni
first\u number
函数中的局部变量。每次调用
first\u number
,都会定义一个新的
first\u ni
,但仅在该函数中可见。您不能在
second\u number
中使用它,因为
second\u number
只能看到它自己的局部变量和全局变量,
first\u ni
两者都不是



您需要理解的概念称为范围。Python有一些很好的工具来帮助您理解范围。您可以在程序的任何部分打印出
locals()
globals()
dir()
,查看其中的作用域。但是您需要先阅读教程。

缩进和其他一些东西是有问题的。我不知道为什么要在其他函数中定义所有这些函数。。。我想这会满足你的要求。不过,您需要进行更多的错误检查(确保输入是整数、除以0等)


压痕和其他一些事情是值得怀疑的。我不知道为什么要在其他函数中定义所有这些函数。。。我想这会满足你的要求。不过,您需要进行更多的错误检查(确保输入是整数、除以0等)


请修正你的缩进。对
start\u average
的调用是在
general
函数体内部还是在顶层?所有其他的函数都是在
start\u average
的主体中定义的吗?与此同时,你是不是故意让事情变得复杂?为什么在调用链中其他函数的函数中定义函数,等等。?在有些情况下,这些工具很有用,但在尝试建造和骑一个有75个不同大小轮子的怪物之前,先学习如何骑自行车。此外,看起来你实际上要计算的是
n1/n2/n3/n4/n5
;平均值是
(n1+n2+n3+n4+n5)/5
,这是非常非常不同的。请修复缩进。对
start\u average
的调用是在
general
函数体内部还是在顶层?所有其他的函数都是在
start\u average
的主体中定义的吗?与此同时,你是不是故意让事情变得复杂?为什么在调用链中其他函数的函数中定义函数,等等。?有些情况下,这些工具很有用,但要学会如何使用bi