miércoles, 18 de enero de 2012

(ALGO INTERESANTE) - FUNCIONES COMO PARAMETROS

Quizás a esta altura ya hayan olvidado las funciones que habíamos creado en algún momento, en algún articulo de este BLOG. :). Por esta razón vamos a refrescar un poco su memoria y vamos a volver a escribirlas en la consola interactiva de Python.

>>> def sumar(num1, num2):
...     return num1+num2
...
>>> def mostrarMensaje(mensaje):
...     print mensaje
...
>>> def multiplicar(num1, num2):
...     return num1*num2
...
>>> mostrarMensaje("Otro dia")
Otro dia
>>> sumar(3,5)
8
>>> multiplicar(5,5)
25

Como se dijo previamente estas dos funciones van a ser accesibles solo desde esta sesión de consola.
Esto quiere decir que si cerramos y abrimos la consola interactiva de Python vamos a tener que volver a crear dichas funciones si deseamos utilizarlas.
De todas formas esto es suficiente para mostrar el ejemplo siguiente:

LISTA DE FUNCIONES

En Python las funciones son objetos de primer grado, esto quiere decir que se le pueden dar varios usos importantes, entre ellos se puede destacar que a las funciones se las puede pasar como parámetros o cargar dentro de una lista como si fueran variables, lo cual puede llegar a ser de muchísima ayuda. Esta funcionalidad  esta implementada muuuuuy sencillamente en Python a diferencia de otros lenguajes como por ejemplo C.

Veamos como se utiliza esto:

Antes de meternos de lleno en lo que son las listas de funciones, estaría bueno mostrarles como se hace en Python para pasar una función como parámetro. La realidad es que esto es muy simple.
Lo primero que hay que hacer es definir la funcion que va a recibir otra funcion por parametro.. :)
Luego internamente esa función se debería usar como se utilizaría normalmente.

>>> def operacion(funcion, operando1, operando2):
...     result = funcion(operando1,operando2)
...     return result
...
>>> operacion(multiplicar, 5,5)
25
>>> operacion(sumar,5,5)
10

Cabe aclarar que hay que tener cuidado con estos temas ya que pueden provocar muchos problemas en tiempo de ejecución. Por ejemplo si los tipos de los parámetros no concuerdan con los que debería recibir la función o si la cantidad de parámetros tampoco es la correcta, se producirán errores como se muestra a continuación.

>>> operacion(sumar,'a','b')
'ab'
>>> operacion(multiplicar,'b',7)
'bbbbbbb'

Como se explico anteriormente las cadenas pueden concatenarse utilizando el operador '+', y también puede multiplicarse una cadena por un entero X, lo cual genera la repeticion de la cadena X cantidad de veces.
En el ejemplo el carácter 'b' se multiplica por 7, lo que genera 'bbbbbbb'.
Lo que daría un error seria tratar de multiplicar dos cadenas.

>>> operacion(multiplicar,'a','b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in operacion
  File "<stdin>", line 2, in multiplicar
TypeError: can't multiply sequence by non-int of type 'str'

Así como también tratar de llamar a la función mostrarMensaje con más de un parámetro.

>>> operacion(mostrarMensaje,'Hola','Mundo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in operacion
TypeError: mostrarMensaje() takes exactly 1 argument (2 given)

Una lista de funciones se define de la misma manera que una lista de enteros, o una lista de cadenas.

Veamos un ejemplo.

Supongamos que deseamos aplicarle un conjunto de funciones a dos enteros en particular, para esto lo que hacemos es meter en una lista las funciones que deseamos aplicar y luego creamos un método que reciba esta lista de funciones y los enteros a los que le tenemos que aplicar las operaciones.

>>> # Se crea la lista de funciones
>>> listaFunciones = [sumar,multiplicar]
>>>
>>> # Se crea la funcion que recibe dicha lista y los enteros.
>>> def aplicarFunciones(lfunc,num1,num2):
...     for f in lfunc:
...             result = f(num1,num2)
...             print result
...
>>> # Llamamos a la funcion que aplicara cada una de las operaciones a ambos enteros.
>>> aplicarFunciones(listaFunciones,5,5)
10
25

Como puede observarse esto es muuuy potente, el hecho de poder modificar el comportamiento en tiempo de ejecución de una función en particular, nos da muchísima versatilidad para escribir código. Es cierto  que si se abusa de estas técnicas el código puedo volverse difícil de mantener y de seguir, pero los beneficios que conlleva la utilización de esta técnica, muchas veces puede superar ampliamente las problemáticas.

No hay comentarios:

Publicar un comentario