Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Documentos relacionados
Luciano Iteráveis, geradores & cia: o caminho pythonico

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Python para quem sabe Python

Python: Exceções, Iteradores e Geradores. Claudio Esperança

Python para quem sabe Python

Computação 1 - Python Aula 10 - Teórica: Estrutura de Dados - Dicionário. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 18

Listas, conjuntos e dicionários

Aula passada. Aula passada... Sequências Funções puras e modificadores. Listas Tuplos

Ponteiros e Tabelas. K&R: Capítulo 5

Estruturas de Dados em Python

Computação 1 - Python Aula 6 - Teórica: Listas 1/ 28

Dicionários. Operações Aliases, cópias. Os tipos de dados compostos que estudamos até ao momento (strings, listas, tuplos) são sequenciais:

Python: Listas. Claudio Esperança

Computação II (MAB 225)

Luciano Ramalho dezembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Nas aulas anteriores Strings. Ciclos

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Descritores de atributos em Python

Computação I - Python Aula 1 - Teórica: Manipulação de Strings, Tuplas e Listas

Algoritmos e estrutura de dados

Luciano Ramalho setembro/2012. Objetos Pythonicos. Orientação a objetos e padrões de projeto em Python

Conceitos de Linguagens de Programação

Programação Estruturada

PROGRAMAÇÃO E PYTHON. Laboratórios de Informática João Paulo Barraca, André Zúquete, Diogo Gomes

Computação 1. Revisão Geral professor: Leonardo Carvalho

Produtividade e qualidade em Python através da metaprogramação

Laboratório de Programação 1 Aula 04

Curso de Python em 5 Horas

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

Os elementos da programação

Algoritmos e Programação

prim = A ; prim = &A[0];

TIPOS ESTRUTURADOS. Prof. Msc. Luis Filipe Alves Pereira 2015

Funções. Prof. Alberto Costa Neto Programação em Python

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

1 Definição de funções 1. 2 Valores boleanos e condicionais 5. Podemos depois usar as novas funções tal qual as pré-definidas

Osvaldo Santana Thiago Galesi

Básico: estrutura de programa, sintaxe Interface com linha de comando

Computação II (MAB 225)

Allen B. Downey. Novatec

Primeira Prova de Linguagens de Programação - DCC024W - Sistemas de Informação

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Introdução à Programação / Programação I

Algoritmos e Programação

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Orientação a Objetos e Java

Abaixo iremos pormenorizar cada um de seus atributos:

TAD: Tipo Abstrato de Dados (parte 2)

Objetivos do mini curso. Conhecer a linguagem. Noção de programação utilizando Python. Aprender o báscio.

TAD: Tipo Abstrato de Dados (parte 2)

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2003/2004

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Sequências - Tuplas. Sequências - Tuplas

Programação I Aula 19 Aritmética com racionais Pedro Vasconcelos DCC/FCUP

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

Aula de hoje. Outras estruturas de dados. Teoria dos conjuntos. Teoria dos conjuntos. Conjuntos em Python. Conjuntos em Python

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Linguagem Python. Inteligência Artificial. Características de Python. Importando módulos. Módulos. Usando Python no modo interativo

Diagrama de Classes. Conceitos Básicos. prof. Robinson Vida Monday, April 20, 15

Análise de Programação

Simulado de Linguagem de Programação Java

Dicionários. Prof. Alberto Costa Neto Programação em Python

Computação II Orientação a Objetos

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Linguagens de Programação Conceitos e Técnicas. Amarrações

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Programação Java (nível intermediário) 4. Polimorfismo

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Estruturas de Dados Aula 6: Cadeias de Caracteres

Seleção Múltipla Laços (while, do-while, for) AULA 05

Linguagem de Programação II Implementação

ENGENHARIA DE PRODUÇÃO PROGRAMAÇÃO INTRODUÇÃO Estrutura de Seleção. Prof. Luiz Fernando Laguardia Campos FMS

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

TCC 00308: Programação de Computadores I Organização de programas em Python

Linguagem Python. Processamento Estatístico da Linguagem Natural. Barra invertida em strings. Strings. Aspas triplas. Operações com Strings

Introdução à Programação Aula 07. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

4 Conceito de Herança

Introdução. Universidade Federal de Uberlândia. Programação Orientada a Objetos. Prof. Fabiano Dorça

Programação Estruturada e Orientada a Objetos

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Computação 1 - Python Aula 4 - Teórica Variáveis e Atribuição, Strings. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 30

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Linguagem de Programação III

Aula 4 Estruturas de Controle

Introdução à Programação / Programação I

ICE-B. 7 - Condições. Ludwig Krippahl

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Transcrição:

Luciano Ramalho luciano@ramalho.org setembro/2012 Objetos Pythonicos Orientação a objetos e padrões de projeto em Python

Aula 3 Variáveis e referências + Iteráveis, iteradores e geradores

Objetivos desta aula Apresentar os conceitos de referências e aliasing Iniciar a discussão sobre padrões de projeto, mostrando iteradores em Python

Implementação da tômbola # coding: utf-8 import random class Tombola(object): itens = None def carregar(self, seq): self.itens = list(seq) def carregada(self): return bool(self.itens) Python 2.2 a 2.7 def misturar(self): random.shuffle(self.itens) def sortear(self): return self.itens.pop()

Uma tômbola com defeito Esta implementação tem um bug sutil, porém grave # coding: utf-8 # COM DEFEITO!!! import random class Tombola(object): itens = [] def carregar(self, seq): self.itens.extend(seq) def carregada(self): return bool(self.itens) def misturar(self): random.shuffle(self.itens) def sortear(self): return self.itens.pop() oopy/exemplos/tombola_bug.py

Mutabilidade Em Python, alguns objetos são mutáveis, outros são imutáveis Objetos mutáveis possuem conteúdo ou estado interno que pode ser alterado (campos ou atributos de valor) ao longo da sua existência Objetos imutáveis não podem alterados de nenhuma maneira. Seu estado é congelado no momento da inicialização.

Mutabilidade: exemplos Alguns tipos mutáveis: list dict set objetos que permitem a alteração de atributos por acesso direto, setters ou outros métodos Alguns tipos imutáveis: str unicode int float tuple frozenset

Aliasing ( apelidamento ) Edson Pelé Uma pessoa pode ser chamada por dois ou mais nomes diferentes Um objeto pode ser referenciado através de duas ou mais variáveis diferentes

Aliasing ( apelidamento ) Em Python, as variáveis não contém objetos, apenas referências para objetos Esqueça a metáfora da variável como caixa Isso significa que duas variáveis podem apontar para o mesmo objeto Adote a metáfora da variável como rótulo O mesmo objeto pode ter dois rótulos

Variáveis e referências Atribuição nunca faz cópias! apenas associa rótulos ou muda os rótulos de lugar a = [1,2,3] b = a a = 'zoo'

Variáveis e referências Atribuição nunca faz cópias! apenas associa rótulos ou muda os rótulos de lugar a = [1,2,3] b = a a = 'zoo'

Variáveis e referências Atribuição nunca faz cópias! apenas associa rótulos ou muda os rótulos de lugar a = [1,2,3] b = a a = 'zoo'

Aliasing: demonstração >>> a = [21, 52, 73] >>> b = a >>> c = a[:] >>> b is a True >>> c is a False >>> b == a True >>> c == a True >>> a, b, c ([21, 52, 73], [21, 52, 73], [21, 52, 73]) >>> b[1] = 999 >>> a, b, c ([21, 999, 73], [21, 999, 73], [21, 52, 73])

Identidade e igualdade Use id(o) para ver a identidade de um objeto Duas variáveis podem apontar para o mesmo objeto Neste caso, seus valores são idênticos a is b True Duas variáveis podem apontar para objetos distintos com conteúdos iguais a == b True

Comparando com Java Em Java o operador que compara referências é == também usado para os tipos primitivos (int etc.) Em Python, comparação de referências é com is Este operador não pode ser sobrecarregado

Comparando com Java (2) Em Java, igualdade entre objetos é testada com o método.equals().equals() é um método, portanto x.equals(y) não funciona se x é null Em Python, usamos o operador == O operador == pode ser sobrecarregado em qualquer classe, redefinindo o método eq Em Python, None é um objeto e suporta == Mas o teste x is None é mais eficiente

Iteráveis, iteradores e geradores

Comparando: C e Python #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i = 0; i < argc; i++) printf("%s\n", argv[i]); return 0; } import sys for arg in sys.argv: print arg

Iteração em Java class Argumentos { public static void main(string[] args) { for (int i=0; i < args.length; i++) System.out.println(args[i]); } } $ java Argumentos alfa bravo charlie alfa bravo charlie

Iteração em Java 1.5 ano: 2004 Enhanced for (for melhorado) class Argumentos2 { public static void main(string[] args) { for (String arg : args) System.out.println(arg); } } $ java Argumentos2 alfa bravo charlie alfa bravo charlie

ano: 1984!

Exemplos de iteração Iteração em Python não se limita a tipos primitivos Exemplos string arquivo Django QuerySet Baralho (em: OO em Python sem Sotaque ) https://slideshare.net/ramalho/

List comprehensions Expressões que consomem 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]

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}

Em Python o comando for itera sobre... iteráveis Definicão preliminar informal: iterável = que pode ser iterado assim como: desmontável = que pode ser desmontado Iteráveis podem ser usados em outros contextos além do laço for

Tipos iteráveis embutidos basestring str unicode dict file frozenset list set tuple xrange

Funções embutidas que consomem iteráveis all any filter iter len map max min reduce sorted sum zip

Operações com iteráveis Desempacotamento de tupla em atribuições em chamadas de funções >>> def soma(a, b):... return a + b... >>> soma(1, 2) 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) 7 >>> a, b, c = 'XYZ' >>> a 'X' >>> b 'Y' >>> c 'Z' >>> g = (n for n in [1, 2, 3]) >>> a, b, c = g >>> a 1 >>> b 2 >>> c 3

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.

Protocolo de sequência >>> t = Trem(4) >>> len(t) 4 >>> t[0] 'vagao #1' >>> t[3] 'vagao #4' >>> t[-1] 'vagao #4' >>> for vagao in t:... print(vagao) vagao #1 vagao #2 vagao #3 vagao #4 len getitem getitem

Protocolo de sequência implementação informal da interface class 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)

Interface Sequence collections.sequence from collections import Sequence class Trem(Sequence): 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)

Herança de Sequence >>> t = Trem(4) >>> 'vagao #2' in t True >>> 'vagao #5' in t False >>> for i in reversed(t): print i... vagao #4 vagao #3 vagao #2 vagao #1 >>> t.index('vagao #2') 1 >>> t.index('vagao #7') Traceback (most recent call last):... ValueError from collections import Seque class Trem(Sequence): def init (self, num_va self.num_vagoes = num def len (self): return self.num_vagoe def getitem (self, pos indice = pos if pos >

Interface Iterable 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 & Vlissides Addison-Wesley, ISBN 0-201-63361-2

Head First Design Patterns Poster O'Reilly, ISBN 0-596-10214-3

O padrão Iterator permite acessar os itens de uma coleção sequencialmente, isolando o cliente da implementação da coleção. Head First Design Patterns Poster O'Reilly, ISBN 0-596-10214-3

Trem com iterator iter(t) class Trem(object): def init (self, num_vagoes): self.num_vagoes = num_vagoes def iter (self): return IteradorTrem(self.num_vagoes) class IteradorTrem(object): 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: raise StopIteration() for vagao in t: >>> t = Trem(4) >>> for vagao in t:... print(vagao) vagao #1 vagao #2 vagao #3 vagao #4 invoca iter(t) devolve IteradorTrem invoca itrem.next() até que ele levante StopIteration

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

Iteração em C (exemplo 2) #include <stdio.h> int main(int argc, char *argv[]) { } int i; for(i = 0; i < argc; i++) printf("%d : %s\n", i, argv[i]); return 0; $./args2 alfa bravo charlie 0 :./args2 1 : alfa 2 : bravo 3 : charlie

Iteração em Python (ex. 2) import sys for i, arg in enumerate(sys.argv): print i, ':', arg $ python args2.py alfa bravo charlie 0 : args2.py 1 : alfa 2 : bravo 3 : charlie

Iterator x generator Gerador é uma generalização do iterador assunto para a aula 4...