Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Referncia Bibliogrfica
Sugesto de leitura
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
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
# -*- 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!"
Compilao
.pyc
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
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
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
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
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 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
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
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
Booleans
True ou False (mas o Python considera como verdadeiro, alm de True, qualquer valor diferente de 0, None, ou estruturas de dados vazias)
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
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
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
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 """
Strings podem ser convertidos de e para unicode com as funes internas str e unicode
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)
(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 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)
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 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
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]
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
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 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
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
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, 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
Qual seria a diferena entre extend e +? Qual seria a diferena entre append e extend quando o parmetro uma lista?
apenas a lista
a = alfa b = [0,1,a,c] b[2] = d
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
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 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]
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
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
_ o resultado da ltima avaliao no interpretador interativo _* no so importados automaticamente por from modulo __*__ nomes de sistema __* membros privados das classes
Listas, strings, etc. podem ser comparados usando <, >, etc. Lembre-se de que None um valor que significa referncia para objeto nenhum
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
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
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
enumerate(sequncia) retorna um enumerador que fornece uma sequncia de tuplas com o nmero da iterao e o valor da lista original
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
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
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
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
a = [1,2,3] f(a)
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
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}
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?
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
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
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()
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
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
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}
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
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
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!
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?
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
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
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
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()
espaos de nomes
Assim, se no mdulo escalares for criada a funo produto, no haver conflito com a funo produto do mdulo vetores
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
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
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()
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
instncia
class Y:
pass
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
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
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
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
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
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
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()
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
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
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
def f2(b):
return f1(b)
def f3(c):
return f2(c)
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
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
excees levantadas
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
except AttributeError:
except ZeroDivisionError:
print diviso por zero
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]
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]
except ZeroDivisionError:
else:
print erro de diviso por zero print no deu erro print executado sempre
finally:
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
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
assert condio , string Se condio for falsa, um AssertionError levantado, e o string usado como mensagem dele
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