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