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


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

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

def Kerma():
        return "energy / mass"    

print Kerma()

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

print Kerma()

def Kerma():
    return "energy / mass"

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

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

4 61

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.

Python-это динамический язык, и интерпретатор всегда принимает состояние переменных (функций,...) как они в данный момент их называют. Вы даже можете переопределить функции в некоторых if-блоках и вызывать их каждый раз по-разному. Вот почему вы должны определить их, прежде чем называть их.