Ссылка перед назначением Python

У меня есть следующий код:

#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
</module>

Я, вероятно, сделал это больше всего в своем коде, и я только что сделал это, но я просто не знаю, как это исправить или что отображается ошибка! Я не понимаю.

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_number может видеть только свои локальные переменные, а глобальные переменные и first_ni - ни один.

Концепция, которую вы должны понимать, называется областью. В Python есть несколько полезных инструментов, которые помогут вам понять область действия. Вы можете распечатать locals() и globals() и dir() в любой части вашей программы, чтобы увидеть, что там есть. Но сначала вам нужно прочитать учебник.


Отступы и несколько других вопросов сомнительны. Я не уверен, почему вы определяете все эти функции внутри других функций... Я думаю, что это будет делать то, что вы хотите. Вам потребуется гораздо больше проверки ошибок (убедитесь, что входные данные целые, разделите на 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

licensed under cc by-sa 3.0 with attribution.