Подтвердить что ты не робот

Объявить функцию в конце файла в Python

Можно ли вызвать функцию без предварительного ее полного определения? При попытке этого я получаю ошибку: "имя_функции не определено". Я прихожу с фона на С++, так что эта проблема претит меня.

Объявление функции перед работами:

def Kerma():
        return "energy / mass"    

print Kerma()

Однако попытка вызвать функцию без ее первого определения дает проблемы:

print Kerma()

def Kerma():
    return "energy / mass"

В С++ вы можете объявить функцию после вызова, как только вы поместите свой заголовок перед ней.

Я что-то пропустил?

4b9b3361

Ответ 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-блоках и называть их каждый раз по-разному. Вот почему вы должны определить их перед их вызовом.