Luciano Ramalho                              luciano@ramalho.org                                      @ramalhoorgIteráveis...
Luciano Ramalho• Arquiteto de soluções Web desde 1994 • 1º diretor técnico do Brasil Online, na Abril S/A• Muitos clientes...
Exemplos• Laço for em Python iterando sobre: • string • arquivo • Django QuerySet • Baralho                               ...
Contraste• laço for em BASIC, Pascal, C • muito bons para incrementar inteiros!• “foreach” em JavaScript, Bash • parecidos...
Em Python o comando foritera sobre... “iteráveis”• Literalmente: • “desmontável” = que pode ser desmontado • “iterável” = ...
( Interface? Em Python?• Interface é um conceito essencial em OO• Em Smalltalk: “protocolo”     The interface provides a b...
( Interface? Em Python?• Interface é um conceito essencial em OO• Em Smalltalk: “protocolo”     A interface fornece uma se...
)Interface em Python• Conceitualmente, sempre existiram• Não havia maneira formal de especificar  interfaces em Python até ...
Em Python, um iterável é...• Um objeto a partir do qual a função iter  consegue obter um iterador.• A chamada iter(x): • i...
Protocolo de sequência >>> t = Trem(4) >>> len(t) 4                       __len__ >>> t[0] vagao #1 >>> t[3]              ...
Protocolo  de sequência  • collections.Sequenceclass Trem(object):    def __init__(self, num_vagoes):        self.num_vago...
InterfaceIterable• Iterable provê um método  __iter__• O método __iter__ devolve  uma instância de Iterator               ...
Iterator é...• um padrão de projeto                         Design Patterns                         Gamma, Helm, Johnson &...
Head FirstDesign PatternsPosterOReilly,ISBN 0-596-10214-3                     @ramalhoorg
O padrãoIterator permiteacessar os itensde uma coleçãosequencialmente,isolando o clienteda implementaçãoda coleção.Head Fi...
Trem                      class Trem(object):                          def __init__(self, num_vagoes):                    ...
Em Python, um iterável é...• Um objeto a partir do qual a função iter  consegue obter um iterador.• A chamada iter(x):    ...
Iterator x generator• Gerador é uma generalização do iterador• Por definição, um objeto iterador produz itens  iterando sob...
Função               >>> def g123():geradora                     ...     yield 1                     ...     yield 2      ...
Trem c/ função geradora                      class Trem(object):                          def __init__(self, num_vagoes): ...
class Trem(object):Iterador        def __init__(self, num_vagoes):                    self.num_vagoes = num_vagoes        ...
List comprehensionList comprehensions          ●   Compreensão de lista ou abrangência                             ●   Exe...
Set & dict comprehensions• Expressões que consomem iteráveis e  produzem sets ou dicts >>> s = abracadabra >>> {c for c in...
Expressãogeradora             >>> g = (n for n in [1, 2, 3])                     >>> for i in g: print i                  ...
Trem c/ expressão geradora                      class Trem(object):                          def __init__(self, num_vagoes...
Tipos iteráveis embutidos  • basestring   • frozenset   • str         • list   • unicode     • set  • dict         • tuple...
Funções embutidas queconsomem iteráveis• all       • max• any       • min• filter     • reduce• iter      • sorted• len    ...
Construtores embutidosque consomem eproduzem iteráveis• dict        • reversed• enumerate   • set• frozenset   • tuple• li...
Operações com iteráveis                                       >>>   a, b, c = XYZ  • Desempacotamento                   >>...
Módulo itertools• geradores (potencialmente) infinitos • count(), cycle(), repeat()• geradores que combinam vários iterávei...
Exemplo prático defunção geradora• Funções geradoras para desacoplar laços de  leitura e escrita em uma ferramenta para  c...
Funções geradoras comoco-rotinas• Segundo David Beazley, co-rotinas não tem a ver  com iteração, e sim com pipelines • ent...
Exemplo prático deco-rotina• Função geradora como co-rotina para preservar  o contexto de callback em programação  assíncr...
Luciano Ramalho                                      luciano@ramalho.org                                              @ram...
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
Upcoming SlideShare
Loading in...5
×

Python: Iteraveis, geradores etc

1,373

Published on

Published in: Technology
1 Comment
2 Likes
Statistics
Notes
  • Muito legal Luciano, parabéns!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
1,373
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
41
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Python: Iteraveis, geradores etc

  1. 1. Luciano Ramalho luciano@ramalho.org @ramalhoorgIteráveis, geradores & cia:a essência do Python
  2. 2. Luciano Ramalho• Arquiteto de soluções Web desde 1994 • 1º diretor técnico do Brasil Online, na Abril S/A• Muitos clientes e alguns empregos desde então, quase sempre atuando na Web (server-side)• Atualmente: Oficinas Turing (vários cursos) e Academia Python em parceria com Globalcode• Sócio do Garoa Hacker Clube @ramalhoorg
  3. 3. Exemplos• Laço for em Python iterando sobre: • string • arquivo • Django QuerySet • Baralho @ramalhoorg
  4. 4. Contraste• laço for em BASIC, Pascal, C • muito bons para incrementar inteiros!• “foreach” em JavaScript, Bash • parecidos com o de Python, mas limitados aos tipos primitivos da linguagem• “foreach” em Java • “enhanced for” no Java 5 @ramalhoorg
  5. 5. Em Python o comando foritera sobre... “iteráveis”• Literalmente: • “desmontável” = que pode ser desmontado • “iterável” = que pode ser iterado• E como se faz um objeto iterável em Python? • forma legada: protocolo de sequência • forma moderna: interface Iterable @ramalhoorg
  6. 6. ( Interface? Em Python?• Interface é um conceito essencial em OO• Em Smalltalk: “protocolo” The interface provides a boundary between the implementations of an abstraction and its clients. It limits the amount of implementation detail visible to clients. It also specifies the functionality that implementations must provide. P. S. Canning, W. R. Cook, W. L. Hill, and W. G. Olthoff. 1989. Interfaces for strongly-typed object- oriented programming. In Conference proceedings on Object-oriented programming systems, languages and applications (OOPSLA 89). ACM, New York, NY, USA, 457-467. @ramalhoorg DOI=10.1145/74877.74924 http://doi.acm.org/10.1145/74877.74924
  7. 7. ( Interface? Em Python?• Interface é um conceito essencial em OO• Em Smalltalk: “protocolo” A interface fornece uma separação entre a implementação de uma abstração e seus clientes. Ela limita os detalhes de implementação que os clientes podem ver. Também especifica a funcionalidade que as implementações devem prover. P. S. Canning, W. R. Cook, W. L. Hill, and W. G. Olthoff. 1989. Interfaces for strongly-typed object- oriented programming. In Conference proceedings on Object-oriented programming systems, languages and applications (OOPSLA 89). ACM, New York, NY, USA, 457-467. @ramalhoorg DOI=10.1145/74877.74924 http://doi.acm.org/10.1145/74877.74924
  8. 8. )Interface em Python• Conceitualmente, sempre existiram• Não havia maneira formal de especificar interfaces em Python até a versão 2.5 • usava-se termos como “uma sequência” ou “a file-like object”• Agora temos ABC (Abstract Base Class) • com herança múltipla, como em C++ @ramalhoorg
  9. 9. Em Python, um iterável é...• Um objeto a partir do qual a função iter consegue obter um iterador.• A chamada iter(x): • invoca x.__iter__() para obter um iterador • ou, se x.__iter__ não existe: • fabrica um iterador que acessa os itens de x sequenciamente fazendo x[0], x[1], x[2] etc. @ramalhoorg
  10. 10. Protocolo de sequência >>> t = Trem(4) >>> len(t) 4 __len__ >>> t[0] vagao #1 >>> t[3] __getitem__ vagao #4 >>> t[-1] vagao #4 >>> for vagao in t: ... print(vagao) __getitem__ vagao #1 vagao #2 vagao #3 vagao #4 @ramalhoorg
  11. 11. Protocolo de sequência • collections.Sequenceclass Trem(object): def __init__(self, num_vagoes): self.num_vagoes = num_vagoes def __len__(self): return self.num_vagoes def __getitem__(self, pos): indice = pos if pos >= 0 else self.num_vagoes + pos if 0 <= indice < self.num_vagoes: # indice 2 -> vagao #3 return vagao #%s % (indice+1) else: raise IndexError(vagao inexistente %s % pos) @ramalhoorg
  12. 12. InterfaceIterable• Iterable provê um método __iter__• O método __iter__ devolve uma instância de Iterator @ramalhoorg
  13. 13. Iterator é...• um padrão de projeto Design Patterns Gamma, Helm, Johnson & Vlissides Addison-Wesley, ISBN 0-201-63361-2 @ramalhoorg
  14. 14. Head FirstDesign PatternsPosterOReilly,ISBN 0-596-10214-3 @ramalhoorg
  15. 15. O padrãoIterator permiteacessar os itensde uma coleçãosequencialmente,isolando o clienteda implementaçãoda coleção.Head FirstDesign PatternsPosterOReilly,ISBN 0-596-10214-3 @ramalhoorg
  16. 16. Trem class Trem(object): def __init__(self, num_vagoes): self.num_vagoes = num_vagoes def __iter__(self): com return IteradorTrem(self.num_vagoes) class IteradorTrem(object): iterator def __init__(self, num_vagoes): self.atual = 0 self.ultimo_vagao = num_vagoes - 1 def next(self): if self.atual <= self.ultimo_vagao: self.atual += 1 return vagao #%s % (self.atual) else: iter(t) raise StopIteration() • for vagao in t:>>> t = Trem(4)>>> for vagao in t: • invoca iter(t)... print(vagao)vagao #1 • devolve IteradorTremvagao #2vagao #3 • invoca itrem.next() até quevagao #4 ele levante StopIteration @ramalhoorg
  17. 17. Em Python, um iterável é...• Um objeto a partir do qual a função iter consegue obter um iterador.• A chamada iter(x): interface Iterable • invoca x.__iter__() para obter um iterador • ou, se x.__iter__ não existe: • fabrica um iterador que acessa os itens de x sequenciamente fazendo x[0], x[1], x[2] etc. protocolo de sequência @ramalhoorg
  18. 18. Iterator x generator• Gerador é uma generalização do iterador• Por definição, um objeto iterador produz itens iterando sobre outro objeto (alguma coleção)• Um objeto gerador produz itens de forma independente • ele pode iterar sobre outro objeto mas também pode gerar itens por contra própria, sem qualquer dependência externa @ramalhoorg
  19. 19. Função >>> def g123():geradora ... yield 1 ... yield 2 ... yield 3 ... >>> for i in g123(): print i ...• Quando invocada, 1 2 3 devolve um >>> g = g123() >>> g objeto gerador <generator object g123 at 0x10e385e10>• O objeto gerador >>> g.next() 1 >>> g.next() é um iterável 2 >>> g.next() 3 >>> g.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration @ramalhoorg
  20. 20. Trem c/ função geradora class Trem(object): def __init__(self, num_vagoes): self.num_vagoes = num_vagoes def __iter__(self): for i in range(self.num_vagoes): yield vagao #%s % (i+1) iter(t) • for vagao in t:>>> t = Trem(4)>>> for vagao in t: • invoca iter(t)... print(vagao)vagao #1 • devolve geradorvagao #2vagao #3 • invoca gerador.next() até quevagao #4 ele levante StopIteration @ramalhoorg
  21. 21. class Trem(object):Iterador def __init__(self, num_vagoes): self.num_vagoes = num_vagoes def __iter__(self):clássico return IteradorTrem(self.num_vagoes) class IteradorTrem(object): def __init__(self, num_vagoes):12 linhas self.atual = 0 self.ultimo_vagao = num_vagoes - 1de código def next(self): if self.atual <= self.ultimo_vagao: self.atual += 1 return vagao #%s % (self.atual) else: raise StopIteration() mesma funcionalidade!Função class Trem(object): def __init__(self, num_vagoes):geradora self.num_vagoes = num_vagoes def __iter__(self): for i in range(self.num_vagoes): yield vagao #%s % (i+1) 3 linhas
  22. 22. List comprehensionList comprehensions ● Compreensão de lista ou abrangência ● Exemplo: usar todos os elementos:• Expressões que consomem L2 = [n*10 for n in L] – iteráveis e produzem listas qualquer iterável resultado: uma lista>>> s = abracadabra>>> l = [ord(c) for c in s]>>> [ord(c) for c in s][97, 98, 114, 97, 99, 97, 100, 97, 98, 114, 97] @ramalhoorg
  23. 23. Set & dict comprehensions• Expressões que consomem iteráveis e produzem sets ou dicts >>> s = abracadabra >>> {c for c in s} set([a, r, b, c, d]) >>> {c:ord(c) for c in s} {a: 97, r: 114, b: 98, c: 99, d: 100} @ramalhoorg
  24. 24. Expressãogeradora >>> g = (n for n in [1, 2, 3]) >>> for i in g: print i ... 1 2 3• Quando avaliada, >>> g = (n for n in [1, 2, 3]) >>> g devolve um <generator object <genexpr> at 0x109a4deb0> objeto gerador >>> g.next() 1• O objeto gerador >>> g.next() 2 é um iterável >>> g.next() 3 >>> g.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration @ramalhoorg
  25. 25. Trem c/ expressão geradora class Trem(object): def __init__(self, num_vagoes): self.num_vagoes = num_vagoes def __iter__(self): return (vagao #%s % (i+1) for i in range(self.num_vagoes)) iter(t) • for vagao in t:>>> t = Trem(4)>>> for vagao in t: • invoca iter(t)... print(vagao)vagao #1 • devolve geradorvagao #2vagao #3 • invoca gerador.next() até quevagao #4 ele levante StopIteration @ramalhoorg
  26. 26. Tipos iteráveis embutidos • basestring • frozenset • str • list • unicode • set • dict • tuple • file • xrange @ramalhoorg
  27. 27. Funções embutidas queconsomem iteráveis• all • max• any • min• filter • reduce• iter • sorted• len • sum• map • zip @ramalhoorg
  28. 28. Construtores embutidosque consomem eproduzem iteráveis• dict • reversed• enumerate • set• frozenset • tuple• list @ramalhoorg
  29. 29. Operações com iteráveis >>> a, b, c = XYZ • Desempacotamento >>> X a de tupla >>> b Y • em atribuições >>> Z >>> c g = (n for n in [1, 2, 3]) • em chamadas de funções >>> >>> a, b, c = g a>>> def soma(a, b): 1... return a + b >>> b... 2>>> soma(1, 2) >>> c3 3>>> t = (3, 4)>>> soma(t)Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: soma() takes exactly 2 arguments (1 given)>>> soma(*t) @ramalhoorg7
  30. 30. Módulo itertools• geradores (potencialmente) infinitos • count(), cycle(), repeat()• geradores que combinam vários iteráveis • chain(), tee(), izip(), imap(), product(), compress()...• geradores que selecionam ou agrupam itens: • compress(), dropwhile(), groupby(), ifilter(), islice()...• Iteradores que produzem combinações • product(), permutations(), combinations()... @ramalhoorg
  31. 31. Exemplo prático defunção geradora• Funções geradoras para desacoplar laços de leitura e escrita em uma ferramenta para conversão de bases de dados semi-estruturadashttps://github.com/ramalho/isis2json @ramalhoorg
  32. 32. Funções geradoras comoco-rotinas• Segundo David Beazley, co-rotinas não tem a ver com iteração, e sim com pipelines • então esse tema nem deveria ser tratado nesta palestra • mas como são implementadas como funções geradoras, merece ser mencionado @ramalhoorg
  33. 33. Exemplo prático deco-rotina• Função geradora como co-rotina para preservar o contexto de callback em programação assíncrona com o framework Tornado https://github.com/oturing/ppqsp/ .../async/assincrono_clo.py .../async/assincrono_ge.py @ramalhoorg
  34. 34. Luciano Ramalho luciano@ramalho.org @ramalhoorgoficina online:Objetos PythonicosPOO e padrões de projeto como devem ser em Python Pré-inscrição: pre-oopy.turing.com.br
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×