Clase 4/4 Curso Introducción a Python 2012

16
Curso de Introducción a Python Clase 4 Defossé Nahuel, Pecile Lautaro UNPSJB Septiembre 2012 Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

description

Curso de Introducción a Python de la UNPSJB

Transcript of Clase 4/4 Curso Introducción a Python 2012

Page 1: Clase 4/4 Curso Introducción a Python 2012

Curso de Introducción a PythonClase 4

Defossé Nahuel, Pecile Lautaro

UNPSJB

Septiembre 2012

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 2: Clase 4/4 Curso Introducción a Python 2012

Slices

Podemos obtener una rebanada de cualquier secuencia iterable(cadenas, listas, tuplas, archivos...).El formato es secuencia[inicio:fin:salto].El slice es una secuencia nueva y podemos modificarlo sinalterar el original.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 3: Clase 4/4 Curso Introducción a Python 2012

Persistencia - Pickle

Python posee varios módulos que proveen serialización ypersistencia.Los clásicos son son pickle y shelve.Pickle permite serializar casi cualquier objeto, incluso losdefinidos por el usuario.Existe una versión implementada en C llamada cPickle queprovee la misma funcionalidad e interfaces, pero con muchamás velocidad.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 4: Clase 4/4 Curso Introducción a Python 2012

caballeros = {’gallahad’: ’el puro’,’robin’: ’el valiente’}

import pickle# guardamos los datosarchivo_caballeros = open(’caballeros.dat’, ’w’)pickle.dump(caballeros, archivo_caballeros)archivo_caballeros.close()caballeros = None# cargamos los datosarchivo_caballeros = open(’caballeros.dat’, ’r’)caballeros = pickle.load(archivo_caballeros)archivo_caballeros.close()print caballeros

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 5: Clase 4/4 Curso Introducción a Python 2012

Persistencia - Shelve

Problema: si guardamos más de un objeto en un archivo conPickle, sólamente podemos accederlos de manera secuencial.Solución: Shelve provee una interfase de trabajo estilodiccionario, de manera que tenemos acceso por clave a losobjetos serializados.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 6: Clase 4/4 Curso Introducción a Python 2012

caballeros = {’gallahad’: ’el puro’,’robin’: ’el valiente’}

cosas = [’spam’, ’eggs’]pajaro = ’albatros’import shelvedatos = shelve.open(’datos.dat’)datos[’caballeros’] = caballerosdatos[’cosas’] = cosasdatos[’pajaro’] = pajarodatos.close()datos = shelve.open(’datos.dat’)print datos[’caballeros’]

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 7: Clase 4/4 Curso Introducción a Python 2012

Iteradores

Los iteradores son objetos que definen un protocolo pararecorrer una secuencia.Un iterador debe poseer un método next() que es llamadoautomáticamente por Python para obtener el siguienteelemento de la secuencia.En caso de que no existan más elementos en la secuencia, elmétodo debe elevar una excepción StopIteration.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 8: Clase 4/4 Curso Introducción a Python 2012

Un objeto iterable debe poseer definido el método __iter__()que devuelve un iterador para esa estructura de datos.Obtenemos un iterable de una secuencia con la función builtiniter().El iterador no necesariamente es el mismo objeto que eliterable.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 9: Clase 4/4 Curso Introducción a Python 2012

class UnnesterIterator(object):def __init__(self, nested_list):

self.it = iter(nested_list)self.rlst = []

def __iter__(self):return self

def append(self, obj):try:

for el in obj:self.append(el)

except TypeError:self.rlst.append(obj)

def next(self):if not self.rlst:

self.append(next(self.it))return self.rlst.pop(0)

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 10: Clase 4/4 Curso Introducción a Python 2012

Generadores

Son objetos iterables (funciones generalmente) que generanvalores sucesivamente en cada llamada.Su característica es el uso de la palabra reservada yield enlugar de return.Cuando un generador devuelve un valor, no finaliza como unafunción común sino que queda en un estado detenido, paracontinuar luego la ejecución en el punto en donde habíaquedado.Dos ventajas importantes de los generadores ante lassecuencias comunes es el menor consumo de memoria, y laposibilidad de crear secuencias potencialmente infinitas.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 11: Clase 4/4 Curso Introducción a Python 2012

def fibonacci():a = b = 1while True:

yield aa, b = b, a+b

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 12: Clase 4/4 Curso Introducción a Python 2012

Decoradores

Podemos crear objetos que agregan una capa más defuncionalidad a otras objetos, sin alterarlos sino envolviéndoloso decorándolos.Este es el concepto detrás de los decoradores, que estánbasados en el patrón “Decorator” del GoF.Un decorador es un callable que envuelve a otro, alterando elcomportamiento final.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 13: Clase 4/4 Curso Introducción a Python 2012

def print_name(f):def wrapper(*largs, **kwargs):

print "Entramos en ", f.__name__f(*largs, **kwargs)

return wrapper

@print_namedef foo():

print "Hola mundo!"

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 14: Clase 4/4 Curso Introducción a Python 2012

Manejadores de Contexto

Un Manejador de Contexto (“context manager”) esresponsable por un recurso dentro de un bloque de código,posiblemente creándolo cuando se entre al bloque, yliberándolo luego de que se abandona el bloque.Un manejador de contexto se habilita con la sentencia with.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 15: Clase 4/4 Curso Introducción a Python 2012

Manejadores de Contexto

La API manejador de contexto posee dos métodos. El método__enter__() se ejecuta cuando el flujo de ejecución entra enbloque de código, y retorna un objeto para ser usado en esecontexto.Cuando el flujo de ejecución deja el bloque with, el método__exit__() del manejador de contexto se llama para limpiarcualquier recurso usado.

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python

Page 16: Clase 4/4 Curso Introducción a Python 2012

class Context(object):def __init__(self):

print ’Creamos el contexto’def __enter__(self):

print ’Entramos al contexto’return self

def __exit__(self, exc_type, exc_val, exc_tb):print ’Salimos del contexto’

with Context():print ’Estoy haciendo cosas en el contexto’

Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python