10. 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)
11. 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 % album
for arquivo in os.listdir(diretorio):
if arquivo.endswith(formato):
pagina += corpo % (arquivo, arquivo)
pagina += rodape
arquivo = open(os.path.join(diretorio, "album.html"), "w")
arquivo.write(pagina)
arquivo.close()
12. 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.
13. Exemplo
• Criem um novo projeto PyDev chamado
Aula3;
• Criem dois módulos:
• funcoes;
• principal.
14. 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)
15. Módulo “funcoes”
Lembram de recursividade ?
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)
16. 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))
17. Módulo “principal”
# -*- coding: latin-1 -*-
import funcoes import <nome_modulo>
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))
18. Módulo “principal”
# -*- coding: latin-1 -*-
import funcoes import <nome_modulo>
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))
nome_modulo.funcao
19. 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))
20. Outras formas de
importação
from <nome_modulo> import <parte|*>
# -*- 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))
21. Outras formas de
importação
from <nome_modulo> import <parte|*>
# -*- 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))
sem o nome do módulo !
22. 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))
23. 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 !
24. 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 !'
25. 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 ?
26. 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 !'
27. 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.
28. 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.
29. 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))
30. Modificando o módulo
principal
from <pacote>.<nome_modulo> import <parte|*>
# -*- 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))
31. E o __init__ ?
• Vamos adicionar algum conteúdo a este
módulo para ver o seu funcionamento:
print "Pacote util carregado !"
• Agora, executem novamente o módulo
principal.
32. 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.
33. Exemplo
• No módulo util.funcoes:
def fatorial(n):
'''
Esta função calcula o fatorial de um número
'''
if n == 0:
return 1;
return n * fatorial(n - 1)
• Módulo principal:
from util.funcoes import fatorial
print fatorial.__doc__
34. 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.
35. Instalando o PIL
MacOSX - 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/
36. Instalando o PIL
MacOSX - 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
37. Instalando o PIL
Ubuntu
• No terminal digite:
• sudo apt-get install python-imaging
• É só isso !
38. Instalando o PIL
Windows
• 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 !
39. 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”.
40. 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
41. Exemplo
Criando 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")
42. 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 !
44. 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 % album
for 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 += rodape
arquivo = open(os.path.join(diretorio, "album.html"), "w")
arquivo.write(pagina)
arquivo.close()
45. 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")
46. 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
47. Exemplo
class Pessoa:
def qualSeuNome(self):
print "Bruno"
p = Pessoa();
p.qualSeuNome()
48. Exemplo
Definição da classe
class Pessoa:
def qualSeuNome(self):
print "Bruno"
p = Pessoa();
p.qualSeuNome()
49. Exemplo
Definição da classe
class Pessoa:
def qualSeuNome(self):
print "Bruno"
Método
p = Pessoa();
p.qualSeuNome()
50. Exemplo
Definição da classe
class Pessoa:
def qualSeuNome(self):
Criação de um objeto print "Bruno"
Método
p = Pessoa();
p.qualSeuNome()
51. Exemplo
Definição da classe
class Pessoa:
def qualSeuNome(self):
Criação de um objeto print "Bruno"
Método
p = Pessoa();
p.qualSeuNome()
Chamada de um método
52. 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
53. 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.
54. 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.
56. Exemplo
class 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()
57. Exemplo Valor nulo (vazio)
class 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()
58. Exemplo Valor nulo (vazio)
class Pessoa:
def __init__(self, nome=None):
if nome:
self.nome = nome Equivalente a null ou nil
else:
self.nome = "Fulano"
def qualSeuNome(self):
print self.nome
p1 = Pessoa()
p1.qualSeuNome()
p2 = Pessoa("Bruno")
p2.qualSeuNome()
59. Exemplo Valor nulo (vazio)
class Pessoa:
def __init__(self, nome=None):
if nome:
O if assim testa se o valor self.nome = nome Equivalente a null ou nil
é diferente de None else:
self.nome = "Fulano"
def qualSeuNome(self):
print self.nome
p1 = Pessoa()
p1.qualSeuNome()
p2 = Pessoa("Bruno")
p2.qualSeuNome()
60. 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())
61. Métodos e Atributos de classe (estáticos)
class Pessoa:
Atributo de classe
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())
62. Métodos e Atributos de classe (estáticos)
class Pessoa:
Atributo de classe
qtd = 0
def __init__(self, nome):
self.nome = nome
Pessoa.qtd += 1
Acessando o atributo
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())
63. Métodos e Atributos de classe (estáticos)
class Pessoa:
Atributo de classe
qtd = 0
def __init__(self, nome):
self.nome = nome
Pessoa.qtd += 1
Acessando o atributo
def qualSeuNome(self):
print self.nome
@staticmethod
Modificador de método
def quantidadePessoas():
return Pessoa.qtd
p1 = Pessoa("Fulano")
p2 = Pessoa("Bruno")
p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
64. Métodos e Atributos de classe (estáticos)
class Pessoa:
Atributo de classe
qtd = 0
def __init__(self, nome):
self.nome = nome
Pessoa.qtd += 1
Acessando o atributo
def qualSeuNome(self):
print self.nome
@staticmethod
Modificador de método
def quantidadePessoas():
return Pessoa.qtd
Não tem self
p1 = Pessoa("Fulano")
p2 = Pessoa("Bruno")
p3 = Pessoa("Beltrano")
print str(Pessoa.quantidadePessoas())
65. Métodos e Atributos de classe (estáticos)
class Pessoa:
Atributo de classe
qtd = 0
def __init__(self, nome):
self.nome = nome
Pessoa.qtd += 1
Acessando o atributo
def qualSeuNome(self):
print self.nome
@staticmethod
Modificador de método
def quantidadePessoas():
return Pessoa.qtd
Não tem self
p1 = Pessoa("Fulano")
p2 = Pessoa("Bruno")
p3 = Pessoa("Beltrano") Acessando método estático
print str(Pessoa.quantidadePessoas())
66. 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
67. import math
Exemplo
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())
68. import math
Exemplo
class FormaGeometrica:
def __init__(self, tamanhoLado):
self.tamanhoLado = tamanhoLado
def calculaArea(self): pass é uma instrução que não faz nada !
pass está aqui pois todo método precisa de um corpo
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())
69. import math
Exemplo
class FormaGeometrica:
def __init__(self, tamanhoLado):
self.tamanhoLado = tamanhoLado
def calculaArea(self): pass é uma instrução que não faz nada !
pass está aqui pois todo método precisa de um corpo
class Triangulo(FormaGeometrica):
note que não foi definido um construtor
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())
70. import math
Exemplo
class FormaGeometrica:
def __init__(self, tamanhoLado):
self.tamanhoLado = tamanhoLado
def calculaArea(self): pass é uma instrução que não faz nada !
pass está aqui pois todo método precisa de um corpo
class Triangulo(FormaGeometrica):
note que não foi definido um construtor
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)
chamando o construtor da superclasse
q = Quadrado(2)
print str(t.calculaArea())
print str(q.calculaArea())
71. 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.
72. 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
73. Exemplo
# -*- coding: latin-1 -*-
idade = 0
while True:
try:
idade = int(raw_input("Digite a sua idade: "))
break só será executado caso não haja uma exceção
except ValueError:
print "Você deve digitar um número válido !"
print "A sua idade é %d" % idade
74. Exemplo
# -*- coding: latin-1 -*-
idade = 0
while True:
try:
idade = int(raw_input("Digite a sua idade: "))
break só será executado caso não haja uma exceção
except ValueError:
print "Você deve digitar um número válido !"
print "A sua idade é %d" % idade
só será executado
caso haja uma exceção
75. 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
76. 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'
77. 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 !