Python 03
-
Upload
bruno-catao -
Category
Technology
-
view
1.165 -
download
1
Transcript of Python 03
Python - 3ª AulaBruno Gama Catão
Relembrando ...
• Na aula passada vimos:
• Como criar funções;
• Listas, tuplas, conjuntos e dicionários;
• Módulos random, urllib2 e zipfile.
Funções
def fatorial(n): if n == 0: return 1; return n * fatorial(n - 1)
#Chamando a funcaoprint str(fatorial(5))
Listas
• Padrão:
• legumes = ['Batata', 'Cenoura', 'Repolho']
• Listas compactadas:salarios = [510, 720, 850, 1200]
#aumento de 10%
salarios = [s * 1.01 for s in salarios]
Tuplas
#tupla simplestelefone = (83, 33102222)print 'Telefone (%d) %d' % telefone
#Lista de tuplastelefones = [(83, 33332222), (84, 32215678)]for tel in telefones: print 'Telefone (%d) %d' % tel
Conjuntos
# Lista de comprascompras = ['laranja', 'uva', 'maca', 'uva']# Verificando quais frutas foram compradasfrutas = set(compras)
print frutas
Dicionários
aluno = {"nome" : "Bruno", "curso" : "SI", "media" : 8.2};
print "%s - %.2f" % (aluno["nome"], aluno["media"])
Módulo randomimport random
#Sorteando as dezenasdezenas = random.sample(range(1, 61), 6)
#Ordenandodezenas.sort()
print dezenas
Módulo urllib2
import urllib2
url = raw_input('Digite a URL: ')print urllib2.urlopen(url).readlines()
Módulo zipfile
# -*- coding: latin-1 -*-from zipfile import ZipFile
arquivo = raw_input('Digite o nome do arquivo: ')diretorio = raw_input('Digite o diretório de destino: ')zip = ZipFile(arquivo)zip.extractall(diretorio)
Resposta ao desafio# -*- coding: latin-1 -*-import os
arquivo = open(raw_input('Qual o arquivo do cabeçalho ?'))cabecalho = arquivo.read()arquivo = open(raw_input('Qual o arquivo do corpo ?'))corpo = arquivo.read()arquivo = open(raw_input('Qual o arquivo do rodapé ?'))rodape = arquivo.read()diretorio = raw_input('Qual o diretório das imagens ?')formato = raw_input('Qual o formato das imagens ?')album = raw_input('Qual o nome do álbum ?')pagina = cabecalho % albumfor arquivo in os.listdir(diretorio): if arquivo.endswith(formato): pagina += corpo % (arquivo, arquivo)pagina += rodapearquivo = open(os.path.join(diretorio, "album.html"), "w")arquivo.write(pagina)arquivo.close()
Criando seus próprios módulos
• Um módulo em Python é um arquivo .py;
• Módulos podem ser organizados em diretórios (pacotes);
• Para utilizar mais de um módulo em uma aplicação é necessário importar este outro módulo.
Exemplo
• Criem um novo projeto PyDev chamado Aula3;
• Criem dois módulos:
• funcoes;
• principal.
Módulo “funcoes”
def fatorial(n): if n == 0: return 1 return n * fatorial(n - 1)
def somatorio(n): if n == 0: return 0 return n + somatorio(n - 1)
Módulo “funcoes”
def fatorial(n): if n == 0: return 1 return n * fatorial(n - 1)
def somatorio(n): if n == 0: return 0 return n + somatorio(n - 1)
Lembram de recursividade ?
Módulo “principal”
# -*- coding: latin-1 -*-import funcoes
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, funcoes.fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, funcoes.somatorio(n))
Módulo “principal”
# -*- coding: latin-1 -*-import funcoes
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, funcoes.fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, funcoes.somatorio(n))
import <nome_modulo>
Módulo “principal”
# -*- coding: latin-1 -*-import funcoes
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, funcoes.fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, funcoes.somatorio(n))
import <nome_modulo>
nome_modulo.funcao
Outras formas de importação
# -*- coding: latin-1 -*-from funcoes import *
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, somatorio(n))
Outras formas de importação
# -*- coding: latin-1 -*-from funcoes import *
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, somatorio(n))
from <nome_modulo> import <parte|*>
Outras formas de importação
# -*- coding: latin-1 -*-from funcoes import *
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, somatorio(n))
from <nome_modulo> import <parte|*>
sem o nome do módulo !
Outras formas de importação
• Você pode importar apenas uma função, isso diminui o uso de memória pela sua aplicação !
# -*- coding: latin-1 -*-from funcoes import fatorial
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
Atenção
• Quando se importa um módulo o seu conteúdo é executado;
• Portanto, se no corpo do módulo existirem comandos soltos, ou seja, que não estejam dentro de uma função, estes comandos serão executados sempre que o módulo for importado !
Exemplo• Vamos modificar o nosso módulo “funcoes”,
execute o módulo “principal” e veja o que acontece:# -*- coding: latin-1 -*-
def fatorial(n): if n == 0: return 1; return n * fatorial(n - 1)
def somatorio(n): if n == 0: return 0; return n + somatorio(n - 1)
print 'Módulo funcoes carregado !'
Mas ...
• E se eu quiser que o meu módulo tenha apenas funções quando for importado, mas que faça alguma coisa quando for executado diretamente ?
Ponto de Entrada“main”
• Aqui está o truque para fazer isso:
# -*- coding: latin-1 -*-
def fatorial(n): if n == 0: return 1; return n * fatorial(n - 1)
def somatorio(n): if n == 0: return 0; return n + somatorio(n - 1)
if __name__ == "__main__": print 'Módulo funcoes carregado !'
Pacotes
• Pacotes são diretórios onde podemos agrupar os nossos módulos;
• São uma forma de organização;
• Todo pacote pode ter um módulo chamado __init__ que será importado automaticamente sempre que alguém utilizar o pacote.
Exemplo• Crie um PyDev package chamado util em
seu projeto;
• Veja que automaticamente foi criado um módulo __init__;
• Movam o módulo funcoes (é só arrastar com o mouse) para o pacote util.
Modificando o módulo principal
# -*- coding: latin-1 -*-from util.funcoes import *
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, somatorio(n))
Modificando o módulo principal
# -*- coding: latin-1 -*-from util.funcoes import *
n = int(raw_input('Digite um número: '))print "fat(%d) = %d" % (n, fatorial(n))
n = int(raw_input('Digite um número: '))print "sum(%d) = %d" % (n, somatorio(n))
from <pacote>.<nome_modulo> import <parte|*>
E o __init__ ?
• Vamos adicionar algum conteúdo a este módulo para ver o seu funcionamento:
• Agora, executem novamente o módulo principal.
print "Pacote util carregado !"
Documentação
• A documentação de funções em Python é feita por uma String de múltiplas linhas logo em seu início;
• Toda entidade de Python (objetos, etc) têm um atributo __doc__ que permite visualizar esta documentação.
Exemplo
• No módulo util.funcoes:
• Módulo principal:
def fatorial(n): ''' Esta função calcula o fatorial de um número ''' if n == 0: return 1; return n * fatorial(n - 1)
from util.funcoes import fatorial
print fatorial.__doc__
Módulos externos
• Infelizmente Python não possui um procedimento padrão para instalação de módulos externos;
• Cada plataforma possui a sua estratégia;
• Veremos como fazer a instalação de um módulo PIL (Python Imaging Library);
• Este módulo possui funções para manipulação avançada de imagens.
Instalando o PILMacOSX - Snow Leopard
• É a instalação mais complicada !
• É necessário antes ter instalado o XCode, pacote de desenvolvimento da Apple que vem nos DVDs de instalação do Mac;
• É necessário fazer o download da libjpeg e do PIL:
• http://ethan.tira-thompson.org/Mac_OS_X_Ports.html
• http://www.pythonware.com/products/pil/
Instalando o PILMacOSX - Snow Leopard
• Instale a libjpeg (pacote dmg);
• Descompacte o PIL (Imaging-1.1.7.tar.gz);
• Dentro da pasta descompactada digite:
• sudo python setup.py build
• sudo python setup.py install
Instalando o PILUbuntu
• No terminal digite:
• sudo apt-get install python-imaging
• É só isso !
Instalando o PILWindows
• Faça o download do instalador para Windows no endereço:
• http://www.pythonware.com/products/pil/
• Execute o instalador:
• PIL-1.1.7.win32-py2.6.exe
• É só isso !
Configurando o PyDev• Para adicionar módulos externos ao seu projeto PyDev é
necessário:
• Clique com o botão direito do mouse sobre o projeto e escolha “Properties”;
• Selecione a sessão “PyDev - PYTHONPATH”;
• Selecione a aba “External Libraries”;
• Clique no botão “Add source folder”;
• Localize o diretório onde o PIL foi instalado:
• é sempre bom prestar atenção nos instaladores !
• Clique no botão “OK”.
Exemplo
• Crie um módulo chamado testepil:
import Image
im = Image.open(raw_input("Digite o caminho para uma imagem: "))print im.format, im.size, im.mode
ExemploCriando um thumbnail
import Image
tamanho = (128, 128)
entrada = raw_input("Digite o caminho para uma imagem: ")im = Image.open(entrada)im.thumbnail(tamanho)saida = raw_input("Digite o caminho para o thumbnail: ")im.save(saida, "JPEG")
Desafio para já
• Modifiquem o gerador de álbuns para:
• Gerar um thumbnail para cada foto;
• Exibir estes thumbnails na página do álbum;
• Bônus: O usuário deveria poder escolher o tamanho do thumbnail !
# -*- coding: latin-1 -*-import osimport Image
cabecalho = '''<html> <head><title></title></head> <body> <h1>%s</h1>'''corpo = '<a href="%s"><img src="%s"/></a>'rodape = '''</body></html>'''
diretorio = raw_input('Qual o diretório das imagens ?')formato = raw_input('Qual o formato das imagens ?')album = raw_input('Qual o nome do álbum ?')tamanho = int(raw_input('Qual o tamanho do thumbnail ?'))pagina = cabecalho % albumfor arquivo in os.listdir(diretorio): if arquivo.endswith(formato): #Geração do thumbnail arquivoThumb = arquivo.split('.')[0] + "_thumb.jpg" im = Image.open(os.path.join(diretorio, arquivo)) im.thumbnail((tamanho, tamanho)) im.save(os.path.join(diretorio, arquivoThumb), "JPEG") pagina += corpo % (arquivo, arquivoThumb)pagina += rodapearquivo = open(os.path.join(diretorio, "album.html"), "w")arquivo.write(pagina)arquivo.close()
Escrevendo nas imagens
import Image, ImageFont, ImageDraw
entrada = raw_input("Digite o caminho para uma imagem: ")im = Image.open(entrada)f = ImageFont.load_default()d = ImageDraw.Draw(im)d.text((0, 0), "Fotos de Bruno", font=f, fill="rgb(255,0,0)")im.save(entrada.split('.')[0] + "2.jpg", "JPEG")
Orientação a objetos
• Python é uma linguagem orientada a objetos;
• A conceito básico da orientação a objetos são as classes;
• A sintaxe para criar uma classe em Python é:
class NomeDaClasse:
corpo da classe
Exemplo
class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()
Exemplo
class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()
Definição da classe
Exemplo
class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()
Definição da classe
Método
Exemplo
class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()
Definição da classe
MétodoCriação de um objeto
Exemplo
class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()
Definição da classe
MétodoCriação de um objeto
Chamada de um método
Construtores• Objetos são criados através de um método especial
chamado de construtor;
• Toda classe possui pelo menos um construtor que será criado caso o programador não defina nenhum;
• O construtor em Python é definido pelo nome __init__:
class Pessoa: def __init__(self, nome): self.nome = nome def qualSeuNome(self): print self.nome
E o self ?
• Self é uma referência para o próprio objeto;
• Sempre o primeiro parâmetro de um método é self (com exceção de métodos de classe - estáticos);
• Parâmetros de classes são definidos dinamicamente dentro dos métodos e não no corpo das classes.
Polimorfismo ?
• Poli o quê ?
• Em linguagens tradicionais (Java, C++ e C#) é possível definir métodos com o mesmo nome e assinaturas diferentes;
• Em Python isto não é possível pois os métodos têm parâmetros opcionais.
Exemplo
class Pessoa: def __init__(self, nome= "Fulano"): self.nome = nome def qualSeuNome(self): print self.nome p1 = Pessoa()p1.qualSeuNome()
p2 = Pessoa("Bruno")p2.qualSeuNome()
Exemploclass Pessoa: def __init__(self, nome=None): if nome: self.nome = nome else: self.nome = "Fulano" def qualSeuNome(self): print self.nome p1 = Pessoa()p1.qualSeuNome()
p2 = Pessoa("Bruno")p2.qualSeuNome()
Exemploclass Pessoa: def __init__(self, nome=None): if nome: self.nome = nome else: self.nome = "Fulano" def qualSeuNome(self): print self.nome p1 = Pessoa()p1.qualSeuNome()
p2 = Pessoa("Bruno")p2.qualSeuNome()
Valor nulo (vazio)
Exemploclass Pessoa: def __init__(self, nome=None): if nome: self.nome = nome else: self.nome = "Fulano" def qualSeuNome(self): print self.nome p1 = Pessoa()p1.qualSeuNome()
p2 = Pessoa("Bruno")p2.qualSeuNome()
Valor nulo (vazio)
Equivalente a null ou nil
Exemploclass Pessoa: def __init__(self, nome=None): if nome: self.nome = nome else: self.nome = "Fulano" def qualSeuNome(self): print self.nome p1 = Pessoa()p1.qualSeuNome()
p2 = Pessoa("Bruno")p2.qualSeuNome()
Valor nulo (vazio)
O if assim testa se o valor é diferente de None
Equivalente a null ou nil
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Atributo de classe
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Atributo de classe
Acessando o atributo
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Atributo de classe
Acessando o atributo
Modificador de método
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Atributo de classe
Acessando o atributo
Modificador de método
Não tem self
Métodos e Atributos de classe (estáticos)class Pessoa: qtd = 0 def __init__(self, nome): self.nome = nome Pessoa.qtd += 1 def qualSeuNome(self): print self.nome
@staticmethod def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano")p2 = Pessoa("Bruno")p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
Atributo de classe
Acessando o atributo
Modificador de método
Não tem self
Acessando método estático
Herança
• Uma classe pode herdar os métodos e atributos de outras;
• A intenção é reusar código;
• Python suporta herança simples e composta;
• A forma geral é a seguinte:
class NomeClasse(Super1, Super2, Super3):
corpo da classe
Exemploimport math
class FormaGeometrica: def __init__(self, tamanhoLado): self.tamanhoLado = tamanhoLado def calculaArea(self): pass
class Triangulo(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado * math.sqrt(2) / 4
class Quadrado(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado t = Triangulo(4)q = Quadrado(2)
print str(t.calculaArea())print str(q.calculaArea())
Exemploimport math
class FormaGeometrica: def __init__(self, tamanhoLado): self.tamanhoLado = tamanhoLado def calculaArea(self): pass
class Triangulo(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado * math.sqrt(2) / 4
class Quadrado(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado t = Triangulo(4)q = Quadrado(2)
print str(t.calculaArea())print str(q.calculaArea())
pass é uma instrução que não faz nada !está aqui pois todo método precisa de um corpo
Exemploimport math
class FormaGeometrica: def __init__(self, tamanhoLado): self.tamanhoLado = tamanhoLado def calculaArea(self): pass
class Triangulo(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado * math.sqrt(2) / 4
class Quadrado(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado t = Triangulo(4)q = Quadrado(2)
print str(t.calculaArea())print str(q.calculaArea())
pass é uma instrução que não faz nada !está aqui pois todo método precisa de um corpo
note que não foi definido um construtor
Exemploimport math
class FormaGeometrica: def __init__(self, tamanhoLado): self.tamanhoLado = tamanhoLado def calculaArea(self): pass
class Triangulo(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado * math.sqrt(2) / 4
class Quadrado(FormaGeometrica): def calculaArea(self): return self.tamanhoLado * self.tamanhoLado t = Triangulo(4)q = Quadrado(2)
print str(t.calculaArea())print str(q.calculaArea())
pass é uma instrução que não faz nada !está aqui pois todo método precisa de um corpo
note que não foi definido um construtor
chamando o construtor da superclasse
Erros e Exceções• O tratamento de erros em Python é feito através do
tratamento de exceções;
• A idéia é a seguinte:
• o código que encontra um erro lança uma exceção;
• a execução do programa é interrompida no ponto onde a exceção foi lançada;
• o código continua em um bloco de tratamento de exceções, caso exista;
• se não existir, o programa será interrompido.
Exemplo
# -*- coding: latin-1 -*-idade = 0
while True: try: idade = int(raw_input("Digite a sua idade: ")) break except ValueError: print "Você deve digitar um número válido !" print "A sua idade é %d" % idade
Exemplo
# -*- coding: latin-1 -*-idade = 0
while True: try: idade = int(raw_input("Digite a sua idade: ")) break except ValueError: print "Você deve digitar um número válido !" print "A sua idade é %d" % idade
só será executado caso não haja uma exceção
Exemplo
# -*- coding: latin-1 -*-idade = 0
while True: try: idade = int(raw_input("Digite a sua idade: ")) break except ValueError: print "Você deve digitar um número válido !" print "A sua idade é %d" % idade
só será executado caso não haja uma exceção
só será executado caso haja uma exceção
Sugestão• Se em um programa você precisar ler mais
de uma vez um valor inteiro do teclado, crie uma função:
# -*- coding: latin-1 -*-def lerInteiro(mensagem, mensagemErro="Você deve digitar um número válido !"): valor = 0 while True: try: valor = int(raw_input(mensagem)) break except ValueError: print mensagemErro return valor
idade = lerInteiro("Digite a sua idade: ")print "A sua idade é %d" % idade
Qual exceção devo tratar ?
• Como descobrir o nome da exceção ?
• É só provocar o seu lançamento !
• Por exemplo, execute o programa abaixo, digite uma letra e veja a sua saída:idade = int(raw_input("Digite a sua idade: "))
Traceback (most recent call last): File "/Users/brunocatao/Documents/workspace/Aula1/src/excecoes.py", line 2, in <module> idade = int(raw_input("Digite a sua idade: "))ValueError: invalid literal for int() with base 10: 'a'
Qual exceção devo tratar ?
• Como descobrir o nome da exceção ?
• É só provocar o seu lançamento !
• Por exemplo, execute o programa abaixo, digite uma letra e veja a sua saída:idade = int(raw_input("Digite a sua idade: "))
Traceback (most recent call last): File "/Users/brunocatao/Documents/workspace/Aula1/src/excecoes.py", line 2, in <module> idade = int(raw_input("Digite a sua idade: "))ValueError: invalid literal for int() with base 10: 'a'
nome da exceção !