Можно ли вызвать функцию без ее полного определения? При попытке этого я получаю сообщение об ошибке: « имя_функции не определено». Я работаю на C ++, поэтому эта проблема меня озадачивает.
Объявление функции до работы:
def Kerma():
return "energy / mass"
print Kerma()
Однако попытка вызвать функцию без предварительного определения вызывает проблемы:
print Kerma()
def Kerma():
return "energy / mass"
В C ++ вы можете объявить функцию после вызова, если поместите перед ней заголовок.
Я что-то упустил?
python
function
formatting
TheGentleOne
источник
источник
Kerma is an acronym for "kinetic energy released per unit mass"
.py
файл и импортировать его? Есть ли непредвиденные последствия?Ответы:
Один из способов, который в Python является своего рода идиоматикой, - это написать:
def main(): print Kerma() def Kerma(): return "energy / mass" if __name__ == '__main__': main()
Это позволяет вам писать код в нужном вам порядке, пока вы продолжаете вызывать функцию
main
в конце.источник
main
функций обычно помещается в конец.if __name__ == '__main__':
переключатель - это обычная идиоматическая часть.if ... __main__':
. Я не сказал, чтоmain
нужно ставить над остальным кодом. Я сказал, что важная часть - это вызов_\_main__
в конце, и тогда не имеет значения, где вы разместите его определение.Когда запускается модуль Python (файл .py), операторы верхнего уровня в нем выполняются в том порядке, в котором они появляются, сверху вниз (от начала до конца). Это означает, что вы не можете ссылаться на что-либо, пока это не определите. Например, следующее вызовет показанную ошибку:
c = a + b # -> NameError: name 'a' is not defined a = 13 b = 17
В отличие от многих других языков, операторы
def
иclass
операторы в Python выполняются , а не только декларативно, поэтому вы не можете ссылаться ни на что,a
либоb
пока это не произойдет и они не будут определены. Вот почему в вашем первом примере есть проблемы - вы ссылаетесь наKerma()
функцию до того, как ееdef
оператор был выполнен, тело было обработано, а результирующий объект функции привязан к имени функции, поэтому он не определен в этой точке скрипта.Программы на таких языках, как C ++, обычно предварительно обрабатываются перед запуском, и на этом этапе компиляции вся программа и все
#include
файлы, на которые она ссылается, считываются и обрабатываются одновременно. В отличие от Python, этот язык содержит декларативные операторы, которые позволяют объявлять (но не определять) имя и последовательность вызовов функций (или статический тип переменных) перед использованием, так что, когда компилятор встречает их имя, он имеет достаточно информации для проверки их использование, которое в первую очередь влечет за собой проверку типов и преобразование типов, ни одно из которых не требует, чтобы их фактическое содержимое или тела кода еще были определены.источник
doit(); sub doit { print("I'm doing it!\n"); }
Это невозможно в Python, но, откровенно говоря, вы скоро обнаружите, что вам это совсем не нужно. Метод Pythonic для написания кода состоит в том, чтобы разделить вашу программу на модули, которые определяют классы и функции, и один «главный модуль», который импортирует все остальные и запускается.
Для простых сценариев выброса привыкните помещать «исполняемую часть» в конец, а еще лучше научитесь использовать интерактивную оболочку Python.
источник
Python - это динамический язык, и интерпретатор всегда принимает состояние переменных (функций, ...) такими, какие они есть в момент их вызова. Вы даже можете переопределить функции в некоторых if-блоках и вызывать их каждый раз по-разному. Вот почему вы должны определить их, прежде чем вызывать их.
источник
Если вы хотите быть похожим на C ++ и использовать все внутри functions. вы можете вызвать первую функцию из нижней части файла, например:
def main(): print("I'm in main") #calling a although it is in the bottom a() def b(): print("I'm in b") def a(): print("I'm in a") b() main()
Таким образом, python сначала «читает» весь файл, а затем начинает выполнение.
источник