PDF de programación - Tema 3 Cuestiones avanzadas - Curso de Python Avanzado

Imágen de pdf Tema 3 Cuestiones avanzadas - Curso de Python Avanzado

Tema 3 Cuestiones avanzadas - Curso de Python Avanzadográfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf10844

Comentarios de: Tema 3 Cuestiones avanzadas - Curso de Python Avanzado (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad