1. 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
2. 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 sin
alterar el original.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
3. Persistencia - Pickle
Python posee varios módulos que proveen serialización y
persistencia.
Los clásicos son son pickle y shelve.
Pickle permite serializar casi cualquier objeto, incluso los
definidos por el usuario.
Existe una versión implementada en C llamada cPickle que
provee la misma funcionalidad e interfaces, pero con mucha
más velocidad.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
4. caballeros = {’gallahad’: ’el puro’,
’robin’: ’el valiente’}
import pickle
# guardamos los datos
archivo_caballeros = open(’caballeros.dat’, ’w’)
pickle.dump(caballeros, archivo_caballeros)
archivo_caballeros.close()
caballeros = None
# cargamos los datos
archivo_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
5. Persistencia - Shelve
Problema: si guardamos más de un objeto en un archivo con
Pickle, sólamente podemos accederlos de manera secuencial.
Solución: Shelve provee una interfase de trabajo estilo
diccionario, de manera que tenemos acceso por clave a los
objetos serializados.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
7. Iteradores
Los iteradores son objetos que definen un protocolo para
recorrer una secuencia.
Un iterador debe poseer un método next() que es llamado
automáticamente por Python para obtener el siguiente
elemento de la secuencia.
En caso de que no existan más elementos en la secuencia, el
método debe elevar una excepción StopIteration.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
8. 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 builtin
iter().
El iterador no necesariamente es el mismo objeto que el
iterable.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
9. 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
10. Generadores
Son objetos iterables (funciones generalmente) que generan
valores sucesivamente en cada llamada.
Su característica es el uso de la palabra reservada yield en
lugar de return.
Cuando un generador devuelve un valor, no finaliza como una
función común sino que queda en un estado detenido, para
continuar luego la ejecución en el punto en donde había
quedado.
Dos ventajas importantes de los generadores ante las
secuencias comunes es el menor consumo de memoria, y la
posibilidad de crear secuencias potencialmente infinitas.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
11. def fibonacci():
a = b = 1
while True:
yield a
a, b = b, a+b
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
12. Decoradores
Podemos crear objetos que agregan una capa más de
funcionalidad a otras objetos, sin alterarlos sino envolviéndolos
o decorándolos.
Este es el concepto detrás de los decoradores, que están
basados en el patrón “Decorator” del GoF.
Un decorador es un callable que envuelve a otro, alterando el
comportamiento final.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
13. def print_name(f):
def wrapper(*largs, **kwargs):
print "Entramos en ", f.__name__
f(*largs, **kwargs)
return wrapper
@print_name
def foo():
print "Hola mundo!"
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
14. Manejadores de Contexto
Un Manejador de Contexto (“context manager”) es
responsable por un recurso dentro de un bloque de código,
posiblemente creándolo cuando se entre al bloque, y
liberá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
15. 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 en
bloque de código, y retorna un objeto para ser usado en ese
contexto.
Cuando el flujo de ejecución deja el bloque with, el método
__exit__() del manejador de contexto se llama para limpiar
cualquier recurso usado.
Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
16. 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