Professional Documents
Culture Documents
Sobre a apostila
Esta apostila foi escrita por ex-estudantes da Universidade Santa Ceclia, localizada em
Santos SP, como exigncia parcial para obteno do ttulo de Bacharel em Cincia da
Computao, sob orientao do Prof. Maurcio Neves Asenjo. Seu contedo destinado a
estudantes iniciantes de programao, que tenham pelo menos conhecimento de lgica de
programao, conceitos de bancos de dados e SQL (Structured Query Language).
Nessa apostila ns cobriremos os recursos fundamentais da linguagem Python e de sua
biblioteca-padro, alm de alguns assuntos mais avanados e tericos, que daro ao estudante
a base necessria para poder se aprofundar em outros tpicos mais especficos, seja da
biblioteca-padro do Python, como frameworks e bibliotecas de terceiros.
Para quem j desenvolvedor e deseja aprender Python, recomendamos a leitura do
livro Python para Desenvolvedores - 2 edio, de Luiz Eduardo Borges, disponvel para
download no seu site oficial, http://ark4n.wordpress.com/python/.
Prefcio da 2 Edio
A 1 edio desta apostila foi disponibilizada para download no Source Forge em
novembro de 2010, poca em que o trabalho que a apostila fazia parte foi apresentado na 10
edio do SEMESP CONIC (Congresso Nacional de Iniciao Cientfica). Devido a este limite de
tempo, alguns contedos tiveram de ser deixados de fora e diversos tpicos ficaram confusos.
Esta 2 edio, lanada em novembro de 2011, foi totalmente revisada, os contedos
que foram deixados de fora na 1 edio foram includos, bem como alguns tpicos foram reescritos. Dentre os tpicos includos podemos citar:
Site oficial
A edio mais recente dessa apostila encontra-se disponvel no formato PDF para
download no endereo http://sourceforge.net/projects/apostila-python/. Dvidas,
reclamaes, sugestes, correo (e por que no elogios?!) podem ser enviados para o e-mail
do mantenedor do projeto, gabriel@phasedesign.com.br. Para se manter informado em
relao a novos lanamentos e correes da apostila, basta seguir o perfil @GabrielOliverio no
Twitter.
Licena
Este trabalho est licenciado sob uma Licena Creative Commons Atribuio-Uso NoComercial-Compartilhamento pela mesma Licena 2.5 Brasil. Para ver uma cpia desta licena,
visite http://creativecommons.org/licenses/by-nc-sa/2.5/br/ ou envie uma carta para Creative
Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
Convenes
Nesta apostila utilizamos diversas convenes de estilos para distinguir mais
facilmente os diferentes tipos de informaes nela contida.
Exemplos de cdigos-fontes so separados do texto e utilizam a fonte monosespaada
Courier New; listagens com mais de uma linha aparecem enumeradas para facilitar a
Sumrio
Sobre a apostila ........................................................................................................................ 1
Prefcio da 2 Edio ................................................................................................................ 1
Site oficial ................................................................................................................................. 2
Licena...................................................................................................................................... 2
Convenes .............................................................................................................................. 2
Sumrio .................................................................................................................................... 3
Introduo ................................................................................................................................ 7
O que Python? ................................................................................................................... 7
Histria ................................................................................................................................. 8
Implementaes ................................................................................................................... 8
Verses ................................................................................................................................. 9
Ambientes de desenvolvimento e editores de texto .............................................................. 9
Modos de execuo ............................................................................................................ 10
Interativo ........................................................................................................................ 10
Compilao e interpretao ............................................................................................ 12
Sintaxe ................................................................................................................................ 14
Blocos ............................................................................................................................. 14
Comentrios.................................................................................................................... 15
Identificadores ................................................................................................................ 16
Variveis e tipos ...................................................................................................................... 17
Tipos de dados .................................................................................................................... 17
Tipos Numricos ................................................................................................................. 17
Int ................................................................................................................................... 17
Long ................................................................................................................................ 18
Float................................................................................................................................ 18
Complex .......................................................................................................................... 18
Bool ................................................................................................................................ 18
NoneType ....................................................................................................................... 19
Tipos de Sequncias ............................................................................................................ 19
List .................................................................................................................................. 19
Tuple ............................................................................................................................... 21
Dict ................................................................................................................................. 23
Strings................................................................................................................................. 24
Seleo e slicing .............................................................................................................. 25
Sequncias de escape...................................................................................................... 25
Formatao (ou interpolao) de strings ......................................................................... 27
Unicode .......................................................................................................................... 31
Determinando o tipo de uma varivel ................................................................................. 32
Determinando o tamanho de uma varivel ......................................................................... 33
Converses ......................................................................................................................... 33
Avaliao de True e False .................................................................................................... 34
Operadores ............................................................................................................................. 35
Operadores Aritmticos ...................................................................................................... 35
Operadores lgicos ............................................................................................................. 37
Identidade de objetos ......................................................................................................... 38
Presena em Sequncias ..................................................................................................... 38
Estruturas ............................................................................................................................... 40
Estrutura de deciso ........................................................................................................... 40
Estruturas de repetio ....................................................................................................... 41
For .................................................................................................................................. 41
While .............................................................................................................................. 41
Controle de laos ............................................................................................................ 42
Funes .................................................................................................................................. 44
O que so? .......................................................................................................................... 44
Parmetros e argumentos ................................................................................................... 44
Parmetros com argumentos default .............................................................................. 45
Argumentos de tamanho varivel .................................................................................... 46
Decoradores ....................................................................................................................... 47
DocStrings........................................................................................................................... 48
Mdulos ................................................................................................................................. 49
Criando um mdulo ............................................................................................................ 49
Importando mdulos .......................................................................................................... 50
Espao de nomes .................................................................................................................... 54
Local ............................................................................................................................... 54
Global ............................................................................................................................. 54
Embutido ou Built-in ....................................................................................................... 55
Pacotes ................................................................................................................................... 57
Trabalhando com arquivos ...................................................................................................... 59
Criando arquivos ................................................................................................................. 59
Modos de abertura ............................................................................................................. 59
Lendo arquivos ................................................................................................................... 60
Posicionando-se em arquivos .............................................................................................. 61
Atributos e mtodos de arquivos ........................................................................................ 62
Tratamento de excees ......................................................................................................... 64
O que so excees? ........................................................................................................... 64
Try / Except ......................................................................................................................... 64
Acionando excees............................................................................................................ 65
Finally ................................................................................................................................. 66
Trabalhando com bancos de dados ......................................................................................... 67
Criando o banco de dados ................................................................................................... 68
Estabelecendo conexo....................................................................................................... 71
Executando queries ............................................................................................................. 71
Paradigmas de programao ................................................................................................... 75
Paradigma Imperativo ......................................................................................................... 75
Paradigma Procedural ......................................................................................................... 76
Programao Orientada a Objetos ...................................................................................... 77
Classes new-style e old-style ............................................................................................ 78
Criando classes ................................................................................................................ 78
Variveis de instncia ...................................................................................................... 79
Variveis de classe .......................................................................................................... 80
Mtodos ......................................................................................................................... 80
Atributos e mtodos dinmicos ....................................................................................... 83
Referncias a objetos ...................................................................................................... 84
Herana .......................................................................................................................... 85
Sobrescrita de mtodos (Method overriding) .................................................................. 86
Sobrecarga de mtodos (Method overloading) ................................................................ 87
Atributos e mtodos embutidos ...................................................................................... 87
Representao de objetos ............................................................................................... 88
Variveis e mtodos privados .......................................................................................... 91
Propriedades ................................................................................................................... 92
Introduo
O que Python?
Python uma linguagem de programao de propsito geral, utilizada dentre
diversas outras aplicaes, para o desenvolvimento de aplicativos de console (modo texto),
aplicativos que utilizam formulrios, aplicaes web, cientficas, parsers e tambm como
linguagem de scripting, para estender aplicativos e automatizar tarefas.
Dentre suas caractersticas pode-se ressaltar que Python:
interpretada
Ao contrrio das linguagens compiladas, que transformam o cdigo escrito dos
programas para uma plataforma especifica, por exemplo, Windows ou Linux, Python
transforma o cdigo do programa em bytecodes e estes so executados por um
interpretador, o que possibilita o aplicativo ser executado em vrias plataformas com
poucas ou mesmo nenhuma alterao.
cdigo-aberto
Python absolutamente livre, mesmo para fins comerciais, permitindo a venda de um
produto escrito em Python, ou um produto que venha com o interpretador embutido
sem pagar taxas ou licenas para isso.
adequado para resolver um problema de maneira mais fcil do que o outro. Python
suporta os seguintes paradigmas de programao:
Procedural;
Orientado a objetos;
Funcional;
Histria
Python foi criada no incio de 1990 por Guido van Rossum no CWI Centrum Wiskunde
& Informatic (Instituto Nacional de Pesquisa de Matemtica e Cincia da Computao, em
holands) nos Pases Baixos, para ser a sucessora da linguagem de programao ABC. Seu
nome baseado na srie de televiso britnica Monty Python's Flying Circus e no na cobra
Pton (Python, em ingles) como muitos pensam. Embora Guido inclua contribuies de muitos
programadores, ele ainda se mantm como o principal autor da linguagem e conhecido na
comunidade como Benevolent Dictator for Life (Ditador Benevolente para a Vida, em ingls).
Em 1995, Guido continuou seu trabalho na Corporation for National Research
Initiatives (Corporao para Iniciativas de Pesquisas Nacionais, em ingls), em Reston
Virginia, onde foram lanadas vrias verses do Python. Em maio de 2000, Guido e a equipe de
desenvolvimento do Python se mudaram para o BeOpen.com para formar o time BeOpen
PythonLabs. Em outubro do mesmo ano, o time PythonLabs se muda para a Digital Creations,
agora chamada de Zope Corporation.
Em 2001, a Python Software Foundation PSF foi formada, uma organizao sem fins
lucrativos criada especificamente para possuir as propriedades intelectuais relacionadas
linguagem Python.
Implementaes
Uma implementao de Python deve ser entendida como um programa ou ambiente
que fornece suporte execuo de programas escritos em Python ou algum dialeto similar da
linguagem.
H diversos pacotes de software que fornecem o que todos conhecemos como Python,
apesar de alguns deles serem mais como distribuies ou variantes de alguma implementao
existente do que uma implementao completamente nova da linguagem. A implementao
Python for S60: Conhecido como PyS60, a implementao de Python portado para a
plataforma de software S60 da Nokia, baseado na verso 2.2.2 do Python.
Verses
As implementaes oficiais do Python so mantidas pela PSF e no momento se
encontram nas verses 2.7.2 e 3.2.2, disponveis para download no endereo
http://www.python.org/download.
As verses 2.x e 3.x esto previstas para coexistir por vrios lanamentos em paralelo,
onde a srie 2.x existe em grande parte devido compatibilidade com bibliotecas de terceiros
e possui algumas novas caractersticas que esto sendo portadas da srie 3.x. Devido a esta
compatibilidade, utilizaremos nesta apostila a verso 2.7, que corrige alguns bugs da verso
anterior e implementa alguns recursos. Apesar de utilizarmos a verso 2.7, nada o impede de
utilizar outra verso, desde que seja superior 2.5.
A maioria das distribuies Linux j vem com o interpretador do Python instalado. Para
plataforma Windows h um instalador, que inclui o interpretador, a documentao e um
ambiente de desenvolvimento integrado (IDE) o IDLE.
10
Modos de execuo
Python possui dois modos de execuo: o modo interativo e o modo de compilao e
interpretao.
Interativo
O interpretador interativo de Python pode ser encontrado como Python (command
line) na aba Python 2.7 no menu Iniciar no Windows, ou digitando python e pressionando
ENTER em um terminal de Linux. Isto tambm pode ser configurado em ambientes Windows
incluindo o caminho do interpretador do Python na varivel de sistema PATH. Mais
informaes no Apndice A da apostila.
11
Os sinais >>> mostram que o interpretador est pronto para receber comandos. Digite
os seguintes comandos no interpretador interativo:
1
2
3
4
5
6
[ENTER]
[ENTER]
[ENTER]
[ENTER]
adiante, um if testa uma condio, se ela for verdadeira ento executa um ou mais
comandos, portanto, pelo menos um comando tem que ser inserido (ou um erro seria
exibido). Ao entrar com o comando print "4 > 2" e pressionar ENTER, o interpretador
exibe ... novamente, esperando mais sentenas. Podemos pressionar ENTER e a sentena
estar terminada, o interpretador exibe o resultado, e ento estar pronto para receber outro
comando.
Nos exemplos acima no precisaramos necessariamente ter chamado o comando
print para imprimir os textos no interpretador interativo, podemos passar objetos/valores
diretamente para o interpretador do Python e ele se vira para imprimir o valor mais que faz
mais sentido de acordo com seu tipo. Utilizamos o comando print somente para demonstrar
de uma forma didtica a utilizao do interpretador interativo do Python, mas lembre-se de
nunca omitir o comando print em um script no modo Compilao e interpretao, que
veremos logo a diante. Vamos ver alguns exemplos:
12
1
2
3
4
5
6
>>> 'String'
'String'
>>> 1+1
2
>>> object()
<object object at 0x006F14B0>
No menu File, clique em Save, escolha o local a salvar o arquivo e o nomeie como
ola_mundo.py. Com o arquivo salvo, podemos execut-lo clicando em Run e em seguida em
Run Module, ou pressionando a tecla de atalho F5. Desta forma, o programa executado em
um shell no prprio IDLE, porm podemos tambm execut-lo clicando duas vezes sobre ele
13
preocupe - veremos mais a frente como fazemos para representar nossos caracteres latinos no
Python.
Para que isso funcione necessrio incluir o caminho onde o interpretador do Python foi instalado (geralmente
C:\Python27) na varivel de ambiente PATH e reiniciar o computador para que as alteraes sejam aplicadas. Mais
informaes no apndice A da apostila.
14
Sintaxe
Um programa escrito em Python constitudo de instrues que podem ser
distribudas em vrias linhas no cdigo-fonte. Uma das formas de se fazer isso utilizando o
caractere barra-invertida ( \ ). Exemplos:
1
2
3
4
5
x = 3 * 4 \
5.0
mensagem1 = "Texto de uma linha"
mensagem2 = "Texto distribudo \
em mais de uma linha"
Tambm podemos distribuir o cdigo em mais linhas com vrgulas, quando estamos
armazenando dados em colees, como listas, tuplas e dicionrios, definindo parmetros e
passando argumentos para funes, que veremos mais a diante. Exemplos:
1
2
3
4
5
6
7
8
9
lista = ['string1',
'string2']
def funcao(param1,
param2, param3):
print param1, param2, param3
funcao('string1', 'string2',
'string3')
Blocos
Python usa espaos em branco e indentao para separar blocos de cdigo, como
estruturas de controle e de repetio e na declarao de funes, que veremos a seguir na
apostila. O aumento da indentao indica o incio de um novo bloco, que termina com
diminuio da indentao.
A linha que define a estrutura ou declarao terminada por dois-pontos e simboliza
que as linhas com mais um nvel de indentao que seguem fazem parte do seu bloco de
cdigo. No exemplo abaixo demonstrada a definicao de uma funo:
1
2
3
4
5
6
7
15
cdigo, e at conveniente para facilitar sua leitura o bloco s termina com a diminuio da
indentao.
Na maioria das linguagens de programao, a indentao bastante utilizada para
aumentar a legibilidade do cdigo, porm no Python ela obrigatria, se um erro de
indentao estiver presente no cdigo, ocorrer uma falha na interpretao. O exemplo a
seguir demonstra um erro de indentao na linha 3:
1
2
3
4
O ponto-e-vrgula tambm pode ser inserido no trmino de cada linha, porm seu uso
opcional e quase nunca utilizado.
Comentrios
Os comentrios em uma linguagem de programao so teis para deixar algum tipo
de informao, como lembretes de funcionamento de um processo, erros a serem corrigidos
ou cdigo a ser melhorado para a pessoa que for ler e manter o cdigo, este sendo
possivelmente at mesmo o programador que escreveu o cdigo.
O caractere # marca o incio dos comentrios, a partir deste caractere todo texto
ignorado pelo interpretador at o final da linha - com exceo dos comentrios funcionais ou
mgicos, que sero exibidos a seguir. Exemplos de comentrios no-funcionais:
1
2
3
Indicar o local do interpretador que ser utilizado para executar o programa, onde
acrescentado o comentrio #! seguido do caminho do interpretador, algo como
16
#!/usr/bin/python
# -*- coding: latin-1 -*-
Ateno
Apesar de nessa apostila no definirmos a codificao nas listagens de cdigos-fontes a
fim de reduzir o nmero de linhas, no se esquea de definir a codificao nos seus arquivos,
ou os caracteres latinos neles presentes aparecero incompreensveis, na melhor das
hipteses. Veremos mais sobre tipos de caracteres no captulo seguinte, quando falaremos
sobre Unicode.
Identificadores
Identificadores so nomes utilizados para identificar objetos - variveis, funes e
classes, por exemplo. Os identificadores devem comear com uma letra sem acentuao ou
com um sublinhado ( _ ), e podem conter nmeros, letras sem acentuao e sublinhados.
Python case-sensitive, ou seja, o identificador python diferente dos identificadores
PYTHON e Python.
17
Variveis e tipos
Variveis so espaos reservados na memria utilizados para armazenar valores, como
por exemplo, textos, resultados de clculos, entrada de usurio, resultados de consultas a uma
base de dados, etc. Variveis devem seguir as regras de identificadores, vistos anteriormente.
Tipos de dados
Tipos de dados restringem os valores a serem armazenados nas variveis. Os tipos prdefinidos no Python podem ser simples - como nmeros e tambm os tipos que funcionam
como colees, como as listas e dicionrios. Como dito anteriormente, Python possui tipagem
dinmica, o que associa o valor da varivel a um tipo no momento da atribuio de valor e
aloca o espao necessrio para armazenar seus valores. Para atribuir valores s variveis
utilizado o operador de atribuio ( = ). Exemplos:
1
2
nome = "Zaphod"
resposta = 42
# Uma string
# Um inteiro
No exemplo acima a varivel nome tem o valor "Zaphod" atribudo, assim como a
varivel resposta possui o valor 42. Pode-se tambm atribuir vrios valores de uma s vez s
variveis, por exemplo:
x, y, z = 10, -5, 7
# Igual a x = 10, y = -5 e z = 7
Imutveis que no permitem que seus valores sejam alterados, ou seja, ao re-atribuir
um valor a uma varivel, este no alterado, o valor a ser atribudo um novo valor.
Tipos Numricos
Tipos de dados numricos em Python so imutveis e se dividem basicamente em
quatro, alm do bool, que uma extenso do tipo int:
Int
Representa nmeros inteiros, como 42, 0, 1 e -3, entre -2147483648 a 2147483647.
Ocupa 4 bytes na memria e pode armazenar tanto valores decimais (de base 10), quanto
valores octais (de base 8) e hexadecimais (base 16). Para declarar um inteiro octal, o nmero 0
18
(zero) tem que ser prefixado ao nmero, como 0123, e para definir um nmero hexadecimal, o
prefixo 0x ou 0X deve ser utilizado, como 0xFFFFFF ou 0X006699.
Long
Representa nmeros inteiros longos e pode armazenar nmeros to grandes quanto a
memria puder armazenar. Assim como o tipo int, o long tambm pode armazenar nmeros
tanto decimais, quanto octais e hexadecimais. Para declarar um valor long mesmo se o
nmero a ser atribudo estiver na faixa de valores do tipo int necessrio sufixar a letra L
minscula ou maiscula - como em 524511574362l, 0xDDEFBDAEFBDAECBFBAEL e 0122L.
Como a letra L minscula pode ser confundida facilmente com o nmero 1, uma boa prtica
utilizar o L sempre maisculo ao invs de minsculo.
Float
Representa nmeros reais e que possuem sinal de expoente (e ou E). Esses nmeros
so comumente chamados comumente de floating-point numbers ou nmeros de ponto
flutuante. Exemplos: 0.0042, .005 (o mesmo que 0.005), 1.14159265 e 6.02e23 (o mesmo que
6.02). Note que o delimitador de casas decimais o ponto ( . ) e no a vrgula ( , ) padro no
Brasil.
Complex
Representa nmeros complexos, como 0.42j e 9.322e-36j.
Bool
O tipo bool foi adicionado na verso 2.2 do Python como uma especializao do tipo
int. Os valores do tipo bool podem representar dois valores completamente distintos: True
possui_filhos = False
e_funcionario = false
sair = True
valida_entrada = true
#
#
#
#
OK
Erro
OK
Erro
19
NoneType
NoneType o tipo de None, uma constante embutida do Python, assim como True e
False, e frequentemente utilizada para representar a ausncia de um valor, similar a null
na linguagem C e derivadas.
Tipos de Sequncias
List
Uma lista um conjunto linear de valores indexados por um nmero inteiro, chamado
de ndice, que se inicia em 0 (zero). Os elementos contidos em uma lista podem ser de
qualquer tipo, at mesmo outras listas e no precisam ser todos do mesmo tipo. Uma lista
delimitada por colchetes, e seus elementos separados por vrgulas. Exemplos:
1
2
3
4
lista1
lista2
lista3
lista4
=
=
=
=
[]
[1, 2, 3]
["string 1", "string 2"]
[1, 3.1415, "string", [1, 2], (4, 5)]
Nos exemplos anteriores, lista1 uma lista iniciada sem elementos. Estes podem
ser adicionados ou inseridos na lista atravs se seus mtodos, que sero vistos mais adiante.
lista4 possui 5 elementos, sendo um int, um float, uma string, uma outra lista e uma
# Imprime 1
# Imprime 2
print lista3[-1]
print lista4[-2]
# Imprime string 2
# Imprime (4, 5)
Python fornece uma maneira simples de criar fatias (slices) de uma lista. Uma fatia
nada mais do que uma lista gerada a partir de um fragmento de outra lista. Para criar um
slice, basta especificar os dois ndices separados pelo sinal de dois-pontos (:) - o fragmento
resultante contm os elementos correspondentes do primeiro ndice ao segundo, no
incluindo o ltimo elemento. Se omitirmos um dos ndices, assume-se incio ou fim da lista.
Exemplos:
20
1
2
3
4
lista = [1, 2, 3, 4, 5]
print lista[0:2]
print lista[2:4]
lista[:]
# Imprime [1, 2]
# Imprime [3, 4]
# Imprime [1, 2, 3, 4, 5]
lista = [1, 2, 3, 4, 5]
print lista[0:2]
print lista[2:4]
lista[:]
# Imprime [1, 2]
# Imprime [3, 4]
# Imprime [1, 2, 3, 4, 5]
Repare que na linha 3 no especificamos nem o incio, nem o final do slice, fornecemos
somente o intervalo com o valor -1, que fez com que a lista seja gerada e exibida do ltimo
para o primeiro elemento.
Operaes
Vimos que tudo em Python um objeto, listas so objetos tambm e possuem
mtodos (funes) para manipul-las. Abaixo segue uma relao dos mtodos mais comuns e
alguns exemplos:
count(elemento): Retorna quantas ocorrncias de um elemento existe na lista.
Exemplos:
1
2
3
4
5
Exemplo:
1
2
3
Exemplo:
1
2
3
4
>>>
>>>
>>>
[1,
lista = [1, 2, 3]
lista.append(4)
lista
2, 3, 4]
Exemplo:
21
1
2
3
4
Exemplo:
1
2
3
4
>>>
>>>
>>>
[2,
lista = [1, 2, 3, 1, 2, 3]
lista.remove(1)
lista
3, 1, 2, 3]
pop(): Remove elemento da lista e o retorna. O mtodo pop aceita o argumento index, caso
>>>
>>>
5
>>>
1
>>>
[2,
lista = [1, 2, 3, 4, 5]
lista.pop()
# Remove e retorna elemento 5
lista.pop(0)
lista
3, 4]
sort(): Ordena a lista. O mtodo sort aceita o parmetro reverse, que possibilita que a
Tuple
Uma tupla consiste de um nmero de valores separados por vrgulas. Tuplas ao
contrrio das listas que acabamos de ver so imutveis - uma vez criadas no podem ser
modificadas. Exemplos:
1
2
3
4
5
6
7
8
9
>>>
>>>
(1,
>>>
1
>>>
(3,
>>>
(5,
t1 = 1, 2, 3, 4, 5
t1
2, 3, 4, 5)
t1[0]
t1[2:4]
4)
t1[::-1]
4, 3, 2, 1)
22
10 >>> t2 = (1, 3, 3)
11 >>> t2[1] = 2
12 Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Como voc pode ver nos exemplos acima, as tuplas impressas aparecem sempre entre
parnteses, de forma que tuplas aninhadas sejam interpretadas corretamente. Podemos
definir uma tupla com ou sem os parnteses, embora muitas vezes estes sejam necessrios,
caso a tupla faa parte de uma expresso maior ou provoque ambiguidade. Repare tambm
nos exemplos acima que tuplas possuem as mesmas funcionalidades de indexao e slicing
que as listas vistas anteriormente.
O que fizemos na linha 1 se chama tuple packing, oque acontece quando agrupamos
dois ou mais valores em uma tupla. A operao inversa, chamada de sequence unpacking,
tambm possvel, dessa forma:
1
2
3
4
5
6
>>>
>>>
>>>
1
>>>
2
tupla = 1, 2
x, y = tupla
x
y
Note que a operao de atribuio mltipla vista logo no incio do captulo nada mais
do que uma combinao de tuple packing e sequence unpacking. Recordando:
x, y, z = 10, -5, 7
# Igual a x = 10, y = -5 e z = 7
Tuplas podem ter vrios usos, como coordenadas num eixo cartesiano (x, y), registros
de uma consulta a um banco de dados e onde fizer sentido ou for mais eficiente um conjunto
fixo de valores.
Tips and tricks de tuplas
H uma peculiaridade na construo de tuplas vazias ou com um s tem. Tuplas vazias
so construdas por um par vazio de parnteses, dessa forma:
>>> t = ()
Tuplas com somente um elemento devem ser construdas adicionando uma vrgula
aps seu valor. Abra o interpretador interativo do Python e dispare as seguintes instrues:
1
2
3
4
5
>>> x = (1)
>>> type(x)
<type 'int'>
>>> y = (1,)
>>> type(y)
23
6
<type 'tuple'>
Repare que ao passarmos a varivel x para a funo embutida type - que retorna o
tipo de um objeto - o texto <type 'int'> exibido, mostrando que x no uma tupla, mas
um inteiro. J com y no ocorre o mesmo, j que inserimos a vrgula aps o nico elemento da
tupla.
Isso ocorre porque o Python utiliza parnteses tambm para agrupar expresses,
como em 2 * (42 + y), portanto temos que inserir a vrgula para no haver ambiguidade
entre tuplas e expresses.
Operaes
Tuplas possuem dois mtodos idnticos ao das listas: index e count. O restante dos
mtodos de listas realiza modificaes nos valores, e como tuplas so imutveis, no suportam
tais operaes. Mais infomaes sobre tuplas consulte a documentao oficial da linguagem,
no endereo http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences.
Dict
Um dicionrio uma coleo de elementos onde possvel utilizar como ndice
qualquer tipo imutvel, como strings, tuplas e tipos numricos. O termo normalmente
utilizado para descrever essa associao entre ndice e elemento key / value ou chave / valor.
Dicionrios2 so definidos entre chaves ( { e } ), as keys separadas dos values por doispontos ( : ) e os pares de keys e values separados por vrgulas. Exemplos:
1
2
3
# Adiciona valor
# Remove valor
A instruo del apaga uma referncia a um objeto. Veremos mais sobre o assunto no
final da apostila, em Orientao a Objetos.
Operaes
keys(): Retorna uma lista das chaves de um dicionrio.
Caso voc tenha alguma experincia com outras linguagens de programao, possivel que voc j conhea o
conceito de dicionrios porm com outro nome, como Hash e Map, por exemplo.
24
Exemplo:
1
2
3
Exemplo:
1
2
3
items(): Retorna uma lista contendo os pares de chaves e valores em formas de tuplas.
Exemplo:
1
2
3
has_key(chave): Retorna True caso chave exista em um dicionrio e False caso contrrio.
Exemplo:
1
2
3
Strings
Strings so seqncias de caracteres, sejam eles letras, nmeros, espaos, caracteres
especiais, e etc., e assim como os tipos numricos vistos anteriormente, strings tambm so
imutveis. Strings podem ser delimitadas por aspas simples, duplas ou triplas, sendo que estas
devem ser idnticas na abertura e fechamento, ou seja, quando se abre uma string com aspas
duplas, deve-se fechar com aspas duplas. Exemplos:
1
2
3
4
>>>
>>>
>>>
>>>
string1
string2
string3
string4
=
=
=
=
"Python"
'Python'
"""Python"""
'''Python'''
#
#
#
#
Aspas
Aspas
Aspas
Aspas
duplas
simples
triplas
triplas
>>>
>>>
>>>
>>>
string1
string2
string3
string4
>>>
>>>
>>>
>>>
string1
string2
string3
string4
=
=
=
=
"Python, "
'Batteries included!'
string1 + string2
'Python ' + "Batteries included!"
#
#
#
#
Python
Batteries included!
Python, Batteries included!
Python, Batteries included!
25
10 >>> string1 + string2
Seleo e slicing
Assim como listas e tuplas, strings tambm so sequncias, portanto, podemos utilizar
as mesmas funcionalidades de indexao e slicing de elementos vistos nos outros tipos
seqenciais vistos anteriormente. Exemplo:
1
2
3
4
5
6
7
8
9
Sequncias de escape
Como vimos, definimos strings envolvendo uma sequncia de caracteres entre aspas.
Tambm vimos na introduo da apostila que o caractere barra-invertida ( \ ) tem a funo de
separar uma seqncia em vrias linhas, portanto, as aspas e a barra-invertida possuem
funes especiais no Python, mas e se precisarmos, por exemplo, inserir aspas ou barrasinvertidas em uma string? Para isso precisamos escapar esses caracteres. Sequncias de
escape no Python consistem de uma barra-invertida ( \ ) seguida de uma letra, sinal ou
combinaes de dgitos. Alguns das sequncias de escape que Python dispe so:
\n
\t
Tabulao horizontal
\r
\b
\a
\\
\"
\'
Exemplos:
1
2
3
4
26
5
6
7
8
9
10
11
12
13
14
15
As aspas triplas so muito teis para criar strings com vrias linhas, assim, as linhas
podem ser quebradas diretamente sem o uso do caractere de escape "\n". Exemplo:
1
2
3
4
mensagem = """\
ls [-opcoes]
-l
Exibe permisses, data de criao e tipo do arquivo
-a
Exibe inclusive arquivos ocultos"""
Na linha 1 utilizamos uma barra-invertida depois das aspas para dispor a sentena em
outra linha somente para melhorar o alinhamento no cdigo, podemos igualmente definir a
string dessa forma:
1
2
3
Como veremos mais adiante, em Trabalhando com Arquivos, sempre utilizamos o caractere / (barra) para definir
27
%s
%r
%i ou %d
Nmeros inteiros
%o
Nmeros octais
%h
Nmeros hexadecimais
%f
%e
%%
Sinal de porcentagem
Exemplos:
1
2
3
4
5
Repare que passamos as variveis nome e idade para o operador % atravs de uma
tupla depois do fechamento das aspas e que no omitimos os parnteses; caso isso ocorra,
uma exceo TypeError acionada.
As funes str e repr, utilizadas pelos smbolos de formatao %s e %r, so utilizadas
para representar objetos, str para uma representao mais amigvel, e repr para uma
representao mais especfica do objeto. Veremos mais sobre as funes str e repr mais a
diante, em Orientao a Objetos.
28
Como Python uma linguagem fortemente tipada, para concatenar uma string com
um int, primeiro teramos que converter o valor da varavel idade em string e ento
concatenar os valores, dessa forma:
1
nmero, preenchido com zeros esquerda. Ambos os modificadores podem ser omitidos.
Exemplos:
1
2
3
4
5
6
7
8
9
10
Chamamos esse mtodo de formatao por posio, pois se mudarmos a posio dos
os valores na tupla, por exemplo, inverter as variveis pi e euler, que so do mesmo tipo, a
string formatada ser diferente.
Formatao por palavra-chave
Esse segundo mtodo bastante semelhante ao primeiro. Exemplo:
1 >>> mensagem = 'Nome: %(nome)s. Idade: %(idade)d.' % {'nome':
'Zaphod', 'idade': 42}
2 >>> print mensagem # Imprime Nome: Zaphod. Idade: 42.
Repare que ao invs de passarmos os valores atravs de uma tupla para o operador %,
utilizamos um dicionrio, onde a chave corresponde ao placeholder na string a ser formatada,
e que os smbolos utilizados para formatar strings no primeiro mtodo tambm devem ser
utilizados nesse, aps o fechamento dos parnteses.
A formatao de tipos numricos atravs dos modificadores m.n tambm funciona da
mesma maneira que no mtodo de formatao por posio que vimos anteriormente.
Exemplos:
1
2
3
29
4 >>> print """\
5 ... Pi: %(pi)10.3f.
6 ... Euler: %(euler).7f.
7 ... Resposta: %(resposta)3d""" % {'euler': euler, 'resposta': resp,
'pi': pi}
8 Pi:
3.142.
9 Euler: 2.7313000.
10 Resposta: 42
Mtodo format
Como foi dito anteriormente, outra maneira de formatao foi disponibilizada na
verso 2.6 do Python, o mtodo format dos objetos string. Esse mtodo o novo padro de
formatao de strings no Python 3.0, e consiste em definir placeholders, que podem ser tanto
numricos (por posio) quanto por palavra-chave, entre um par de chaves ( { } ). Veja alguns
exemplos:
1
2
3
4
5
6
Voc deve estar se perguntando sobre o que so esses tais de argumentos por posio e por palavras-chave que
falamos tanto agora, no ?! No se preocupe, teremos um tpico s deles mais a diante, em Funes.
30
idade, um int, cujo smbolo default d. Esse novo mtodo de formatao mais completo
's'
Para inteiros:
'd'
'b'
'o'
'x'
'X'
'n'
'c'
'e'
'E'
'f' ou 'F'
'%'
Exemplo:
1
2
string = "python"
print string.capitalize()
# Imprime Python
31
Exemplo:
1
2
string = "python"
print string.upper()
# Imprime PYTHON
Exemplo:
1
2
string = "PYTHON"
print string.lower()
# Imprime python
strip(): Retorna uma cpia da string com os espaos em branco antes e depois removidos.
Exemplo:
1
2
string = "
Python
"
print string.strip() + "!!!"
# Imprime Python!!!
startswith(prefixo): Retorna True se uma string comea com o prefixo passado por
string = "Python"
print string.startswith("py")
# Imprime False
string = "PYTHON"
string = string.lower()
32
Salve esse arquivo e o execute (clicando duas vezes sobre seu cone ou atravs da linha
de comando, navegando at o local onde o arquivo foi salvo e executando o seguinte comando
no terminal ou prompt de comando, caso esteja no Windows5):
python nome_do_arquivo.py
>>> a = 1
>>> type(a)
<type 'int'>
>>> b = "Python"
>>> type(b)
<type 'str'>
>>> c = [1, 2, 3]
>>> type(c)
Isso s vai funcionar no Windows se voc configurou o a varivel de ambiente PATH, conforme explicado no
Apndice A.
33
9
10
11
12
13
14
15
16
<type 'list'>
>>> d = (1, 2, 3)
>>> type(d)
<type 'tuple'>
type(a) == type(b)
True
type(b) == int
True
>>>
>>>
6
>>>
>>>
3
>>>
>>>
2
a = "Python"
len(a)
b = [1, 2, 3]
len(b)
c = {"a": 1, "b": 2}
len(c)
Quando a funo len recebe uma string, retorna a quantidade de caracteres; quando
recebe uma lista, tupla ou dicionrio, retorna a quantidade de elementos, e assim por diante.
As funes len e type vistas anteriormente representam funes de reflexo ou introspeco
e veremos mais delas no decorrer da apostila.
Converses
Python disponibiliza algumas funes para que possamos converter um valor de um
tipo em outro. Exemplos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> a = "1"
>>> b = int(a)
>>> type(b)
<type 'int'>
>>> c = 1
>>> d = float(c)
>>> type(d)
<type 'float'>
>>> e = [1, 2, 3]
>>> f = tuple(e)
>>> type(f)
<type 'tuple'>
>>> g = "False"
>>> h = bool(g)
>>> type(h)
<type 'bool'>
34
Alm dos tipos demonstrados anteriormente, Python dispe ainda de muitos outros,
como as colees set e frozenset, no mostradas nessa apostila. Para mais informaes
consulte a documentao oficial no endereo http://docs.python.org/library/stdtypes.html.
False
None
35
Operadores
Operadores Aritmticos
H sete operadores aritmticos no Python:
Soma
Subtrao
Multiplicao
Diviso
//
Diviso truncada
Mdulo
**
Exponenciao
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
2 + 2
5 / 2
10 % 5
12.356 / 2
5 * 5
2 ** 3
5 2
12.356 // 2
#
#
#
#
#
#
#
#
Imprime
Imprime
Imprime
Imprime
Imprime
Imprime
Imprime
Imprime
4
2
0
6.1779999999999999
25
8
3
6.0
Explicando:
Linha 4: A soluo para o problema da linha 2: dividir 12.356 (um nmero real), por 2
um inteiro, resulta em outro nmero real;
Linha 7: Subtrai 2 de 5;
36
1
2
>>> pow(2, 3)
>>> pow(5, 2)
# Imprime 8
# Imprime 25
+=
Soma e atribui
-=
Subtrai e atribui
*=
Multiplica e atribui
/=
Divide e atribui
//=
%=
**=
Exemplos:
1
2
3
4
2)
5
6
7
8
>>>
>>>
>>>
>>>
i
i
i
i
= 0
+= 10
/= 2
// 2
#
#
#
#
Atribui 0 para i
Incrementa 10 em i. (i = 10)
Divide 10 por 2 e atribui para i. (i = 5)
Divide 5 por 2 e atribui parte inteira para i. (i =
>>>
>>>
>>>
>>>
i
i
i
i
+= 8
-= 4
**= 2
%= 10
#
#
#
#
Incrementa i em 8. (i = 10)
Subtrai 4 de i e atribui resultado. (i = 6)
Eleva 6 ao quadrado e atribui para i. (i = 36)
Divide 36 por 10 e atribui resto para i. (i = 6)
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
i
i
i
i
i
i
i
i
=
=
=
=
=
=
=
=
0
i
i
i
i
i
i
i
+ 10
/ 2
// 2
+ 8
- 4
** 2
% 10
a = "Python"
print a * 2
# Imprime PythonPython
37
a = [-1, -2]
b = [1, 2, 3]
print b * 3
print a + b
c = (1, 2)
print c + (3, 4)
# Imprime [1, 2, 3, 1, 2, 3, 1, 2, 3]
# Imprime [-1, -2, 1, 2, 3]
# Imprime (1, 2, 3, 4)
Operadores lgicos
Alm dos operadores matemticos, Python possui operadores lgicos, que retornam
sempre um valor booleano, ou seja, True ou False. Estes operadores so utilizados com
frequncia nas estruturas de controle, e laos de repetio, que veremos mais adiante.
Os operadores lgicos em Python so:
>
Maior
<
Menor
>=
Maior ou igual
<=
Menor ou igual
==
Igual
not
No
!=
No-igual 6
and
or
Ou
Exemplos:
1
2
3
4
5
6
7
8
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
print
print
print
print
print
print
print
print
1 > 2
2 == 3
5 == 5
10 > 1
2 != 1
5 <= 5
5 < 5
7 >= 3
#
#
#
#
#
#
#
#
False
False
True
True
True
True
False
True
O operador not utilizado para negar (inverter) o resultado de uma operao lgica,
por exemplo:
print not 5 < 3
# True
O operador != pode ser tambm escrito <>, porm est obsoleto e mantido por questes de compatibilidade
com cdigos antigos. Novos cdigos devem sempre utilizar != ao invs de <>.
38
idade = 22
maior_idade = idade >= 18
senha, senha_digitada = "123", "456"
libera_entrada = senha_digitada == senha
print libera_entrada
# Imprime False
Identidade de objetos
O operador is e is not so utilizados para comparar a igualdade de dois objetos. A
diferena entre o operador is e o de igualdade ( == ) est justamente na diferena que,
enquanto o operador == compara os valores armazenados nos dois objetos, o operador is
compara se as duas referncias apontam para a mesma referncia na memria, isto , se os
dois objetos so iguais. O exemplo a seguir demonstra bem a diferena entre os operadores ==
e is:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> x = [1, 2, 3]
>>> y = x
>>> z = x[:]
>>> x is y
True
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> z
[1, 2, 3]
>>> x is z
False
>>> x == z
True
Presena em Sequncias
Para seqncias, como strings, listas e tuplas, existe o operador in, que verifica se um
elemento est presente na seqncia e o not in, que retorna o inverso do operador in.
Exemplos:
39
1
2
3
4
print
print
print
print
"p" in "python"
1 in [1, 2, 3]
"d" in ("a", "b", "c")
"d" not in ("a", "b", "c")
#
#
#
#
True
True
False
True
40
Estruturas
Estrutura de deciso
A funo de uma estrutura de deciso verificar o contedo de uma expresso lgica
(ou booleana) e direcionar o fluxo do programa. Python possui uma estrutura de deciso, o if,
que definida da seguinte forma:
1
2
3
4
5
6
if expressao:
expressao_1
expressao_2
else:
expressao_3
expressao_4
a = 5
b = 3
if a >= b:
print "a maior ou igual a b"
else:
print "a menor do que b"
na tela.
Python oferece um adicional estrutura if: o elif, que permite realizar outros testes
caso a expresso avaliada pelo if seja falsa. Exemplo:
1
2
3
4
5
6
7
8
9
a = 5
b = 3
if a > b:
print u"a maior do que b"
elif a == b:
print u"a igual a b"
else:
print u"a menor do que b"
Pode-se inserir quantos elifs necessrios no if, contanto que o else seja nico e o
ltimo. Tal recurso adicional do if se deve ao fato de Python no possuir a estrutura switch,
comum s linguagens derivadas da linguagem C, como C++, Java, PHP e C#.
41
Estruturas de repetio
Estruturas ou laos de repetio so construes da linguagem que permitem repetir
um bloco de cdigo um nmero determinado ou indeterminado de vezes. Python possui duas
construes, uma adequada para cada caso.
For
O lao for adequado para o primeiro caso, quando se sabe quantas vezes ir repetir
um bloco de cdigo. Exemplo:
1
2
A funo range chamada na definio do for, retorna uma lista contendo uma faixa
de valores, no caso, de 1 a 10. A varivel i utilizada para iterar na lista retornada por range,
a cada iterao i recebe um valor, primeiro 1, depois 2, e assim por diante at o 10. A funo
range recebe trs argumentos o primeiro o incio do intervalo, o segundo fim, e o
for s in "Python":
print s
i = 0
while i < 10:
print i
i = i + 1
42
sucessivamente at que o valor no seja menor do que 10. Repare que o while testa uma
expresso lgica, vista anteriormente na apostila. Caso esta expresso retorne sempre True, o
while ser repetido infinitamente, gerando um loop infinito.
Controle de laos
Algumas vezes voc vai enfrentar uma situao em que precisa sair de um lao
completamente quando uma condio externa acionada ou quando quer pular uma parte
do lao e iterar novamente. Python fornece dois comandos para essas situaes, o break e o
continue.
Break
Pode ser utilizado tanto em um lao for quanto while. O comando break, assim
como na linguagem C e derivadas, quebra um lao. Exemplo:
1
2
3
4
5
5
6
i = 0
while i < 10:
if i == 5:
break
else:
print i
i += 1
Nesse caso, as letras da string 'Python' so impressas, exceto pela letra 'h'.
Pass
O pass, na verdade, no um comando de controle de laos (voc deve ter
percebido, j que dissemos que Python possui dois comandos de controle de laos e no trs).
O pass no faz exatamente nada, e utilizado quando uma expresso sintaticamente
necessria, mas o programa no precisa de nenhuma ao. Exemplos:
43
1
2
3
4
5
6
7
8
def teste(*args):
pass
class ClasseVazia:
pass
while True:
pass
O exemplo da funo teste mostra que o pass pode ser utilizado como um placeholder, quando se est trabalhando em um novo cdigo, permitindo assim continuar pensando
em um nvel mais abstrato e implementar a funo depois.
O segundo exemplo demonstra a definio de uma classe vazia. Classes sero
explicadas no final da apostila, em Programao Orientada a Objetos
O terceiro exemplo um while infinito que executado at que o programa seja
interrompido por um Ctrl + C.
44
Funes
O que so?
Funes so blocos de cdigo identificados por um nome, que podem receber valores
pr-definidos, chamados de argumentos e retornar valores. As funes no Python so
definidas na forma:
1
2
3
4
def funcao():
expressao_1
expressao_2
return valor
def imprime_valores():
lista = [0, 1, 2, 3]
for i in lista:
print i
Repare que a funo anterior no retorna um valor, ela somente imprime todos os
nmeros da lista. Se voc j teve contato com linguagens de programao como C, C++, C# e
Java, deve ter percebido que no foi preciso declarar a funo como void para especificar que
ela no retorna um valor. Exemplo de funo que retorna um valor:
1
2
3
4
5
6
7
8
def soma():
lista = [0, 1, 2, 3]
soma = 0
for num in lista:
soma += num
return soma
print "Soma =", soma()
No exemplo acima, criamos uma funo chamada soma. Nela, definimos uma lista
contendo quatro nmeros inteiros, que so somados e o total retornado pela funo.
Parmetros e argumentos
Para permitir a entrada de valores na funo, chamados de argumentos, podemos
declarar parmetros, que so variveis de entrada de uma funo. Abaixo redefinimos a
funo criada anteriormente, incluindo o parmetro lista:
1
def soma(lista):
45
2
3
4
5
6
7
soma = 0
for num in lista:
soma += num
return soma
print "Soma =", soma([0, 1, 2, 3])
A funo acima retorna a soma de todos os elementos de uma lista, agora, passada por
argumento na linha 7.
Ateno
comum os estudantes iniciantes de programao acharem que os termos
parmetro e argumento designam a mesma coisa, porm so termos distintos. Parmetro
a varivel que voc define na assinatura da funo, entre parnteses. Argumento o valor que
voc passa para um parmetro. No possvel passar um argumento para uma funo que no
tem um parmetro definido.
Parmetros com argumentos default
Muitas vezes necessrio criar uma funo quase idntica a outra, a nica diferena
que uma recebe argumentos e a outra no. A funo abaixo, por exemplo, retorna um
intervalo de nmeros, dados o incio, fim e o incremento:
1
2
3
4
5
6
7
8
9
# Imprime [1, 3, 5, 7, 9]
de valores entre 1 e 10, chamaramos apenas intervalo(10). Para isso Python oferece um
recurso interessante: os argumentos padro ou default fazem um parmetro se tornar
opcional. Para especificar um valor padro para um parmetro, basta atribu-lo na lista de
parmetros. Exemplo:
1
2
3
4
5
6
46
7
return retorno
8
9 print intervalo(10)
10]
10 print intervalo(10, 1, 2)
# Imprime [1, 2, 3, 4, 5, 6, 7, 8, 9,
# Imprime [1, 3, 5, 7, 9]
print
9]
print
print
print
def soma(*nums):
result = 0
for n in nums:
result += n
return result
print soma(1, 2, 3)
print soma(1, 2)
# Imprime 6
# Imprime 3
47
Decoradores
Como vimos no incio da apostila, tudo em Python um objeto e funes no so uma
exceo. Um decorador uma funo que recebe uma outra funo como argumento, a
modifica e a retorna. Decoradores tanto podem ser usados para criar ou alterar caractersticas
das funes, como adicionar atributos, quanto para envolver as funes, acrescentando uma
camada em torno delas com novas funcionalidades. Exemplo do livro Python para
Desenvolvedores, 2 edio, de Luiz Eduardo Borges:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Funo decoradora
def dumpargs(f):
# Funo que envolver a outra
def func(*args):
# Mostra os argumentos passados para a funo
print args
# Retorna o resultado da funo original
return f(*args)
# Retorna a funo modificada
return func
@dumpargs
def multiply(*nums):
m = 1
for n in nums:
m = m * n
return m
print multiply(1, 2, 3)
multiply = dumpargs(multiply)
print multiply(1, 2, 3)
48
O conceito de uma funo que recebe uma funo e a retorna conhecido como
objetos de primeira-classe e o veremos mais detalhadamente no final da apostila, em
Programao Funcional.
DocStrings
DocStrings, como o prprio nome supe, so strings de documentao, utilizadas para
documentar funes, mdulos, classes e seus mtodos, que veremos mais adiante nessa
apostila. So utilizadas para gerar documentao automtica com a ferramenta pydoc e
muitos editores, como os citados na introduo da apostila, as utilizam para fornecer
informaes, como a utilizao de funes, seus parmetros, utilizao de mdulos, e etc.
Para definir uma string de documentao, basta fornecer como primeira declarao de
um objeto (funo, mdulo, classe, mtodo, etc.) uma string, normalmente definida entre
aspas triplas. Exemplo:
1 def intervalo(fim, inicio=1, incremento=1):
2
"""Retorna uma faixa de valores inteiros.
3
4
fim -- final da faixa de valores obrigatrio
5
inicio -- inicio da faixa de valores (default 1)
6
incremento -- incremento entre inicio e fim (default 1)
7
8
"""
9
retorno = []
10
i = inicio
11
while i <= fim:
12
retorno.append(i)
13
i += incremento
14
return retorno
Na primeira linha da DocString demos uma descrio rpida da funo o que ela faz e
retorna - e nas linhas seguintes descrevemos a utilizao dos parmetros e seus valores
default. No h regras quanto a definio das strings de documentao, porm a PEP 2577
documenta a semntica e as convenes associadas a estas, como por exemplo, utilizar aspas
triplas, a forma de descrever as funes, convenes sobre espaos em branco, etc. Mais
informaes em http://www.python.org/dev/peps/pep-0257/.
PEP, sigla de Python Enhancement Proposal, ou, Proposta de melhoria do Python, consiste de documentos que
fornecem informaes para a comunidade do Python, como consensos e boas-prticas, descrevem novos recursos
da linguagem, seus processos ou ambiente. Cada PEP possui um nmero de identificao, iniciado pelo 0001, PEP
que descreve detalhadamente o que so as elas, quais so seus tipos e etc. Voc pode encontrar mais informaes
em http://python.org/dev/peps/pep-0001.
49
Mdulos
Mdulos nada mais so do que arquivos-fonte que podem ser importados para um
programa e so utilizados quando desejamos utilizar atributos (funes, objetos, classes, etc.)
j definidos, em nossos programas. Um mdulo executado quando importado, e
compilado e armazenado com extenso .pyc ou .pyo quando importado pela primeira vez.
Para um mdulo ser importado ele precisa possuir uma das extenses de arquivosfonte Python, ou seja, .py, .pyc e .pyo e precisa estar no PYTHONPATH - a lista de diretrios e
arquivos onde o interpretador procura os mdulos quando so importados. O PYTHONPATH
normalmente composto do diretrio corrente do arquivo, o diretrio de instalao do
Python e alguns de seus diretrios internos como o Lib, lib e DLLs (no Windows) entre
outros. Para verificar qual o PYTHONPATH de um mdulo, a biblioteca-padro do Python
disponibiliza o objeto path, localizado no mdulo sys.
A biblioteca padro do Python inclui um nmero muito grande de mdulos j prontos
e compilados para que no precisemos reinventar a roda. Dentre esses mdulos, encontrase, por exemplo, o calendar, para manipulao de calendrios, o datetime, para
manipulao de datas, o time, para manipulao de tempo, o sqlite3 para trabalhar com
bancos de dados SQLite (que veremos mais a diante, em Trabalhando com Bancos de Dados) e
muitos outros. Devido a essa grande quantidade de mdulos disponveis na biblioteca-padro,
diz-se que Python vem com baterias inclusas, ou Batteries included.
Alm desses mdulos da biblioteca-padro e de bibliotecas de terceiros, normal que
com o crescimento de um programa, exista o desejo de separ-lo em vrios arquivos para uma
melhor organizao, por exemplo, um arquivo para classes, outro para manipulao de dados,
outro para validao, outro com funes de utilidades, etc. Um mdulo pode ser importado
dentro de outro mdulo ou dentro do prprio interpretador interativo do Python para se ter
acesso ao que foi definido dentro do arquivo.
Criando um mdulo
Iremos agora criar um mdulo contendo um conjunto de funes que manipulam dois
nmeros (soma, diferena, produto, quociente e potncia) e iremos cham-lo de
numeros.py.
1
2
3
4
# numeros.py
u"""Faz a manipulacao de dois numeros, atravs das funes
soma, diferenca, produto, quociente e potencia"""
50
5 def soma(x, y):
6
u"""Esta funo retorna a soma dos dois nmeros passados como
7
parmetros"""
8
return x + y
9
10 def diferenca(x, y):
11
u"""Esta funo retorna a diferena dos dois nmeros passados
como parmetros"""
12
return x y
13
14 def produto(x, y):
15
u"""Esta funo retorna o produto dos dois nmeros passados"""
16
return x * y
17
18 def quociente(x, y):
19
u"""Retorna o quociente dos dois nmeros.""""
20
return x / y
21
22 def potencia(x, y):
23
u"""Retorna a potencia dos dois nmeros"""
24
potencia = 1
25
while y > 0:
26
potencia = potencia * x
27
y = y 1
28
return potencia
Importando mdulos
Com o mdulo numeros.py em mos, crie outro mdulo e salve-o como
teste_numeros.py no mesmo diretrio que o numeros.py. Para que possamos utilizar os
atributos contidos em numeros.py, primeiramente este precisa ser importado para o seu
namespace com o comando import. Insira o seguinte cdigo para importar o mdulo
numeros.py:
import numeros
Para utilizar uma funo do mdulo numeros, a funo soma, por exemplo, devemos
fazer:
print numeros.soma(2, 3)
Se por acaso utilizarmos o cdigo abaixo, chamando uma funo que no existe, uma
exceo acionada:
51
numeros.outra()
import numeros
print dir(numeros)
neste captulo, exceto por __package__, que ser explicado na parte de Pacotes. Repare que
seus nomes so precedidos e sucedidos por dois __ (underscores) essa a sintaxe do Python
para identificar seus atributos e mtodos especiais. Mdulos so objetos singleton, ou seja,
carregada somente uma instncia deles na memria, e esta fica disponvel de forma global
para o programa. Para re-importar um mdulo, basta utilizar a funo reload, desta forma:
1
2
import numeros
reload(numeros)
print soma(2, 4)
print produto(3, 9)
52
Ou ainda:
1
2
import numeros
n = numeros
import sys
"""DocString do mdulo"""
if __name__ == "__main__":
nome = sys.argv[0]
# O mesmo que __file__
args = sys.argv[1:]
# Lista de argumentos passados
if len(args) > 0:
print "Argumentos de", nome
for arg in args:
print arg
else:
print "Nenhum argumento passado"
else:
print u"Mdulo importado, nada a fazer"
53
import modulo1
print modulo1.__name__
print modulo1.__doc__
# Imprime modulo1
# Imprime DocString do mdulo
Note que no mdulo anterior importamos o mdulo sys, presente na bibliotecapadro do Python. Este mdulo contm, entre outros atributos, o objeto argv uma lista que
contm todos os argumentos passados por linha de comando para o programa. O primeiro
valor de argv o nome do arquivo, por isso, atribumos o valor da varivel nome ao primeiro
elemento da lista, e o valor da varivel args aos elementos da segunda posio em diante. O
atributo embutido __file__ armazena o nome do arquivo e seu caminho, assim como
argv[0]. Caso o mdulo tenha sido importado, a mensagem "Mdulo importado, nada
a fazer" impressa e nada mais. O atributo __doc__ armazena a DocString do mdulo e
54
Espao de nomes
A partir do momento que so criadas, as variveis dependem de um local para serem
armazenadas. Os namespaces so onde ficam registradas as variveis, e funcionam como
dicionrios que so atualizados dinamicamente em tempo de execuo, onde as chaves (keys)
so os nomes das variveis e os valores (values) so os valores contidos nelas. Existem trs
namespaces no Python: local, global e embutido.
Local
Cada funo (ou mtodo) possui seu prprio namespace chamado de local, que
mantm no seu dicionrio as variveis da funo, inclusive seus parmetros. Variveis
definidas em funes s podem ser acessadas de dentro delas. Exemplo:
1
2
3
4
5
# modulo_exemplo.py
import numeros
var_local = 42
def funcao_exemplo():
pass
class classe_exemplo:
pass
print globals(
55
'numeros' from 'C:/Modulos/numeros.pyc'>, 'classe_exemplo': <class
__main__.classe_exemplo at 0x02C9B900>, '__package__': None,
'var_local': 42, '__name__': '__main__', '__doc__': None}
total = 0;
def soma(x, y):
total = x + y
# Varivel total definida na funo
print "Valor de total dentro da funo:", total
soma(10, 20)
print "Valor de total fora da funo:", total
# Imprime 30
# Imprime 0
No exemplo acima, definimos uma varivel total no escopo global iniciada com 0
(zero). Dentro da funo soma definimos outra varivel total, para armazenar o resultado da
soma dos dois parmetros. Na linha 5, total vale 30 resultado da soma de 10 e 20 passados
por argumento. Na linha 8, imprimimos o valor de total do escopo global, cujo valor no foi
alterado desde sua inicializao. Para que a varivel total do escopo global seja utilizada pela
funo soma, devemos defin-la como global. Exemplo:
1
2
3
4
5
6
7
8
9
total = 0
def soma(x, y):
global total
total = x + y
# Varivel total definida na funo
print "Valor de total dentro da funo:", total
soma(10, 20)
print "Valor de total fora da funo:", total
Que imprime:
Valor de total dentro da funo: 30
Valor de total fora da funo: 30
Embutido ou Built-in
onde todas as funes, constantes e excees embutidas do Python so definidas.
acessvel de qualquer mdulo, criado quando o interpretador Python aberto, e dura at ele
56
57
Pacotes
Pacotes, ou packages, so pastas que contm um arquivo-fonte, normalmente vazio,
chamado __init__.py. Eles so utilizados como colees para organizar mdulos de forma
hierrquica. Exemplo:
+
|
|
|
|
|
|
|
|
|
|
+
bancos_dados
+-__init__.py
+-mysql.py
+-conecta()
+-desconecta()
+-executa()
+-sqlite.py
+-conecta()
+-desconecta()
+-executa()
->
->
->
->
->
->
->
->
->
->
Pasta (Pacote)
Identifica pasta como pacote
Mdulo para MySQL
Funo do mdulo mysql
Funo do mdulo mysql
Funo do mdulo mysql
Mdulo para SQLite
Funo do mdulo sqlite
Funo do mdulo sqlite
Funo do mdulo sqlite
aplicacao.py
Acima apresentamos uma estrutura hierrquica onde banco_dados uma pasta que
contm o arquivo __init__.py, que identifica a pasta como um pacote. Nela esto contidos
os mdulos mysql.py e sqlite.py, ambos possuindo os mtodos conecta, desconecta e
executa. O mdulo aplicacao.py est no mesmo nvel hierrquico do pacote
banco_dados, ento para acessar dele os mdulos contidos no pacote banco_dados, temos
58
A instruo print da linha 3 ser executada todas as vezes que houver uma
importao envolvendo o pacote banco_dados, seja ele por importao absoluta ou relativa,
importando um mdulo contido nele ou o pacote como um todo.
59
Criando arquivos
Para criar um arquivo, podemos chamar tanto a funo embutida open, quanto o
construtor do tipo file e passar o caminho do arquivo e o modo de abertura como
argumento. O modo de abertura uma string que indica como o arquivo ser aberto para
escrita, somente-leitura e etc. Exemplo:
1
2
3
4
Modos de abertura
Os principais modos de abertura de arquivos no Python so:
60
"r"
do arquivo.
"r+"
Abre arquivo tanto para leitura quando para escrita. O ponteiro do arquivo
"w"
sobrescreve.
"w+"
Abre arquivo para leitura e escrita. Assim como os dois acima, se o arquivo no
"a"
"a+"
Abre arquivo tanto para ler quanto para acrescentar. O ponteiro localizado
Lendo arquivos
Podemos ler o contedo de um arquivo de diversas maneiras, e a primeira que vamos
ver com o mtodo read. Esse mtodo aceita como argumento o nmero de bytes a serem
lidos, e quando esse argumento no fornecido o mtodo l o contedo todo do arquivo.
Exemplo:
1
2
3
Outra forma de ler arquivos pelo mtodo readline, que l uma linha inteira do
arquivo. Exemplo:
1
2
3
61
4
>>> arquivo.close()
Repare que inserimos uma vrgula no final da instruo print linha, na linha 3, o
que faz com que a funo print no insira um \n aps ser executada. Essa alternativa
uma abordagem mais simples, mas que no fornece nenhum tipo de controle mais refinado.
O mtodo readlines ainda outro meio de ler o contedo de um arquivo em
Python, ele retorna uma lista de strings contendo as linhas do arquivo. Exemplo:
1
2
3
Posicionando-se em arquivos
Para obter a posio corrente em um arquivo utilizamos o mtodo tell, que retorna
um inteiro medido em bytes a partir do incio do objeto file. Exemplo:
1
2
3
arq = file(r'C:/arquivo.txt')
conteudo_1 = arq.read(5)
print arq.tell()
# Imprime 5
Para alterar a posio atual em um arquivo utilizamos o mtodo seek, que recebe dois
argumentos. O primeiro o offset o nmero de bytes em queremos nos mover e o segundo
a referncia de onde queremos nos localizar. Utilizando como referncia o valor 0 (default),
nos posicionamos em relao ao incio do arquivo; o valor 1 faz com que nos posicionemos em
relao posio atual e 2 utiliza como referncia o final do arquivo. Exemplo:
1
2
3
4
5
6
7
8
arq = open(r'C:/arquivo_2.txt','w')
arq.write('123456789abcd')
arq.close()
arq = open(r'C:/arquivo_2.txt')
arq.seek(5)
print arq.read(1)
# Imprime 6
arq.close()
62
arq = file(r'C:/arquivo_2.txt')
arq.seek(-4, 2)
print arq.read(4)
# Imprime abcd
arq.close()
Exemplos:
1
2
3
4
5
Que imprime:
Nome do arquivo: C:/arquivo.txt
Modo de abertura: w
Est fechado?: False
Ateno
Repare que em todos os exemplos anteriores chamamos o mtodo close nos
arquivos que abrimos, tanto para leitura quanto para gravao. O mtodo close, como deve
presumir, fecha o arquivo e libera seus recursos da memria.
Como veremos no exemplo a seguir, quando abrimos um arquivo, escrevemos bytes
nele e no executamos o mtodo close, as alteraes no so salvas no arquivo em disco e s
ficam registradas no buffer do arquivo, em memria. Para descarregar o buffer manualmente
h o mtodo flush. Para demonstrar a utilizao do mtodo flush, abra o interpretador
interativo do Python e entre com os seguintes comandos:
1
63
2 >>> arq.write('Linha 1\n')
# Abra o arquivo com seu editor
preferido e veja que ele existe mas ainda est vazio.
3 >>> arq.flush() # Feche o arquivo e o abra novamente a string foi
gravada em disco!
4 >>> arq.write('Linha 2\n')
5 >>> arq.close()
64
Tratamento de excees
O que so excees?
Uma exceo um evento que ocorre durante a execuo de um programa e
interrompe o fluxo normal das suas instrues. Uma diviso por zero, por exemplo, uma
exceo, e caso no seja tratada propagada atravs das chamadas de funes at o mdulo
principal do programa, interrompendo sua execuo e exibindo uma mensagem de traceback.
Exemplo de uma diviso por zero no-tratada:
>>> 1 / 0
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
Try / Except
As instrues try e except permitem o tratamento de excees no Python. Se uma
exceo ocorre dentro de um bloco try, ela deve ser manipulada atravs de uma instruo
except adequada. Exemplo:
1
2
3
4
try:
print 1 / 0
except ZeroDivisionError:
print "Erro ao dividir por zero"
vista anteriormente.
Quando passamos o nome da exceo que desejamos manipular para a instruo
except, s esta exceo capturada. Podemos tambm inserir vrias instrues except para
try:
x = int(raw_input("Digite um nmero: "))
y = int(raw_input("Digite outro: "))
resultado = x / y
print "Resultado da diviso:", resultado
except ValueError:
print "O valor digitado no um nmero vlido"
65
8
9
except ZeroDivisionError:
print "O valor digitado para y deve ser maior do que 0 (zero)"
No exemplo acima inserimos duas instrues except, uma para tratar excees do
tipo ValueError e outra para ZeroDivisionError. Caso o usurio digite um valor invlido
(no numrico) ou no digite nada, a primeira exceo acionada. Se o usurio digitar 0 (zero)
na segunda entrada de dados a segunda exceo acionada.
A ltima instruo except pode omitir o nome da exceo, assim, ela pode servir de
curinga caso uma exceo seja acionada e nenhuma das instrues except anteriores a
capture, ela faz o trabalho. Exemplo:
1 try:
2
nome_arq = raw_input(r"Caminho do arquivo: ")
3
arquivo = open(nome_arq)
4
print arquivo.read()
6
arquivo.close()
7 except IOError:
8
print "Erro no arquivo '%s'", nome_arq
9 except:
10
print "Um erro inesperado ocorreu!"
Acionando excees
A instruo raise nos possibilita forar uma exceo a ser acionada. Exemplo:
1 try:
2
nome = raw_input("Nome: ")
3
if len(nome) == 0:
4
raise ValueError("Digite seu nome!")
5
6
idade = int(raw_input("Idade: "))
7
if idade < 18:
8
raise ValueError("Voc precisa ser maior de idade!")
9 except ValueError, mensagem:
10
print mensagem
11 except:
12
print "Um erro inesperado ocorreu!"
66
menor que 18 para a idade. Repare que passamos uma varivel chamada mensagem na linha 9
para armazenar a mensagem de erro retornada pela exceo ValueError e imprim-la na
tela.
Finally
A instruo finally acionada sempre no final de um bloco try / except, caso uma
exceo seja acionada ou no. comumente utilizada para liberar recursos, como arquivos,
conexes de bancos de dados e de rede. Exemplo:
1 try:
2
arquivo = open(r"C:/arquivo.txt", "w")
3
try:
4
arquivo.write("Linha 1\n");
5
except:
6
print "Erro ao escrever no arquivo!"
7 except IOError:
8
print "Erro ao abrir o arquivo!"
9
finally:
10
arquivo.close()
No exemplo acima temos dois blocos try / except aninhados. O except mais
interno acionado somente quando um erro ao escrever no arquivo ocorre. O except mais
externo acionado caso algum erro ocorra ao abrir o arquivo. O bloco finally acionado
sempre, queira o arquivo seja aberto com sucesso ou no, garantindo assim que ele seja
fechado adequadamente, liberando seus recursos da memria.
67
68
captulo, e como essa apostila no de SQL, mas Python, no cobriremos nem a sintaxe da
linguagem, nem os conceitos de tabelas, registros, tipos de dados e demais assuntos
pertinentes a bancos de dados. Recomendamos ao estudante o excelente tutorial de SQL do
W3Schools, disponvel em http://www.w3schools.com/sql (em ingls).
69
Para criar um novo banco de dados, v em File, New Database. Escolha um local que
deseja armazenar seus projetos desenvolvidos em Python e crie uma pasta (nada mal se ela se
chamasse algo como pyAgenda, no?) e nomeie nosso banco de dados como
agenda.sqlite. O formulrio para criao de tabela ser exibido logo aps o banco de dados
ser criado:
No campo Table name, digite Contatos. Agora vamos adicionar os campos na tabela
Contatos clique em Add, digite codigo no campo Field name e selecione INTEGER PRIMARY
KEY no campo Field type. Clique novamente no boto Add, digite nome no campo Field name e
selecione TEXT no campo seguinte. Repita esse procedimento at que o formulrio se parea
com isso:
70
C:\>
C:\> D:
D:\> cd Downloads\sqlite-shell-win32-x86-3070900
D:\Downloads\sqlite-shell-win32-x86-3070900> sqlite3 agenda.sqlite
Agora s nos falta inserir o comando SQL para criar a tabela contatos:
CREATE TABLE Contatos (codigo INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT, nome VARCHAR(255) NOT NULL, telefone VARCHAR(14) NOT
NULL, celular VARCHAR(14) NOT NULL, email VARCHAR(100) NOT NULL);
71
Estabelecendo conexo
Antes de qualquer coisa, crie um mdulo dentro da pasta que voc criou para
armazenar nosso aplicativo. Utilizaremos esse mdulo para testar os comandos para nos
conectar ao banco de dados e executar nossas queries.
O mdulo para trabalhar com banco de dados SQLite no Python o sqlite3,
portanto, precisamos import-lo para nosso mdulo, dessa forma:
import sqlite3
Para executarmos uma query no nosso banco de dados primeiro precisamos nos
conectar a ele atravs da funo connect, que recebe como um dos seus argumentos o
caminho do banco de dados:
conexao = sqlite3.connect('agenda.sqlite')
Repare que no precisamos nesse caso passar o caminho todo do banco de dados, j
que o mdulo que voc criou se encontra no mesmo diretrio que o arquivo do banco de
dados. Caso precisemos nos conectar a um banco de dados em um local diferente do nosso
arquivo, podemos passar o caminho absoluto do banco, mas no se esquea de usar barras ( /
) ao invs de barras-invertidas ( \ ) para descrever o caminho.
Executando queries
A funo connect executada anteriormente cria um objeto do tipo Connection, que
por sua vez possui um mtodo chamado cursor, que cria um objeto do tipo Cursor que
utilizaremos para executar nossas queries. Exemplo:
cursor = conexao.cursor()
Agora que temos nossos objetos Connection e Cursor, temos que definir o
comando SQL que iremos executar:
comando = 'INSERT INTO Contatos (nome, telefone, celular, email)
VALUES (?, ?, ?, ?)'
A string acima requer alguma explicao na parte das interrogaes, no? Se voc
seguiu nosso conselho e aprendeu SQL antes de chegar nessa parte, voc deve saber que onde
esto os quatro pontos de interrogao vo os valores que sero inseridos na tabela Contatos
pela clusula INSERT. Os pontos de interrogao servem como placeholders para os valores
72
que sero inseridos a seguir. Para executarmos a query, chamamos o mtodo execute do
objeto cursor, passando a string SQL e os valores a serem inseridos atravs de uma tupla:
cursor.execute(comando, ('Zaphod', '9999-9999', '0000-0000',
'zaphod@magrathea.xyz'))
conexao.commit()
conexao.close()
conexao = sqlite3.connect('agenda.sqlite')
cursor = conexao.cursor()
comando = 'SELECT * FROM Contatos'
cursor.execute(comando)
contatos = cursor.fetchall()
conexao.close()
print contatos
listagem anterior da que executamos nossa clusula INSERT que chamamos o mtodo
fetchall do objeto cursor depois de executar o mtodo execute. Esse mtodo retorna
todos os registros restantes do result set como uma lista de tuplas. Vamos agora deixar nossa
listagem de contatos mais bem apresentvel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
conexao = sqlite3.connect('agenda.sqlite')
cursor = conexao.cursor()
comando = 'SELECT * FROM Contatos'
cursor.execute(comando)
contatos = cursor.fetchall()
conexao.close()
mensagem = u'''\
Nome: %s
Telefone: %s
Celular: %s
E-mail: %s
------------------------------'''
73
15 if len(contatos) > 0:
16
for contato in contatos:
17
print mensagem % (contato[1], contato[2], contato[3],
contato[4])
18 else:
19
print 'Nenhum contato encontrado!'
20
21 raw_input('Pressione qualquer tecla para continuar...')
74
tabela Contatos veremos o porqu disso dentro de instantes. Repare na utilizao do mtodo
fetchone nas linhas 13, 15 e 17. Na linha 13 o mtodo retornou o primeiro registro do result
set, na 15, retornou o segundo, e na 17 no retornou nada, isso porque no h mais registros
na tabela.
Nas linhas 20 e 22 utilizamos mais um mtodo novo o fetchmany que recebe
como argumento o nmero de registros a serem buscados. Agora repare nas linhas 26 e 28. Na
primeira executamos fetchone, que retorna o primeiro registro, em seguida executamos
fetchall, que retornou o segundo registro. Estranho? No exatamente. Lembra-se que
vimos que o mtodo fetchall retorna todos os registros restantes do result set? Entenda
esse restantes como ainda no retornados.
Apesar de termos demonstrado aqui como executar queries no SQLite, o procedimento
muito semelhante em outros SGBDs, graas a PEP 249, que descreve as diretrizes que os DBIs
para Python devem seguir. A maioria dos DBIs seguem essas diretrizes, portanto, conectar-se e
executar uma query bem parecido no SQLite, MySQL, PostgreSQL, Oracle ou qualquer outro
SGBD que possua um DBI para Python que siga as diretrizes descritas na PEP 249. Para obter
uma lista dos DBIs disponveis para Python, acesse
http://wiki.python.org/moin/DatabaseInterfaces.
Para mais informaes sobre o mdulo sqlite3, visite sua documentao oficial no
endereo http://www.python.org/documentacaodosqlite3.
75
Paradigmas de programao
Um Paradigma de Programao o que determina o ponto de vista que o
programador tem sobre a estruturao e execuo de um programa. H diversos paradigmas,
dentre eles destaca-se o Procedural, o Orientado a Objetos e o Funcional - cada um suporta
um conjunto de conceitos que os tornam melhor para um determinado tipo de problema. A
utilizao de ferramentas corretas aumenta a produtividade de desenvolvimento, facilidade na
manuteno e confiabilidade do cdigo.
Os projetores de algumas linguagens de programao escolheram enfatizar um
paradigma particular, como o caso de SmallTalk. Isto torna difcil desenvolver programas
utilizando uma abordagem diferente, aumentando tanto dificuldade na escrita do cdigo
quanto na manuteno, tornando o cdigo mais suscetvel a erros. Outras linguagens so
multi-paradigmas suportam vrios paradigmas de programao, como o caso de Python,
C++ e Lisp isto permite aos programadores escreverem programas e bibliotecas que utilizem
tanto cdigo Procedural quanto Orientado a Objetos e Funcional. Por exemplo, a interface
grfica pode ser escrita utilizando a programao Orientada a Objetos, enquanto o
processamento Procedural ou Funcional.
Paradigma Imperativo
O paradigma Imperativo baseia-se no conceito de comandos e atualizao de variveis.
Como os programas so escritos para modelar processos e objetos do mundo real e tais
objetos freqentemente possuem estados que variam com o tempo, variveis naturalmente
modelam tais objetos. Alm disso, todas as arquiteturas de computadores existentes hoje se
baseiam na arquitetura de von Neumann, caracterizada pelo acesso direto e possibilidade de
alterao de valores armazenados em posies de memria. Isso torna os ambientes de
execuo das linguagens Imperativas bastante eficientes.
Os projetos das linguagens de programao Imperativas foram muito influenciados na
arquitetura de computadores de von Neumann, introduzida em meados dos anos 40 e a
predominante ainda hoje. A arquitetura de von Neumann o modelo criado por John von
Neumann, que usa uma unidade central de processamento (CPU), e uma estrutura de
armazenamento separada (memria) que armazena tanto instrues (programas) quanto
dados. Linguagens imperativas foram influenciadas quanto a:
76
Paradigma Procedural
O Paradigma Procedural um paradigma Imperativo baseado no conceito de
procedimentos, tambm chamados de rotinas, mtodos ou simplesmente de funes, sendo
os dois ltimos utilizados na documentao oficial da linguagem Python. A programao
procedural geralmente uma escolha melhor que programao seqencial e no-estruturada
em muitas situaes que envolvem uma complexidade mdia e requerem facilidade de
manuteno. Possveis benefcios so:
def bubble_sort(lista):
77
2
for i in range(len(lista) - 1, 0, -1):
3
for j in range(0, i):
4
if lista[j] < lista[j + 1]:
5
lista[j], lista[j + 1] = lista[j + 1], lista[j]
6
7
return lista
8
9 lista = [10, 5, 7, 0, 9, 8, 1, 4, 3, 6, 2]
10 lista_ord = bubble_sort(lista_1)
11
12 print lista_ord
78
pode possuir atributos como codigo, nome, telefone e endereco, assim como os mtodos
insere e altera. Um objeto chamado tambm de instncia de uma classe uma
As classes new-style surgiram na verso 2.2 do Python com o intuito de unificar classes
e tipos. Classes new-style so, nada mais nada menos que tipos definidos pelo usurio,
portanto, type(x) o mesmo que x.__class__. Essa unificao trouxe alguns benefcios
imediatos, como por exemplo, a possibilidade da utilizao de Propriedades, que veremos
mais adiante e metaclasses, assunto que no veremos nessa apostila.
Por razes de compatibilidade as classes so old-style por padro. Classes new-style
so criadas especificando-se outra classe new-style como classe-base. Veremos mais sobre isso
adiante, em Herana. Classes old-style existem somente nas verses 2.x do Python, na 3.0 elas
j foram removidas, portanto, recomendado criar classes new-style a no ser que voc tenha
cdigos que precisem rodar em verses anteriores a 2.2.
Criando classes
Uma classe definida na forma:
class NomeClasse:
<atributos e mtodos>
class ClasseSimples(object):
pass
79
Acima definimos uma classe que no possui nenhum atributo nem mtodo a palavrachave pass foi utilizada para suprir a necessidade de pelo menos uma expresso dentro da
classe.
Note que aps o nome da classe inserimos entre parnteses a palavra object. Como
veremos mais a diante, essa a sintaxe para herdar uma classe de outra (ou outras) no
Python. O que fizemos na classe anterior foi derivar a classe ClasseSimples da classe
object que uma classe new-style definindo ento outra classe new-style.
instancia.atributo
instancia.metodo()
class Cliente(object):
def __init__(self, codigo, nome, telefone, endereco):
self.codigo = codigo
self.nome = nome
self.telefone = telefone
self.endereco = endereco
cliente1 = Cliente(42, 'Zaphod', '0000-9999', 'Rua Magrathea, S/N')
cliente2 = Cliente(1024, 'Ford', '9999-0000', 'Av. Jelz, 42')
80
class Cliente(object):
instancias = 0
def __init__(self, codigo, nome, telefone, endereco):
Cliente.instancias += 1
self.codigo = codigo
self.nome = nome
self.telefone = telefone
self.endereco = endereco
cliente1 = Cliente(42, 'Zaphod', '0000-9999', 'Rua Magrathea, 1')
cliente2 = Cliente(1024, 'Ford', '9999-0000', 'Av. Jelz, 42')
print 'Quantidade de instancias: ', Cliente.instancias
class Cliente(object):
def __init__(self, codigo, nome, telefone, endereco):
self.codigo = codigo
81
4
self.nome = nome
5
self.telefone = telefone
6
self.endereco = endereco
7
8
def insere(self):
9
print 'Cliente #%i - %s inserido!' % (self.codigo, self.nome)
10
11 cliente1 = Cliente(42, 'Ford Prefect', '0000-9999', 'Betelgeuse 7')
12 cliente1.insere() # Imprime 'Contato #42 Ford Prefect inserido!'
utilizado pelo interpretador para passar a instncia pela qual chamamos os mtodos. Para
constatar o mesmo, basta criar um mtodo que recebe um parmetro alm de self e chamar
esse mtodo sem passar um valor uma mensagem de erro exibida dizendo que o mtodo
recebe dois parmetros e que s um foi fornecido.
Mtodos de classe
Os mtodos de classe so similares aos mtodos de instncia, porm s podem
referenciar as variveis e mtodos de classe. Exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Cliente(object):
instancias = 0
def __init__(self, codigo, nome, telefone, endereco):
Cliente.instancias += 1
self.codigo = codigo
self.nome = nome
self.telefone = telefone
self.endereco = endereco
def insere(self):
print 'Cliente #%i - %s inserido!' % (self.codigo, self.nome)
@classmethod
def imprime_instancias(cls, formatado = False):
if formatado:
print 'N de instncias de Cliente: ', cls.instancias
else: print cls.instancias
cliente1 = Cliente(42, 'Osmiro', '0000-9999', 'Rua Magrathea, 1')
cliente1.imprime_instancias()
# Imprime 1
Cliente.imprime_instancias()
# Imprime 1
82
em mtodos de instncia. O parmetro cls possui esse nome por conveno, e assim como
self, pode ter seu nome alterado apesar de no ser uma boa prtica.
Note que, assim como usamos o decorador @classmethod para criar um mtodo
esttico, utilizamos o @staticmethod para transformar o mtodo em esttico.
83
instncia;
Exemplos:
1
2
3
4
5
6
Note que na linha 2 adicionamos o atributo email ao objeto cliente1 por meio de
atribuio, na linha 4 adicionamos o atributo celular pela funo setattr tanto pela
atribuio quanto pela funo setattr o resultado o mesmo. O mesmo acontece com a
funo getattr, onde poderamos sem problemas fazer:
print cliente1.celular
# Imprime '0099-9900'
def ola_mundo():
return "Ola mundo"
84
4
5
>>>
...
...
...
>>>
>>>
>>>
>>>
10
>>>
10
>>>
>>>
20
class Teste(object):
def __init__(self):
self.atributo = 0
x = Teste()
x.atributo = 10
y = x
x.atributo
y.atributo
x.atributo = 20
y.atributo
85
>>> del x
>>> x.atributo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> y.atributo
20
Herana
A Herana um dos pilares da Programao Orientada a Objeto. Com ela, pode-se
criar uma classe baseando-se em outra, ou outras, j que Python suporta herana mltipla.
Criar uma classe baseada em outra faz com que a classe herdada, ou classe-filha, literalmente
herde todos os atributos e mtodos das classes-base (chamadas tambm de superclasses,
dentre outros termos). Para mencionar a, ou as superclasses, basta list-las entre parnteses,
separando-as por vrgulas depois do nome da classe-filha (ou subclasse / classes especializada).
Para exemplificar, vamos modificar a estrutura da classe Cliente, criando uma classe
Contato e especializando a classe Cliente:
1 class Contato(object):
2
'Classe Contato'
3
def __init__(self, codigo, nome, telefone, email):
4
self.codigo = codigo
5
self.nome = nome
6
self.telefone = telefone
7
self.email = email
8
9
def insere(self):
10
print 'Contato # %i - %s' % (self.codigo, self.nome)
11
12
def imprime(self):
13
print u"""\
14 Cdigo: %i
15 Nome: %s
16 Telefone: %s
17 Email: %s""" % (self.codigo, self.nome, self.telefone, self.email)
18
19 class Cliente(Contato):
20
'Classe Cliente, que herda da classe Contato'
21
def __init__(self, codigo, nome, telefone, email, cpf,
cartao_credito):
22
Contato.__init__(self, codigo, nome, telefone, email)
23
self.cpf = cpf
24
self.cartao_credito = cartao_credito
25
26 contato1 = Contato(1, 'Ford', '9999-0000', 'ford@pre.fect')
86
27 cliente1 = Cliente(42, 'Zaphod', '0000-9999', 'zaphod@xyz', '128',
'256')
28 cliente1.imprime()
No exemplo acima redefinimos o mtodo imprime, fazendo com que ele imprima
alm dos dados presentes na sua implementao da classe Contato, os dados CPF e N do
87
__bases__: Retorna uma tupla com os nomes das classes-base. Caso a classe no
88
3
4
5
6
7
8
9
10
11
12
13
14
15
atrs_Cliente = Cliente.__dict__
print "Objeto 'cliente1'"
print 'Namespace:'
for atr in atrs_cliente1:
print atr, '->', atrs_cliente1[atr]
print "Classe 'Cliente'"
print 'DocString:', Cliente.__doc__
print 'Classes-base:', Cliente.__bases__
print 'Namespace:'
for atr in atrs_Cliente:
print atr, '->', atrs_Cliente[atr]
__del__: Chamado quando a instncia est para ser destruda, chamado de destrutor;
89
vira para imprimir o valor que mais faz sentido de acordo com seu tipo? O exemplo que
demos foi:
1
2
3
4
5
6
>>> 'String'
'String'
>>> 1+1
2
>>> object()
<object object at 0x006F14B0>
No exemplo acima, para o interpretador do Python saber como representar cada tipo
de objeto, ele utiliza seus mtodos __repr__. O motivo pelo qual o object do exemplo
acima imprime seu endereo de memria bastante simples esse o comportamento
padro desse mtodo, portanto, bem comum sobrescrev-lo em nossas classes, j que seu
comportamento padro no necessariamente til na maioria dos casos.
Alm do mtodo __repr__ existe ainda o __str__, e apesar de aparentemente
possurem a mesma funo, h diferenas fundamentais entre eles, como veremos a seguir.
__repr__
De acordo com a documentao oficial do Python, o mtodo __repr__ chamado
pela funo embutida repr para criar a representao oficial de um objeto. O objetivo desse
mtodo ser livre de ambiguidade, a fim de representar um objeto em especfico, em geral na
forma <...descrio til...>. Apesar de pouco utilizado, nesse mtodo podemos
retornar uma expresso vlida do Python com o fim de recriar um objeto com o mesmo valor,
atravs da funo embutida eval.
__str__
O mtodo __str__ chamado pelas funes str e print e utilizada para criar a
representao informal de um objeto. Uma das caractersticas que difere o mtodo
__repr__ do __str__ que esse ltimo deve retornar uma representao mais concisa e
90
91
16 Telefone: %s
17 Email: %s""" % (self.codigo, self.nome, self.telefone, self.email)
18
19
def __repr__(self):
20
return u'<Contato # %i - %s>' % (self.codigo, self.nome)
21
22
def __str__(self):
23
return u'%s' % self.nome
24
25
26 class Cliente(Contato):
27
'Classe Cliente, que herda da classe Contato'
28
def __init__(self, codigo, nome, telefone, email, cpf,
cartao_credito):
29
Contato.__init__(self, codigo, nome, telefone, email)
30
self.cpf = cpf
31
self.cartao_credito = cartao_credito
32
33
def __repr__(self):
34
return u'<Cliente # %i - %s>' % (self.codigo, self.nome)
35
36
def __str__(self):
37
return u'%s' % self.nome
92
93
8
def reajusta(self, percentual):
9
self._salario *= percentual
10
11
def reajusta_bonificacao(self, percentual):
12
self._bonificacao *= percentual
13
14
def set_salario(self, salario):
15
self._salario = salario
16
17
def get_salario(self):
18
return self._salario + self._bonificacao
19
20
salario = property(get_salario, set_salario)
21
22 f = Funcionario(42, 'Zaphod', '0000-9999', 'zaphod@beeblebrox.xyz',
'000.000.000-00', 3000, 130)
23
24 print u'Salrio:', f.salario
# Imprime Salrio: 3130
25 f.salario = 3200
26 print u'Salrio:', f.salario
# Imprime Salrio: 3330
94
muito boa para desenvolver aplicativos com grande apelo visual, devido pobreza dos seus
componentes visuais. No nos aprofundaremos muito nem no TK, nem na sintaxe do SQL por
serem assuntos bastante extensos para serem explicados nessa apostila.
Criando a classe Contato
Dentro da pasta de nosso aplicativo, crie uma pasta chamada model e insira dentro
dela um arquivo __init__.py para transform-la em um pacote. Dentro desse pacote, crie
um mdulo chamado de contato.py e insira o seguinte cdigo para a classe Contato:
1 # -*- coding: latin-1 -*2
3 import re
4
5 class Contato(object):
6
'''Classe que representa cada contato no banco de dados.'''
7
8
def __init__(self, codigo=-1, nome='', telefone='', celular='',
email=''):
9
self._codigo = codigo
10
self._nome = nome
11
self._telefone = telefone
12
self._celular = celular
13
self._email = email
14
15
def get_codigo(self):
16
return self._codigo
17
18
def set_codigo(self, codigo):
19
if codigo < 0:
20
raise ValueError(u'Cdigo de contato invlido')
21
else:
22
self._codigo = codigo
23
24
def get_nome(self):
25
return self._nome
26
27
def set_nome(self, nome):
28
if not len(nome):
29
raise ValueError(u'Digite o nome do contato')
30
else:
31
self._nome = nome.strip()
32
33
def get_telefone(self):
34
return self._telefone
35
36
def set_telefone(self, telefone):
37
if not len(telefone):
38
raise ValueError(u'Digite o telefone do contato')
39
elif not re.search(r'^\([0-9]{2}\) [0-9]{4}-[0-9]{4}$',
telefone):
40
raise ValueError(u"Telefone invlido. Digite um nmero
no formato '(xx) xxxx-xxxx'")
41
else:
42
self._telefone = telefone.strip()
43
44
def get_celular(self):
95
45
return self._celular
46
47
def set_celular(self, celular):
48
if len(celular):
49
if not re.search(r'^\([0-9]{2}\) [0-9]{4}-[0-9]{4}$',
celular):
50
raise ValueError(u"Celular invlido. Digite um
nmero no formato '(xx) xxxx-xxxx' ou deixe em branco")
51
else:
52
self._celular = celular.strip()
53
54
def get_email(self):
55
return self._email
56
57
def set_email(self, email):
58
if not len(email):
59
raise ValueError(u'Digite o e-mail do contato')
60
elif not re.search(r'^[a-zA-Z0-9._-]+@([a-zA-Z0-9._]+\.)+[a-zA-Z0-9_-]+$', email):
61
raise ValueError(u'E-mail invlido. Digite um e-mail
vlido')
62
else:
63
self._email = email.strip()
64
65
def limpa(self):
66
self._codigo = -1
67
self._nome = ""
68
self._email = ""
69
self._celular = ""
70
self._telefone = ""
71
72
def __repr__(self):
73
return '<Contato # %i: %s>' % (self.get_codigo(),
self.get_nome())
74
75
def __str__(self):
76
return self.nome
77
codigo = property(get_codigo, set_codigo)
78
nome = property(get_nome, set_nome)
79
telefone = property(get_telefone, set_telefone)
80
email = property(get_email, set_email)
81
celular = property(get_celular, set_celular)
96
97
27
conexao.close()
28
29
def lista(self):
30
sql = 'SELECT codigo, nome, telefone, celular, email FROM
Contatos'
31
conexao = sqlite3.connect(self.banco_dados)
32
try:
33
cursor = conexao.cursor()
34
cursor.execute(sql)
35
36
contatos = []
37
for r in cursor:
38
contatos.append(Contato(r[0], r[1], r[2], r[3],
r[4]))
39
except:
40
raise RuntimeError(u'Erro ao listar contatos: ' +
traceback.format_exc())
41
finally:
42
conexao.close()
43
44
return contatos
45
46
def insere(self, contato):
47
sql = 'INSERT INTO Contatos (nome, telefone, celular,
email) VALUES (?, ?, ?, ?)'
48
conexao = sqlite3.connect(self.banco_dados)
49
try:
50
cursor = conexao.cursor()
51
cursor.execute(sql, (contato.nome, contato.telefone,
contato.celular, contato.email))
52
conexao.commit()
53
except:
54
raise RuntimeError(u'Erro ao inserir contato: ' +
traceback.format_exc())
55
finally:
56
conexao.close()
57
58
def atualiza(self, contato):
59
sql = 'UPDATE Contatos SET nome = ?, telefone = ?, celular
= ?, email = ? WHERE codigo = ?'
60
conexao = sqlite3.connect(self.banco_dados)
61
try:
62
cursor = conexao.cursor()
63
cursor.execute(sql, (contato.nome, contato.telefone,
contato.celular, contato.email, contato.codigo))
64
conexao.commit()
65
except:
66
raise RuntimeError(u'Erro ao atualizar contato: ' +
traceback.format_exc())
67
finally:
68
conexao.close()
69
70
def existe(self, contato):
71
sql = 'SELECT COUNT(codigo) FROM Contatos WHERE codigo = ?'
72
conexao = sqlite3.connect(self.banco_dados)
73
try:
74
cursor = conexao.cursor()
75
cursor.execute(sql, (contato.codigo,))
76
rs = cursor.fetchone()[0]
77
78
return rs
98
79
except:
80
raise RuntimeError(u'Erro ao atualizar contato: ' +
traceback.format_exc())
81
finally:
82
conexao.close()
83
84
def exclui(self, contato):
85
if not self.existe(contato):
86
raise RuntimeError(u'Contato %s no existe.' %
(contato.nome,))
87
return
88
89
sql = 'DELETE FROM Contatos WHERE codigo = ?'
90
conexao = sqlite3.connect(self.banco_dados)
91
try:
92
cursor = conexao.cursor()
93
cursor.execute(sql, (contato.codigo,))
94
conexao.commit()
95
except:
96
raise RuntimeError(u'Erro ao excluir contato: ' +
traceback.format_exc())
97
finally:
98
conexao.close()
Na linha 3 importamos o mdulo sqlite3 para poder trabalhar com bancos de dados
SQLite. O mdulo traceback que importamos na linha 4 fornece uma interface que nos
permite extrair, formatar e imprimir rastros da pilha de excees. Dentro dos mtodos dessa
classe, capturamos todas as excees (apesar de isso no ser uma boa idia) e as relanamos
como RuntimeException, passando a mensagem de erro retornada pela funo
format_exc da exceo capturada. Estamos relanando as excees, a maioria do mdulo
sqlite3, para que no fiquemos acoplados a esse mdulo quando estivermos trabalhando
99
consulta se o contato j existe no banco de dados, atravs do mtodo existe, caso o contato
exista, o exclui. Quando trabalhamos com o mdulo sqlite3, precisamos fazer essa verificao
antes porque quando executamos um comando SQL DELETE, no temos uma forma de
constatar se o comando foi executado com sucesso ou no.
Criando a interface grfica
Por fim, criaremos a interface com o usurio. No diretrio raiz de nosso aplicativo, crie
um pacote chamado view, e dentro dele crie um mdulo chamado frame_contato.py,
contendo o seguinte cdigo:
1 # -*- coding: latin-1 -*2
3 from Tkinter import *
4 import tkMessageBox
5
6 from dao.contato_dao import ContatoDAO
7 from model.contato import Contato
8
9 class FrameContato(Frame):
10
def __init__(self, master=None):
11
Frame.__init__(self, master)
12
self.grid()
13
self._posicao = 0
14
self._dao = ContatoDAO()
15
self._contato = Contato()
16
self._contatos = self.lista_contatos()
17
18
self.__createWidgets()
19
self.primeiro_contato()
20
21
def __createWidgets (self):
22
self.master.title("PyAgenda")
23
self.master.resizable(width=False, height=False)
24
25
self._nome = StringVar()
26
self._telefone = StringVar()
27
self._celular = StringVar()
28
self._email = StringVar()
29
30
# Nome
31
self.lblNome = Label(self, text='Nome', width=10)
32
self.lblNome.grid(row=0, column=0)
33
self.txtNome = Entry(self, textvariable=self._nome)
34
self.txtNome.grid(row=0, column=1, sticky=W + E + N + S,
columnspan=6)
35
36
# Telefone
37
self.lblTelefone = Label(self, text='Telefone')
38
self.lblTelefone.grid(row=1, column=0)
39
self.txtTelefone = Entry(self, textvariable=self._telefone)
40
self.txtTelefone.grid(row=1, column=1, sticky=W + E + N +
S, columnspan=6)
41
42
# Celular
43
self.lblCelular = Label(self, text='Celular')
100
44
self.lblCelular.grid(row=2, column=0)
45
self.txtCelular = Entry(self, textvariable=self._celular)
46
self.txtCelular.grid(row=2, column=1, sticky=W + E + N + S,
columnspan=6)
47
48
# E-mail
49
self.lblEmail = Label(self, text='E-mail')
50
self.lblEmail.grid(row=3, column=0)
51
self.txtEmail = Entry(self, textvariable=self._email)
52
self.txtEmail.grid(row=3, column=1, sticky=W + E + N + S,
columnspan=6)
53
54
# Botes
55
self.btnNovo = Button(self, text='Novo')
56
self.btnNovo.grid(row=4, column=0, sticky=W + E + N + S,
padx=2)
57
self.btnNovo["command"] = self.novo_contato
58
59
self.btnSalvar = Button(self, text='Salvar')
60
self.btnSalvar["command"] = self.salva
61
self.btnSalvar.grid(row=4, column=1, sticky=W + E + N + S,
padx=2)
62
63
self.btnExcluir = Button(self, text='Excluir')
64
self.btnExcluir["command"] = self.exclui
65
self.btnExcluir.grid(row=4, column=2, sticky=W + E + N + S,
padx=2)
66
67
self.btnPrimeiro = Button(self, text='|<')
68
self.btnPrimeiro["command"] = self.primeiro_contato
69
self.btnPrimeiro.grid(row=4, column=3)
70
71
self.btnAnterior = Button(self, text='<')
72
self.btnAnterior["command"] = self.retorna_contato
73
self.btnAnterior.grid(row=4, column=4)
74
75
self.btnProximo = Button(self, text='>')
76
self.btnProximo["command"] = self.avanca_contato
77
self.btnProximo.grid(row=4, column=5)
78
79
self.btnUltimo = Button(self, text='>|')
80
self.btnUltimo["command"] = self.ultimo_contato
81
self.btnUltimo.grid(row=4, column=6)
82
83
def lista_contatos(self):
84
return self._dao.lista()
85
86
def novo_contato(self):
87
self._nome.set("")
88
self._telefone.set("")
89
self._celular.set("")
90
self._email.set("")
91
self._contato.limpa()
92
self.txtNome.focus()
93
94
def salva(self):
95
try:
96
# Pega dados do formulrio
97
self._contato.nome = self.txtNome.get()
98
self._contato.telefone = self.txtTelefone.get()
99
self._contato.celular = self.txtCelular.get()
101
100
self._contato.email = self.txtEmail.get()
101
102
if self._contato.codigo == -1:
103
self._dao.insere(self._contato)
104
mensagem = "Contato inserido com sucesso!"
105
else:
106
self._dao.atualiza(self._contato)
107
mensagem = "Contato atualizado com sucesso!"
108
109
tkMessageBox.showinfo(title=mensagem, message=mensagem)
110
self._contatos = self.lista_contatos()
111
self.primeiro_contato()
112
113
except ValueError, mensagem:
114
tkMessageBox.showinfo(title="Erro ao inserir contato",
message=mensagem)
115
116
def exclui(self):
117
try:
118
resposta = tkMessageBox.askyesno(title="Confirma
excluso?", message="Tem certeza que deseja excluir contato?")
119
120
if resposta:
121
self._dao.exclui(self._contato)
122
tkMessageBox.showinfo(title="Contato excludo com
sucesso!", message="Contato excludo com sucesso!")
123
self._contatos = self.lista_contatos()
124
self.primeiro_contato()
125
except ValueError, mensagem:
126
tkMessageBox.showinfo(title="Erro ao inserir contato",
message=mensagem)
127
128
def atualiza_campos(self):
129
if len(self._contatos):
130
self._contato.codigo =
self._contatos[self._posicao].codigo
131
self._contato.nome = self._contatos[self._posicao].nome
132
self._contato.telefone =
self._contatos[self._posicao].telefone
133
self._contato.celular =
self._contatos[self._posicao].celular
134
self._contato.email =
self._contatos[self._posicao].email
135
136
self._nome.set(self._contato.nome)
137
self._telefone.set(self._contato.telefone)
138
self._celular.set(self._contato.celular)
139
self._email.set(self._contato.email)
140
141
# Botes de navegao
142
def primeiro_contato(self):
143
self._posicao = 0
144
self.atualiza_campos()
145
146
def avanca_contato(self):
147
try:
148
if self._posicao != len(self._contatos) - 1:
149
self._posicao += 1
150
self.atualiza_campos()
151
except IndexError:
152
pass
102
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
def retorna_contato(self):
try:
if self._posicao != 0:
self._posicao -= 1
self.atualiza_campos()
except IndexError:
self._posicao += 1
def ultimo_contato(self):
try:
self._posicao = len(self._contatos) - 1
self.atualiza_campos()
except IndexError:
pass
A primeira linha instancia um objeto Label, passando como texto a string Nome e
tamanho 10. A segunda posiciona o rtulo em uma tabela, na linha 0 e coluna 0.
33
103
O mtodo salva, que chamado quando o boto Salva clicado, popula o objeto
_contato instanciado no mtodo __init__ com os valores digitados pelo usurio nas caixas
de texto. Os valores so recebidos pelo mtodo get dos objetos Entry. Em seguida, o
mtodo salva do objeto _dao executado e a mensagem configurada com base no cdigo
do contato. A funo showinfo do mdulo tkMessageBox chamada, passando a
mensagem configurada anteriormente no ttulo e mensagem a serem exibidos, algo como:
104
105
106
como seu executvel e build, utilizado pelo py2exe como um espao de trabalho enquanto
o aplicativo est sendo enpacotado.
Entre no diretrio dist e execute o arquivo main.exe se tudo ocorreu bem, nosso
aplicativo dever ser exibido, e dessa vez sem o prompt de comando do Windows, presente
quando executamos o mdulo main.py.
Ateno
A exceo UnicodeEncodeError acionada quando o script se encontra em um
diretrio cuja uma das partes do caminho possua um caractere no-ascii, como em
C:\Users\Usurio.
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in
position 99: ordinal not in range(128)
Programao Funcional
A Programao Funcional um estilo de programao que enfatiza a avaliao de
expresses ao invs da execuo de comandos. O estilo funcional se contrasta com os
paradigmas Imperativos por evitar alteraes de variveis e execuo de comandos, conceitos
no qual os paradigmas Imperativos se baseiam.
O conceito de funo do Paradigma Funcional e dos paradigmas Imperativos se difere.
As funes dos paradigmas Imperativos podem conter efeitos-colaterais, o que significa que
eles podem utilizar e alterar variveis globais (de fora da funo). Por dependerem de variveis
externas, as funes dos paradigmas Imperativos no possuem transparncia referencial, ou
seja, dados dois valores de entrada, uma expresso pode resultar valores diferentes em
momentos diferentes.
Funes do Paradigma Funcional, chamadas tambm de expresses, so puras - elas
recebem valores de entrada e retornam um valor processado funes puras no podem
referenciar variveis externas, o resultado delas depende somente dos seus valores de
entrada, por isso, sempre retornam o mesmo valor dados os mesmos valores de entrada.
A eliminao dos efeitos-colaterais pode tornar muito mais fcil de entender e prever
o comportamento de um programa e uma das principais motivaes do desenvolvimento do
Paradigma Funcional. Muitos autores afirmam que as caractersticas da Programao
Funcional tornam o desenvolvimento mais rpido e menos suscetvel a erros, alm de mais
fcil de debuggar e testar, j que os programas so quebrados em pequenas partes utilizando
funes.
107
108
Exemplo:
1
2
inc = lambda x: x + 1
print inc(10)
# Imprime 11
Outro exemplo:
1
2
3
lista = [1, 2, 3, 4, 5]
lista_2 = []
for i in lista:
lista_2.append(i ** 2)
print lista_2
# Imprime [1, 4, 9, 16, 25]
quad = lambda x: x ** 2
lista = [1, 2, 3, 4, 5]
lista_2 = map(quad, lista)
print lista_2
# Imprime [1, 4, 9, 16, 25]
O primeiro argumento da funo map a funo lambda quad, que eleva segunda
potncia o nmero passado por argumento. O segundo argumento a lista na qual os
elementos sero aplicados funo quad. A lista gerada pela funo map armazenada como
lista_2, e ento exibida na linha 4. Como as funes em Python so objetos de primeira-
fx = lambda f: f()
f1 = lambda: 'f1() executada'
f2 = lambda: 'f2() executada'
f3 = lambda: 'f3() executada'
109
6 f4 = lambda: 'f4() executada'
7
8 fn = [f1, f2, f3, f4]
9
10 print map(fx, fn) # Imprime ['f1() executada', 'f2() executada',
'f3() executada', 'f4() executada']
e_par = lambda x: (x % 2) == 0
lista = [1, 2, 3, 4, 5, 6]
lista_pares = filter(e_par, lista)
print lista_pares
# Imprime [2, 4, 6]
A funo lambda e_par retorna True quando o nmero passado como argumento
par e False quando impar. Quando o elemento da lista aplicado funo e_par retorna
True, armazenado em lista_pares, que impressa na linha 4. O mesmo cdigo pode ser
lista = [1, 2, 3, 4, 5, 6]
lista_pares = []
for num in lista:
if (num % 2) == 0:
lista_pares.append(num)
print lista_pares
# Imprime [2, 4, 6]
Reduo
Reduo, conhecida tambm no mundo da Programao Funcional como Fold,
consiste em aplicar uma funo que recebe dois parmetros nos dois primeiros elementos de
uma sequencia, aplicar novamente essa funo usando como parmetros o resultado do
primeiro par e o terceiro elemento, e assim sucessivamente. Ao contrrio das funes map e
filter vistas anteriormente, o resultado da funo reduce apenas um elemento e no
uma lista. O exemplo a seguir ajudar a entender melhor o uso da funo reduce:
110
1
2
3
4
5
6
7
O exemplo anterior utilizando uma funo que imprime o resultado parcial de forma
legvel serviu para demonstrar como a funo reduce funciona internamente ela possui um
acumulador, que guarda o resultado da operao anterior utilizando-o na prxima operao.
Os dois exemplos de cdigos a seguir so equivalentes, o primeiro ao estilo imperativo - com
um lao de repetio for, e o segundo utilizando uma funo lambda e a funo reduce:
Imperativo
1
2
3
4
5
6
tupla = (1, 2, 3, 4, 5)
soma = 0
for num in tupla:
soma += num
print soma
# Imprime 15
Funcional
1
2
tupla = (1, 2, 3, 4, 5)
print reduce(lambda x, y: x + y, tupla)
# Imprime 15
Iteradores
Um iterador um objeto que representa um fluxo de dados, retornando um elemento
do fluxo de cada vez. Iteradores devem suportar um mtodo chamado next que no recebe
argumentos e sempre retorna o prximo elemento do fluxo de dados, acionando a exceo
StopIteration quando o iterador chegou ao fim. A funo built-in iter utilizada para
criar um iterador - esta funo recebe um objeto como argumento e tenta retornar um
iterador que ir retornar os contedos dos objetos, ou elementos. H diversos tipos de dados
que suportam iterao, os mais comuns sendo sequencias, como listas, tuplas e dicionrios. O
exemplo abaixo demonstra a criao de um iterador a partir de uma lista no interpretador
interativo:
1
111
2 >>> iterador = iter(lista)
3 >>> iterador.next()
4 1
5 >>> iterador.next()
6 2
7 >>> iterador.next()
8 3
9 >>> iterador.next()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
StopIteration
Como podemos ver no exemplo acima, a cada vez que chamamos o mtodo next do
objeto iterador, ele retorna um elemento do objeto sequencialmente, at que a exceo
StopIteration acionada quando no h mais elementos no objeto. Note que com
>>>
>>>
>>>
>>>
L = [1,2,3]
iterador = iter(L)
tupla = tuple(iterador)
print tupla
# Imprime (1, 2, 3)
112
sequencia1
sequencia2
sequencia3
sequenciaN
)
sequencia1
sequencia2
sequencia3
sequenciaN
]
lista_strings = ['
\n', 'Linha 3
']
Como se pode perceber, uma list comprehension retorna uma lista, que imprimimos na
linha 9 do primeiro exemplo. Generator expressions retornam um iterador que calcula os
113
def generate_ints(N):
for i in range(N):
yield i
for n in generate_ints(3):
print n
Ou ainda:
1
2
3
4
5
gen = generate_ints(3)
print gen.next()
print gen.next()
print gen.next()
# Imprime 1
# Imprime 2
# Imprime 3
114
tambm como avaliao estrita ou ansiosa, que utilizada como padro na maioria das
linguagens imperativas. Na eager evaluation uma expresso avaliada assim que ela
vinculada a uma varivel. Os exemplos a seguir demonstram a diferena entre os dois tipos de
avaliao:
Usando um generator (Programao Funcional)
1 def gen_fibonacci(limite):
2
x, y = 1, 1
3
i = 0
4
while i < limite:
5
yield x
6
x, y = y, x+y
7
i += 1
8
9 for num in gen_fibonacci (10):
10
print num
115
Apndice
A Configurando o PATH do Windows
Adicionar o caminho do interpretador do Python no PATH do Windows torna mais fcil
tanto executar o interpretador interativo, quanto executar programas escritos em Python na
linha de comando.
Primeiro, pressione simultaneamente as teclas WINDOWS e PAUSE/BREAK para abrir a
janela Propriedades do sistema. Na aba Avanado, clique em Variveis de ambiente, selecione
a varivel Path em Variveis de sistema e clique em Editar.
116