jueves, 27 de febrero de 2014

Python básico III, funciones anónimas



Python permite un uso muy peculiar de unas funciones denominadas anónimas y que no todos los lenguajes incorporan. La forma habitual de escribir una función es:

>>> def pow(b,n):
...     return b**n
... 

Pero también hay otra forma de escribir la misma función mediante las funciones anónimas:

>>> f = lambda b,n: b**n
>>> f(2,3)
8

Como puede comprobarse la función anónima viene definida con el término lambda y carece de return. Estas funciones también admiten valores por defecto, la siguiente función anónima es perfectamente válida.

>>> fun = lambda x, y = 10: y**x
>>> fun(1)
10
>>> fun(2,2)
4
>>> 
 
Otro ejemplo de como usar estas funciones es el siguiente:

>>> def pow(b): return lambda x: b**x
... 
>>> f = pow(2)
>>> f(3)
8

Mediante esta forma de encapsular las funciones podemos crear múltiples variantes de la misma función que pueden ser empleadas de forma independiente. En el ejemplo anterior también es posible llamar a la función directamente, sin tener que asignarla antes a una variable:

>>> pow(2)(3)
8
 
La potencialidad de las funciones anónimas aumenta si se emplean en combinación con la función filter. Mediante filter, podemos pasar a una función anónima todos los valores de una variable iterable,  el resultado será solo los valores que al pasar por la función devuelvan True. Veamos un ejemplo:

>>> n = range(1,20000)
>>> len(filter(lambda x: ((x+1)**2 - x**2)%2 !=0, n)) == len(n)
True

En la línea 1 creamos una lista de números entre el 1 y el 20000, en la segunda línea los pasamos por una función anónima que nos devuelve True cuando la diferencia entre el cuadrado de su consecutivo y el cuadrado del número es impar. También comparamos la longitud retornada con la longitud original de n. El resultado es True para cualquier conjunto de enteros si se considera que la diferencia de dos consecutivos enteros siempre es un impar. 

Existen otras funciones que podemos emplear. Por ejemplo, con la función map conseguimos pasar a la función lambda los valores de una variable iterable que nos devolverá los valores obtenidos:

>>> par = range(2,20,2)
>>> par
[2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> map(lambda x: x**2, par)
[4, 16, 36, 64, 100, 144, 196, 256, 324]

Otra función muy útil es reduce, con ella reducimos el contenido de una variable iterable a un solo valor. La reducción se realiza según se indica en la función lambda que debe ser de dos variables. El siguiente ejemplo suma los 10 primeros números enteros.

>>> reduce(lambda x, y : x+y, [1,2,3,4,5,6,7,8,9,10])
55


No hay comentarios:

Publicar un comentario