La manera de evitar que un programa tenga código repetitivo es descomponerlo en bloques. Cada uno de esos bloques será una función. Las funciones realizan una serie de cálculos y el objetivo es poder usarlas desde cualquier parte del programa. Sólo habrá que llamarlas y pasarles los datos que necesiten para funcionar correctamente. Vamos a conocerlas:
Una primera función
Vas a ver que crear una función es fácil. Sólo debes seguir la siguiente estructura que te presentamos a continuación: escribir la palabra reservada def para definir la función, elegir un nombre para la función seguido de paréntesis y los dos puntos, y finalmente escribir debajo los comandos que realizará la función indentados a la derecha.
Por ejemplo: Si quisiéramos crear una función para mostrar el menú inicial, sería del siguiente modo.
#Función para mostrar el menú de usuario
def menu():
print ("Bienvenido al sistema de reserva.\n")
print ("Introduzca el número de la opción a realizar.\n")
print ("1 - Ver asientos de la sala (0:libre 1:reservado).\n")
print ("2 - Reservar butacas.\n")
print ("3 - Terminar.\n")
#Cuerpo del programa
opcion = 0
while opcion !=3 :
menu()
opcion = input()
#Serie de operaciones según la opción.
print ("Ha terminado su sesión.\n")
Variable local vs. variable global
Al ver el ejemplo anterior seguramente te hayas hecho una pregunta: ¿Por qué no pide el valor de la opción dentro de la propia función?. La respuesta la tienes en las variables locales y variables globlales:
Las variables que se utilizan dentro de una función sólo son accesibles dentro del bloque donde están declaradas. Reciben el nombre de variables locales. Estas variables no existen en el cuerpo principal del programa ni en ninguna otra función. De este modo, si intentas ejecutar el ejemplo anterior con el siguiente cambio, te daría un error. Pruébalo en tu IDLE, ¿qué comportamiento erróneo tiene este programa?
#Función para mostrar el menú de usuario
def menu():
print ("Bienvenido al sistema de reserva.\n")
print ("Introduzca el número de la opción.\n")
print ("1 - Ver asientos de la sala.\n")
print ("2 - Reservar butacas.\n")
print ("3 - Terminar.\n")
opcion = input()
#Cuerpo del programa
opcion = 0
while opcion !=3 :
menu()
#Serie de operaciones según la opción.
print ("Ha terminado su sesión.\n")
Una variable global está declarada fuera de todas las funciones y, por lo tanto, es accesible por todas. Pero Python no permite de manera general el uso de variables globales dentro de una función, por eso para poder utilizarlas es necesario indicarlo específicamente en la función la palabra reservada
global. El ejemplo anterior, usando una variable global funcionaría así:
#Función para mostrar el menú de usuario
def menu():
global opcion
print ("Bienvenido al sistema de reserva.\n")
print ("Introduzca el número de la opción.\n")
print ("1 - Ver asientos de la sala.\n")
print ("2 - Reservar butacas.\n")
print ("3 - Terminar.\n")
opcion = input()
#Cuerpo del programa
opcion = 0
while opcion !=3 :
menu()
#Serie de operaciones según la opción.
print ("Ha terminado su sesión.\n")
*Nota: Sin embargo, este último programa se considera un código incorrecto, ya que si el día de mañana necesitamos la función de menu() no podríamos reutilizar este código: la variable global puede estar utilizándose para otras funciones.
Envíale datos
Hay veces en las que, para que una función pueda trabajar, necesita recibir ciertos datos que se están utilizando en el programa. Estos datos que se le envían a la función, a la vez que el programa la llama, se denominan parámetros.
Por ejemplo: Imaginemos que a los largo del programa necesitaremos mostrar varias veces por pantalla la sala de butacas. Lo ideal será entonces crear una función que muestre por pantalla la sala y no tener que repetir todo el código de bucles cuando necesitamos mostrar por pantalla la sala, sino llamar a la función en su lugar. Veámosla:
#Función para imprimir la sala
def imprime(matriz):
for i in range (1,6):
for j in range (1,10):
print (matriz[i][j]," ", end="")
print ("\n")
#Cuerpo del programa:
#Inicializo la matriz a ceros
sala = [[0]* 10 for i in range (6)]
#Ponemos algunos unos
sala[3][2]=sala[3][3]=1
imprime(sala)
*Para no bajar de línea tras usar la función print se ha utilizado el parámetro end="" de dicha función.
Si se desea pasar a una función más de un parámetro, es posible: sólo hay que separarlos por comas.
Devolver y asignar
Si necesitamos que una función realice algún cálculo o comprobación y nos devuelva el resultado para utilizarlo en el programa principal, utilizaremos la palabra reservada return al final de dicha función: esta orden hace que la función, al regresar al lugar donde fue llamada, regrese el valor de la variable que la acompaña.
Además, si se llama a la función desde una orden de asignación, el valor devuelto quedará almacenado en la variable cuya asignación hizo la llamada a la función.
Por ejemplo: En nuestro reto sería resomendable crear una función que compruebe si los asientos seleccionados por el usuario están libres, para poder ser reservados, o no. Veamos cómo podría ser esta función y qué devolvería:
#Función que calcula si hay sitio libre
def comprueba_libre(matriz,numero,fila):
contador = 0
libre = "no"
for i in range (1,10):
if (matriz[fila-1][i] == 0) :
contador = contador + 1
if (numero == contador):
libre = "sí"
else :
contador = 0
return libre
#Cuerpo principal del programa
print ("Comienzo\n")
#Inicializo la matriz a ceros
sala = [[0]* 10 for i in range (6)]
#Ponemos algunos unos
sala[3][2]=sala[3][3]=1
numero_fila = input ("¿Qué fila desea? (1 a 6)\n")
cantidad = input("¿Cuántas butacas desea en la fila?\n")
sitio=comprueba_libre(sala,cantidad,numero_fila)
if sitio == "sí" :
print ("Hay suficientes butacas disponibles.")
else :
print ("No hay suficientes butacas seguidas.")
Nota: Python permite que una función devuelva dos valores. Para ello ambos se deben separar por comas en la orden reurn y también hay que asignarlos a variables diferentes también separadas por comas cuando la función es llamada.