Funciones y módulos en Python

Este artículo es el último de la primera serie de Python que quiero hacer en PItando, y cierra el círculo de las técnicas más básicas necesarias para empezar ya a ponernos a hacer experimentos. En este artículo explicaré cómo se programan funciones en Python, y cómo agrupando funciones en archivos especiales conseguimos librerías propias que poder incluir en cualquiera de nuestros programas. Por último os propondré como ejercicio una calculadora sencilla que acepte sus parámetros por la línea de comandos.

¿Apetece? Pues al lío

Cómo definir funciones

Una función en Python se define de la siguiente forma:

def nombre_funcion ( argumentos ) :
    ["Cadena de documentación"]
    sentencias
    [return valor]

La definición de funciones siempre es igual y de la siguiente forma:

  • Empieza con la palabra clave def
  • Separado por un espacio, el nombre para la función. Los nombres de funciones pueden tener los siguientes caracteres:
    • Alfabéticos: “a, b,… z, A, B,… Z”. Incluyendo las letras ñ, Ñ y las vocales acentuadas, pero no es recomendable por si quieres ejecutar tu programa en un ordenador que no los soporte .
    • Guiones bajos, “_”
    • Numéricos: “0, 1,… 9”
  • Entre paréntesis, los argumentos: variables que aceptará la función. Si no acepta parámetros, no los ponemos, pero los paréntesis siempre tienen que ir.
  • Dos puntos.

Tras la definición de la función viene el cuerpo, o la implementación: la colección de sentencias que se ejecutarán al llamar a la función. Tiene la siguiente estructura:

  • Una cadena de texto entre comillas con la que explicaremos en palabras sencillas qué hace la función. Es opcional, pero muy conveniente como veremos.
  • Una serie de sentencias en Python.
  • Opcionalmente, una sentencia return que devolverá un resultado.

Vamos a probarlo, y a investigar un poco en las consecuencias, posibilidades y algunas cosas que conviene entender. Abre IDLE para Python 3 y escribe lo siguiente:

def suma ( sumando1, sumando2 ):
    "Devuelve la suma de 2 números"
    resultado = sumando1 + sumando2
    return resultado

Cuando acabes, pulsa 2 veces intro para volver al modo interactivo. Ahora escribe lo siguiente:

suma (2, 3)

Verás que al tiempo que lo escribes, IDLE te proporciona información acerca de la función y gracias a la cadena que hemos escrito:
Captura de pantalla 2015-07-11 18.23.00

Al terminar de escribirlo y pulsar intro, IDLE nos responde con el resultado:
Captura de pantalla 2015-07-11 18.24.00

Ahora, echa un vistazo de nuevo a la función. En su cuerpo hemos definido una nueva variable, resultado, que no está entre los parámetros de la función y que, evidentemente, sirve para alojar el resultado. Intenta acceder a ella desde fuera de la función escribiendo resultado en IDLE: verás que obtienes un error.

Captura de pantalla 2015-07-11 18.28.00

Traduciéndolo más o menos libremente, lo que dice ese letrero en rojo es lo siguiente:

Trazado (la llamada más reciente, de última):
    Fichero "", línea 1, en ;
        resultado
ErrorNombre: nombre 'resultado' no definido

Nos interesa la última línea; el resto sería de interés si estuviéramos escribiendo un programa en un fichero. Este error se produce porque la variable resultado no está definida en el ámbito donde hemos querido usarla, sino dentro de la función suma. Fuera de la función suma, resultado no existe. Y, es más, podríamos haberla definido y haberle asignado un valor, y seguiría teniéndolo. Prueba lo siguiente, escribiendo todas las líneas que ves en el cuadro:

resultado = 3
suma (3, 5)
resultado

Esto será lo que habrá pasado. Como ves, ahora resultado sí existe y, a pesar de que la suma vale 8 y, por lo tanto, “el resultado de dentro de la función suma” valdría 8, el que hemos definido fuera sigue valiendo 3:

Captura de pantalla 2015-07-11 18.35.00

Esto obedece a lo que se conoce como el ámbito de las variables: cuando se define una variable dentro de una función, se crea y se destruye dentro de la misma, sin afectar a las variables de fuera, se llamen como se llamen.

Las funciones aceptan como argumentos muchas cosas, entre ellas otras variables (no sólo valores literales). Otra prueba que podemos hacer es la siguiente. Escribe en IDLE la siguiente función:

def prueba_parametros ( parametro1, parametro2 ):
    parametro2 = parametro1.upper()

Ahora prueba lo siguiente:

nombre = "Gabriel"
cadena = "Valor anterior"
prueba_parametros (nombre, cadena)

¿Qué crees que ocurrirá?, ¿qué valor tendrá cadena después de la llamada a la función prueba_parametros? Vamos a verlo:

Captura de pantalla 2015-07-11 18.47.00

Como ves, para los casos sencillos como los números, cadenas, etc., los parámetros de una función son inmutables, aunque se pasen como variables. Dentro de la función sí habría cambiado el valor parametro2, pero ese cambio se perdería al salir de la función. Puedes interpretarlo como que Python crea una copia de las variables que se pasan por parámetro. Esto, en “argot” se llama pasar los parámetros por valor. ¿Existe algún caso en el que una función pueda cambiar los parámetros? Sí, y en ese caso hablaríamos de paso de parámetros por referencia. Se produce en el caso de muchas variables complejas como podrían ser las listas, pero lo veremos en su momento en otra entrada cuando profundicemos en los tipos de datos compuestos (conjuntos, listas, objetos,…).

Ejercicio de funciones

Programa una calculadora que funcione por línea de comandos para las operaciones de suma, resta, multiplicación y división, y para un máximo de 2 números enteros (sumar, restar, multiplicar y dividir dos números enteros). Debe reconocer los símbolos usuales de estas operaciones: “+”, “-“, “*” y “/”. Debes usar funciones, una para cada operación.

Captura de pantalla 2015-07-11 19.23.00

Ten en cuenta, eso sí, dos cosas que no tienes por qué saber aún:

  1. Los valores numéricos llegarán a tu programa a través de la línea de comandos como cadenas, siempre. Es decir, cuando pases como parámetro un 2, tu programa Python entenderá `”2″` y no `2`. Para que tus operaciones aritméticas funcionen bien, fuerza una conversión a números con la función `int()`, a la que le pasarás como parámetro cada argumento que quieras que se interprete como un número entero.
  2. Ésta ya la habrás podido notar en la imagen superior :). En Linux y en Mac OS X, el asterisco “*” es un caracter especial para el Terminal y lo interpretará antes de pasárselo a tu programa Python. Para que llegue un asterisco a tu programa, cuando lo pruebes tendrás que escapar el asterisco usando una barra invertida, : ./calculadora.py 2 * 3. Esto no ocurrirá en Windows.

Módulos

Un módulo no es más que un fichero que contiene definiciones de funciones, una tras otra, y que se puede importar con la palabra clave import en un programa en Python. No tiene ningún requisito especial; simplemente, hay que escribir una serie de funciones todas juntas en un fichero.

Por ejemplo, escribamos el siguiente código en el editor de texto de IDLE, abriendo una nueva ventana de edición de texto:

def saluda_esp (nombre):
    return "Hola, " + nombre

def saluda_ing (name):
    return "Hello, " + name

def saluda (nombre, idioma):
    if str(idioma).lower() == "esp":
        return saluda_esp(nombre)
    elif str(idioma).lower() == "ing":
        return saluda_ing(nombre)
    else:
        return "Idioma no soportado"

Grábalo, por ejemplo, con el nombre idiomas.py en el directorio del usuario pi, en tu directorio principal de Documentos en Mac OS X (/Users/tu_usuario/Documents). En Windows, guárdalo en el directorio de instalación de Python (en mi caso c:\progPython34). Ahora, en IDLE, podrás importar el módulo y usar sus funciones anteponiendo a su nombre el del módulo, de la siguiente forma (pruébalo):

import idiomas

idiomas.saluda("PItando", "ing")
idiomas.saluda_esp("PItando")

Este es el resultado:

Captura de pantalla 2015-07-11 19.53.00

En un programa deberás hacer exactamente igual: usar las funciones anteponiendo el nombre del Módulo. Esto sucede porque las librerías que programemos nosotros no son estándares de Python.

Ejercicio de módulos

Mejora el programa del ejercicio anterior para que use una librería llamada “aritmetica_basica” en lugar de declarar las funciones en el propio programa.

Y esto es todo por este artículo. Espero que os parezca útil esto, y preparaos: ¡en breve vamos a empezar a usar periféricos de la Raspberry Pi que podremos programar con Python!

4 comentarios en “Funciones y módulos en Python

  1. Claro y explicativo.
    Añadiría que aunque no es la aproximación ideal, puedes definir una variable como “global nombrevariable” dentro de una función. Si existe una variable general, externa a esa función de mismo nombre, al modificar su valor la función, quedará modificada también la general.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *