En esta lección se trata la creación de funciones en Python y el uso de variables en las funciones. Otros conceptos relativos a las funciones se tratan en la lección Funciones (2):
Las funciones se pueden crear en cualquier punto de un programa, escribiendo su definición.
La primera línea de la definición de una función contiene:
Las instrucciones que forman la función se escriben con sangría con respecto a la primera línea.
Por comodidad, se puede indicar el final de la función con la palabra reservada return (más adelante se explica el uso de esta palabra reservada), aunque no es obligatorio.
Para poder utilizar una función en un programa se tiene que haber definido antes. Por ello, normalmente las definiciones de las funciones se suelen escribir al principio de los programas
El ejemplo siguiente muestra un programa que contiene una función y el resultado de la ejecución de ese programa.
Ejemplo de función
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante. Copyright 2020 Bartolomé Sintes Marco Licencia CC-BY-SA 4.0 Programa terminado.
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de función - Paso 1
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
La definición de la función no provoca ninguna salida del programa. Las instrucciones que forman parte de la función se ejecutan únicamente cuando se llama a la función en el programa.
Ejemplo de función - Paso 2
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante.
La primera instrucción que se ejecuta es la que está después de la definición de la función.
Ejemplo de función - Paso 3
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante.
A continuación se encuentra la llamada a la función. Como tal, la llamada no produce ninguna salida del programa, pero hace que a continuación se ejecuten las instrucciones incluidas en la función.
Ejemplo de función - Paso 4
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante.
Copyright 2020 Bartolomé Sintes Marco
Se ejecuta la primera instrucción de la función.
Ejemplo de función - Paso 5
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante.
Copyright 2020 Bartolomé Sintes Marco
Licencia CC-BY-SA 4.0
Se ejecuta la segunda instrucción de la función.
Ejemplo de función - Paso 6
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante. Copyright 2020 Bartolomé Sintes Marco Licencia CC-BY-SA 4.0
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de función - Paso 7
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
Este programa no hace nada interesante.
Copyright 2020 Bartolomé Sintes Marco
Licencia CC-BY-SA 4.0
Programa terminado.
Se ejecuta la última instrucción del programa y el programa termina.
El ejemplo siguiente muestra un programa incorrecto que intenta utilizar una función antes de haberla definido.
Ejemplo de función incorrecta
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
Este programa no hace nada interesante.
Traceback (most recent call last):
File "ejemplo.py", line 2, in <module>
licencia()
NameError: name 'licencia' is not defined
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de función incorrecta - Paso 1
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
Este programa no hace nada interesante.
La primera instrucción escribe una frase en la pantalla.
Ejemplo de función incorrecta - Paso 2
print("Este programa no hace nada interesante.")
licencia()
print("Programa terminado.")
def licencia():
print("Copyright 2020 Bartolomé Sintes Marco")
print("Licencia CC-BY-SA 4.0")
return
Este programa no hace nada interesante.
Traceback (most recent call last):
File "ejemplo.py", line 2, in <module>
licencia()
NameError: name 'licencia' is not defined
A continuación se encuentra la llamada a la función. Pero como esta función no se ha definido todavía, se produce un mensaje de error y se detiene la ejecución del programa.
Como se ha comentado antes, una de las principales ventajas de las subrutinas es que permiten reutilizar el código. Pero copiar y pegar subrutinas de un programa a otro puede producir lo que se llama un conflicto de nombres de variables. En efecto, si la subrutina que pegamos en un programa utiliza alguna variable auxiliar para algún cálculo intermedio y resulta que el programa ya utilizaba una variable con el mismo nombre que esa variable auxiliar, los cambios en la variable que se hagan en la subrutina podrían afectar al resto del programa de forma imprevista.
Para resolver el problema de los conflictos de nombres, los lenguajes de programación limitan lo que se llama el alcance o el ámbito de las variables. Es decir, que los lenguajes de programación permiten que una variable exista únicamente en el interior de una subrutina y no afecte a otras variables de mismo nombre situadas fuera de esa subrutina. Como las subrutinas pueden contener a su vez subrutinas, se suele hablar de niveles: el nivel más alto sería el programa principal, el siguiente nivel serían las subrutinas incluidas en el programa principal y cada vez que hay una subrutina incluida dentro de otra estaríamos bajando un nivel.
El problema es más complicado de lo que parece a primera vista, porque a menudo también nos interesará que una subrutina pueda modificar variables que estén definidas en otros puntos del programa. Así que los lenguajes de programación tienen que establecer mecanismos para aislar las variables y evitar los conflictos de nombres, pero al mismo tiempo deben permitir el acceso a las variables en los casos que así lo quiera el programador.
Aunque cada lenguaje tiene sus particularidades, el mecanismo más habitual se basa en los siguientes principios:
Python sigue estos principios generales, pero con algunas particularidades:
Si el programa contiene solamente funciones que no contienen a su vez funciones, todas las variables libres son variables globales. Pero si el programa contiene una función que a su vez contiene una función, las variables libres de esas "subfunciones" pueden ser globales (si pertenecen al programa principal) o no locales (si pertenecen a la función).
A continuación, se detallan las reglas y situaciones posibles, acompañadas de ejemplos.
Ejemplo de variable local 1
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
2 5
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable local 1 - Paso 1
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
La primera instrucción del programa asigna el valor 5 a la variable "a".
Ejemplo de variable local 1 - Paso 2
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable local 1 - Paso 3
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
La primera instrucción de la función asigna el valor 2 a la variable "a".
Ejemplo de variable local 1 - Paso 4
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
La segunda instrucción escribe el valor de la variable "a", es decir, 2.
Ejemplo de variable local 1 - Paso 5
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
2
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable local 1 - Paso 6
def subrutina():
a = 2
print(a)
return
a = 5
subrutina()
print(a)
2
5
La última instrucción del programa escribe de nuevo el valor de "a", pero el valor que se escribe no es 2, sino 5, ya que la variable "a" del programa es distinta de la variable "a" de la función, aunque se llamen igual.
Ejemplo de variable local 2
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
2
Traceback (most recent call last):
File "ejemplo.py", line 7, in <module>
print(a)
NameError: name 'a' is not defined
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable local 2 - Paso 1
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
La primera instrucción del programa llama a la función subrutina().
Ejemplo de variable local 2 - Paso 2
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
La primera instrucción de la función asigna el valor 2 a la variable "a".
Ejemplo de variable local 2 - Paso 3
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
La segunda instrucción escribe el valor de la variable "a", es decir, 2.
Ejemplo de variable local 2 - Paso 4
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
2
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable local 2 - Paso 5
def subrutina():
a = 2
print(a)
return
subrutina()
print(a)
2
Traceback (most recent call last):
File "ejemplo.py", line 7, in <module>
print(a)
NameError: name 'a' is not defined
La última instrucción del programa da error porque la variable "a" no existe para el programa, ya que se creó en la función.
Ejemplo de variable local 3
def subrutina():
print(a)
a = 2
print(a)
return
a = 5
subrutina()
print(a)
Traceback (most recent call last):
File "ejemplo.py", line 8, in <module>
subrutina()
File "ejemplo.py", line 2, in subrutina
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable local 3 - Paso 1
def subrutina():
print(a)
a = 2
print(a)
return
a = 5
subrutina()
print(a)
La primera instrucción del programa asigna el valor 5 a la variable "a".
Ejemplo de variable local 3 - Paso 2
def subrutina():
print(a)
a = 2
print(a)
return
a = 5
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable local 3 - Paso 3
def subrutina():
print(a)
a = 2
print(a)
return
a = 5
subrutina()
print(a)
Traceback (most recent call last):
File "ejemplo.py", line 8, in <module>
subrutina()
File "ejemplo.py", line 2, in subrutina
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
La primera instrucción de la función produce un mensaje de error. El motivo es que en la función se asigna valor a la variable "a" (concretamente en la segunda instrucción) y por tanto Python la considera variable local. Como la primera instrucción quiere imprimir el valor de "a", pero a esa variable todavía no se le ha dado valor en la función (el valor de la variable "a" del programa principal no cuenta pues se trata de variables distintas, aunque se llamen igual), se produce el mensaje de error.
Si a una variable no se le asigna valor en una función, Python la considera libre y busca su valor en los niveles superiores de esa función, empezando por el inmediatamente superior y continuando hasta el programa principal. Si a la variable se le asigna valor en algún nivel intermedio la variable se considera no local y si se le asigna en el programa principal la variable se considera global, como muestran los siguientes ejemplos:
Ejemplo de variable libre global
def subrutina():
print(a)
return
a = 5
subrutina()
print(a)
5 5
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable libre global - Paso 1
def subrutina():
print(a)
return
a = 5
subrutina()
print(a)
La primera instrucción del programa asigna el valor 5 a la variable "a".
Ejemplo de variable libre global - Paso 2
def subrutina():
print(a)
return
a = 5
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable libre global - Paso 3
def subrutina():
print(a)
return
a = 5
subrutina()
print(a)
En la función subrutina(), la variable "a" es libre puesto que no se le asigna valor. Su valor se busca en los niveles superiores, por orden. En este caso, el nivel inmediatamente superior es el programa principal. Como en él hay una variable que también se llama "a", Python coge de ella el valor (en este caso, 5) y lo imprime. Para la función subrutina(), la variable "a" es una variable global, porque su valor proviene del programa principal.
Ejemplo de variable libre global - Paso 4
def subrutina():
print(a)
return
a = 5
subrutina()
print(a)
5
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable libre no local
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3 3 4
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable libre no local - Paso 1
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
La primera instrucción del programa asigna el valor 4 a la variable "a".
Ejemplo de variable libre no local - Paso 2
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable libre no local - Paso 3
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
La primera instrucción de la función subrutina() asigna el valor 3 a la variable "a", así que esta variable "a" será una variable local.
Ejemplo de variable libre no local - Paso 4
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
A continuación se llama a la función sub_subrutina().
Ejemplo de variable libre no local - Paso 5
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
En la función sub_subrutina(), la variable "a" es libre puesto que no se le asigna valor. Su valor se busca en los niveles superiores, por orden. En este caso, el nivel inmediatamente superior es la función subrutina(). Como en ella hay una variable local que también se llama "a", Python coge de ella el valor (en este caso, 3) y lo imprime. Para la función sub_subrutina(), la variable "a" es una variable no local, porque su valor proviene de una función intermedia.
Ejemplo de variable libre no local - Paso 6
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable libre no local - Paso 7
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
3
La tercera instrucción de la función subrutina() escribe el valor de la variable local "a", es decir, 3.
Ejemplo de variable libre no local - Paso 8
def subrutina():
def sub_subrutina():
print(a)
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3 3
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable libre no definida
def subrutina():
print(a)
return
subrutina()
print(a)
Traceback (most recent call last):
File "ejemplo.py", line 5, in <module>
subrutina()
File "ejemplo.py", line 2, in subrutina
print(a)
NameError: global name 'a' is not defined
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable libre no definida - Paso 1
def subrutina():
print(a)
return
subrutina()
print(a)
La primera instrucción del programa llama a la función subrutina().
Ejemplo de variable libre no definida - Paso 2
def subrutina():
print(a)
return
subrutina()
print(a)
Traceback (most recent call last):
File "ejemplo.py", line 5, in <module>
subrutina()
File "ejemplo.py", line 2, in subrutina
print(a)
NameError: global name 'a' is not defined
Como la función no asigna valor a la variable "a", Python la considera variable libre y busca su valor en niveles superiores, en este caso el programa principal. Pero como en el programa principal tampoco se asigna valor a la variable "a", se produce un error.
Nota: El programa hubiera dado error de todas formas en la última instrucción del programa, que también imprimía el valor de la variable "a" no definida.
Si queremos asignar valor a una variable en una subrutina, pero no queremos que Python la considere local, debemos declararla en la función como global o nonlocal, como muestran los ejemplos siguientes:
Ejemplo de variable declarada global
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
5 1
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable declarada global - Paso 1
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
La primera instrucción del programa asigna el valor 5 a la variable "a".
Ejemplo de variable declarada global- Paso 2
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable declarada global - Paso 3
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
Al declarar global la variable "a", la variable "a" de la función y la variable "a" del programa principal son la misma variable.
Ejemplo de variable declarada global - Paso 4
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
La segunda instrucción de la función escribe el valor de la variable "a", es decir, 5, puesto que se trata de la misma variable "a" del programa principal.
Ejemplo de variable declarada global - Paso 5
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
5
La siguiente instrucción cambia el valor de la variable "a" a 1.
Ejemplo de variable declarada global - Paso 6
def subrutina():
global a
print(a)
a = 1
return
a = 5
subrutina()
print(a)
5
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable declarada nonlocal
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3 1 4
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable declarada nonlocal - Paso 1
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
La primera instrucción del programa asigna el valor 4 a la variable "a".
Ejemplo de variable declarada nonlocal - Paso 2
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
A continuación se llama a la función subrutina().
Ejemplo de variable declarada nonlocal - Paso 3
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
La primera instrucción de la función subrutina() asigna el valor 3 a la variable "a", así que esta variable "a" será una variable local.
Ejemplo de variable declarada nonlocal - Paso 4
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
A continuación se llama a la función sub_subrutina().
Ejemplo de variable declarada nonlocal - Paso 5
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
Al declarar nonlocal la variable "a", Python busca en los niveles superiores, por orden, una variable que también se llame "a", que en este caso se encuentra en la función subrutina(). Python toma el valor de esa variable, es decir, 3.
Ejemplo de variable declarada nonlocal - Paso 6
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
La primera instrucción de la función sub_subrutina() escribe el valor de la variable no local "a", es decir, 3.
Ejemplo de variable declarada nonlocal - Paso 7
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
La segunda instrucción de la función sub_subrutina() cambia el valor de la variable "a" a 1.
Ejemplo de variable declarada nonlocal - Paso 8
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable declarada nonlocal - Paso 9
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
1
La tercera instrucción de la función subrutina() escribe el valor de la variable local "a", es decir, 1.
Ejemplo de variable declarada nonlocal - Paso 10
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3 1
La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.
Ejemplo de variable declarada nonlocal - Paso 11
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
a = 3
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
3
1
4
La última instrucción del programa escribe el valor de la variable global "a", que sigue siendo 4, puesto que ninguna función la ha modificado.
Ejemplo de variable declarada nonlocal no definida
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.
Ejemplo de variable declarada nonlocal no definida - Paso 1
def subrutina():
def sub_subrutina():
nonlocal a
print(a)
a = 1
return
sub_subrutina()
print(a)
return
a = 4
subrutina()
print(a)
El programa no llega a ejecutarse puesto que Python detecta un error de sintaxis.