Объявить функцию в конце файла в Python
Можно ли вызвать функцию без предварительного ее полного определения? При попытке этого я получаю ошибку: "имя_функции не определено". Я прихожу с фона на С++, так что эта проблема претит меня.
Объявление функции перед работами:
def Kerma():
return "energy / mass"
print Kerma()
Однако попытка вызвать функцию без ее первого определения дает проблемы:
print Kerma()
def Kerma():
return "energy / mass"
В С++ вы можете объявить функцию после вызова, как только вы поместите свой заголовок перед ней.
Я что-то пропустил?
Ответы
Ответ 1
Один из способов, который является своего рода идиоматическим в Python, пишет:
def main():
print Kerma()
def Kerma():
return "energy / mass"
if __name__ == '__main__':
main()
Это позволяет вам писать код в том порядке, который вам нравится, пока вы продолжаете называть функцию main
в конце.
Ответ 2
При запуске модуля Python (файл .py) операторы верхнего уровня в нем выполняются в порядке их появления сверху вниз (от начала до конца). Это означает, что вы не можете ссылаться на что-либо, пока не определите это. Например, следующее сгенерирует показанную ошибку:
c = a + b # -> NameError: name 'a' is not defined
a = 13
b = 17
В отличие от многих других языков, операторы def
и class
являются исполняемыми в Python, а не просто декларативными, поэтому вы не можете ссылаться на a
или b
пока это не произойдет, и они не будут определены. Вот почему у вашего первого примера возникли проблемы: вы Kerma()
функции Kerma()
до того, как ее оператор def
был выполнен, и тело было обработано, а результирующий объект функции привязан к имени функции, поэтому он не определен в этой точке скрипта,
Программы на таких языках, как C++, обычно предварительно обрабатываются перед запуском, и на этом этапе компиляции вся программа и все файлы #include
которые она ссылается, читаются и обрабатываются одновременно. В отличие от Python, этот язык имеет декларативные операторы, которые позволяют объявлять (но не определять) имя и последовательность вызова функций (или статический тип переменных) перед использованием, чтобы при обнаружении компилятором их имени у него было достаточно информации для проверки их использование, которое в первую очередь влечет за собой проверку типов и преобразование типов, ни одно из которых не требует, чтобы их фактическое содержимое или тела кода были еще определены.
Ответ 3
Это невозможно в Python, но, честно говоря, вы скоро обнаружите, что вам это совсем не нужно. Питоновский способ писать код состоит в том, чтобы разделить вашу программу на модули, которые определяют классы и функции, и единственный "основной модуль", который импортирует все остальные и запускает.
Для простых сценариев отбрасывания вы привыкли размещать "исполняемую часть" в конце или, еще лучше, научиться использовать интерактивную оболочку Python.
Ответ 4
Python - динамическое выражение, и интерпретатор всегда принимает состояние переменных (функций,...), как они находятся в момент их вызова. Вы даже можете переопределить функции в некоторых if-блоках и называть их каждый раз по-разному. Вот почему вы должны определить их перед их вызовом.