danilo borges da silva [email protected]

58
Python e Django – Programação de Alto Nível Danilo Borges da Silva [email protected]

Upload: internet

Post on 21-Apr-2015

113 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Danilo Borges da Silva daniloborges_@hotmail.com

Python e Django – Programação de Alto Nível

Danilo Borges da [email protected]

Page 2: Danilo Borges da Silva daniloborges_@hotmail.com

Simples o suficiente para um curso introdutório Muitos recursos Orientação a Objetos

Escalável (módulos, classes, controle de exceções)

Biblioteca embutida extensa e grande número de módulos fornecidos por terceiros

Grande variedade de aplicações Linguagem interpretada (script) Multi-plataforma Gratuito Comunidade bastante desenvolvida

Porquê Python?

Page 3: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Tipos Básicos

Page 4: Danilo Borges da Silva daniloborges_@hotmail.com

São categorias de valores que são processados de forma semelhante

Por exemplo, números inteiros são processados de forma diferente dos números de ponto flutuante (decimais) e dos números complexos

Tipos primitivos: são aqueles já embutidos no núcleo da linguagem◦ Simples: numéricos (int, long, float, complex) e cadeias

de caracteres (strings)◦ Compostos: listas, dicionários, tuplas e conjuntos

Tipos definidos pelo usuário: são correspondentes a classes (orientação objeto)

Tipos de Dados

Page 5: Danilo Borges da Silva daniloborges_@hotmail.com

São áreas de memória reservadas para armazenamentos de dados

Os nomes de variáveis são identificadores: ◦ Nomes podem ser compostos de algarismos (0-9), letras (a-z ou A-Z)

ou sublinhado ( _ )◦ O primeiro caractere não pode ser um algarismo◦ Não Palavras reservadas (if, while, etc) são proibidas

Servem para:◦ Guardar valores intermediários◦ Construir estruturas de dados

Uma variável é modificada usando o comando de atribuição:◦ Var = expressão

É possível também atribuir a várias variáveis simultaneamente:◦ var1,var2,...,varN = expr1,expr2,...,exprN

Variáveis

Page 6: Danilo Borges da Silva daniloborges_@hotmail.com

Variáveis são criadas dinamicamente e destruídas quando não mais necessárias, por exemplo, quando saem fora de escopo (veremos isso mais tarde)

O tipo de uma variável muda conforme o valor atribuído, i.e., int, float, string, etc.

Variáveis

Page 7: Danilo Borges da Silva daniloborges_@hotmail.com

Há vários tipos numéricos que se pode usar em python:◦ Int: números inteiros de precisão fixa

1 , 2 , 15 , -19◦ Long: números inteiros de precisão arbitrária

1L , 10000L , -9999999L◦ Floats: números racionais de precisão variável

1.0 , 10.5 , -19000.00005 , 15e-5 ◦ Complex: números complexos

1+1j , 20j , 1000+100J

Números

Page 8: Danilo Borges da Silva daniloborges_@hotmail.com

São cadeias de caracteres Constituem outro tipo fundamental do python Constantes string são escritas usando aspas

simples ou duplas Ex.: "a" ou 'a‘ O operador “+” pode ser usado para concatenar

strings Ex.: "a"+"b" é o mesmo que "ab" O operador “*” pode ser usado para repetir

strings Ex.: "a"*10 é o mesmo que "aaaaaaaaaa"

Strings

Page 9: Danilo Borges da Silva daniloborges_@hotmail.com

Python usa a tabela de caracteres default do S.O. Ex.: ASCII, UTF-8 Caracteres não imprimíveis podem ser expressos

usando notação “barra-invertida” (\)\n é o mesmo que new line\r é o mesmo que carriage return\t é o mesmo que tab\b é o mesmo que backspace\\ é o mesmo que \\x41 é o mesmo que o caractere cujo código

hexadecimal é 41 (“A” maiúsculo)

Strings

Page 10: Danilo Borges da Silva daniloborges_@hotmail.com

A notação barra-invertida (\) pode ser desabilitada desde que a constante string seja precedida por um r (erre minúsculo)◦ São chamadas strings raw (cruas)

Também é possível escrever constantes string em várias linhas incluindo as quebras de linha usando três aspas como delimitadores

Strings

Page 11: Danilo Borges da Silva daniloborges_@hotmail.com

Notação para separar trechos de uma string◦ Notação: string[índice1:índice2]◦ Retorna os caracteres desde o de índice1

(inclusive) até o de índice2 (exclusive)◦ Se o primeiro índice é omitido, é assumido 0◦ Se o último índice é omitido, é assumido o fim da

string

Strings – Fatias (slices)

Page 12: Danilo Borges da Silva daniloborges_@hotmail.com

Também chamadas expressões lógicas Resultam em verdadeiro (True) ou falso (False) São usadas em comandos condicionais e de

repetição Servem para analisar o estado de uma computação e

permitir escolher o próximo passo Operadores mais usados

◦ Relacionais: > , < , ==, !=, >=, <=◦ Booleanos: and, or, not

Avaliação feita em “Curto-circuito”◦ Expressão avaliada da esquerda para a direita◦ Se o resultado (verdadeiro ou falso) puder ser determinado

sem avaliar o restante, este é retornado imediatamente

Expressões Booleanas

Page 13: Danilo Borges da Silva daniloborges_@hotmail.com

As constantes True e False são apenas símbolos convenientes

Qualquer valor não nulo é visto como verdadeiro enquanto que 0 (ou False) é visto como falso

O operador or retorna o primeiro operando se for vista como verdadeiro, caso contrário retorna o segundo

O operador and retorna o primeiro operando se for vista como falso, caso contrário retorna o segundo

Operadores relacionais são avaliados antes de not, que é avaliado antes de and, que é avaliado antes de or

Expressões Booleanas

Page 14: Danilo Borges da Silva daniloborges_@hotmail.com

Além dos operadores, é possível usar funções para computar valores

As funções podem ser definidas:◦ Pelo programador◦ Em módulos da biblioteca padrão◦ Por default: são as funções embutidas (built-in)

Na verdade, fazem parte do módulo __builtins__, que é sempre importado em toda aplicação

Funções Embutidas

Page 15: Danilo Borges da Silva daniloborges_@hotmail.com

Muitas funções importantes são disponibilizadas em módulos da biblioteca padrão◦ Ex.: o módulo math tem funções como sin, cos, exp e

outras Um módulo pode conter não só funções mas

também variáveis ou classes◦ Por exemplo, o módulo math define a constante pi

Para usar os elementos de um módulo, pode-se usar o comando import◦ Formatos:

import modulo from modulo import nome,...,nome from modulo import *

Importando Módulos

Page 16: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Comandos Básicos

Page 17: Danilo Borges da Silva daniloborges_@hotmail.com

Comandos condicionais Comandos de repetição Definição e uso de procedimentos

(subprogramas) Definição e uso de classes e objetos

(programação OO)

Passos em programação

Page 18: Danilo Borges da Silva daniloborges_@hotmail.com

Forma geral: print expr,expr,... Os valores das expressões são escritos um

após o outro sem pular de linha: >>> print "1.001 ao quadrado é ",1.001**2

1.001 ao quadrado é 1.002001 Se o comando terminar com vírgula, o

próximo print escreverá na mesma linha.

Print

Page 19: Danilo Borges da Silva daniloborges_@hotmail.com

O programa que computa elementos da série de Fibonacci termina quando atinge um elemento com valor superior a uma constante

Podemos tornar o programa mais flexível se ao usuário for permitido estipular o valor máximo

O comando input permite perguntar ao usuário um valor (normalmente é atribuído a uma variável)◦ Formato: input(pergunta)◦ onde pergunta é uma string opcional que será

exibida para indicar o valor que se espera (i.e., prompt)

Input

Page 20: Danilo Borges da Silva daniloborges_@hotmail.com

É o comando condicional por excelência Formatos:

◦ if expressao:

comandos◦ if expressao:

comandos1 else: comandos2

◦ if expressao1:

comandos1 elif expressao2: comandos2

else: comandos(N)

If

Page 21: Danilo Borges da Silva daniloborges_@hotmail.com

Repete uma seqüência de comandos enquanto uma dada expressão booleana é avaliada como verdadeira

Formato: while expressão:

comando ... comando

While

Page 22: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Listas

Page 23: Danilo Borges da Silva daniloborges_@hotmail.com

Maneira de organizar dados de maneira a facilitar seu acesso

Algumas formas são clássicas:◦ Listas◦ Arrays (vetores e matrizes)◦ Tuplas (registros)◦ Árvores

Linguagens freqüentemente possuem primitivas para construção dessas E.D. ◦ Estruturas de dados embutidas

Outras E.D. mais complexas podem ser construídas combinando as E.D. clássicas

Estruturas de dados

Page 24: Danilo Borges da Silva daniloborges_@hotmail.com

São arranjos seqüenciais de informações mais simples

Caracterizam-se por permitir o acesso eficiente aos seus elementos em ordem seqüencial

A definição clássica de uma lista como estrutura de dados abstrata compreende:◦ Operação de construção de uma lista vazia◦ Operação que testa se uma dada lista é vazia◦ Operação para obter o primeiro elemento de uma lista◦ Uma operação para adicionar um novo elemento no

início de uma lista◦ Operação para retirar o elemento inicial de uma lista

Listas

Page 25: Danilo Borges da Silva daniloborges_@hotmail.com

Retorna uma progressão aritmética de inteiros numa lista

Forma geral: range (início, parada, incremento)◦ início (opcional) é o primeiro valor a ser gerado

(default: 0)◦ parada é o limite da progressão: a progressão

termina no último valor antes de parada◦ incremento (opcional) é o passo da progressão

(default:1)

A função range

Page 26: Danilo Borges da Silva daniloborges_@hotmail.com

Permite iterar sobre os elementos de uma lista

Forma geral: for var in lista : comandos◦ Os comandos são repetidos para cada valor de

lista◦ Durante a repetição, var possui o valor corrente

da lista Uma grande utilidade da função range é

construir a lista de iteração Ex.: >>>for i in range(1,7): print i,

Comando for

Page 27: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Tuplas e Strings

Page 28: Danilo Borges da Silva daniloborges_@hotmail.com

São estruturas de dados parecidas com listas, mas com a particularidade de serem imutáveis

Tuplas são seqüências e, assim como listas, podem ser indexadas e fatiadas, mas não é possível modificá-las

Uma tupla vazia se escreve () Os parênteses são opcionais se não

provocarem ambigüidade Uma tupla contendo apenas um elemento

deve ser escrita com uma vírgula ao final

Tuplas

Page 29: Danilo Borges da Silva daniloborges_@hotmail.com

Manipulação de strings é uma atividade freqüente em programas Python

Existe um módulo chamado string que contém uma grande quantidade de funcionalidades para trabalhar com strings◦ Para usá-las:

from string import * Entretanto, strings pertencem à classe str e

a maior parte do que existe no módulo string aparece como métodos da classe str

Módulo String

Page 30: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Dicionários

Page 31: Danilo Borges da Silva daniloborges_@hotmail.com

São estruturas de dados que implementam mapeamentos

Um mapeamento é uma coleção de associações entre pares de valores◦ O primeiro elemento do par é chamado de chave

e o outro de conteúdo De certa forma, um mapeamento é uma

generalização da idéia de acessar dados por índices, exceto que num mapeamento os índices (ou chaves) podem ser de qualquer tipo imutável

Dicionários

Page 32: Danilo Borges da Silva daniloborges_@hotmail.com

Considere que queiramos representar um caderno de telefones

Uma solução é ter uma lista de nomes e outra de telefones◦ Telefone de nome[i] armazenado em telefone[i]◦ Acrescentar “Joao” com telefone “20122232”:

nome+= “Joao” telefone+=“20122232”◦ Para encontrar o telefone de “Joao”:

Tel = telefone[nome.index[“Joao”]] Dicionários tornam isso mais fácil e eficiente

◦ telefone[“Joao”] = “20122232”◦ Tel = telefone[“Joao”]

Chaves vs. Índices

Page 33: Danilo Borges da Silva daniloborges_@hotmail.com

Uma constante do tipo dicionário é escrita { chave1:conteúdo1, ... chaveN:conteúdoN} Uma variável do tipo dicionário pode ser

“indexada” da maneira habitual, isto é, usando colchetes

O conteúdo associado a uma chave pode ser alterado atribuindo-se àquela posição do dicionário

Novos valores podem ser acrescentados a um dicionário fazendo atribuição a uma chave ainda não definida

Não há ordem definida entre os pares chave/conteúdo de um dicionário

Criando dicionários

Page 34: Danilo Borges da Silva daniloborges_@hotmail.com

get(chave,valor)◦ Obtém o conteúdo de chave◦ Não causa erro caso chave não exista: retorna

valor◦ Se valor não for especificado chaves inexistentes

retornam None

Método get

Page 35: Danilo Borges da Silva daniloborges_@hotmail.com

items() retorna uma lista com todos os pares chave/conteúdo do dicionário

keys() retorna uma lista com todas as chaves do dicionário

values() retorna uma lista com todos os valores do dicionário

pop (chave)◦ Obtém o valor correspondente a chave e remove

o par chave/valor do dicionário

Métodos items, keys, values e pop

Page 36: Danilo Borges da Silva daniloborges_@hotmail.com

Python: funções

Page 37: Danilo Borges da Silva daniloborges_@hotmail.com

É uma técnica de programação que nos permite pensar num problema em diversos níveis

A idéia é que quando estamos pensando num problema macroscopicamente, não estamos preocupado com minúcias

Dividir para conquistar:◦ Um problema é dividido em diversos sub-

problemas◦ As soluções dos sub-problemas são combinadas

numa solução do problema maior

Abstração

Page 38: Danilo Borges da Silva daniloborges_@hotmail.com

Em Python, sub-programas têm o nome de funções Formato geral: def nome (arg, arg, ... arg): comando . . . comando Onde:

◦ nome é o nome da função◦ args são especificações de argumentos da função

Uma função pode ter 0, 1 ou mais argumentos comandos contêm as instruções a ser executadas

quando a função é invocada

Definindo funções

Page 39: Danilo Borges da Silva daniloborges_@hotmail.com

Python: Classes

Page 40: Danilo Borges da Silva daniloborges_@hotmail.com

É uma disciplina de programação assim como a Programação Estruturada

Tenta unificar as idéias de algoritmos e estruturas de dados através do conceito de Objeto◦ Um objeto é uma unidade de software que encapsula

algoritmos e os dados sobre o qual os algoritmos atuam Os seguintes conceitos são importantes quando

falamos de orientação a objetos:◦ Polimorfismo◦ Abstração◦ Herança

Orientação a Objetos

Page 41: Danilo Borges da Silva daniloborges_@hotmail.com

É o que permite que dois objetos diferentes possam ser usados de forma semelhante◦ Por exemplo, tanto listas quanto tuplas ou strings podem

ser indexadas por um número entre colchetes e suportam o método len

◦ Assim, se escrevemos ...

for i in range(len(X)): print i, X[i]◦ ...não é possível saber de antemão se X é uma tupla, uma

lista ou uma string Desta forma, se escrevemos um algoritmo para ser

aplicado um objeto X, então também pode ser aplicado a um objeto Y desde que Y seja suficientemente polimórfico a X

Polimorfismo

Page 42: Danilo Borges da Silva daniloborges_@hotmail.com

É o que permite que um objeto seja utilizado sabendo-se sobre ele apenas a sua interface◦ Em particular, não precisamos conhecer a

implementação dos seus métodos Em OO a abstração tem mais alcance pois

um objeto encapsula tanto dados como algoritmos◦ Assim, podemos atribuir objetos ou passar objetos

como argumentos, sem necessariamente saber como o objeto está implementado

Abstração ou Encapsulamento

Page 43: Danilo Borges da Silva daniloborges_@hotmail.com

É o que permite construir objetos que são especializações de outro objeto◦ Isso permite o reuso de software já que objetos

especializados herdam dos objetos genéricos uma série de atributos comuns

Por exemplo, considere um objeto que representa uma forma geométrica. Então, ele pode ter características tais como área, perímetro, centróide, etc.◦ Um polígono é uma forma geométrica,

Portanto, herda todas as características de formas geométricas Deve suportar também características específicas como

número de lados e comprimento de arestas

Herança

Page 44: Danilo Borges da Silva daniloborges_@hotmail.com

A maneira mais simples é: class nome: var = valor ... var = valor def metodo (self, ... arg): ... def metodo (self, ... arg): ... As variáveis e os métodos são escritos precedidos pelo nome da

classe e por um ponto (.) Assim, uma variavel v definida numa classe c é escrita c.v

Os métodos sempre têm self como primeiro argumento◦ self se refere a uma instância da classe

Uma nova instância da classe é criada usando nome ()

Declarando a Classe

Page 45: Danilo Borges da Silva daniloborges_@hotmail.com

>>> class C: a = 2 b = 3 def f(self,x): return C.a*x+C.b>>> C.a = 99>>> C.b3>>> obj=C()>>> obj.f(7)17

Exemplo

Page 46: Danilo Borges da Silva daniloborges_@hotmail.com

No exemplo anterior, a e b eram atributos da classe C e portanto usáveis por qualquer instância de C

Mais freqüentemente, precisamos de atributos associados a instâncias individuais

Um atributo attr associado a uma instância obj tem nome obj.attr

Se queremos nos referir a um atributo attr de um objeto dentro de algum de seus métodos, usamos o nome self.attr

Atributos de instâncias

Page 47: Danilo Borges da Silva daniloborges_@hotmail.com

>>> class C: def init(self,a=2,b=3): self.a = a self.b = b def f(self,x): return self.a*x+self.b>>> obj1 = C()>>> obj1.init(2,3)>>> obj2 = C()>>> obj2.init(8,1)>>> obj1.f(7)17>>> obj2.f(7)57

Exemplo

Page 48: Danilo Borges da Silva daniloborges_@hotmail.com

Se uma classe define atributos de classe, as instâncias herdam esses atributos da classe como atributos de instância

Ex.:>>> class C: a = 1 def f(self,x): self.a += x>>> c = C()>>> c.f(2)>>> c.a3>>> C.a1

Atributos herdados de classe

Page 49: Danilo Borges da Silva daniloborges_@hotmail.com

Um método como init do exemplo anterior é bastante útil para inicializar atributos da instância e é conhecido como construtor da classe

Na verdade, Python suporta construtores que podem ser chamados automaticamente na criação de instâncias◦ Basta definir na classe um método chamado __init__◦ Este método é chamado automaticamente durante a criação

de um nova instância da classe, sendo que os argumentos são passados entre parênteses após o nome da classe

Obs.: o método __init__ é apenas um exemplo de “método mágico” que é invocado de maneira não padrão (veremos outros adiante)

Construtores

Page 50: Danilo Borges da Silva daniloborges_@hotmail.com

>>> class C: def __init__(self,a=2,b=3): self.a = a self.b = b def f(self,x): return self.a*x+self.b>>> obj1 = C()>>> obj2 = C(8,1)>>> obj1.f(7)17>>> obj2.f(7)57

Exemplo

Page 51: Danilo Borges da Silva daniloborges_@hotmail.com

Para fazer uma classe C herdar de outra B, basta declarar C como:

class C(B): . . . Diz-se que C é sub-classe (ou derivada) de B ou que B

ésuper-classe (ou base) de C C herda todos os atributos de B A especialização de C se dá acrescentando-se novos

atributos (variáveis e métodos) ou alterando-se métodos

Se, um método de C, precisa invocar um método m de B, pode-se utilizar a notação B.m para diferenciar do m de C, referido como C.m

Especialização de Classes

Page 52: Danilo Borges da Silva daniloborges_@hotmail.com

>>> class B: n = 2 def f(self,x): return B.n*x>>> class C(B): def f(self,x): return B.f(self,x)**2 def g(self,x): return self.f(x)+1>>> b = B()>>> c = C()>>> b.f(3)6>>> c.f(3)36>>> c.g(3)37>>> B.n = 5>>> c.f(3)225

Exemplo

Page 53: Danilo Borges da Silva daniloborges_@hotmail.com

O construtor de uma classe D derivada de C precisa chamar o construtor de C

A chamada do construtor de C não é feita por default

Permite inicializar os elementos de C que não são específicos de D

Usa-se a notação C.__init__(self, ...)

Construtores de Classes Derivadas

Page 54: Danilo Borges da Silva daniloborges_@hotmail.com

É possível construir uma classe que herda de duas ou mais outras. Ex.:

class C(A,B): ... Nesse caso, a classe derivada herda todos os

atributos de ambas as classes-base Se ambas as classes base possuem um

atributo com mesmo nome, aquela citada primeiro prevalece

No exemplo acima, se A e B possuem um atributo x, então C.x se refere ao que foi herdado de A

Herança Multipla

Page 55: Danilo Borges da Silva daniloborges_@hotmail.com

Framework web, escrito em Python Focado em desenvolvimento ágil “Nós fazemos a parte repetitiva, você faz o

que interessa.”

Django

Page 56: Danilo Borges da Silva daniloborges_@hotmail.com

Veremos o desenvolvimento de uma aplicação web utilizando o framework.

Nome do projeto: Controle de estoque de um bar.

Projeto Django

Page 57: Danilo Borges da Silva daniloborges_@hotmail.com

Conclusão

Page 58: Danilo Borges da Silva daniloborges_@hotmail.com

Obrigado!