Slide 1

Slide 1 text

A I L P Introdução Básica Christian S. Perone [email protected] de abril de

Slide 2

Slide 2 text

A I L Parte I A

Slide 3

Slide 3 text

A I L A ▸ Christian S. Perone ▸ Trabalha como desenvolvedor ▸ Colaborador e mantenedor open-source ▸ Blog ▸ http://pyevolve.sourceforge.net/wordpress ▸ Projetos ▸ https://github.com/perone ▸ Twitter @tarantulae

Slide 4

Slide 4 text

A I L R A Apresentação I Características Casos de sucesso Implementações Read-Eval-Print Loop (REPL) Versões da Linguagem L Variáveis Tipos de Dados Funções Controles de Fluxo Orientação a Objetos Decorators Exceções Métodos Mágicos Propriedades Módulos e Pacotes Dúvidas ?

Slide 5

Slide 5 text

A I L Parte II I

Slide 6

Slide 6 text

A I L C ▸ VHLL (Very-High-Level Language) ▸ Interpretada ▸ Multiparadigma ▸ Imperativa ▸ Orientada a Objetos ▸ Funcional ▸ Tipagem dinâmica ▸ Fortemente tipada ▸ Baterias inclusas (Python Standard Library) ▸ Extensível ▸ Comunidades em diversas áreas

Slide 7

Slide 7 text

A I L C - L H C (LHC) e large funcionality available in Python’s library in combination with the exibility provided by the language itself was the main reason for the choice. —D . A P , CMS. (CERN, LHC).

Slide 8

Slide 8 text

A I L C - I L M (ILM) Python plays a key role in our production pipeline. Without it a project the size of e Avengers would have been very di cult to pull o . From crowd rendering to batch processing to compositing, Python binds all things together. —T B , L .

Slide 9

Slide 9 text

A I L C - O S A comunidade do OpenStack escolheu Python como a linguagem de desenvolvimento exclusiva para o projeto e ela é hoje exigida em novos projetos.

Slide 10

Slide 10 text

A I L C - C A A Continuum Analytics recebeu um nanciamento de U milhões de um fundo de pesquisa da DARPA para trabalhar no NumPy, SciPy e técnicas de visualização para exploração interativa de grandes quantidades de dados.

Slide 11

Slide 11 text

A I L I O interpretador o cial (referência) da linguagem Python é chamado CPython, entretanto no “ecossistema” da linguagem também existem outros interpretadores, como por exemplo: ▸ Jython (Java) ▸ IronPython (.NET) ▸ PyPy (RPython) É importante compreender a diferença entre a linguagem e os interpretadores da linguagem.

Slide 12

Slide 12 text

A I L R -E -P L (REPL) Uma das vantagens do Python é o prompt do interpretador, que quando executado apresenta um REPL (Read-Eval-Print Loop). No REPL do Python você pode interagir a qualquer momento com o interpretador, esta é uma das mais importantes ferramentas de aprendizado da linguagem, você pode testar pequenos trechos de código sem precisar encapsular isto em uma classe (aka Java) ou criar um arquivo de fonte separado. Exemplo de uso: >>> print ’Hello world’ Hello world >>> a = 2 >>> b = 3 >>> print a+b 5

Slide 13

Slide 13 text

A I L P Hoje temos duas principais versões da linguagem: Versão .x Lançada em de Out , trouxe novidades como list comprehensions. Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . .

Slide 14

Slide 14 text

A I L P Hoje temos duas principais versões da linguagem: Versão .x Lançada em de Out , trouxe novidades como list comprehensions. Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . . Versão .x Lançada em de Dez , foco em reparar algumas inconsistências da linguagem e reduzir a duplicação de recursos. Nesta versão a retrocompatibilidade de sintaxe com as versões anteriores foi quebrada.

Slide 15

Slide 15 text

A I L P Hoje temos duas principais versões da linguagem: Versão .x Lançada em de Out , trouxe novidades como list comprehensions. Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . . Versão .x Lançada em de Dez , foco em reparar algumas inconsistências da linguagem e reduzir a duplicação de recursos. Nesta versão a retrocompatibilidade de sintaxe com as versões anteriores foi quebrada. Ambas versões foram planejadas para coexistirem e receberem atualizações em paralelo. Muitos recursos que foram introduzidos na versão .x foram também portados para a versão .x.

Slide 16

Slide 16 text

A I L Parte III L

Slide 17

Slide 17 text

A I L V Python é uma linguagem dinamicamente tipada, ou seja, os tipos das variáveis declaradas são resolvidos em tempo de execução (ao contrário de linguagens estaticamente tipadas como C por exemplo). Abaixo seguem alguns exemplos de declaração/atribuição de variáveis em Python: # Declaração de variável inteira var_x = 1 # Declaração de variável real var_y = 1 .34 # Declaração de variável string var_z = ’abcdef’

Slide 18

Slide 18 text

A I L V ▸ I Você pode usar a função type() para mostrar na tela qual o tipo da variável, como no exemplo abaixo usando o REPL do Python: >>> print type(var_x) >>> print type(var_y) >>> print type(var_z)

Slide 19

Slide 19 text

A I L V ▸ M I Em Python, alguns tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens:

Slide 20

Slide 20 text

A I L V ▸ M I Em Python, alguns tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto.

Slide 21

Slide 21 text

A I L V ▸ M I Em Python, alguns tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto. Memória as strings imutáveis podem ser reutilizadas, duas strings iguais podem apontar para o mesmo lugar da memória.

Slide 22

Slide 22 text

A I L V ▸ M I Em Python, alguns tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto. Memória as strings imutáveis podem ser reutilizadas, duas strings iguais podem apontar para o mesmo lugar da memória. Design imutabilidade é um dos conceitos fundamentais da Programação Funcional, ela permite você ver o uxo do código como uma série de transformações de uma representação em outra ao invés de uma sequência de mutações in-place.

Slide 23

Slide 23 text

A I L V ▸ T Tudo em Python é um objeto, inclusive funções, classes, números, etc. Você pode usar o REPL do Python para mostrar os atributos de um objeto da seguinte forma usando o dir(): >>> minha_string = ’abc’ >>> dir(minha_string) [’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, (... omitido por brevidade)]

Slide 24

Slide 24 text

A I L V ▸ T Tudo em Python é um objeto, inclusive funções, classes, números, etc. Você pode usar o REPL do Python para mostrar os atributos de um objeto da seguinte forma usando o dir(): >>> minha_string = ’abc’ >>> dir(minha_string) [’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, (... omitido por brevidade)] Você pode também veri car a identidade de um objeto usando a função id(): >>> var_a = 1 >>> id(var_a) 32679628 N Esta identidade tem a garantia de ser única e constante para este objeto durante o tempo de vida do objeto.

Slide 25

Slide 25 text

A I L V ▸ N Em Python, variáveis não são o objeto em si mas sim nomes para um objeto. Um mesmo objeto pode ser referenciado por mais de um nome: >>> var_a = var_b = 5 >>> id(var_a) 3267963 >>> id(var_b) 3267963 O que este trecho de código faz é criar dois nomes para o mesmo objeto, neste caso o número . Ao usar a função id() do Python podemos constatar que de fato as duas variáveis estão apontando para o mesmo objeto.

Slide 26

Slide 26 text

A I L T D ▸ N Exemplos de operações matemáticas em Python: >>> 2+2 4 >>> (5 -5*6)/4 5 >>> 7/3 2 >>> 7/3. 2.3333333333333335 N A divisão por inteiro sempre retorna um inteiro. Na versão .x este comportamento padrão foi alterado.

Slide 27

Slide 27 text

A I L T D ▸ S Em Python as strings podem ser declaradas utilizando aspas simples, duplas ou uma sequência de de três aspas (simples ou duplas). >>> "hello world" ’hello world’ >>> ’isn\’t’ "isn’t" >>> var_str = """my string""" ’my string’ >>> var_str = "line\nbreak" >>> var_str ’line\nbrk’ >>> print var_str line brk

Slide 28

Slide 28 text

A I L T D ▸ S II As strings também podem ser concatenadas e indexadas: >>> var_str = ’abc’ + ’def’ >>> var_str ’abcdef’ >>> var_str[2] ’c’ >>> var_str[ :2] ’ab’ >>> var_str[2:] ’cdef’ >>> var_str[-2:] ’ef’ A sintaxe var_str[ :2] é chamada de slicing em Python.

Slide 29

Slide 29 text

A I L T D ▸ S III

Slide 30

Slide 30 text

A I L T D ▸ S IV Note que as strings em Python sao imutáveis, ou seja, qualquer tentativa de tentar alterá-las irá gerar uma exception: >>> minha_string = ’hello world’ >>> minha_string[ ] = ’H’ Traceback (most recent call last): File "", line 1, in TypeError: object does not support item assignment

Slide 31

Slide 31 text

A I L T D ▸ L As listas em Python podem conter diferentes tipos de dados: # Criando uma nova lista minha_lista = [1, 2.5, 5, ’string qualquer’] Ao contrário das strings, listas são mutáveis, o que signi ca que uma atribuição é naturalmente válida: >>> minha_lista [1, 2.5, 5, ’string qualquer’] >>> minha_lista[ ] = 666 >>> minha_lista [666, 2.5, 5, ’string qualquer’] >>> len(minha_lista) 4

Slide 32

Slide 32 text

A I L T D ▸ L ▸ C Veja o seguinte exemplo: >>> minha_lista [1, 2.5, 5, ’string qualquer’] >>> outra_lista = minha_lista >>> outra_lista[ ] = 666 >>> minha_lista [666, 2.5, 5, ’string qualquer’]

Slide 33

Slide 33 text

A I L T D ▸ L ▸ C Veja o seguinte exemplo: >>> minha_lista [1, 2.5, 5, ’string qualquer’] >>> outra_lista = minha_lista >>> outra_lista[ ] = 666 >>> minha_lista [666, 2.5, 5, ’string qualquer’] Este comportamento é um efeito do fato de que as variáveis são nomes para os objetos. Ao atribuir à variável outra_lista a lista minha_lista, o interpretador utilizou o mesmo objeto minha_lista ao invés de criar uma nova lista.

Slide 34

Slide 34 text

A I L T D ▸ L ▸ C II O correto para criar uma nova lista (uma cópia) em Python é o seguinte: >>> minha_lista [1, 2.5, 5, ’string qualquer’] >>> outra_lista = minha_lista[:] >>> outra_lista[ ] = 666 >>> minha_lista [1, 2.5, 5, ’string qualquer’] >>> outra_lista [666, 2.5, 5, ’string qualquer’] Isto porque ao fazer slicing, o interpretador sempre cria uma nova lista.

Slide 35

Slide 35 text

A I L T D ▸ L ▸ L C Em Python temos o conceito de List Comprehensions: >>> lista = [’ab’, ’cd’] >>> [x.upper() for x in lista] [’AB’, ’CD’] >>> lista = [1, 2, 1 , 2 ] >>> [x for x in lista if x < 1 ] [1, 2] >>> [x**2 for x in range(5)] [ , 1, 4, 9, 16] A compreensão é a propriedade de classi cação em torno da qual se reagruparão os “elementos” que a ela correspondem. Indica os pontos comuns a determinados tipos de objetos. A extensão é a própria coleção desses objetos. (...) Tudo isto é muito simples. —L F , K , U “C ”.

Slide 36

Slide 36 text

A I L T D ▸ D Um dicionário em Python é uma estrutura que de ne uma relação de ∶ entre as respectivas chaves e valores. # Definindo um dicionário >>> meu_dicionario = {’nome’: ’Fulano’, ’idade’: 28} # Acessando valores do dicionário usando as chaves >>> meu_dicionario[’nome’] ’Fulano’ >>> meu_dicionario[’idade’] 28 # Apagando chaves/valores >>> del meu_dicionario[’nome’] # Atribuindo valores >>> meu_dicionario[’altura’] = 1.72

Slide 37

Slide 37 text

A I L T D ▸ D II Alguns fatos importantes sobre dicionários em Python: ▸ Eles podem conter dados heterogêneos, você pode misturar inteiros com strings, etc ▸ As chaves de um dicionário são case-sensitive ▸ Um dicionário vazio pode ser declarado como: >>> meu_dicionario = {} ▸ Você pode limpar um dicionário usando o método clear(): >>> meu_dicionario.clear() ▸ Dicionários requerem que os tipos das chaves implementem um método hash, reduzindo assim a complexidade de pesquisa em um dicionário em O .

Slide 38

Slide 38 text

A I L T D ▸ T Tuplas não são nada mais do que listas imutáveis, ou seja, logo após sua criação não se pode alterá-las sem criar uma nova tupla. >>> minha_tupla = (’a’, ’b’, 2.5, 666) >>> minha_tupla (’a’, ’b’, 2.5, 666) >>> minha_tupla[1] ’b’ >>> tup = (’um’, 2, 3) >>> var_a, var_b, var_c = tup >>> print var_a, var_b, var_c um 2 3 Assim como em uma lista, elementos em uma tupla têm uma ordem e o slicing também é possível.

Slide 39

Slide 39 text

A I L T D ▸ T II ▸ Uma tupla tem um desempenho melhor que uma lista, use-a quando a sua estrutura de dados não precisar ser alterada, ela deixará o seu código mais legível e sem efeitos colaterais devido ao fato de ser uma estrutura imutável. ▸ Tuplas podem ser convertidas em listas e vice-versa: >>> minha_tupla = (1, 2, 3) >>> list(minha_tupla) [1, 2, 3] >>> minha_lista = [1, 2, 3] >>> tuple(minha_lista) (1, 2, 3)

Slide 40

Slide 40 text

A I L T D ▸ C Sets (ou conjuntos) seguem a de nição matemática: são uma coleção de elementos distintos, ou seja, uma coleção onde itens não se repetem. Para de nir um conjunto em Python usamos o tipo set: # Usando uma lista >>> conjunto = set([1, 2, 3, 1, 2, 3]) >>> conjunto set([1, 2, 3]) # Notação usando chaves >>> conjunto = {1, 2, 3, 1, 2, 3} >>> conjunto set([1, 2, 3]) N A notação usando chaves foi incluída na versão . do Python e posteriormente portada para a versão . .

Slide 41

Slide 41 text

A I L T D ▸ C II Os conjuntos também suportam algumas operações matemáticas: >>> conj_a = {1, 2, 3} >>> conj_b = {2, 3, 4} # União >>> conj_a.union(conj_b) set([1, 2, 3, 4]) # Intersecção >>> conj_a.intersection(conj_b) set([2, 3])

Slide 42

Slide 42 text

A I L F Em Python, as funções são declaradas usando a palavra reservada def (que signi ca de nition). Exemplo da declaração de uma função que fará a soma de dois parâmetros: def soma(a, b): return a+b Note que Python utiliza espaços para delimitar os blocos do programa, o número de espaços recomendado pelo guia de estilo o cial (PEP ) são espaços (sem TAB). Note também que a função soma() também é um objeto: >>> soma >>> soma(2,4) 6

Slide 43

Slide 43 text

A I L F ▸ A P Funções em Python, além de podermos usar parâmetros padronizados, também podemos realizar chamadas para funções nomeando parâmetros: def adiciona_pessoa(nome, idade=28, sexo=’M’): print nome, idade, sexo >>> adiciona_pessoa(’christian’) christian 28 M >>> adiciona_pessoa(’laura’, sexo=’F’) laura 28 F >>> adiciona_pessoa(’pedro’, 12, ’M’) pedro 12 M

Slide 44

Slide 44 text

A I L F ▸ L A A Uma função pode ser construída de forma que aceite uma lista de tamanho arbitrário de argumentos: def argumentos_arbitrarios(*args): print ’Argumentos:’, args # Exemplo de chamada >>> argumentos_arbitrarios(’teste’, 1, 2. , [1, 2, 3]) Argumentos: (’teste’, 1, 2. , [1, 2, 3]) N A lista de argumentos é enviada para a função no argumento args como uma tupla.

Slide 45

Slide 45 text

A I L F ▸ A - Quando o último argumento de uma função conter um parâmetro pre xado com **, este parâmetro irá aceitar argumentos palavra-chave: def argumentos_arbitrarios(*args, **kwargs): print ’Argumentos:’, args print ’Argumentos palavra-chave:’, kwargs # Exemplo de chamada >>> argumentos_arbitrarios(’a’, ’b’, x=’one’, y=’two’) Argumentos: (’a’, ’b’) Argumentos palavra-chave: {’x’: ’one’, ’y’: ’two’} N A lista de argumentos palavra-chave enviados para o parâmetro kwargs está no formato de um dicionário.

Slide 46

Slide 46 text

A I L F ▸ N Algumas notas importantes sobre funções: ▸ Todas funções retornam um valor, na ausência de return elas retornarão None. ▸ A primeira linha após a de nição de uma função pode ser uma string, neste caso esta string representará a documentação da função (chamada de docstring): def soma(a,b): """Função de soma.""" return a+b N Existem algumas ferramentas (ex. Sphinx), que utilizam esta docstring para gerar documentação automaticamente.

Slide 47

Slide 47 text

A I L F ▸ N II ▸ Você também pode usar o comando help para obter a docstring e a de nição de uma função/método/classe: def soma(a,b): """Função de soma.""" return a+b # Obtendo help da função >>> help(soma) Help on function soma in module __main__: soma(a, b) Função de soma.

Slide 48

Slide 48 text

A I L F A Como Python adota também o paradigma funcional, você pode também declarar funções anônimas usando a palavra reservada lambda (λ), exemplo: soma_b = lambda a,b: a+b # Retornando uma função anônima def soma_lambda(n): return lambda v: v + n >>> f = soma_lambda(3) >>> f(4) 7 A de nição de soma_b() é ilustrativa, pois obviamente não há vantagem alguma em atribuir uma função lambda à uma variável, pois estaríamos nomeando uma função anônima.

Slide 49

Slide 49 text

A I L C F ▸ I >>> x = 2 >>> if x > : ... print "Maior que zero" ... elif x < : ... print "Menor que zero" ... else: ... print "Zero" ... Maior que zero

Slide 50

Slide 50 text

A I L C F ▸ F A palavra reservada for em Python pode iterar em itens de uma sequência (uma lista, uma string, chaves de um dicionário, etc.): >>> palavras = [’gato’, ’cachorro’] >>> for p in palavras: ... print p, len(p) gato 4 cachorro 8

Slide 51

Slide 51 text

A I L C F ▸ F II Se for preciso iterar em uma sequência numérica, você pode utilizar a função range(), que gera listas contendo progressões aritméticas: >>> range(6) [ , 1, 2, 3, 4, 5] >>> for i in range(len(palavras)): ... print i, palavras[i] gato 1 cachorro Existe também outra função chamada xrange() que retorna um generator ao invés de uma lista, eliminando desta forma a necessidade da criação de uma lista, que pode ser um gargalo de performance para iterações em progressões mais longas.

Slide 52

Slide 52 text

A I L C F ▸ F III Entretanto uma solução pythonica para este problema seria usando a função enumerate(): >>> list(enumerate(palavras)) [( , ’gato’), (1, ’cachorro’)] >>> for i,p in enumerate(palavras): ... print i,p gato 1 cachorro

Slide 53

Slide 53 text

A I L O O Python também suporta Orientação a Objetos e contém mecanismos para criação de classes, herança (múltipla), sobrescrita de métodos (de nidos pelo usuário ou de operadores matemáticos, etc.). Explícito é melhor que implícito. —T Z P , T P , .

Slide 54

Slide 54 text

A I L O O ▸ C Em Python, as classes são de nidas utilizando a palavra reservada class, um exemplo simples da de nição e instanciação de uma classe pode ser de nido como: class MinhaClasse(object): pass # Instanciando um objeto >>> objeto = MinhaClasse()

Slide 55

Slide 55 text

A I L O O ▸ C Para declarar o construtor de uma classe em Python, utilizamos o método mágico __init__(): class MinhaClasse(object): def __init__(self): pass

Slide 56

Slide 56 text

A I L O O ▸ A C Atributos de classe são atributos compartilhados entre todas instâncias da classe: class MinhaClasse(object): atributo_classe = 1 # Acessível através da classe >>> print MinhaClasse.atributo_classe 1 # Acessível também através dos objetos da classe >>> objeto = MinhaClasse() >>> print objeto.atributo_classe 1

Slide 57

Slide 57 text

A I L O O ▸ A I Atributos de instância são atributos únicos para cada objeto instanciado e só existem dentro do objeto: class MinhaClasse(object): def __init__(self, valor): self.valor = valor >>> objeto = MinhaClasse(3 ) >>> print objeto.valor 3 >>> print MinhaClasse.valor Traceback (most recent call last): File "", line 1, in AttributeError: type object ’MinhaClasse’ has no attribute ’valor’

Slide 58

Slide 58 text

A I L O O ▸ H S Em Python podemos ter herança simples: class ClasseBase(object): def nome(self): print ’Sou ClasseBase !’ def base(self): print ’Método da ClasseBase !’ class ClasseDerivada(ClasseBase): def nome(self): print ’Sou ClasseDerivada !’ >>> base = ClasseBase() >>> derivada = ClasseDerivada() >>> base.nome() Sou ClasseBase ! >>> derivada.nome() Sou ClasseDerivada ! >>> derivada.base() Método da ClasseBase !

Slide 59

Slide 59 text

A I L O O ▸ H M E também herança múltipla: class ClasseA(object): def metodo_a(self): print ’metodo_a !’ class ClasseB(object): def metodo_b(self): print ’metodo_b !’ class ClasseC(ClasseA, ClasseB): pass >>> obj = ClasseC() >>> obj.metodo_a() metodo_a ! >>> obj.metodo_b() metodo_b !

Slide 60

Slide 60 text

A I L O O ▸ M C B Ao sobrescrever um método da classe base, muitas vezes precisamos reutilizar o comportamento da classe base no método derivado: class ClasseBase(object): def metodo(self): print ’Metodo da ClasseBase !’ class ClasseDerivada(ClasseBase): def metodo(self): super(ClasseDerivada, self).metodo() print ’Metodo da ClasseDerivada !’ >>> obj = ClasseDerivada() >>> obj.metodo() Metodo da ClasseBase ! Metodo da ClasseDerivada !

Slide 61

Slide 61 text

A I L O O ▸ E Em Python não há um conceito de atributos privados como há em outras linguagens. Python encoraja os desenvolvedores a serem responsáveis.

Slide 62

Slide 62 text

A I L O O ▸ E II ▸ Um método que inicia com o caractere ’_’ indica que o método é um método não-público da API e que pode ser alterado no futuro sem aviso, exemplo: class MinhaClasse(object): def _metodo_interno(self): pass # (...) implementação

Slide 63

Slide 63 text

A I L O O ▸ E II ▸ Um método que inicia com o caractere ’_’ indica que o método é um método não-público da API e que pode ser alterado no futuro sem aviso, exemplo: class MinhaClasse(object): def _metodo_interno(self): pass # (...) implementação ▸ O interpretador utiliza name mangling quando o nome do método inicia com dois caracteres ’__’ (e acaba com no máximo um caractere ’_’ ), exemplo: class MinhaClasse(object): def __metodo_interno(self): pass # (...) implementação No exemplo acima, o método __metodo_interno() tem seu nome alterado para _MinhaClasse__metodo_interno().

Slide 64

Slide 64 text

A I L D Decorators permitem a injeção ou modi cação de código em funções ou classes. A sua aplicação se dá através da seguinte construção: # Em funções @decorator def minha_funcao(): pass # Em classes @decorator class MinhaClasse(): pass # Exemplo útil (Django): @permission_required(’poll.can_vote’) def poll_vote(request): pass # (...) implementação

Slide 65

Slide 65 text

A I L D II Exemplo de decorator para medir o tempo de execução de uma função: def mensura_tempo(func): def func_wrapper(*args): inicio = time.clock() resultado = func(*args) fim = time.clock() print ’Tempo: ’, fim-inicio return resultado return func_wrapper @mensura_tempo def teste(): time.sleep(3) >>> teste() Tempo: 2.9995364 673

Slide 66

Slide 66 text

A I L E ▸ T E Como em outras linguagens, Python também oferece tratamento de erros em tempo de execução, denominados Exceptions, ou Exceções. O tratamento destes erros é realizado através de blocos utilizando as palavras-chaves try e except: meu_dicionario = {’chave_a’: 1, ’chave_b’: 2} try: print meu_dicionario[’chave_c’] except KeyError: print ’Chave não encontrada !’

Slide 67

Slide 67 text

A I L E ▸ L E Para levantar exceções em Python, a palavra reservada raise deve ser utilizada: def verifica_numero_primo(numero): if numero < : raise ValueError(’O valor deve ser maior ’ ’ou igual a zero !’) # (...) No caso acima, uma exceção built-in ValueError será levantada. Você também pode criar classes de exceções próprias criando classes que herdam da classe nativa Exception.

Slide 68

Slide 68 text

A I L M M Métodos mágicos são métodos especiais para implementar protocolos, sobrescrever operadores, etc. Eles seguem sempre o mesmo formato: com dois underscores antes e depois do nome do método, como por exemplo __init__(). class MeuDicionario(object): def __init__(self): self.dicionario = {} def __getitem__(self, key): return self.dicionario[key] def __setitem__(self, chave, valor): self.dicionario[chave] = valor >>> dicionario = MeuDicionario() >>> dicionario[’chave’] = 1 >>> print dicionario[’chave’] 1

Slide 69

Slide 69 text

A I L P Propriedades em Python são uma forma de criar getters/setters exíveis de forma que a sintaxe ainda continue elegante. Considere o exemplo abaixo: class Circulo(object): def __init__(self, raio): self.raio = raio O que acontece se quisermos criar um atributo que contenha sempre a área do círculo (π ∗ r ) ? Poderíamos criar um método em separado para calcular e retornar esta área ou então criar um atributo que é calculado na execução do construtor; entretanto em Python existe uma forma mais elegante de se resolver este problema.

Slide 70

Slide 70 text

A I L P ▸ G import math class Circulo(object): def __init__(self, raio): self._raio = raio @property def area(self): return math.pi * self._raio**2 >>> circulo = Circulo(2) print circulo.area 12.56637 6144

Slide 71

Slide 71 text

A I L P ▸ S import math class Circulo(object): def __init__(self, raio): self.raio = raio @property def area(self): return math.pi * self.raio**2 @area.setter def area(self, area): self.raio = math.sqrt(area/math.pi) >>> circulo = Circulo(2) >>> print circulo.raio 2 >>> circulo.area = 4 >>> print circulo.raio 3.56824823231

Slide 72

Slide 72 text

A I L M P ▸ M Qualquer arquivo arquivo contendo código-fonte Python é chamado de Módulo. Um módulo pode ser importado por outros módulos, de forma que as classes, funções, variáveis globais e outros objetos deste módulo possam ser acessados por outro módulo. A sintaxe para importação de um módulo é feita através do importação utilizando a palavra reservada import: # Arquivo minhas_funcoes.py def fibonacci(n): if n == : return if n == 1: return 1 return fibonacci(n-1) + fibonacci(n-2) # Arquivo usa_modulo.py import minhas_funcoes resultado = minhas_funcoes.fibonacci(8)

Slide 73

Slide 73 text

A I L M P ▸ M II Você também pode importar objetos especí cos diretamente para o namespace atual: # Importa todas funções (má prática) from minhas_funcoes import * resultado = fibonacci(8) # Importa apenas a função soma (boa prática) from minhas_funcoes import fibonacci resultado = fibonacci(8) # Importa módulo usando outro nome import minhas_funcoes as mf resultado = mf.fibonacci(2, 3)

Slide 74

Slide 74 text

A I L M P ▸ P Um pacote em Python não é nada além de uma estrutura de diretório contendo módulos. Juntamente com o conceito de módulos, os pacotes são uma maneira e caz de estruturar e organizar os módulos e evitar a poluição de namespaces. Exemplo da estrutura de um pacote: frontend/ __init__.py desktop/ __init__.py modulo_a.py web/ __init__.py modulo_b.py # Importando modulo ’modulo_a’ >>> from frontend.desktop import modulo_a >>> modulo_a.funcao()

Slide 75

Slide 75 text

A I L D Junte-se ao PyTchê ! Acesse http://pytche.org