Danilo Borges da Silva
[email protected]








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



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)

São áreas de memória reservadas para armazenamentos
de dados
Os nomes de variáveis são identificadores:

Servem para:

Uma variável é modificada usando o comando de
atribuição:

◦ 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
◦ Guardar valores intermediários
◦ Construir estruturas de dados
◦ Var = expressão

É possível também atribuir a várias variáveis
simultaneamente:
◦ var1,var2,...,varN = expr1,expr2,...,exprN


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.

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
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"



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)

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

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

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

Avaliação feita em “Curto-circuito”




◦ Relacionais: > , < , ==, !=, >=, <=
◦ Booleanos: and, or, not
◦ Expressão avaliada da esquerda para a direita
◦ Se o resultado (verdadeiro ou falso) puder ser
determinado sem avaliar o restante, este é retornado
imediatamente





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


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

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 *




Comandos condicionais
Comandos de repetição
Definição e uso de procedimentos
(subprogramas)
Definição e uso de classes e objetos
(programação OO)



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.



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)


É o comando condicional por excelência
Formatos:
◦ if expressao:
comandos
◦ if expressao:
else:
comandos1
comandos2
◦ if expressao1:
comandos1
elif expressao2:
comandos2
else:
comandos(N)


Repete uma seqüência de comandos
enquanto uma dada expressão booleana é
avaliada como verdadeira
Formato:
while expressão:
comando
...
comando


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



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
◦
◦
◦
◦


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)


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,





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


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


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


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”]





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

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




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



É 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 subproblemas
◦ As soluções dos sub-problemas são combinadas
numa solução do problema maior



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


É 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

É 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

É 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

É 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


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

Uma nova instância da classe é criada usando nome ()
◦ self se refere a uma instância da classe
>>> 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




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
>>> 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
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



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)
>>> 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





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
>>> 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




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, ...)




É 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



Framework web, escrito em Python
Focado em desenvolvimento ágil
“Nós fazemos a parte repetitiva, você faz o
que interessa.”


Veremos o desenvolvimento de uma
aplicação web utilizando o framework.
Nome do projeto: Controle de estoque de um
bar.
Download

Python e Django #U2013 Programa#U00e7#U00e3o