580 likes | 717 Views
Python e Django – Programação de Alto Nível. Danilo Borges da Silva d aniloborges_@hotmail.com. Porquê Python ?. Simples o suficiente para um curso introdutório Muitos recursos Orientação a Objetos Escalável (módulos, classes, controle de exceções)
E N D
Python e Django – Programação de Alto Nível Danilo Borges da Silva daniloborges_@hotmail.com
Porquê Python? • 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
Tipos de Dados • 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)
Variáveis • 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 • 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.
Números • 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
Strings • 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 • 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 newline \r é o mesmo que carriagereturn \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 • 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 – Fatias (slices) • 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
Expressões Booleanas • 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 • 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
Funções Embutidas • 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
Importando Módulos • 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 *
Passos em programação • Comandos condicionais • Comandos de repetição • Definição e uso de procedimentos (subprogramas) • Definição e uso de classes e objetos (programação OO)
Print • Forma geral: printexpr,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.
Input • 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)
If • É o comando condicional por excelência • Formatos: • ifexpressao: comandos • ifexpressao: comandos1 else: comandos2 • if expressao1: comandos1 elif expressao2: comandos2 else: comandos(N)
While • Repete uma seqüência de comandos enquanto uma dada expressão booleana é avaliada como verdadeira • Formato: while expressão: comando ... comando
Estruturas de dados • 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
Listas • 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
A função range • 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)
Comando for • 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,
Tuplas • 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
Módulo String • 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
Dicionários • 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
Chaves vs. Índices • 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”]
Criando dicionários • 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
Método get • 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étodos items, keys,values e pop • 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
Abstração • É 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
Definindo funções • 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
Orientação a Objetos • É 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
Polimorfismo • É 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
Abstração ou Encapsulamento • É 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
Herança • É 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
Declarando a Classe • A maneira mais simples é: class nome: var = valor ... var = valor defmetodo (self, ... arg): ... defmetodo (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 ()
Exemplo >>> class C: a = 2 b = 3 def f(self,x): return C.a*x+C.b >>> C.a = 9 9 >>> C.b 3 >>> obj=C() >>> obj.f(7) 17
Atributos de instâncias • 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
Exemplo >>> class C: definit(self,a=2,b=3): self.a = a self.b = b def f(self,x): returnself.a*x+self.b >>> obj1 = C() >>> obj1.init(2,3) >>> obj2 = C() >>> obj2.init(8,1) >>> obj1.f(7) 17 >>> obj2.f(7) 57
Atributos herdados de classe • 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.a 3 >>> C.a 1
Construtores • 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)
Exemplo >>> class C: def __init__(self,a=2,b=3): self.a = a self.b = b def f(self,x): returnself.a*x+self.b >>> obj1 = C() >>> obj2 = C(8,1) >>> obj1.f(7) 17 >>> obj2. f(7) 57