¿Es posible llamar a una función sin primero definirla completamente? Al intentar esto, aparece el error: " function_name no está definido". Vengo de una experiencia en C ++, por lo que este problema me desconcierta.
Declarar la función antes de las obras:
def Kerma():
return "energy / mass"
print Kerma()
Sin embargo, intentar llamar a la función sin definirla primero da problemas:
print Kerma()
def Kerma():
return "energy / mass"
En C ++, puede declarar una función después de la llamada una vez que coloca su encabezado antes.
¿Me estoy perdiendo de algo?
python
function
formatting
TheGentleOne
fuente
fuente
Kerma is an acronym for "kinetic energy released per unit mass"
.py
archivo separado e importarlo? ¿Hay algunas consecuencias no deseadas?Respuestas:
Una forma que es un poco idiomática en Python es escribir:
def main(): print Kerma() def Kerma(): return "energy / mass" if __name__ == '__main__': main()
Esto le permite escribir su código en el orden que desee siempre que siga llamando a la función
main
al final.fuente
main
funciones generalmente se colocan al final.if __name__ == '__main__':
cambio es la parte idiomática común.if ... __main__':
. No dije quemain
debería colocarse por encima del resto del código. Dije que lo importante es llamar_\_main__
al final, y no importa dónde coloques su definición en ese momento.Cuando se ejecuta un módulo de Python (archivo .py), las declaraciones de nivel superior en él se ejecutan en el orden en que aparecen, de arriba a abajo (de principio a fin). Esto significa que no puede hacer referencia a algo hasta que lo haya definido. Por ejemplo, lo siguiente generará el error que se muestra:
c = a + b # -> NameError: name 'a' is not defined a = 13 b = 17
A diferencia de muchos otros idiomas,
def
yclass
las declaraciones son ejecutables en Python, no sólo declarativa, de modo que no se puede hacer referencia a cualquieraa
ob
hasta que eso ocurra, y que están definidos. Esta es la razón por la que su primer ejemplo tiene problemas: está haciendo referencia a laKerma()
función antes dedef
que se haya ejecutado su declaración y el cuerpo se haya procesado y el objeto de función resultante esté vinculado al nombre de la función, por lo que no está definido en ese punto del script.Los programas en lenguajes como C ++ generalmente se preprocesan antes de ejecutarse y durante esta etapa de compilación, todo el programa y los
#include
archivos a los que hace referencia se leen y procesan de una vez. A diferencia de Python, este lenguaje presenta declaraciones declarativas que permiten declarar (pero no definir) el nombre y la secuencia de llamada de las funciones (o el tipo estático de variables), antes de su uso para que cuando el compilador encuentre su nombre, tenga suficiente información para verificar uso, que principalmente implica la verificación de tipos y conversiones de tipos, ninguno de los cuales requiere que se hayan definido aún sus contenidos reales o cuerpos de código.fuente
doit(); sub doit { print("I'm doing it!\n"); }
Esto no es posible en Python, pero francamente pronto descubrirá que no lo necesita en absoluto. La forma Pythonic de escribir código es dividir su programa en módulos que definen clases y funciones, y un único "módulo principal" que importa todos los demás y se ejecuta.
Para scripts simples y desechables, acostúmbrese a colocar la "porción ejecutable" al final, o mejor aún, aprenda a usar un shell interactivo de Python.
fuente
Python es un lenguaje dinámico y el intérprete siempre toma el estado de las variables (funciones, ...) como están en el momento de llamarlas. Incluso podría redefinir las funciones en algunos bloques if y llamarlos cada vez de forma diferente. Por eso tienes que definirlos antes de llamarlos.
fuente
Si está dispuesto a ser como C ++ y usar todo dentro de funciones. puede llamar a la primera función desde la parte inferior del archivo, así:
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()
De esa manera, Python primero 'lee' todo el archivo y luego comienza la ejecución
fuente