Python - 3ª Aula
   Bruno 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 funcao
print 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 simples
telefone = (83, 33102222)
print 'Telefone (%d) %d' % telefone

#Lista de tuplas
telefones = [(83, 33332222), (84, 32215678)]
for tel in telefones:
    print 'Telefone (%d) %d' % tel
Conjuntos

# Lista de compras
compras = ['laranja', 'uva', 'maca', 'uva']
# Verificando quais frutas foram compradas
frutas = set(compras)

print frutas
Dicionários


aluno = {"nome" : "Bruno", "curso" : "SI", "media" : 8.2};

print "%s - %.2f" % (aluno["nome"], aluno["media"])
Módulo random
import random

#Sorteando as dezenas
dezenas = random.sample(range(1, 61), 6)

#Ordenando
dezenas.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 % 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()
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”
                       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)
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            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))
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
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
               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))
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 !
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
            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))
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.
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:
 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__
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 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/
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
Instalando o PIL
           Ubuntu

• No terminal digite:
 • sudo apt-get install python-imaging
• É só isso !
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 !
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
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")
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 os
import 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 % 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()
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
             Definição da classe

class Pessoa:
    def qualSeuNome(self):
        print "Bruno"

p = Pessoa();
p.qualSeuNome()
Exemplo
             Definição da classe

class Pessoa:
    def qualSeuNome(self):
        print "Bruno"
                                  Método
p = Pessoa();
p.qualSeuNome()
Exemplo
                               Definição da classe

                   class Pessoa:
                       def qualSeuNome(self):
Criação de um objeto       print "Bruno"
                                                    Método
                 p = Pessoa();
                 p.qualSeuNome()
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
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()
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()
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()
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()
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()
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:
                          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())
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())
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())
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())
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())
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
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())
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())
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())
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())
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          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
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
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 !

Python 03

  • 1.
    Python - 3ªAula Bruno Gama Catão
  • 2.
    Relembrando ... • Naaula passada vimos: • Como criar funções; • Listas, tuplas, conjuntos e dicionários; • Módulos random, urllib2 e zipfile.
  • 3.
    Funções def fatorial(n): if n == 0: return 1; return n * fatorial(n - 1) #Chamando a funcao print str(fatorial(5))
  • 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.
    Tuplas #tupla simples telefone =(83, 33102222) print 'Telefone (%d) %d' % telefone #Lista de tuplas telefones = [(83, 33332222), (84, 32215678)] for tel in telefones: print 'Telefone (%d) %d' % tel
  • 6.
    Conjuntos # Lista decompras compras = ['laranja', 'uva', 'maca', 'uva'] # Verificando quais frutas foram compradas frutas = set(compras) print frutas
  • 7.
    Dicionários aluno = {"nome": "Bruno", "curso" : "SI", "media" : 8.2}; print "%s - %.2f" % (aluno["nome"], aluno["media"])
  • 8.
    Módulo random import random #Sorteandoas dezenas dezenas = random.sample(range(1, 61), 6) #Ordenando dezenas.sort() print dezenas
  • 9.
    Módulo urllib2 import urllib2 url= raw_input('Digite a URL: ') print urllib2.urlopen(url).readlines()
  • 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 umnovo projeto PyDev chamado Aula3; • Criem dois módulos: • funcoes; • principal.
  • 14.
    Módulo “funcoes” deffatorial(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 seimporta 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 modificaro 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 ... • Ese 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ãodiretó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 umPyDev 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çãode 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óduloutil.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 • InfelizmentePython 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 !
  • 43.
    # -*- coding:latin-1 -*- import os import Image cabecalho = '''<html> <head><title></title></head> <body> <h1>%s</h1>''' corpo = '<a href="%s"><img src="%s"/></a>' rodape = '''</body> </html>'''
  • 44.
    diretorio = raw_input('Qualo 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 importImage, 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ãocriados 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 ? • Polio 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.
  • 55.
    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()
  • 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 Atributosde 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 Atributosde 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 Atributosde 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 Atributosde 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 Atributosde 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 Atributosde 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 classepode 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 !