Você está na página 1de 167

Alberto Araujo Serrajordia Lopes Receita Federal do Brasil 2011

Referncia Bibliogrfica
Sugesto de leitura

Lutz, M. e Ascher, D. Aprendendo Python, 2 ed. Bookman

Borges, L. E. Python para desenvolvedores http://ark4n.wordpress.com/python/ Pilgrim, M. Dive into Python http://diveintopython.org/ Tutorial do Python em http://docs.python.org/tutorial/ Demais materiais referenciados em http://www.python.org/doc/, em especial os documentos em portugus em http://wiki.python.org/moin/PortugueseLanguage

PortablePython
Disponvel em http://www.portablepython.com Pegar a verso 2.6 Executar o instalador, e escolher uma pasta Aps a execuo do instalador, a pasta escolhida ter uma instalao completa do Python
A pasta pode ser colocada num Pendrive e transportada vontade

Para executar a ferramenta de programao, d clique duplo no programa SPE-Portable.exe

Criada e conduzida por Guido von Rossum Mantida atualmente pela Python Software Foundation, em um processo comunitrio
Mudanas fundamentais so discutidas em comunidade Aprovao final das mudanas revisada pelo criador

O nome Python vem do grupo de humor ingls Monty Python


H diversas referncias no universo Python ao programa Monty Python Flying Circus

# -*- coding: latin-1 -*import sys print u"Bem vindo ao Python, verso %s" % sys.version print u"Digite um nmero inteiro:", n = int(raw_input()) for i in range(n): print u"Mensagem %s" % i print u"Obrigado, e at logo!"

Criao do programa em Python


.py

Compilao
.pyc

Execuo do cdigo interpretado

Realizados automaticamente pelo executvel python.exe

Supondo que meu programa esteja salvo no arquivo modulo1.py Chamo o interpretador de comandos Executo o comando python modulo1.py
Meu programa ser automaticamente compilado O cdigo compilado ser automaticamente executado

Clareza e simplicidade do cdigo Portabilidade Multi-propsito Multi-paradigma Linguagem Dinmica Interoperabilidade com outras linguagens Alegria para o desenvolvedor

Eliminao de delimitadores de bloco Recuo sinttico Tipagem dinmica Gerenciamento de memria automtico Parmetros default

Modelo de execuo baseado em mquina virtual Para executar em certa plataforma, basta haver um interpretador Python disponvel
Windows, MAC, Linux, Unix bsicos Jython Python para Java IronPython Python para .NET

Python inicialmente foi criada para ser usada como linguagem de script de shell, no sistema operacional Amoeba Atualmente, pode ser usada em diversos domnios de aplicao

Python usada hoje entre outros no Youtube e no Google

Aplicativos desktop (Tk/Tcl, wxPython, Jython , IronPython) Aplicativos web (executando como CGI ou mdulo no Apache, ou com um framework como Pylons , Django, Grok) Web Services

Python suporta construes principalmente nos paradigmas de programao


Imperativa (estruturada)
Funes, estruturas de controle, mdulos

Orientada a objetos
Classes, objetos

Funcional
Manipulao de listas

Uma das principais vantagens o aproveitamento das melhores estruturas de cada paradigma

No Python, tudo um objeto No Python, tudo ocorre em tempo de execuo Os objetos no Python possuem uma estrutura dinmica
Atributos podem ser acrescentados em tempo de execuo Classes podem ser modificadas em tempo de execuo

A linguagem incentiva a programao dinmica e reflexiva

Mdulos do Python podem ser implementados em cdigo executvel

Programas em Python podem realizar chamadas ao sistema operacional, iniciar processos, etc. Implementaes da Mquina Virtual Python em outras tecnologias podem oferecer acesso a bibliotecas

E, portanto, escrito em linguagens como C++, C, etc.

Programas em Python que rodam em Jython tm acesso biblioteca padro Java Programas em Python que rodam em IronPython tm acesso s bibliotecas do .NET Framework

A disponibilidade do interpretador interativo facilita o aprendizado


Pequenas experincias podem ser feitas desde o comeo

A clareza de cdigo facilita o entendimento A dispensa de processamento do cdigo fonte (compilao, ligao, etc.) acelera o ciclo de desenvolvimento

A tipagem dinmica pode dificultar a documentao e o entendimento de um sistema de maior tamanho e complexidade
A presena de declaraes de tipos poderia funcionar como

O fato da linguagem ser dinmica dificulta a programao com base em contratos Sintaxe focada de programa a torna menos atraente para programao web do que PHP (de sintaxe focada em template) Ausncia de bons ambientes de desenvolvimento integrado vinha dificultando sua adoo Ecossistema de menor alcance do que alternativas como Java, PHP ou .NET
A ausncia do suporte a interfaces na linguagem, por exemplo, torna menos formal a declarao de componentes

documentao compulsria

Python especialmente adequada para

Python no especialmente recomendada para

Automao de tarefas de administrao (como linguagem de scripts) Tarefas de manipulao de listas ou dicionrios Sistemas de complexidade pequena ou mdia, desenvolvidos com metodologia sem grande nfase em testes Criao de sistemas complexos onde no h grande nfase no projeto da arquitetura, ou onde no haja uma metodologia de testes implementada Criao de sistemas com arquitetura baseada em componentes, salvo excees, como webservices ou Zope3

Executando o Interpretador interativo


Use CTRL+Z para sair No prompt >>> voc tem duas opes
Digitar um comando Digitar uma expresso

As expresses so avaliadas e o resultado apresentado na linha abaixo, como a representao do resultado Os comandos so executados, afetando o ambiente de execuo

Expresses aritmticas
+, -, *, /,

Expresses de comparao
>, <, >=, <=, ==, !=

Expresses lgicas
and, or, not

Inteiros (long da linguagem C)


Longos (preciso arbitrria) Ponto flutuante
0,123,4444,231 0L, 231L, 4444L (o L pode ser mnusculo, mas bom evitar) 1.23, 444.4, 123.4e+56

Inteiros podem ser em hexa ou octal Nmeros complexos


1+2j alberto, araujo 0xFF, 0xbabaca, 0123, 02222, 010

Strings (delimitados com aspas ou apstrofos)

Booleans

Referncia a nenhum objeto


None

True ou False (mas o Python considera como verdadeiro, alm de True, qualquer valor diferente de 0, None, ou estruturas de dados vazias)

print (comando da linguagem)

raw_input (funo da linguagem)

A expresso depois do print avaliada e o resultado, impresso na sada padro NO a mesma coisa que a representao do resultado Se o print terminar com uma vrgula, no h quebra de linha ao final (s um espao) Se aps o print houver expresses separadas por vrgula, todas sero impressas, separadas por espao

uma funo cujo parmetro um string (prompt) O retorno string Voc pode converter com as funes da linguagem int, float, bool, longpyth

Atualizado: literais de complexos

Comentrios

Espaos em branco e tabulaes so ignorados, exceto no comeo da linha (quando marcam o recuo sinttico) Uma linha lgica pode ser dividida em duas linhas fsicas se for terminada por um caracter \ fora de um literal string
Lembre-se de manter o recuo sinttico consistente por todo o bloco

Iniciam-se no caracter # (fora de um literal string) e vo at o final da linha

# -*- coding: <encoding-name> -*-

A linha lgica tambm continua se a linha fsica termina em uma lista (parmetros de uma funo, por exemplo) Ou ainda, se termina em um literal string de delimitadores triplos no fechado usado para indicar a codificao do arquivo fonte

Os Strings no Python so delimitados com apstrofo ou aspas


Isso para permitir mais facilmente usar tais delimitadores dentro de strings: Eat at Joes, Ento ele disse: Quem voc?

No pode haver quebras de linhas, a no ser que os strings sejam delimitados por aspas

ou apstrofos triplos

""" Sobre este documento O Python uma linguagem muito boa """

Os strings pode ser prefixados por u ou r


u"Este um literal unicode" r"Este um literal de string cru (no interpreta \)" ru"Este um literal unicode cru

Strings podem ser convertidos de e para unicode com as funes internas str e unicode

Escape Sequence \newline \\ \' \" \a \b \f \n \N{name} \r \t \uxxxx

Meaning Ignored Backslash (\) Single quote (') Double quote (") ASCII Bell (BEL) ASCII Backspace (BS) ASCII Formfeed (FF) ASCII Linefeed (LF) Character named name in the Unicode database (Unicode only) ASCII Carriage Return (CR) ASCII Horizontal Tab (TAB) Character with 16bit hex value xxxx (Unicode only) Character with 32bit hex value xxxxxxxx (Uni code only) ASCII Vertical Tab (VT) Character with octal value ooo Character with hex value hh

Notes

(1)

\Uxxxxxxxx \v \ooo \xhh

(2)

Notes: 1. Individual code units which form parts of a surrogate pair can be encoded using this escape sequence. 2. Any Unicode character can be encoded this way, but characters outside the Basic Multilingual Plane (BMP) will be encoded using a surrogate pair if Python is compiled to use 16-bit code units (the default). Individual code units which form parts of a surrogate pair can be encoded using this escape sequence. 3. As in Standard C, up to three octal digits are accepted. 4. Unlike in Standard C, exactly two hex digits are required. 5. In a string literal, hexadecimal and octal escapes denote the byte with the given value; it is not necessary that the byte encodes a character in the source character set. In a Unicode literal, these escapes denote a Unicode character with the given value.

(3,5) (4,5)

um string (no unicode) que descreve o objeto No caso de tipos numricos, normalmente a forma como o objeto seria escrito como literal No caso de valores string, o prprio string (com escapes se possuir caracteres especiais) No caso de objetos, o resultado da chamada de um mtodo chamado __repr__ no objeto
A diferena entre os mtodos str e repr que aquele busca gerar strings mais legveis, e o repr busca criar strings prximos de literais
Por exemplo um objeto do tipo Janela poderia ter uma repr como <Objeto Janela centralizado com ttulo Principal> Mas veja, por exemplo, que a representao do nmero 6,2x1023 6.1999999999999994e+23

Concatenao
alfa + beta, Hello + world Note que dois literais string justapostos subentende-se como concatenados, como Mar portuguez

Repetio
Liga*30

Busca simples
dado in soldado

Os strings podem ser manipulados com o operador de indexao


alberto[2] retorna b

Mas isso no pode ser usado para alterar o string


Strings so considerados imutveis!

Os valores de ndice sempre comeam com 0 O operador de indexao no Python muito poderoso, possuindo diversas opes:

(Para todos os exemplos, considere que inicialmente a varivel alfa possui o string abcdefghijklmnopqrstuvwxyz)

Obteno de um determinado elemento


alfa[10] retorna k

ndices negativos: -1 considerado o ltimo elemento Indicar um nico ndice fora do tamanho do string d erro Dois ndices separados por dois pontos retornam um substring incluindo o caracter do primeiro ndice mas no incluindo o caracter do segundo ndice
alfa[2:10] retorna cdefghij alfa[-24:-16] tambm retorna cdefghij alfa[300] ou alfa[-27] do erro alfa[-1] retorna z, alfa[-26] retorna a

Se o primeiro ndice corresponder a um caracter posterior ao do primeiro ndice, nada retornado


Se o segundo ndice um valor alm dos limites, o resultado o mesmo de indicar a ltima posio Se o primeiro ndice no for indicado, o default a primeira posio
alfa[25:3000] retorna yz alfa[3:0] retorna

Se o segundo ndice no for indicado, o default o ndice posterior ao da ltima posio (o que quer dizer que o ltimo caracter ser o da ltima posio
alfa[20:] retorna uvwxyz

alfa[:2] retorna ab

Um terceiro valor pode ser indicado como o passo


Um passo negativo pode ser indicado para retornar a sequncia invertida
alfa[0:5:2] retorna ace

alfa[6:2:-1] retorna gfed Repare que agora o primeiro ndice deve posterior ao segundo E que o ltimo caracter retornado corresponde posio posterior do segundo ndice Invertem tambm os defaults dos dois primeiros ndices

O que retorna:
alfa[::] alfa[:] alfa[] alfa[10:] alfa[10::] alfa[:10:] alfa[2::2] alfa[:2:2] alfa[:2:-2]

O Python usa o operador % para a operao

formatao de string

O caso de uso mais til a construo de inteiros e strings (possivelmente com pesquisa em dicionrios), j que a formatao de floats no possui suporte internacionalizao

O operando do lado esquerdo um string de formato O operando do lado direito um objeto ou uma tupla de objetos (uma lista de objetos entre parnteses, separada por vrgulas) O resultado um string no qual o valor do objeto (obtido por str e no repr) inserido no string de formato, em posies marcadas por sequncias do tipo %, onde um cdigo de formatao

Smbolo s d x f

Descrio str(objeto) Nmero inteiro Inteiro no formato hexa Float (muito usado com o nmero de casas: %.2f formata para duas casas decimais)

Alberto %s Lopes % Araujo retorna Alberto Araujo Lopes O resultado total: %.2f % r retorna O resultado total: 12.34 se r contiver por exemplo 12,345 A formatao com %s de longe a mais comum em Python

Nome str
unicode repr len

Descrio Converte um valor em string


Converte um valor em unicode Retorna a representao em string do objeto Tamanho do string (ou da lista, da tupla, etc.)

No Python tudo um objeto As variveis guardam apenas referncias a objetos Uma referncia nada mais do que o endereo de um objeto na memria Se uma varivel aponta para um objeto, e receber uma atribuio de outro objeto, perde a referncia do primeiro objeto Quando nenhuma varivel apontar para um certo objeto, este objeto ser reclamado pelo coletor

de lixo

O coletor usado para gerenciamento de memria

Alguns objetos so de tipos imutveis Os strings e os nmeros so do tipo imutvel


No possvel alterar o valor de seus atributos, ou acrescentar ou tirar atributos deles

O que se pode fazer obter novos objetos imutveis por meio de operaes, e atribuir novos objetos s variveis

Certos objetos no Python so chamveis Isto quer dizer que eles suportam a operao

chamada

Quando um objeto chamvel chamado, ele executa uma rotina de cdigo Os objetos chamveis mais comuns so as funes e as classes

Funes correspondem a um pequeno procedimento, definido na declarao da funo, que pode ou no ter parmetros e pode ou no retornar valores Classes so objetos que criam objetos cujo tipo definido na declarao da classe

A operao chamada indicada pela notao de parnteses (com os argumentos ou parmetros reais) a serem usados entre parnteses, separados por vrgulas Os argumentos podem indicar o nome do parmetro formal a que correspondem Exs.:
alfa() alfa(a, 12) alfa(abacaxi, 23.03, total=10, linha=malinha)

Certos objetos possuem certos atributos chamveis denominados mtodos Conceitualmente, um mtodo um procedimento que o objeto executa, ao receber uma mensagem correspondente Ou seja, no mtodo existe o argumento implcito correspondente ao prprio objeto Mtodos so acessados com o operador . e chamados com o operador ()
a.m1(alfa) - mensagem ao objeto a, solicitando a execuo do mtodo m1, com o string alfa como argumento

S.capitalize() S.ljust(width [, fill]) S.center(width [, fill]) S.lower() S.count(sub [, start [, end]]) S.lstrip([chars]) S.decode([encoding[,errors]]) S.encode([encoding [,errors]]) S.maketrans(x[, y[, z]]) S.endswith(suffix [, start [, end]]) S.partition(sep) S.expandtabs([tabsize]) S.replace(old, new [, count]) S.find(sub [, start [, end]]) S.rfind(sub [,start [,end]]) S.format(fmtstr, *args, **kwargs) S.rindex(sub [, start [, end]]) S.index(sub [, start [, end]]) S.rjust(width [, fill]) S.isalnum() S.rpartition(sep) S.isalpha()

S.rsplit([sep[, maxsplit]]) S.isdecimal() S.rstrip([chars]) S.isdigit() S.split([sep [,maxsplit]]) S.isidentifier() S.splitlines([keepends]) S.islower() S.startswith(prefix [, start [, end]]) S.isnumeric() S.strip([chars]) S.isprintable() S.swapcase() S.isspace() S.title() S.istitle() S.translate(map) S.isupper() S.upper() S.join(iterable) S.zfill(width)

Os mtodos devem ser pesquisados na documentao da biblioteca padro do Python (em Builtin Types)

No Python, tudo um objeto Todos os valores, mesmo nmeros, so objetos Um objeto uma mquina de computao
Cada objeto de um tipo
Possui estado Realiza determinadas computaes

Os objetos possuem atributos

O tipo do objeto determina quais as informaes que compem o objeto O tipo tambm determina as computaes que o objeto pode executar Um atributo a de um objeto b nada mais do que um objeto b associado aa Por exemplo, os objetos do tipo int possuem os atributos real e imag, indicando os valores das partes real e imaginria, respectivamente

Pode-se usar o operador ponto para identificar atributos de um objeto

A varivel guarda sempre a referncia (i.e., o endereo na memria) de um objeto


a=1 aloca o objeto 1 na memria, e guarda a referncia dele na varivel a b = a coloca em b a mesma referncia que h em a

O prompt interativo sempre apresenta uma representao do valor do objeto apontado pela referncia indicada

Dado:

A operao de potenciao pode ser feita com o operador ** random.randint(x,y) retorna um nmero aleatrio de x a y (inclusive)
necessrio importar o mdulo random para usar, com import random no comeo do programa

Pede-se

Escreva um programa que pede ao usurio uma palavra de 10 a 20 letras


Supondo que o usurio preencheu corretamente, o programa dever:
Sortear uma letra da palavra e imprimir Imprimir a palavra ao contrrio Excluir a letra central da palavra e imprimir o resultado Imprimir a primeira metade da palavra, repetida 10 vezes, concatenada com a segunda metade ao contrrio

Escreva um programa que, dado um nmero de perodos, um capital inicial, uma taxa anual de juros, o nmero de perodos de capitalizao no ano, seja impresso na tela o total capitalizado

Reorganizao dos slides (referncias) Total: %.2f % 123.456 precisa de ponto antes do 2

As listas so objetos que guardam valores indexados por nmeros (iniciados em 0) inteiros O tamanho da lista varivel e listas podem ser aninhadas A lista sempre ordenada Em cada posio da lista, vai a referncia um objeto de qualquer tipo Os literais de lista so delimitados entre colchetes As listas podem ser usadas com len, concatenao (+), repetio (*), e slices Diferente dos strings, as listas so mutveis
As listas podem inclusive ser alteradas por atribuio a slices [1,a,True]

Exemplo
a = [1,b,True,[2,3]]
Veja que listas podem ser aninhadas

a[0] retorna o qu? a[0][1] retorna o qu? a[3] retorna o qu? a[3][1] retorna o qu? Faa a[0] = [5,6,7] e observe o que acontece Faa a[0:0] = [5,6,7] e veja o que acontece

Mtodos:
Sort ordena os itens Append anexa itens Extend anexa itens de uma lista ao final da lista Pop retira o ltimo elemento e o retorna
Pop e append implementam uma pilha

Comando del exclui um elemento

Qual seria a diferena entre extend e +? Qual seria a diferena entre append e extend quando o parmetro uma lista?

Alterar o valor de uma posio da lista altera

apenas a lista
a = alfa b = [0,1,a,c] b[2] = d

Qual fica sendo o valor de b?

Estruturas de dados que associam pares de objetos chave e valor Ex.:


Repare que qualquer objeto pode ser chave e qualquer objeto pode ser valor A indexao pode ser feita colocando o valor da chave entre parnteses No possvel realizar slicing em um dicionrio! Note que o dicionrio no ordenado
d1[nome] retorna Alberto d2[2] retorna b
d1 = {nome: Alberto, sobrenome:Lopes} d2 = {a: 1, 2: b}

possvel alterar um valor usando a atribuio a uma chave especfica:


d3[2] = alfa Com isso, possvel tambm inserir chaves inexistentes no dicionrio

Com o mtodo keys retorna-se a lista de chaves Com o mtodo values retorna-se a lista de valores

O mtodo get pode ser usado para recuperar o valor de uma chave, com a vantagem de no dar erro se a chave no existir

O mtodo update concatena o dicionrio passado como parmetro ao dicionrio chamado Tambm possvel criar um dicionrio com a funo dict
d = dict(nome=Alberto, sobrenome=Lopes) Aqui a desvantagem que as chaves precisam ser strings

d2.get(3, nada) retorna nada se a chave 3 no existir no dicionrio d2

So sequncias imutveis de objetos indexveis pelo deslocamento (como nos strings e nas listas) Funcionam basicamente como as listas, exceto por serem imutveis

IF
Sem mistrios if condio1:
bloco de comandos executado se condio1 verdadeira

ELIF e ELSE so opcionais

elif condio2: bloco de comandos executado se condio2 verdadeira else: bloco de comandos executado se nenhuma condio verdadeira

WHILE
Tambm sem mistrio while condio:
bloco de comandos

Executa o bloco se a condio for verdadeira, e volta para testar de novo Pra se a condio for falsa

Pode-se usar o comando break para sair do while sem voltar condio

FOR

Repete o bloco de comandos uma vez para cada elemento da lista Disponibiliza o elemento da vez na varivel Como fazer um loop de digamos 10 repeties?
E se forem muitos mais elementos?
Cria-se a lista [0,1,2,3,4,5,6,7,8,9]
Pode-se criar uma lista com a funo range range(10) retorna [0,1,2,3,4,5,6,7,8,9]

Implementa, de fato, um foreach for variavel in lista: bloco de comandos

Crie um programa que pea para o usurio um nmero inteiro e imprima um tringulo de asteriscos com a altura indicada
Por exemplo, se o usurio informar 5, imprimir: * ** *** **** *****

Refaa o exerccio para um tringulo alinhado direita e para um tringulo centralizado Faa um programa que pea ao usurio um nmero e imprima a tabuada desse nmero at 100.
Ex.: para o nmero 2, 1x2=2 2x2=4 ... 99 x 2 = 198 100 x 2 = 200

Alterado: o assunto Arquivos foi postergado

Nomes de variveis podem conter letras, dgitos ou o sublinhado, no podendo comear com dgitos As palavras a seguir so reservadas e no podem ser usadas como identificadores: and, del, from, not,

while, as, elif, global, or, with, assert, else, if, pass, yield, break, except, import, print, class, exec, in, raise, continue, finally, is, return, def, for, lambda, try

Alguns formatos de identificadores so usados de forma especial pelo interpretador:


import *

_ o resultado da ltima avaliao no interpretador interativo _* no so importados automaticamente por from modulo __*__ nomes de sistema __* membros privados das classes

Dois objetos podem ser comparados de duas formas


a == b: verdadeiro se os dois tiverem o mesmo valor a is b: verdadeiro se so o mesmo objeto Isso especialmente importante para objetos mutveis

Listas, strings, etc. podem ser comparados usando <, >, etc. Lembre-se de que None um valor que significa referncia para objeto nenhum

A funo open de manipulao de arquivos interna

Modo
r w a

Descrio
Leitura (padro) Escrita Anexao (escrita no final)

open(arquivo, modo)
Abre o arquivo cujo caminho passado no modo indicado (ver tabela) e retorna a referncia para o objeto arquivo

r+
rb

Leitura e escrita
Leitura binria (apenas no Windows) Escrita binria (apenas no Windows) Leitura e escrita binrias (apenas no Windows)

wb

r+b

O objeto arquivo retornado possui mtodos teis


read
sem argumentos, l o arquivo todo e retorna um string com um nmero N, l N caracteres do arquivo e retorna no string

readline
l a prxima linha

readlines
l o arquivo e bota as linhas numa lista

write
escreve no arquivo o string passado como parmetro (cuidado porque o write no acrescenta \n ao final da linha!)

writelines
escreve uma lista de strings em linhas do arquivo

close
fecha o arquivo

flush
salva o buffer no arquivo, sem fech-lo

seek(n)
vai at a posio n

Vimos o uso do for com sequncias para iterar sobre elas


for i in [1,3,5,8,3]: print i

Se o elemento atual da iterao for uma sequncia, possvel ter mais de uma varivel de iterao
for a,b,c in [[1,2,3],'456',(7,8,9)]: print b

Algumas funes teis para manipular sequncias


dict, list, tuple podem ser usados para criar dicionrios, listas e tuplas, a partir de outras estruturas zip (lista1, lista2) retorna uma lista de tuplas com os elementos de cada lista pareados
zip(range(0,3), range(3,6)) retorna [(0, 3), (1, 4), (2, 5)] O mtodo zip til quando se deseja iterar sobre duas listas simultaneamente

enumerate(sequncia) retorna um enumerador que fornece uma sequncia de tuplas com o nmero da iterao e o valor da lista original

for i, v in enumerate(alberto): print Letra[%s]: %s % (i, v)

O comando for foi mostrado para iterar sobre sequncias Na verdade, o for varre objetos iterveis Um objeto itervel fornece um objeto iterador, que pode ser usado para obter o prximo elemento da varredura
Quando o for encontra um itervel, obtm o iterador dele A partir da, o loop ir chamar sucessivamente o iterador, at que termine
As sequncias so exemplos de iterveis

Quando o for chamado sobre uma lista, por exemplo, o iterador usado fornece, sucessivamente, os elementos da lista Observe, por exemplo o que acontece quando voc varre um dicionrio (que no um sequncia) com o for
Um outro tipo de itervel so os arquivos Experimente varrer um arquivo com o for... O que o iterador fornece? Voc pode obter o iterador de um itervel x chamando o mtodo iter(x)
O iterador varre a lista de chaves

Todo objeto iterador possui um mtodo de iterao (chamado de next) Quando o iterador termina de fornecer todos os objetos, chamar next resulta em erro do tipo StopIteration O objeto enumerador retornado pela funo enumerate um iterador! Protocolo de iterao o nome que se d a esse conjunto de regras

Se o comando for receber um iterador, ele itera diretamente sobre ele Seno, chama a funo iter sobre o objeto indicado, iterando sobre o iterador retornado Se no for retornado um iterador, um erro
Experimente iterar sobre um nmero inteiro!

Dada uma lista de pessoas (use os nomes dos participantes do curso), crie um programa para sortear a lista do amigo secreto:
O programa deve gerar um dicionrio, no qual cada chave um participante, e o valor corresponde ao amigo secreto No deve haver auto-amigos A lista de amigos deve, ao final, ser salva num arquivo com o seguinte formato: FULANO --> SICRANO

Compreenses de lista mudaram para c

Um dos exemplos de uso de iteradores a compreenso de lista Sintaxe geral:


[expresso for varivel in iterador if condio]

A lista retornada contm os valores da expresso que calculada uma vez a cada iterao, com o valor entregue pelo iterador atribudo varivel, desde que a condio seja verdadeira
A condio opcional

Considere lis = [1,5,3,6]


[2*x for x in lis] retorna [2,10,6,12] [x**2 for x in lis if x<5] retorna [1, 9] [a*3 for a in alberto[::2]] retorna [aaa,bbb,rrr,ooo]

Exerccio
Escreva uma compreenso de lista que gere a mesma lista que o cdigo abaixo:
a = [] for i in nabucodonosor:
a.append(n*10)

map(func, sequencia)
sorted(n)

retorna uma lista contendo o resultado da aplicao da funo ou mtodo func a cada objeto da sequencia retorna os itens de n ordenados (diferente do mtodo sort, no altera n) retorna uma lista contendo os objetos da sequncia passada, desde que func retorne verdadeiro quando chamada para eles retorna o resultado da aplicao sequencial de func aos elementos da sequencia

filter(func, sequencia)

reduce(func, sequencia)

sum, max, min retornam a soma, o mximo, o mnimo da lista all, any retorna True se todos ou algum da lista so verdadeiros

Usando as funes acima, escreva um programa que calcule o fatorial de um nmero qualquer

Funes so objetos que servem para encapsular unidades de algoritmo Voc define uma funo para encapsular blocos de comandos que sero
Utilizados muitas vezes Alterados em um nico local Encapsulados (escondidos) do restante do programa

def nome(lista-de-parmetros):
comandos

def na verdade um comando que:


cria um objeto do tipo funo associa ao objeto funo o cdigo correspondente aos comandos atribui a referncia do objeto funo varivel

nome

Nos comandos, voc pode usar o comando return, que encerra a execuo da funo e opcionalmente retorna um valor

nome-da-funcao(lista-de-argumentos)
Isso uma expresso
retorne algum valor
O que quer dizer que pode ser esperado que ela

Se a funo explicitamente chama o comando return para sair com algum valor, esse valor retornado Seno (return sozinho ou nada), None retornado (e normalmente ignorado)

Escreva uma funo que receba um objeto e imprima a lista de atributos desse objeto Chame essa funo, armazenando o retorno na varivel r Compare r com None e verifique se true ou false

Os argumentos passados so na verdade referncias! Execute a sequncia abaixo no interativo:


def f(lista):
lista[2] = 4

a = [1,2,3] f(a)

Qual o valor de a ao final da execuo acima?

Crie um gerenciador de contatos


Pesquisar contato Novo contato Editar contato Excluir contato Listar todos os contatos Sair

Cada contato ter nome e telefone O programa dever apresentar ao usurio um menu com as opes:

Escreva o programa pedido como um mdulo Use as estruturas de dados j estudadas para implementar a lista de contatos Crie uma funo correspondente a cada opo do menu Crie uma funo correspondente inicializao e finalizao do programa Opcional: faa com que o programa, ao entrar, carregue a lista de contatos de um arquivo e, ao sair, salve a lista de contatos em um arquivo

Enquanto o usurio no escolher a opo Sair, o menu dever executar o procedimento correspondente

Recapitulando a discusso sobre escopo de variveis

Quando a funo dict recebe como argumento uma lista de tuplas, ela retorna um dicionrio com os primeiros itens das tuplas sendo as chaves e os segundos itens das tuplas, sendo os valores
A funo zip recebe como argumento duas listas, e retorna uma lista de tuplas contendo o primeiro elemento da primeira lista e o segundo elemento da segunda lista
Ex.: zip ([a,b,c],[1,2,3]) retorna [(a,1),(b,2),(c,3)] Ex: dict([(a, 1), (b, 2)]) retorna {a:1,b:2}

Sendo assim, diga o que faz o seguinte trecho de cdigo


import random n = [apa, cla, eds, edu, eri, kan] r = [random.randint(0,10) for i in range(len(n))] b = dict(zip(n,r)) a = [p for p in b if b[p] >=5] print a

Uma varivel criada quando recebe um valor pela primeira vez, seja pelo comando de atribuio, seja por ser o parmetro de uma funo chamada Quando criadas em uma funo, as variveis s existem dentro da funo em que foram criadas Quando criadas fora de funes (no corpo do mdulo), as variveis terminam quando o mdulo encerrado (vamos ver mais detalhes no estudo de mdulos)
Quando termina a execuo da funo, a varivel desaparece

def f1():
a=1

f1() print a O que voc espera que acontea?

a=0 def f1():


a=1

f1() print a
O que voc espera que acontea?

Nomes definidos dentro do def s so visveis dentro do def Nomes definidos dentro do def no entram em conflito com nomes definidos fora Tipos de escopo:
Se a varivel definida dentro do def, ela local para aquela funo Se a varivel definida fora de qualquer funo, ela global
Variveis globais so usadas normalmente dentro dos mdulos, mas so atributos do mdulo para o mundo exterior O escopo do mdulo global

Chamar uma funo cria um escopo

Cuidado com o termo global global global em um nico arquivo

Sempre que se faz uma atribuio a uma varivel, ela criada localmente, se no existir localmente
E se existir localmente, usa-se a varivel local

Sempre que se l uma varivel, l-se no escopo local


Se no existir, procura-se uma varivel de mesmo nome no escopo envolvente Se no existir, procura-se no escopo global Se no existir, procura-se no escopo __builtins__

Pode-se usar uma varivel global em uma funo, declarando-a na funo com o comando global
a = aglobal b = bglobal def f1():
global b a = alocal b = blocal

f1()

Qual o valor de a e b ao final?

a=0 def f1():


global a a=1

f1() print a O que voc espera que acontea?

Os parmetros podem ter seus valores default indicados na definio da funo


def logaritmo(x, base=10): import math return math.log(x, base)

Os argumentos na chamada de uma funo so atribudos aos parmetros de tal forma que a ordem dos argumentos passados corresponda ordem dos parmetros na definio da funo
def f1(a, b, c): f1(1,2,3) Neste exemplo, a chamada da ltima linha indica que a=1, b=2, c=3
return a+(b*c)

Os argumentos na chamada de uma funo podem ser indicados fora dessa ordem, desde que sejam referenciados pelo nome do parmetro Nota: argumentos por palavra-chave s podem ser passados aps os argumentos posicionais, e no podem se referir a eles!
Ex.: f1(2,a=1, c=3) est errado porque a foi passado duas vezes Ex.: f1(b=2,c=3, 1) est errado porque o argumento posicional foi passado aps os argumentos por palavra-chave f1(c=1,a=2,b=3)

Funes podem ser definidas para receber um nmero arbitrrio de argumentos O chamador que vai definir quantos e quais argumentos sero passados

Uma funo pode ser definida com um parmetro precedido de um asterisco


def f2(a,b,*c):
....

Nesse caso, o primeiro argumento ser atribudo a a, o segundo a b, e o s demais (se houver) a uma tupla c

Uma funo pode ser definida com um parmetro precedido de dois asteriscos
def f3(a,b,**d):
....

Nesse caso, o primeiro argumento ser atribudo a a, o segundo a b, e o s demais (se houver) a um dicionrio d, desde que sejam passados por palavra-chave

possvel combinar parmetros correspondendo a varargs posicionais e por palavra-chave


def f4(a,b,*c,**d):

Esse nesse caso, os dois primeiros argumentos posicionais sero colocados em a e b, os demais, em c e argumentos por palavra-chave diferentes de a e b sero colocados em d
Ex: f4(1,2,3,4,e=5, f=6) faz com que
a= 1, b= 2 c =(3,4) d={e:5,f:6}

Considere o trecho abaixo


def f5(a=0,b=1,c=2,d=3): ex = [6,7,8,9] f5(ex)
print a

No h dvida que a lista foi passada como argumento, e que a lista ser impressa possvel indicar uma sequncia na chamada, com o intuito de passar vrios argumentos posicionais Nesse caso, usamos um asterisco na chamada e no na definio

Com a mesma definio de f5 acima, execute f5(*ex) e veja a diferena Nos exemplos, f5(6,7,8,9) tem o mesmo efeito de f5(*[6,7,8,9])

Tambm possvel desempacotar argumentos por palavra-chave passados como um dicionrio Para isso, usam-se dois asteriscos antes do argumento
d = {a:x, b:y} f7(**d) tem o mesmo efeito de f7(a=x, b=y)

Como j vimos, os programas em Python so escritos em arquivos com extenso .py Genericamente, o arquivo .py chamado de

mdulo

Um mdulo portanto, contm uma sequncia de comandos, incluindo definies de funes Chamar o interpretador python com o nome de um mdulo como argumento executa o mdulo

Um mdulo pode solicitar ao ambiente Python a importao de outros mdulos Isso feito com o comando import
Os exemplos acima importam os mdulos random e sys, respectivamente Importar um mdulo tem dois efeitos
import random import sys

O mdulo executado em sua totalidade Um objeto do tipo mdulo criado, sua referncia armazenada na varivel de mesmo nome, e as variveis globais do mdulo importado ficam disponveis como

atributos do objeto mdulo

Por exemplo
import os Executa o mdulo os Cria um objeto do tipo mdulo Coloca a referncia desse objeto na varivel os As variveis globais (incluindo funes) do mdulo os so disponibilizadas como atributos do objeto apontado pela varivel os o caso da varivel curdir, que pode ser acessada por os.curdir

Crie um dicionrio no escopo global chamado record com as chaves nome e valor, inicialmente contendo string vazio e 0, respectivamente Crie uma funo que receba um nmero arbitrrio de parmetros por palavra-chave
Essa funo receber argumentos cujo nome o nome de um competidor, e o valor o nmero de pontos Ex.: competicao(alberto=1, joao=2) siginifica que alberto fez 1 ponto e joao, 2

Essa funo dever verificar se algum dos candidatos indicados na chamada superou o nmero de pontos do recordista e, caso positivo, passa a ser o novo recordista

Um mdulo um arquivo contendo instrues em Python, e cujo nome termina em .py


Normalmente, um mdulo contm o programa principal e executado quando se chama o interpretador python, passando como argumento da linha de comando o nome do arquivo .py Outros mdulos contm objetos acessrios ao programa principal, e so executados pelo comando import

O comando import recebe como argumento o nome de um mdulo O mdulo importado ser executado em sua totalidade Um objeto do tipo mdulo ser criado A referncia desse mdulo ser guardada em uma varivel com o nome do mdulo no escopo global do mdulo que o importou As variveis do escopo global do mdulo importado ficam disponveis como atributos do objeto-mdulo criado
Variveis pode receber atribuio ou serem lidas com a notao de atributo Variveis que apontem para funes podem ser chamadas com a aplicao da chamada na notao de atributo

Crie um mdulo principal chamado a.py Esse mdulo dever importar o mdulo b.py O mdulo b.py dever importar o mdulo c.py e viceversa Coloque no final de cada mdulo a instruo print x, trocando x pelo nome do mdulo Aps a instruo acima, em cada mdulo, imprima a lista das variveis globais (voc pode obt-la com o comando dir(), ignorando os resultados iniciados em _)
Use uma compreenso de lista para isso!

A importao de um mdulo uma instruo cara Por isso, importaes subsequentes

reaproveitam importaes anteriores


Isso quer dizer que:

O mdulo importado ser executado apenas na primeira importao Apenas um objeto do tipo mdulo criado
A partir da segunda importao, a referncia do mesmo objeto reusada

(Em todos os mdulos, termine com uma mensagem informativa print modulo) Crie um mdulo gama Crie um mdulo beta que importa o mdulo gama Crie um mdulo alfa que importa o mdulo beta e o mdulo gama No mdulo alfa, compare gama com beta.gama usando o operador is

Quando indicamos o nome do mdulo na instruo import, no passado nunca o caminho do arquivo .py Como o Python encontra o mdulo?

O Python busca o arquivo do mdulo em quatro lugares, nesta ordem:


Pasta principal do programa PYTHONPATH Pastas das bibliotecas padro Pasta de arquivos .pth

Importe o mdulo random e execute print random... Observe o caminho do mdulo importado!

a pasta onde est o mdulo com o programa principal (o mdulo passado como argumento para o interpretador Python) Se estiver sendo usado o interpretador interativo, a pasta de onde ele foi chamado Essa pasta pode ser descoberta usando a funo getcwd do mdulo os

uma varivel de ambiente, configurada da mesma forma que a varivel PATH


No Windows, pode ser configurada no Painel de Controle Sistema Avanado

So algumas pastas padro, inferidas a partir do caminho da instalao do Python (que vamos chamar aqui de <PYTHON>):
<PYTHON> <PYTHON>\lib <PYTHON>\lib\site-packages <PYTHON>\dlls C:\Windows\system32\Pythonxx.zip etc

So caminhos listados em arquivos .pth, um por linha


Arquivos .pth podem estar em alguns diretrios especiais, conforme a plataforma de instalao No Windows, so as pastas <PYTHON> e <PYTHON>\lib\site-packages

O Python cria automaticamente uma lista de pastas a partir do PYTHONPATH, das pastas das bibliotecas padro e das pastas dos arquivos .pth Essa lista guardada no atributo path do mdulo sys Cada mdulo importado procurado na pasta principal do programa; se no for encontrado, procurado em cada uma das pastas do sys.path, na sequncia
Se no for encontrado, um erro exibido

possvel importar apenas uma varivel de um mdulo


Nesse caso, continua sendo executado o mdulo importado Mas no ser criada uma varivel global apontando o mdulo importado no mdulo importador Ser apenas criada uma varivel global no mdulo importador com a mesma referncia da varivel global do mdulo importado indicada no import Assim:
import alfa beta = alfa.beta del alfa from mdulo import varivel

Tem o mesmo resultado de


from alfa import beta

Tambm possvel importar todas as variveis de um mdulo


from modulo import *

Ser criada no mdulo importador uma varivel global correspondente a cada varivel global do mdulo importado EXCETO as variveis do mdulo importado cujos nomes comeam com _

Crie um mdulo chamado dia, com as variaveis _madrugada com o valor 0, manha com o valor 8, tarde com o valor 12 e noite com o valor 18 Execute o interpretador interativo, e importe o mdulo dia Execute dir() e veja quais variveis foram criadas Feche e reinicie o interpretador, e agora use o comando from dia import * Execute dir() novamente e veja quais variveis foram criadas

Se o pacote foi executado como programa principal, a varivel global __name__ recebe automaticamente o valor __main__ Com isso, possvel criar um mdulo que funciona diferente se for chamado diretamente do que se for importado comum encontrar, ao final de mdulos, um trecho de cdigo como
if __name__ == __main__:
inicializa() funcao_principal()

Os mdulos, de certa forma, funcionam como

espaos de nomes

Assim, se no mdulo escalares for criada a funo produto, no haver conflito com a funo produto do mdulo vetores

Veja que os mdulos funcionaram como qualificadores da funo

Se o meu programa for usar a funo produto do mdulo escalares, chamarei escalares.produto() Se o meu programa for usar a funo produto do mdulo vetores, chamarei vetores.produto()

possvel criar estruturas mais complexas de espaos de nomes com os pacotes Podemos entender os pacotes como agrupadores de mdulos e outros pacotes
Os pacotes so criados como pastas, que precisam necessariamente conter um arquivo chamado __init__.py
Pacotes esto para pastas assim como mdulos esto para arquivos

Para importar um mdulo que esteja em um pacote, basta usar o comando


import pacotex.pacotey.pacotez.modulo Nesse exemplo, supe-se que o arquivo modulo.py existe na pasta pacotez, da pasta pacotey, da pasta pacotex que est no caminho de busca de mdulos

Esse arquivo automaticamente executado quando um mdulo do pacote importado

Crie uma pasta chamada alfa Crie uma pasta chamada beta dentro de alfa Crie um arquivo chamado a.py dentro de beta
Coloque o comando print a.py dentro de a.py

Rode o interpretador interativo, e tente importar alfa.beta.a Feche o interpretador e crie em alfa e em beta um arquivo chamado __init__.py Rode novamente o interpretador e tente importar alfa.beta.a novamente

Altere o seu projeto do sistema de contatos, da seguinte forma:

As funes correspondentes s opes pesquisar, editar, excluir e novo devero ficar no mdulo gerenciador_de_contatos.py As funes correspondentes inicializao e finalizao devero estar no mdulo arquivo.py As funes correspondentes impresso e entrada de dados do menu devero estar no mdulo es.py O mdulo principal, alm das instrues de importao e atribuio de variveis globais dever ter apenas um loop principal da seguinte forma:
arquivo.inicializa() while True:
opcao =es.entrada() menu[opcao]() if opcao==es.SAIR: break

arquivo.finaliza()

Uma classe um objeto que, quando chamado, cria

outro objeto denominado instncia


class nome:
comandos

A classe criada com o comando class:

Na execuo do comando class:

os comandos dentro do bloco interno do comando class so executados


Observe que isso diferente da funo; na funo, os comandos internos so executados apenas quando ela for

um novo escopo local criado ao final, um objeto do tipo class criado na memria e sua referncia guardada na varivel nome ao final, as variveis locais criadas permanecem como atributos do objeto classe apontado por nome

chamada

class Alfa:
print oi a=1

Aps executar o bloco acima, uma varivel Alfa criada, apontando para o objeto classe criado Quais so os atributos do objeto Alfa?

O objeto classe tem quatro caractersticas peculiares com relao a outros objetos
Dicionrio de atributos Instanciao Herana Funes so mtodos

Quando a classe criada, ela j ganha atributos correspondente s variveis locais criadas quando da execuo de seu cdigo Por exemplo,
class Calculador:
a=0 b=0

Aps a execuo do bloco acima, criada uma classe que ser apontada pela varivel Calculador

possvel criarmos novos atributos no objeto classe simplesmente atribuindo novos valores
Tambm possvel excluir um atributo com del NOTA: mdulos tambm possuem dicionrio de atributos
Calculador.c = None cria o abtributo c

Calculador.a retorna 0 Calculador.b = 1 coloca o valor 1 no atributo b

Chamar um objeto classe cria um objeto

instncia

O objeto instncia fica associado ao objeto classe


Se, por exemplo, criarmos um objeto instncia x a partir do objeto classe y, dizemos que x uma instncia de y

class Y:
pass

x = Y() Cada instncia criada ter um dicionrio de atributos independente

Uma das caractersticas mais especiais das classes e instncias que esses tipos de objetos entram automaticamente em uma estrutura conceitual chamada rvore ou

hierarquia de herana

Vejamos inicialmente a herana entre classe e instncia:


Uma instncia herda de sua classe Isso quer dizer que os atributos da classe funcionam como se fossem atributos tambm da herana

Exemplo

a=1

class classe1: instancia1 = classe1() instancia2 = classe2() print instancia1.a classe1.a =2 print instancia2.a Nesse exemplo, vemos que como as instncias no possuem um atributo a prprio, a leitura do atributo a retorna o valor do atributo a da classe1

Continuando o exemplo
instancia1.a = 3 print classe1.a print instancia1.a print instancia2.a

Nesse exemplo vemos que a atribuio na verdade cria o atributo a no objeto instancia1
Podemos dizer que o atributo a do objeto instancia1 esconde o atributo a herdado do objeto classe1 pelo objeto instancia1

Alm da herana entre uma classe e suas instncias, pode existir uma herana entre classes Uma classe pode indicar outras classes em sua definio: essas classes so as suas superclasses
def classe2(classe1,classe3):
...

Nesse caso, classe1 e classe 3 so as superclasses de classe2 As subclasses herdam atributos das superclasses
classe2 chamada de subclasse de classe1 e de classe3

No caso de haver dvidas sobre de qual superclasse certo atributo foi herdado, a varredura feita da esquerda para direita No exemplo, se classe1 e classe3 possuem um atributo chamado alfa, classe2 herda alfa de classe1

A ltima caracterstica distintiva dos objetos classe que as funes definidas em seu escopo sero tratadas como

mtodos

Isso quer dizer que sempre so chamadas aplicadas a uma instncia da classe Ou seja
Mtodos precisam sempre definir pelo menos um parmetro O primeiro argumento na chamada de um mtodo precisa sempre ser uma instncia da classe Se o mtodo for chamado qualificado por uma instncia que o herdou, essa instncia usada como parmetro implcito Se o mtodo for chamado qualificado por uma classe que o contm, o primeiro parmetro explcito deve ser uma instncia da classe

Por praxe, costuma ser dado o nome de self para o primeiro parmetro dos mtodos

class Calculador:
def soma(self,x,y):
return x + y

Pode-se chamar soma assim:


um_calculador = Calculador() um_calculador.soma(2,4)

Ou assim:
outro_calculador = Calculador() Calculador.soma(outro_calculador,2,6)

O mtodo __init__ chamado automaticamente pelo Python quando uma instncia da classe criada usado normalmente para criar os atributos iniciais de uma instncia O mtodo __init__ chamado de construtor Ele no pode retornar nada (ou deve retornar None)
Isso porque ele executado na chamada da classe (ou seja, na construo da instncia)

Um software projetado (desenhado) de acordo com o paradigma orientado a objetos pensado como um conjunto de objetos

colaborando

Um objeto uma mquina de computao

Deve ser possvel enviar mensagens para o objeto, solicitando certa computao, a partir de argumentos ou parmetros reais, e a computao ter resultado(s) ou efeitos colaterais

Cada objeto ter um conjunto especfico de responsabilidades


Certos objetos (denominados de experts) tero a responsabilidade de guardar valores
Por exemplo o objeto do tipo Contato ter a responsabilidade de guardar o nome e o telefone de um contato

Certos objetos tero a responsabilidade de apresentar ao usurio informaes Certos objetos tero a responsabilidade de tratar os eventos ou entradas de dados do usurio Certos objetos tero a responsabilidade de salvar os dados em disco Etc.

O projeto de um sistema orientado a objeto normalmente comea com o desenho do modelo dinmico ou de comportamento do sistema, para um certo evento ou transao de negcio A partir da, decide-se qual(is) objeto(s) deve(m) participar do atendimento quele evento ou transao Sabendo-se o conjunto de tarefas que o objeto ter de realizar, pode-se descrever sua classe

Uma classe , portanto, a especificao de certo tipo de objeto contendo, em especial

Exemplo:

A descrio dos comportamentos que o objeto tem de realizar As variveis que o objeto ter para trabalhar class Calculador:
self.x = 0 self.y = 0

def __init__(self): def soma(self):

return self.x + self.y

Observe que o construtor cria os dois atributos, x e y da instncia (que o parmetro self de todos os mtodos) Observer tambm que o mtodo soma retorna a soma dos dois atributos Assim, o protocolo de uso de uma instncia da classe Calculador chamada x poderia ser:
a.x = 20 a.y = 3 a.soma()

Escreva um programa para simular um jogo de dados

Uma classe Jogo dever der um mtodo para iniciar jogo, um mtodo para jogar e um mtodo para dizer se ganhou
Se for 2, 3 ou 12, perde Se for 7 ou 11, ganha Se for qualquer outro, joga de novo

O jogo comea com a chamada ao mtodo iniciar O jogador manda a mensagem jogar. O objeto Jogo sorteia dois dados

Uma classe UI deve controlar um menu de jogo:

A cada jogada, o jogador manda a mensagem resultado A classe UI deve apresentar o jogo A classe Jogo s chamada para jogar os dados quando o jogador aperta Enter A cada jogada, a classe UI chama a classe Jogo Ao final do jogo, a classe UI pergunta se o usurio quer sair ou continuar
Continuar comea novo jogo Sair termina o programa

A funo os.getcwd() no retorna a pasta principal do programa, mas a pasta de onde o Python foi chamado

Quando um programa executa uma instruo que leve a uma condio de erro ou a um estado inconsistente do programa, dizemos que uma exceo lanada ou levantada Uma exceo um objeto que descreve uma condio inesperada, como por exemplo:

Valores invlidos para parmetro (uma funo que espera um dicionrio foi chamada com uma lista, diviso por zero, etc.) Situaes inesperadas no ambiente (tentou-se abrir um arquivo inexistente, tentou-se abrir conexo com um servidor fora do ar, etc.)

Automtico

O prprio Python levanta a exceo Exemplo:

Manual

a=1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero

O programa avalia a situao e levanta a exceo usando o comando raise O comando raise deve ser seguido de uma classe (derivada de) Exception ou de uma instncia de uma classe (derivada de) Exception Exemplo:
raise ZeroDivisionError

Considere o seguinte exemplo:


def f1(a):
return 1/a

def f2(b):
return f1(b)

def f3(c):
return f2(c)

c = f3(int(raw_input())) Temos a seguinte situao:

f3

f2

f1

No exemplo anterior, o cdigo do mdulo chama f3, que chama f2, que chama f1 Se o usurio digitar 0 como entrada, o cdigo 1/a de f1 levanta uma exceo Isso faz com que, ao invs de ser feito o retorno normal da funo, f2 seja notificado por f1 com uma exceo (infelizmente, no posso te dar um retorno, pois ocorreu um fato inesperado!) Da mesma forma, f3 notificado por f2, recebendo o objeto execeo Essa sequncia de notificaes continua at notificar o usurio, no prompt de comandos (se o Python foi chamado com um mdulo) ou no interpretador interativo

Como foi dito, possvel levantar excees manualmente, com o comando raise, seguido de uma classe derivada de Exception ou de uma instncia de uma classe derivada de Exception Existe uma srie de classes de excees j prontas, que podem ser usadas em programas Essas classes so builtins, estando disponveis para quaisquer programas, sem a necessidade de importao Veja em http://docs.python.org/library/exceptions.html# exception-hierarchy a lista completa de excees builtin

Exemplo:
pass

class ValorNegativoError(Exception): a = int(raw_input()) if a < 0: raise ValorNegativoError else


print a

O cdigo acima define uma nova classe de exceo derivada de Exception e lana tal exceo se o valor digitado for menor do que zero

O construtor padro das classes de Exceo builtins recebe varargs posicionais, e os armazena como uma tupla no atributo args Com isso, possvel anexar exceo mensagens de erro, cdigos de erro, objetos relacionados, etc.

Voltando ao exemplo:

f3

f2

f1

possvel, em qualquer uma das trs funes, programar o tratamento de

excees levantadas

Com isso, o programa pode tentar se recuperar de uma condio inesperada

Vamos supor que o que se deseja tratar a exceo na funo f2:


def f2(b):
try:
return f1(b)

except ZeroDivisionError:

O bloco dentro do try vai ser executado Se algum comando do bloco levantar uma exceo, o Python procura um bloco except que indique uma exceo correspondente ao tipo da exceo levantada, baixa a exceo e executa o bloco except Se nenhum bloco except correspondente for encontrado, a exceo permanece levantada e o processo de notificao continua (no caso, a exceo repassada para f3)
No caso, se foi levantada uma exceo do tipo ZeroDivisionError (ou derivada), o bloco except executado

print houve uma diviso por zero na chamada de f1 return -1

possvel colocar vrios blocos except em uma estrutura try:


try:
comandoa() comandob(x,y)

except AttributeError:

except ZeroDivisionError:
print diviso por zero

print atributo inexistente ou problema parecido

Se a exceo levantada corresponder a alguma declarao except, o bloco correspondente executado Se uma exceo corresponder a mais de um tipo (por exemplo h um except para uma classe e um except para uma superclasse) o primeiro tipo correspondente executado Voc pode colcar um except Exception para funcionar como outros casos

Ao final dos vrios blocos except, pode-se colocar um bloco else que executado se no for levantada exceo
def testa_else(a):
try:
print 1/a[0]

except ZeroDivisionError: else:

print erro de diviso por zero print no deu erro

Repare que, neste caso, se houver alguma exceo que no ZeroDivisionError, ela ser propagada e nem o except e nem o else ser executado
Experimente executar testa_else com os argumentos 1, [1] e [0]

Depois do else possvel colocar um bloco finally


def testa_else(a):
try:
print 1/a[0]

except ZeroDivisionError:

else:

print erro de diviso por zero print no deu erro print executado sempre

finally:

O bloco finally ser executado

Depois do except ou else, se a exceo for capturada ou se no houver exceo Antes da exceo ser repassada para o chamador, se ela no for tratada Finally usado para cdigo de limpeza por exemplo salvar arquivos, fechar conexes, que deve ser feito sempre, independentemente se o cdigo principal funcionou ou no

possvel usar a declarao as para manipular o objeto que representa a exceo no bloco except: def testa_else(a):
try: except ZeroDivisionError as e: else:
print erro de diviso por zero print Detalhes %s % e.args print no deu erro print executado sempre print 1/a[0]

finally:

Em geral, isso usado com excees customizadas, que tem args mais significativos

Pode-se relevantar uma exceo aps seu tratamento Isso pode querer ser feito, por exemplo, para que uma certa funo ou mtodo faa algum tratamento parcial da exceo, mas no impedindo o tratamento da exceo pelos chamadores
Para isso, basta chamar o comando raise sem argumentos
Provavelmente, o tratamento no eliminou a causa ou no possibilitou a recuperao do programa

Assert um tipo de comando usado para a escrita de testes

Por exemplo, suponha que a funo soma deva retornar a soma de dois nmeros Um teste poderia ser:
assert assert assert assert soma(0,0)==0 soma(1,1)==2 soma(2,1000)==1002 type(soma(0,0))==int, tipo de retorno errado

A forma geral do comando assert

assert condio , string Se condio for falsa, um AssertionError levantado, e o string usado como mensagem dele

Crie uma funo para calcular imposto de renda

Essa funo deve receber como parmetros rendimentos tributveis, rendimentos isentos e dedues A partir disso, e da tabela atual de alquotas, calcule o imposto a pagar Antes de escrever a funo, escreva um esqueleto dela e use para escrever os testes: Escreva uma funo testa_ir que use asserts para testar o clculo do imposto em pelo menos trs situaes Escreva o cdigo da funo realizando o tratamento dos valores de entrada; levante excees (de tipos diferentes) para cada uma das condies:
No obrigatoriedade de entrega pelo valor dos rendimentos Dedues muito altas (maiores que os rendimentos) Valores negativos Antes de escrever a funo, o cdigo evidentemente deve falhar def ir(tribut, isentos, dedu): return 0

Execute o teste e verifique que o teste bem sucedido

Docstrings Geradores lambda Tuplas de retornos

Você também pode gostar