10/05/2013 - Clase 6 - Listas y funciones de orden superior

Fecha de publicación: 14-may-2013 16:18:49

TP2

Arrancamos contando que ya estaba disponible el enunciado del TP2, acá. Este TP lo vamos a hacer en Python, y para alguna de los requerimientos nos van a ser útiles las cosas que vimos en clase.

La clase que viene vamos a tratar de resolver la entrega 0, es decir hacer el análisis del dominio y las entidades en clase entre todos.

Temas de la Clase

Emulando Structs en Python

Primero explicamos un tema que nos quedó pendiente de la clase pasa. Cómo definir structs en Python. En realidad es cómo emular structs en Python, ya que no existe la idea de struct como en C.

Pueden ver esto en ésta página de la unidad 2

Operando con listas

Luego ya nos metimos con las operaciones sobre listas.

Primero repasamos algo de las funciones básicas de las listas que están en el archivo prog2.py.collections.lista.lista_simple.py acá

Pueden encontrar todo el código de ejemplo de python como archivo adjunto de este bitácora.

Funciones de orden superior

Empezamos repasando cómo resolver el problema en el cual dada una lista de números queríamos obtener una lista que solo contenga los números positivos (>= 0).

Vimos la implementación tradicional iterando la lista con un for.

def positivosImperativa(numeros):
    positivos = []
    for n in numeros:
        if n >= 0:
            positivos.append(n)
    return positivos
print positivosImperativa([2, -1, 4, 0, -10, -2, 6, -8])

Luego, hicimos una pausa y repasamos la idea de funciones de orden superior.

Esto está explicado en la Unidad 3, en la página Elementos de Programación Funcional en Python

Los ejemplos de funciones de orden superior que vimos (ejecutar una funcion N veces) también están en el zip.

Filter, Map y Reduce

Una vez que vimos que Python permite hacer funciones de orden superior, es decir que reciben a otras funciones como parámetro, recordamos que en C habíamos hablado sobre la funcion qsort() que, de alguna manera tenía todo el algoritmo para ordenar una lista genérica, sin embargo no sabía como comparar dos elementos, porque eso dependerá de los elementos a ordenar. Entonces nosotros, desde afuera la invocábamos y le dábamos otra función más pequeña que dados dos elementos sabía decir si el primero era mayor, igual o menor que el segundo.

Entonces ahora volvimos a nuestra implementación de la función que obtenía la lista de positivos. E identificamos que esta lógico tiene un patrón de código que se repite para muchas otras operacions (por ejemplo obtener los pares, obtener los productos cuyo precio es mayor a $25, etc etc.

El patrón sería:

    • inicializamos una lista vacía a la cual iremos agregando los elementos a devolver
  • recorremos con un for
      • por cada elemento, evaluamos una condición (positivo)
      • si el elemento cumple la condición, lo agregamos a la lista a devolver
    • luego podríamos hacer alguna lógica adicional opcional
    • retornamos la lista.

Vemos que de todo esto, lo que puede cambiar para diferentes aplicaciones o problema es la condición a evaluar, todo lo demás es igual. Entonces, pensamos que podríamos utilizar funciones de orden superior para implementar este patrón una sola vez, y que reciba como parámetro una función que representará la condición a evaluar.

Esto es justamente la función filter que ya viene en Pyhon.

Después pasamos a otras funciones de orden superior: map y reduce.

Todo esto está mejor explicado en la página Filter, Map, Reduce y Lambdas de la Unidad 3

Por último realizamos un ejemplo combinatorio para dada una lista Productos, obtener la suma de sus costos:

    • primero debíamos realizar un map para dada la lista de productos, derivar la lista de los precios
    • luego un reduce sobre los precios para sumarlos.

Código Fuente

De nuevo repito, todo el código fuente está en el archivo adjunto. Es un proyecto python exportado de un eclipse. Así que puende importarlo en sus eclipses, ver y ejecutar todos los ejemplos. Hay más ejemplos que los que mostramos en clase, así que pueden chusmear si quieren.

Todos los de orden superior sobre listas, como map, filter, reduce están en el paquete prog2.py.collections.ordensup

Pendiente

Nos quedó para la clase que viene explicar:

    • Expresiones lambda
    • Listas por comprension
    • Algunas cositas extra como:
      • Manejo de excepciones
      • Tests Unitarios
      • Diccionarios