Funciones (1)

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):

Definir funciones en Python

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.

Siguiente

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.

Anterior Siguiente

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.

Anterior Siguiente

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.

Anterior Siguiente

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.

Anterior Siguiente

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.

Anterior Siguiente

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.

Anterior Siguiente

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.

Anterior

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.

Siguiente

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.

Anterior Siguiente

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.

Anterior

Variables en funciones

Conflictos de nombres de variables

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:

Conflictos de nombres de variables en Python

Python sigue estos principios generales, pero con algunas particularidades:

A continuación, se detallan las reglas y situaciones posibles, acompañadas de ejemplos.

Variables locales

Variables libres globales o no locales

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:

Variables declaradas global o nonlocal

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: