python - color - plotly layout
Función de definición de Python: ¿cómo se especifica el final de la función? (7)
¿Estoy aprendiendo Python y confundido cuando termina una "def" de una función?
Veo muestras de código como:
def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
Sé que no termina debido a la devolución (porque he visto si las declaraciones ... si FOO que devuelve BAR, sino devuelve FOOBAR). ¿Cómo sabe Python que esta no es una función recursiva que se llama a sí misma? Cuando se ejecuta la función, ¿sigue yendo por el programa hasta que encuentra un retorno? Eso llevaría a algunos errores interesantes.
Gracias
Curiosamente, si solo está escribiendo en el intérprete interactivo de python, debe seguir una función con una línea en blanco. Esto no funciona:
def foo(x):
return x+1
print "last"
aunque es una sintaxis pitón perfectamente legal en un archivo. Hay otras diferencias sintácticas al escribir al intérprete también, así que ten cuidado.
En Python, el espacio en blanco es significativo. La función finaliza cuando la sangría se vuelve más pequeña (menos).
def f():
pass # first line
pass # second line
pass # <-- less indentation, not part of function f.
Tenga en cuenta que las funciones de una línea se pueden escribir sin sangría en una línea:
def f(): pass
Y, luego está el uso de punto y coma, pero esto no es recomendable :
def f(): pass; pass
Las tres formas anteriores muestran cómo el final de una función se define sintácticamente . En cuanto a la semántica , en Python hay tres formas de salir de una función:
Usando la declaración de
return
. Esto funciona igual que en cualquier otro lenguaje de programación imperativo que usted sepa.Usando la declaración de
yield
. Esto significa que la función es un generador. Explicar su semántica está más allá del alcance de esta respuesta. Eche un vistazo a ¿Puede alguien explicarme la declaración de rendimiento de Python?Simplemente ejecutando la última declaración. Si no hay más instrucciones y la última instrucción no es una declaración de
return
, entonces la función existe como si la última instrucción fuerareturn None
. Es decir, sin una declaración dereturn
explícita, una función devuelveNone
. Esta función devuelveNone
:def f(): pass
Y también lo hace este:
def f(): 42
Entonces es la sangría lo que importa. Como otros usuarios aquí le han señalado, cuando el nivel de sangría está en el mismo punto que la declaración de función def su función ha finalizado. Tenga en cuenta que no puede mezclar tabulaciones y espacios en Python. La mayoría de los editores brindan soporte para esto.
Para ser precisos, un bloque termina cuando se encuentra con una línea no vacía indentada a lo sumo en el mismo nivel que el inicio. Esta línea no vacía no forma parte de ese bloque. Por ejemplo, la siguiente impresión finaliza dos bloques al mismo tiempo:
def foo():
if bar:
print "bar"
print "baz" # ends the if and foo at the same time
El nivel de sangría es menor que el def y el if, por lo que los termina a ambos.
Las líneas sin declaración, sin importar la sangría, no importan
def foo():
print "The line below has no indentation"
print "Still part of foo"
Pero la instrucción que marca el final del bloque debe sangrarse al mismo nivel que cualquier sangría existente. Lo siguiente, entonces, es un error:
def foo():
print "Still correct"
print "Error because there is no block at this indentation"
En general, si estás acostumbrado al lenguaje de llaves, solo aplica el código como ellos y estarás bien.
Por cierto, la forma "estándar" de sangrado es solo con espacios, pero por supuesto la pestaña solo es posible, pero por favor no mezcle ambos.
Python es sensible al espacio en blanco con respecto a la sangría. Una vez que el nivel de sangría vuelve al nivel en el que se define la función, la función ha finalizado.
Utiliza sangría
def func():
funcbody
if cond:
ifbody
outofif
outof_func
los espacios en blanco importan cuando el bloque termina, es cuando la definición de la función finaliza.
cuando la función se ejecuta, continúa hasta que finaliza, o hasta que se encuentra el return
o la declaración de yield
. Si la función finaliza sin encontrar declaraciones de return
o yield
, None
se devuelve implícitamente.
hay mucha más información en el tutorial .