Python 03

77
Python - 3ª Aula Bruno Gama Catão

Transcript of Python 03

Page 1: Python 03

Python - 3ª AulaBruno Gama Catão

Page 2: Python 03

Relembrando ...

• Na aula passada vimos:

• Como criar funções;

• Listas, tuplas, conjuntos e dicionários;

• Módulos random, urllib2 e zipfile.

Page 3: Python 03

Funções

def fatorial(n): if n == 0: return 1; return n * fatorial(n - 1)

#Chamando a funcaoprint str(fatorial(5))

Page 4: Python 03

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]

Page 5: Python 03

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

Page 6: Python 03

Conjuntos

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

print frutas

Page 7: Python 03

Dicionários

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

print "%s - %.2f" % (aluno["nome"], aluno["media"])

Page 8: Python 03

Módulo randomimport random

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

#Ordenandodezenas.sort()

print dezenas

Page 9: Python 03

Módulo urllib2

import urllib2

url = raw_input('Digite a URL: ')print urllib2.urlopen(url).readlines()

Page 10: Python 03

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)

Page 11: Python 03

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()

Page 12: Python 03

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.

Page 13: Python 03

Exemplo

• Criem um novo projeto PyDev chamado Aula3;

• Criem dois módulos:

• funcoes;

• principal.

Page 14: Python 03

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)

Page 15: Python 03

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 ?

Page 16: Python 03

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))

Page 17: Python 03

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>

Page 18: Python 03

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

Page 19: Python 03

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))

Page 20: Python 03

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|*>

Page 21: Python 03

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 !

Page 22: Python 03

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))

Page 23: Python 03

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 !

Page 24: Python 03

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 !'

Page 25: Python 03

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 ?

Page 26: Python 03

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 !'

Page 27: Python 03

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.

Page 28: Python 03

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.

Page 29: Python 03

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))

Page 30: Python 03

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|*>

Page 31: Python 03

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 !"

Page 32: Python 03

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.

Page 33: Python 03

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__

Page 34: Python 03

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.

Page 35: Python 03

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/

Page 36: Python 03

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

Page 37: Python 03

Instalando o PILUbuntu

• No terminal digite:

• sudo apt-get install python-imaging

• É só isso !

Page 38: Python 03

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 !

Page 39: Python 03

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”.

Page 40: Python 03

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

Page 41: Python 03

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")

Page 42: Python 03

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 !

Page 43: Python 03

# -*- 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>'''

Page 44: Python 03

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()

Page 45: Python 03

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")

Page 46: Python 03

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

Page 47: Python 03

Exemplo

class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()

Page 48: Python 03

Exemplo

class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()

Definição da classe

Page 49: Python 03

Exemplo

class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()

Definição da classe

Método

Page 50: Python 03

Exemplo

class Pessoa: def qualSeuNome(self): print "Bruno" p = Pessoa();p.qualSeuNome()

Definição da classe

MétodoCriação de um objeto

Page 51: Python 03

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

Page 52: Python 03

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

Page 53: Python 03

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.

Page 54: Python 03

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.

Page 55: Python 03

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()

Page 56: Python 03

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()

Page 57: Python 03

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)

Page 58: Python 03

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

Page 59: Python 03

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

Page 60: Python 03

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())

Page 61: Python 03

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

Page 62: Python 03

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

Page 63: Python 03

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

Page 64: Python 03

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

Page 65: Python 03

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

Page 66: Python 03

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

Page 67: Python 03

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())

Page 68: Python 03

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

Page 69: Python 03

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

Page 70: Python 03

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

Page 71: Python 03

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.

Page 72: Python 03

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

Page 73: Python 03

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

Page 74: Python 03

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

Page 75: Python 03

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

Page 76: Python 03

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'

Page 77: Python 03

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 !