Publicado el 5 de Mayo del 2018
763 visualizaciones desde el 5 de Mayo del 2018
876,6 KB
52 paginas
Creado hace 13a (01/05/2011)
Tema 3 Cuestiones avanzadas
Curso de Python Avanzado
Juan Pedro Bolívar Puente
Instituto de Astrofísica de Andalucía
Mayo de 2011
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
1 / 50
Índice
Iteradores
1
2 Generadores
3 Decoradores
4 Gestión de recursos
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
2 / 50
Índice
Iteradores
Iteradores
1
2 Generadores
3 Decoradores
4 Gestión de recursos
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
3 / 50
Iteradores
Iteradores
Iterador =
Apuntador a un elemento de una secuencia
Es objeto con:
iter
(self)
Devuelve a sí mismo.
next (self)
Devuelve el elemento actual de la sequencia y
avanza el estado en un elemento. Si ha
terminado lanza StopIteration
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
4 / 50
Ejemplo de iteración
Iteradores
r = range (3)
it = iter (r)
it . next ()
it . next ()
it . next ()
it . next ()
# 0
# 1
# 2
# -
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
5 / 50
Ejemplo de iteración
Iteradores
r = range (3)
it = iter ( r )}
it.next() # 0
it . next ()
it . next ()
it . next ()
# 1
# 2
# -
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
6 / 50
Ejemplo de iteración
Iteradores
r = range (3)
it = iter ( r )
it . next ()
it.next() # 1
it . next ()
it . next ()
# 2
# -
# 0
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
7 / 50
Ejemplo de iteración
Iteradores
r = range (3)
it = iter ( r )
it . next ()
it . next ()
it.next() # 2
it . next ()
# 0
# 1
# -
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
8 / 50
Ejemplo de iteración
Iteradores
r = range (3)
it = iter ( r )
it . next ()
it . next ()
it . next ()
it.next() # -
# 0
# 1
# 2
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
9 / 50
Equivalencia while — for
Iteradores
it = iter ( range (10))
try :
while True :
print it . next ()
except S t o p I t e r a t i o n :
pass
for x in range (10):
print x
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
10 / 50
Ejemplo de iterador
Iteradores
Un iterador vacío
class I t e r a d o r V a c i o ( object ):
def __iter__ ( self ):
return self
def next ( self ):
raise S t o p I t e r a t i o n
for x in I t e r a d o r V a c i o ():
print " No me ejecuto ! "
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
11 / 50
Índice
Generadores
Iteradores
1
2 Generadores
3 Decoradores
4 Gestión de recursos
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
12 / 50
Generadores
Generadores
Generador = Iterador virtual
I.e. cada elemento no está almacenado, se calcula
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
13 / 50
Generadores
range vs xrange
Probar con %timeit en Ipython
print xrange (5). _ _c la s s_ _
for x in xrange (5):
print x
print range (5). __ cl a ss __
for x in range (5):
print x
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
14 / 50
Generadores
La biblioteca itertools
Secuencias infinitas
repeat, cycle, count, ...
Manipulación de listas eficientes
izip, chain, islice, product,
permutations, combinations, ...
Programación funcional eficiente
imap, ifilter, starmap, takewhile,
dropwhile, tee, ...
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
15 / 50
Generadores
Ejemplos itertools
from i te rt o ol s import *
it = chain ( ’ Hola ’ , ’ Mundo ! ’)
print list ( it )
it = chain ( ’ Hola ’ , ’ Mundo ! ’)
it = ifilter ( str . isupper , it )
print list ( it )
a , b = tee ( xrange (5) , 2)
print list ( a ) , list ( b )
it = cycle ([1 , 2])
it = islice ( it , 10)
print list ( it )
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
16 / 50
Generadores
La sentencia yield
yield convierte
función → generador
1 Aparentemente es como un return
2 Guarda el estado para la próxima iteración
Requiere Python ≥ 2.5
Inspirado en las continuations de Lisp
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
17 / 50
Generadores
Ejemplo de yield
Generador de factoriales
def f a c t o r i a l e s ():
x = 1
n = 2
while True :
yield x
x *= n
n += 1
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
18 / 50
Generadores
Ejemplo de yield
Ejecución del generador factoriales
it = f a c t o r i a l e s ()
print it . __ c la ss _ _
print it . next ()
print it . next ()
for x in islice ( f a c t o r i a l e s () , 10):
print x
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
19 / 50
Generadores
Generadores por comprensión
Lista por comprensión = Lista transformando otra secuencia
Generador expresión =
Generador transformando otra secuencia
Sintáxis, Python ≥ 2,4
(... for ... in ... [ if ...])
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
20 / 50
Generadores
¡Muchísimas veces no necesitamos listas!
Muy útiles cuando reducimos la secuencia ...
sum ([ x * x for x in range (10)])
sum ( x * x for x in range (10))
max ( len ( line ) for line in file )
dot = sum ( x * y for x , y in izip ( xv , yv ))
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
21 / 50
Índice
Decoradores
Iteradores
1
2 Generadores
3 Decoradores
4 Gestión de recursos
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
22 / 50
Decoradores
Decoradores
Patrón común ...
def funcion (): ...
funcion = de c or a do r ( funcion )
La función decorador
Devuelve una nueva función
Que internamente llama a la función antigua
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
23 / 50
Decoradores
Decoradores
¡Se convirtió en sintáxis!
@ d e c o r a d o r
def funcion (): ...
La función decorador
Devuelve una nueva función
Que internamente llama a la función antigua
Requiere Python ≥ 2.4
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
24 / 50
Decoradores
Ejemplo decorador
Traza de ejecución
def trace ( fun ):
def wrapper (* a , ** k ):
print " ** > >: " , fun . __name__ , a , k
res = fun (* a , ** k )
print " ** < <: " , fun . __name__
return res
return wrapper
@trace
def m i _ f u n c i o n ():
print " Hola Mundo ! "
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
25 / 50
Decoradores
Decoradores con parámetros
Tras la @ podemos poner
cualquier expresión
Todo problema en computación puede ser
resuelto añadiendo un nivel de indirección
David Wheeler
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
26 / 50
Decoradores
Decoradores con parámetros
Tras la @ podemos poner
cualquier expresión
Una función parametrizada devuelve el decorador
El decorador devuelve la función
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
26 / 50
Decoradores
Ejemplo decorador con parámetros
import sys
def trace ( out = sys . stdout ):
def d ec or a to r ( fun ):
@wraps ( fun )
def wrapper (* a , ** k ):
print >> out , " ** > > " , \
fun . __name__ , a , k
res = fun (* a , ** k )
print >> out , " ** < < " , \
fun . __name__
return res
return wrapper
return d ec or a to r
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
27 / 50
Decoradores
Ejemplo decorador con parámetros
¡Recordad poner los paréntesis siempre!
@trace ( sys . stderr )
def m i _ f u n c i o n ():
print " Hola mundo ! "
@trace ()
def m i _ f u n c i o n ():
print " Hola mundo ! "
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
28 / 50
Decoradores
Conservando los metadatos
Problema
Se pierden los metadatos
de la función original
¿Metadatos?
Nombre:
name
Documentación:
Signatura: inspect.getargspec ()
doc
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
29 / 50
Decoradores
El decorador wraps (origfunc)
El decorador wraps (origfun)
copia los metadatos de origfun
def trace ( fun ):
@wraps ( fun )
def wrapper (* a , ** k ):
print " ** > > " , fun . __name__ , a , k
res = fun (* a , ** k )
print " ** < < " , fun . __name__
return res
return wrapper
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 3 Cuestiones avanzadas
Mayo de 2011
30 / 50
Decoradores
El decorador wraps (origfunc)
El decorador wraps (origfun)
copia los metadatos de origfun
¡Ahora sí!
@trace
def m i _ f u n c i o n ():
print " Hola Mundo ! "
help ( m i _ f u n c i o n )
Juan Pedro B
Comentarios de: Tema 3 Cuestiones avanzadas - Curso de Python Avanzado (0)
No hay comentarios