Upcoming SlideShare
×

# Python 03

1,086 views

Published on

Continuação do curso de Python:

Published in: Technology
0 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

• Be the first to like this

Views
Total views
1,086
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
54
0
Likes
0
Embeds 0
No embeds

No notes for slide
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• \n
• ### Python 03

1. 1. Python - 3ª Aula Bruno Gama Catão
2. 2. Relembrando ...• Na aula passada vimos: • Como criar funções; • Listas, tuplas, conjuntos e dicionários; • Módulos random, urllib2 e zipﬁle.
3. 3. Funçõesdef fatorial(n): if n == 0: return 1; return n * fatorial(n - 1)#Chamando a funcaoprint str(fatorial(5))
4. 4. 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]
5. 5. 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
6. 6. Conjuntos# Lista de comprascompras = [laranja, uva, maca, uva]# Verificando quais frutas foram compradasfrutas = set(compras)print frutas
7. 7. Dicionáriosaluno = {"nome" : "Bruno", "curso" : "SI", "media" : 8.2};print "%s - %.2f" % (aluno["nome"], aluno["media"])
8. 8. Módulo randomimport random#Sorteando as dezenasdezenas = random.sample(range(1, 61), 6)#Ordenandodezenas.sort()print dezenas
9. 9. Módulo urllib2import urllib2url = raw_input(Digite a URL: )print urllib2.urlopen(url).readlines()
10. 10. Módulo zipﬁle# -*- coding: latin-1 -*-from zipfile import ZipFilearquivo = raw_input(Digite o nome do arquivo: )diretorio = raw_input(Digite o diretório de destino: )zip = ZipFile(arquivo)zip.extractall(diretorio)
11. 11. Resposta ao desaﬁo# -*- coding: latin-1 -*-import osarquivo = 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()
12. 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. 13. Exemplo• Criem um novo projeto PyDev chamado Aula3;• Criem dois módulos: • funcoes; • principal.
14. 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. 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. 16. Módulo “principal”# -*- coding: latin-1 -*-import funcoesn = 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. 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. 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. 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. 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. 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. 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. 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. 24. Exemplo• Vamos modiﬁcar 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. 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. 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. 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. 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. 29. Modiﬁcando 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. 30. Modiﬁcando 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. 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. 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. 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. 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. 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. 36. 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
37. 37. Instalando o PIL Ubuntu• No terminal digite: • sudo apt-get install python-imaging• É só isso !
38. 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. 39. Conﬁgurando 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. 40. Exemplo • Crie um módulo chamado testepil:import Imageim = Image.open(raw_input("Digite o caminho para uma imagem: "))print im.format, im.size, im.mode
41. 41. Exemplo Criando um thumbnailimport Imagetamanho = (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. 42. Desaﬁo para já• Modiﬁquem 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 !
43. 43. # -*- coding: latin-1 -*-import osimport Imagecabecalho = <html> <head><title></title></head> <body> <h1>%s</h1>corpo = <a href="%s"><img src="%s"/></a>rodape = </body></html>
44. 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 % 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()
45. 45. Escrevendo nas imagensimport Image, ImageFont, ImageDrawentrada = 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. 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. 47. Exemploclass Pessoa: def qualSeuNome(self): print "Bruno"p = Pessoa();p.qualSeuNome()
48. 48. Exemplo Deﬁnição da classeclass Pessoa: def qualSeuNome(self): print "Bruno"p = Pessoa();p.qualSeuNome()
49. 49. Exemplo Deﬁnição da classeclass Pessoa: def qualSeuNome(self): print "Bruno" Métodop = Pessoa();p.qualSeuNome()
50. 50. Exemplo Deﬁnição da classe class Pessoa: def qualSeuNome(self):Criação de um objeto print "Bruno" Método p = Pessoa(); p.qualSeuNome()
51. 51. Exemplo Deﬁniçã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. 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 deﬁna nenhum;• O construtor em Python é deﬁnido pelo nome __init__: class Pessoa: def __init__(self, nome): self.nome = nome def qualSeuNome(self): print self.nome
53. 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 deﬁnidos dinamicamente dentro dos métodos e não no corpo das classes.
54. 54. Polimorﬁsmo ?• Poli o quê ? • Em linguagens tradicionais (Java, C++ e C#) é possível deﬁnir 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.
55. 55. Exemploclass Pessoa: def __init__(self, nome= "Fulano"): self.nome = nome def qualSeuNome(self): print self.nomep1 = Pessoa()p1.qualSeuNome()p2 = Pessoa("Bruno")p2.qualSeuNome()
56. 56. Exemploclass Pessoa: def __init__(self, nome=None): if nome: self.nome = nome else: self.nome = "Fulano" def qualSeuNome(self): print self.nomep1 = Pessoa()p1.qualSeuNome()p2 = Pessoa("Bruno")p2.qualSeuNome()
57. 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.nomep1 = Pessoa()p1.qualSeuNome()p2 = Pessoa("Bruno")p2.qualSeuNome()
58. 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.nomep1 = Pessoa()p1.qualSeuNome()p2 = Pessoa("Bruno")p2.qualSeuNome()
59. 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. 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. 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. 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. 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 Modiﬁcador de método def quantidadePessoas(): return Pessoa.qtd p1 = Pessoa("Fulano") p2 = Pessoa("Bruno") p3 = Pessoa("Beltrano") print str(Pessoa.quantidadePessoas())
64. 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 Modiﬁcador 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. 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 Modiﬁcador 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. 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