Você está na página 1de 40

1

Criando e executando

Programas PYTHON.

O lindo corao do Python

Rpida Introduo
programao procedural
Este captulo ir lhe fornecer informao suficiente para iniciar sua escrita de
programas Python. Ns recomendamos, de forma veemente, que voc instale o
Python caso ainda no o tenha feito, a fim de que possa experenciar algo concreto com tudo o que aprender aqui. (A introduo explica como obter e instalar
Python com as principais plataformas ver pgina 4).
Esta primeira seo do captulo vai lhe mostrar como criar e executar programas
Python. Voc pode usar o seu editor de texto simples para escrever seu cdigo
Python, mas o ambiente de programao IDLE, discutido nesta seo, no lhe
fornece apenas um editor para cdigos, mas tambm algumas funcionalidades
adicionais, incluindo facilidades para experimentao com cdigo Python e para
a depurao de programas Python.
A segunda seo apresenta oito partes-chave de Python, que, por si mesmas,
so o suficiente para escrever programas Python muito teis. Estas partes sero
todas abordadas de maneira mais extensa em captulos posteriores, e, conforme
o livro for progredindo, eles sero suplementados por todo o restante do Python;
portanto, ao final do livro, voc j ter aprendido toda a linguagem e estar apto
a utilizar tudo o que isto pode oferecer para seus programas.
A seo final deste captulo introduz dois pequenos programas, os quais usam o
subset das caractersticas do Python, introduzidos na segunda seo. Desta forma, voc poder provar imediatamente, o gosto da programao Python.

Criando e executando Programas Python


O cdigo Python pode ser escrito com qualquer editor de texto simples, que possa
carregar e salvar o texto usando ambos os codificadores de caracteres: o ASCII ou
o UTF-8. Por padro, os arquivos Python assumem usar o codificador de caracteres UTF-8, um superset de ASCII que pode representar muito bem qualquer
caractere, em qualquer linguagem. Arquivos Python geralmente possuem uma
7

Codificadores
de
caracteres
85

Captulo 1. Rpida Introduo Programao procedural

extenso .py, ainda que, em alguns sistemas semelhantes ao Unix (e.g., linux e
Mac OS X), algumas aplicaes Python no possuam extenso, e os programas
Python GUI (Graphical User Interface) geralmente vm com uma extenso .pyw,
particularmente no Windows e no Mac OS X. Neste livro, ns sempre usamos
uma extenso .py para programas de terminais do Python e mdulos Python, e
.pyw para programas GUI. Todos os exemplos apresentados neste livro executam sem alteraes em todas as plataformas em que Python 3 est disponvel.
Apenas para ter certeza de que tudo est funcionando corretamente e para criar
o primeiro exemplo clssico, crie um arquivo chamado hello.py em um editor
de texto simples (o bloco de notas do Windows j serve muito bem ns logo iremos usar um editor melhor) com os seguintes itens:
#!/usr/bin/env

python3

print (hello, World!)

A primeira linha um comentrio. Em Python, os comentrios comeam com


um # e continuam at o final da mesma linha. (Ns iremos explicar o comentrio
mais crtico adiante).
A segunda linha est em branco Python ignora linhas em branco, mas elas so
normalmente muito usadas pelas pessoas para quebrar blocos de cdigo muito
grandes: uma maneira de torn-los mais fceis de se ler. A terceira linha um
cdigo Python. Aqui, a funo print ( )foi evocada com dois argumentos, cada
um do tipo str (string; i.e., uma sequncia de caracteres).
Cada declarao encontrada em um arquivo .py executada em turnos, comeando com o primeiro e, progressivamente, linha por linha. Isto diferente de
algumas outras linguagem, por exemplo, C++ ou Java, as quais possuem uma
funo particular ou um mtodo de nome especial de onde elas iniciam. O fluxo
de controle pode divergir, como veremos assim que discutirmos as estruturas de
controle do Python, na prxima seo.
Ns iremos supor que os usurios do Windows mantenham seus cdigos python
no diretrio C:\py3eg e que os usurios Unix, Linux e Mac OS X mantenham
seus cdigos no diretrio $HOME/py3eg. Salve, ento, hello.py dentro do diretrio e feche o editor de texto.
Agora que j temos um programa, podemos execut-lo. Os programas Python so
executados pelo interpretador do Python e, normalmente, isto feito dentro de
um terminal do Windows. No Windows, este terminal chamado de Prompt de
Comando ou DOS Prompt ou MS-DOS Prompt, ou algo assim, e, normalmente, est disponvel em Iniciar => Todos os programas => Acessrios. No Mac OS X, o terminal fornecido atravs do programa Terminal.app
(localizado por default em Aplicativos/Utilitrios), que tambm pode
ser encontrado utilizando o Finder, e, em outros Unixes, ns podemos usar um
xterm ou um terminal que fornecido pelo ambiente windowing, por exemplo,
konsole ou gnome-terminal.

Criando e Executando um Programa Python

Inicie um Prompt de Comando e, no Windows, entre com os seguintes comandos (os quais pressupem que o Python j esteja instalado no local padro) a
sada do prompt de comando pode ser vista em negrito; e, o que voc digitou,
em Courier New:
C:\>cd c:\py3g
C:\py3eg\>C:\Python30\python.exe

hello.py

Desde que o comando cd (mudar diretrio) possua uma lista de diretrios absoluta, no importa de qual diretrio voc inicie.
Usurios Unix devem entrar com (supondo que o Python 3 esteja no PATH):*
$
$

cd $HOME/py3eg
python3 hello.py

Em ambos os casos, a sada ser a mesma:


Hello World!

Note que, a no ser declarado ao contrrio, o comportamento do Python no Mac


OS X o mesmo do que em qualquer sistema Unix. De fato, a qualquer momento
que nos referimos a Unix, isto pode ser subentendido como Linux, BSD, Mac OS
X, e a maioria dos sistemas Unixes e afins.
Ainda que o programa possua apenas uma declarao executvel, uma vez que
esta seja executada, possvel inferir alguma informao sobre a funo print(
). Por um lado, print ( ) um item construdo dentro da linguagem Pythonno precisamos importar ou incluir o mesmo de uma biblioteca para fazer
uso dele. Ademais, ele separa cada item que ser impresso com um nico espao,
e imprime uma nova linha aps o ltimo item ser impresso. Estes so comportamentos padro que podem ser modificados, como veremos a seguir. Por outro
lado, algo digno de nota a respeito de print ( ) que ele pode suportar quantos argumentos nos convir dar a ele.
Digitar essas linhas de comando para invocar nosso programa Python poderia
rapidamente se transformar em algo extremamente tedioso. Felizmente, tanto
no Windows como no Unix, podemos usar uma abordagem mais conveniente. Supondo que estamos no diretrio do Windows py3eg, ns podemos simplesmente
digitar:
C:\py3eg\>hello.py

O Windows usa associaes de registro de arquivos para chamar automaticamente o interpretador Python, quando um nome-de-arquivo com extenso .py
iniciado dentro de um terminal.
Se a sada no Windows aparecer como:
(hello,World!)

* O Prompt do Unix pode ser diferente do que o $ mostrado aqui; caso isso acontea, saiba que no
algo relevante.

Print
()
171

10

Captulo 1. Rpida Introduo Programao procedural

Isto significa que o Python 2 est no sistema e est sendo invocado no lugar do
Python 3. Uma soluo modificar a associao do arquivo .py do Python 2
para o Python 3.
Outra soluo (menos conveniente, mais segura) colocar o interpretador do
Python 3 no caminho (supondo que ele esteja instalado no local padro) e executar explicitamente todas as vezes:
C:\py3eg\>path=c:\python30;%path%
C:\py3eg\>python hello.py

Isto pode se tornar mais conveniente para criar um arquivo py3.bat com a linha
nica path=c:\python30;%path% e salvar este arquivo no diretrio C:\Windows. Depois, toda vez que voc iniciar um terminal para executar programas
do Python3, comece executando py3.bat. Ou,de forma alternada, voc pode executar py3.bat automaticamente. Para fazer isso, modifique as propriedades do
terminal (encontre o terminal no menu Iniciar, depois clique com boto direito
do mouse para aparecer na tela de Propiedades o texto /u /k c:\windows\py3.
bat (note os espaos antes, entre e depois das opes /u e /k e certifique-se de
ter adicionado este no final, aps cmd.exe).
No Unix, devemos primeiro fazer do arquivo um executvel e, somente depois,
poderemos execut-lo:
$
$

chmod +x hello.py
./hello.py

Ns precisamos executar o comando chmod apenas uma vez, claro; depois disso,
podemos digitar simplesmente ./hello.py e o programa ir rodar.
No Unix, quando um programa invocado no terminal, os primeiros dois bytes
do arquivo so lidos.* Se estes bytes so os caracteres ASCII #!, o shell assume
que o arquivo deve ser executado por um interpretador e que a linha do primeiro
arquivo especifica qual interpretador usar. Esta linha chamada de linha shebang (execuo shell) e, se presente, dever ser a primeira linha do arquivo.
A linha shebang comumente escrita em uma destas duas formas:
#!/usr/bin/python3

Ou
#!/usr/bin/env

python 3

Se a escrita usar a primeira forma, o interpretador especificado usado. Esta forma pode ser necessria para os programas Python que sero executados por um
servidor da web, ainda que o caminho especificado possa ser diferente do que foi
mostrado. Se a escrita usar a segunda forma, o primeiro interpretador Python3
encontrado no ambiente corrente do shell usado. A segunda forma mais verstil porque permite a possibilidade de o interpretador Python3 no ficar locali* A interao entre o usurio e o terminal gerenciado por um programa shell. A distino entre o
terminal e o shell no nos diz respeito aqui, ento iremos utilizar os termos intercambivelmente.

Criando e Executando um Programa Python

11

zado em /usr/bin (e.g., ele poder ficar em /usr/local/bin ou instalado em


$HOME). A linha shebang no necessria ( mas inofensiva) no Windows; todos
os exemplos neste livro possuem uma linha shebang da segunda forma, ainda
que no a mostremos.
Perceba que para os sistemas Unix supomos que o nome do executvel do Python3
(ou um link simblico) no PATH Python3. Se este no seu caso, voc vai precisar
mudar a linha shebang nos exemplos para usar o nome correto (ou corrigir o nome
e caminho caso voc esteja usando a primeira forma) ou criar um link simblico do
executvel Python3 para o nome Python3 em algum lugar no PATH.
Muitos editores de textos simples, mas poderosos, tais como o Vim e o Emacs, vm
com um suporte embutido para editar programas Python. Este suporte tipicamente envolve destaque colorido de sintaxe e uma correta identao ou desindentao
das linhas. Uma alternativa usar o ambiente de programao IDLE do Python.
No Windows e no Mac OS X, o IDLE instalado de modo padro; nos Unixes, ele
normalmente fornecido como um pacote separado, como descrito na Introduo.
Como aparece na tela que a Figura 1.1. mostra, o IDLE possui um estilo que
nos transporta poca do Motif no Unix e do Windows 95. Isto acontece porque
ele usa a biblioteca baseado em Tk Tkinter GUI (vista no captulo 13), ao invs
de usar as mais poderosas e modernas bibliotecas GUI, como PyGtk, PyQt ou
wxPython. As razes para o uso da Tkinter so uma mistura de histria, licena
liberal, e o fato de que a Tkinter muito menor que as outras bibliotecas GUI.
Por outro lado, o IDLE vem como padro com o Python e muito simples de
aprender e usar.
IDLE fornece trs facilidades-chave: a habilidade para entrar com expresses
e cdigo Python e ver os resultados diretamente no Shell Python; um editor de
cdigo que fornece destaque colorido de sintaxe e suporte de indentao; e um

Figura 1.1. Shell Python do IDLE.

Obtendo e
instalando
Python
4

12

Captulo 1. Rpida Introduo Programao procedural

depurador que pode ser usado para avanar atravs do cdigo a fim de ajudar a
identificar e acabar com os erros de programao (bugs). O Shell Python especialmente til para testar algoritmos simples, fragmentos de cdigo e expresses regulares, alm de ser usado tambm como uma calculadora poderosa e muito flexvel.
Muitos outros ambientes de desenvolvimento Python esto disponveis, mas ns
recomendamos que voc use o IDLE, pelo menos no comeo. Uma alternativa
criar seus programas no editor de texto simples da sua escolha e depur-los
usando invocaes para print ( ) .
possvel invocar o interpretador do Python sem um programa Python especfico. Se isto for feito, o interpretador inicia de modo interativo. Neste modo,
possvel entrar com declaraes Python e ver os resultados exatamente da mesma forma como se usssemos a janela IDLE do Python Shell, e com os mesmo
prompts>>>>. Mas o IDLE muito mais fcil de usar, portanto, ns recomendamos usar o IDLE para experimentao de fragmentos de cdigo. Os pequenos e
interativos exemplos que mostramos at agora pressupem serem executados
em um interpretador interativo do Python ou no IDLE Python Shell.
Agora, ns j sabemos como criar e executar programas Python, mas, objetivamente, no vamos chegar muito longe conhecendo apenas uma nica funo. Na
prxima seo, iremos aumentar consideravelmente nosso conhecimento Python.
Isso nos tornar aptos a criar pequenos, mas muito teis, programas Python,
algo que iremos fazer na ltima seo deste captulo.

Lindo corao do Python


Nesta seo, ns iremos aprender sobre as oito partes da linguagem Python,
e, na prxima seo, iremos mostrar como estas partes podem ser usadas para
escrever um punhado de pequenos, mas realistas, programas. H muito mais a
dizer sobre todas as coisas que iremos ver nesta seo, logo, conforme voc for
lendo, e sentir que esta faltando algo no Python ou que as coisas algumas vezes
so feitas de uma forma muito enfadonha, espie mais adiante usando como guia
as referncias adiante, ou usando a lista de tabelas ou ndice remissivo. Agindo
dessa forma, certamente voc ir encontrar as caractersticas do Python que procura e mais outras concisas formas de expresses do que estamos mostrando por
enquanto e muitas outras coisas.

Parte #1: Tipos de dados


Algo fundamental, que qualquer linguagem de programao deve estar apto a
fazer, representar os itens de dados. Python fornece vrios tipos de dados embutidos, mas ns iremos nos preocupar com apenas dois deles por enquanto. Python
representa inteiros (nmeros inteiros positivos e negativos) usando o tipo int, e
apresenta strings (sequncias de caracteres de UniCode) usanto o tipo str. Aqui
esto alguns exemplos de inteiros e strings, literalmente:

"Lindo Corao" da Python

13

-973
210624583337114373395836055367340864637790190801098222508621955072
0
"Infinitely Demanding"
'Simon Critchley'
'positively abg '
' '

Incidentalmente, o segundo nmero apresentado 2 217 o tamanho dos inteiros


do Python limitado apenas pela memria do computador, no por um nmero
fixado de bytes. J as string, podem ser delimitadas atravs de "quotas" duplas
ou simples, enquanto o mesmo tipo usado em ambos os finais, e, j que Python
usa o UniCode, as string no so limitadas para os caracteres ASCII, assim como
mostra a penltima string. Uma string vazia simplesmente uma com nada
entre os delimitadores.
O Python usa colchetes ([ ]) para acessar os itens de uma sequncia com uma
string. Por exemplo, se ns estamos em um Shell Python (tanto no interpretador
interativo quanto no IDLE) poderemos entrar com o seguinte a sada do Shell
Python exibida em negrito e o que voc digitou exibido em Courier New:
>>> Tempos Difceis [5]
T
>>>girafa[0]
g

Tradicionalmente, Shell Python usa >>> como seus prompts, ainda que isto
possa ser modificado. A sintaxe colchete pode ser usada com itens de dados de
qualquer tipo de dados que seja uma sequncia, assim como string e listas. Esta
consistncia de sintaxe uma das razes para que a linguagem Python ser to
bonita. Perceba que todas as posies de ndice do Python comea com 0.
No Python, tanto str, e os tipos bsicos numricos, como int so imutveis isto
, uma vez atribuidos, seus valores no podem ser modificados. De primeira instncia, isto pode parecer uma limitao muito estranha, a sintaxe do Python no um
problema de prtica. A nica razo para mencionarmos este fato que, ainda que
possamos usar colchetes para resgatar o caractere dado na posio do ndice em
uma string, ns no poderemos us-lo para atribuir um novo caractere. (Perceba
que, no Python um caractere simplesmente uma string de extenso 1.)
Para converter um item de dados de um tipo para outro, podemos usar a sintaxe
datetype (item). Por exemplo:
>>> int (45)
45
>>> str (912)
912

A converso int( ) tolerante espaos em branco, logo, int(45) funcionaria bem tambm. A converso str( ) pode ser aplicada em quase nenhum
itens de dados. Ns podemos facilmente fazer nosso prprio suporte de dados

14

Captulo 1. Rpida Introduo Programao procedural

customizados da converso str( ), e tambm com o int( ) ou qualquer outra


converso, se elas fizerem sentido, como veremos a seguir no Captulo 6. Se uma
converso falha, uma exceo lanada ns iremos introduzir a manipulao de
exceo brevemente na Parte #5, e cobrir totalmente as excees no Captulo 4.
Strings e inteiros sero totalmente cobertos no captulo 2, junto com outros tipos de dados embutidos e alguns tipos de dados da biblioteca padro do Python.
Este captulo tambm vai cobrir operaes que podem ser aplicadas a sequncias
imutveis, assim como strings.

Parte #2: Referncia de Objetos


Uma vez que tenhamos alguns tipos de dados, a prxima coisa que precisamos
so variveis, nas guias armazenamos os tipos de dados. Python no possui variveis como estas, mas, ao invs disso possui referencia de objetos. Quando eles
se transformam em objetos imutveis, como ints e strs, no existe uma diferena discernvel entre a varivel e uma referencia de objeto. Quanto a objetos
mutveis, existe uma diferena, isto raramente importa colocados em prtica.
Ns iremos usar os termos varivel e referencia de objetos intercambiavelmente.
Vamos ver alguns pequenos exemplos e, depois, discutir alguns detalhes.
x= azul
y= verde
z= x

A sintaxe simplesmente referencia de objeto = valor. No h necessidade para uma pr-declarao ou para especificar o tipo do valor. Quando o
Python executa a primeira declarao, ele cria um objeto str com o texto azul e
cria uma referncia de objeto chamado x que se refere ao objeto str. Para todos
os objetivos prticos ns podemos dizer que varivel x foi atribuida a string
"azul". A segunda declarao similar. A terceira declarao cria uma nova referencia de objeto chamado z e o ajusta para se referenciar com o mesmo objeto que
a referencia de objeto x se refere (neste caso, o str contem o texto azul).
O operador = no o mesmo operador de atribuio varivel de algumas outras
linguagens. O operador = ata um referencia de objeto a um objeto da memria.
Se a referencia de objeto j existe, ele simplesmente reatado para se referenciar
ao objeto direita do operador =; se a referencia de objeto no existe, ele criado
pelo operador =.
Vamos continuar com o exemplo x, y, z e fazer alguns reatamentos como notado
anteriormente, os comentrios comeam com um # e continuam at o fim da linha:
print (x,
z = y
print (z,
x = z
print (x,

y,

z)

# print: azul

verde

azul

y,

z)

# print: azul

verde

azul

y,

z)

# print: azul

verde

azul

15

"Lindo Corao" da Python


a = 7

a = 7
b = a

OsOscrculos
representam
objetos
referenciais
crculos
representam
refrencia
de objeto
Os
Osretngulos
retngulos representam
representamobjetos
objetosna
namemria
memria

a = 7
b = a
a = "Liberty"

"Liberty"

Figura 1.2 Referncia de Objetos e objetos.

Aps a quarta declarao (x = z), todos as trs referncia de objetos so referidos a mesma str. J que no existe mais referncia de objetos para a string
azul, Python est livre para joga-los fora.
Figura 1.2 mostra a relao entre objetos e referncia de objetos de forma
esquematizada:
Os nomes usados para referncia de objetos (chamados identificadores) possuem
poucas restries. Em particular, eles no podem ser iguais a nenhuma palavrachave do Python, e devem iniciar com uma letra ou um trao inferior (underscore), e serem seguidas por zero ou alguma letra diferente de espao sublinhado
ou dgito. No existe limite para o tamanho, e as letras e dgitos so definidos
pelo UniCode, isto , elas so includas, mas no limitadas, s letras e dgitos
do ASCII (a, b, ...z, A, B,...Z, 0, 1, ..., 9). Os identificadores Python
diferenciam entre letras maisculas e minsculas, ento, por exemplo, LIMITE,
Limite e limite so trs diferentes identificadores. Ainda mais detalhes e
alguns exemplos um tanto quanto exticos so dados no Capitulo 2.
Python utiliza dynamic typing (tipagem dinmica), o que significa que uma referncia de objeto pode ser reatado para se referir a um objeto diferente (o qual pode
ser um tipo diferente de dados) a qualquer momento. Linguagens que utilizam
uma tipagem forte (como C++ e Java) permitem apenas operaes que so definidas pelos tipos de dados envolvidos para serem executados. Python tambm aplica
esta restrio, mas no pode ser classificada como tendo uma tipagem forte em seu
caso, porque as operaes vlida podem mudar por exemplo, se um referncia de
objeto reatado a um objeto de um tipo diferente de dados. Por exemplo:
rota= 866
print (rota, type (rota)) # imprimir: 866 <class int>
rota = Norte
print(rota, type (rota)) #imprimir: Norte <class str>

Aqui, ns criamos um nova referncia de objeto chamado rota e o ajustamos


para se referir a um novo int de valor 866. At este ponto, ns poderamos usar
/ com rota, j que a diviso uma operao vlida para inteiros. Depois, ns
reusamos a referncia de objeto rota para que ele se refira a uma nova referncia de objeto str de valor Norte, e o objeto int programado para a garbage
collection, j que agora nenhum referncia de objeto se refere a ele. At este pon-

16

Captulo 1. Rpida Introduo Programao procedural

to, usar / com rota poderia causar um typeError para ser lanada, j que / no
mais uma operao vlida para uma string.
A funo type ( ) retorna os tipos de dados (tambm conhecido como a classe) do item de dados que fornecido- esta funo pode ser muito utilizada para
testar e depurar, mas normalmente no vai aparecer no cdigo de produo, j
que existe uma alternativa bem melhor, como veremos no Captulo 6.
Se ns estamos experimentando o cdigo Python dentro de um interpretador
interativo ou em um Shell Python, bem como o nico fornecido pelo IDLE, simplesmente digitar o nome de uma referncia de objeto j o bastante para fazer
com que Python imprima seu valor. Por exemplo:
>>> x = azul
>>> y = verde
>>> z = x
>>> x
azul
>>> x, y, z
(azul, verde, azul)

Isto muito mais conveniente do que invocar a funo print ( ) a todo momento, mas funciona apenas quando usamos o Python interativamente qualquer programa e mdulos que escrevemos devem usar print ( ) ou funes
similares para produzir sadas. Perceba que Python exibiu a ltima sada em
parnteses separados por vrgulas isto significa uma tuple, isto , uma sequncia ordenada e imutvel de objetos. Ns iremos ver a respeito de tuple na
parte seguinte.

Parte #3: Tipos de dados colecionveis


Normalmente, conveniente reter colees inteiras de itens de dados. Python
fornece muitos tipos de dados colecionveis que podem reter itens, incluindo arrys associativas a sets. Mas, aqui, ns iremos introduzir apenas dois deles:
tuplas e lista. As tuple e list do Python podem ser usadas para reter qualquer nmero de itens de dados de qualquer tipo de dados. Tuplas so imutveis,
portanto, uma vez que foram criadas, no permitido modific-las depois. Listas
so mutveis, logo, podemos facilmente inserir e remover itens da maneira que
nos for aprazvel.
Tuplas so criadas usando vrgulas (,) como nos exemplos mostrados a seguir:
>>> Denmark, Norway, Sweden
(Denmark, Norway, Sweden)
>>> um,
(um,)

Quando Python imprimi uma tupla, ele a cerca em parnteses. Muitos programadores emulam isso e sempre cercam as tuplas literais escrevendo-as, entre
parnteses. Se ns temos um item tupla e queremos usar parnteses, preciso

17

"Lindo Corao" da Python

ainda usar a vrgula por exemplo, (1,). Uma tupla vazia criada usando parnteses vazios, ( ). A vrgula tambm usada para separar argumentos chamados
de funes, portanto, se queremos passar uma tupla literal como um argumento,
devemos cerca-la entre parnteses para fugir de confuses.

Shallow
e Deep
Copy
34

Aqui esto alguns exemplos de listas:


[1, 4, 9, 16, 25, 36, 49]
[alfa, bravo, charlie, delta, eco]
[zebra, 49, -879, aardvark, 200]
[]

Listas podem ser criadas a partir de colchetes ([ ]), assim como fizemos aqui;
mais tarde, ns veremos outras maneiras de criar listas. A quarta lista mostra uma lista vazia.
Por baixo da cobertura, listas e tuplas no armazenam itens de dados, mas sim referncia de objetos. Quando listas e tuplas so criadas (e quando itens so inseridos
no caso das listas), elas fazem cpias das referenciais de objetos que lhes formam
dados. No caso de itens literais como inteiros ou strings, um objeto do tipo de dados
apropriado criado na memria e adequadamente inicializado, e, depois, uma referncia de objeto referindo-se ao objeto criado e posto na lista ou na tupla.
Como tudo mais em Python, tipos de dados colecionveis so objetos, ento, ns
podemos encaixar tipos de dados colecionveis dentro de outros tipos de dados
colecionveis, por exemplo, para criar listas de listas, sem formalidades. Em algumas situaes, o fato que listas, tuplas e grande parte de outros tipos de dados
colecionveis do Python retm referncia de objetos ao invs de objetos fazem um
diferencial isto abordado no Captulo 3 (que comea na pgina 99).
Em programao procedural, ns podemos invocar funes e, normalmente, passar itens de dados como argumentos. Por exemplo, ns j vimos a funo print
( ). Outra funo frequentemente usada pelo Python len( ), a qual toma
um nico item de dados como seu argumento e retorna o tamanho do item como
um int. Aqui h algumas chamadas para len( ) ns no temos usado negrito
para as sadas do interpretador, pois supomos que voc possa perceber o que voc
digita e o que representado pelo interpretador, como agora:
>>> len( (um,))
1
>>>len([3, 5, 1, 2, pausar
6
>>> len(automaticamente)
15

, 5])

Tuplas, listas e strings so sized, isto , elas so tipos de dados que possuem
uma noo de tamanho e qualquer item de dados de qualquer tipo de dados pode
ser, de forma significativa, passada para a funo len ( ). (Uma exceo lanada se um tipo de dados sem tamanho transferido para len ( ). )
Todos os itens de dados do Python so objetos (tambm chamados de instncias)
de um tipo de dados particular (tambm chamado de classe). Ns iremos usar os

Shallow
e Deep
Copy
136

18

Captulo 1. Rpida Introduo Programao procedural

termos tipos de dados e classe alternativamente. Uma diferena chave entre um


objeto e os itens simples de dados que outras linguagens fornecem (e.g., C++ ou
tipos numricos embutidos do Java) que um objeto pode ter mtodos. Essencialmente, um mtodo simplesmente uma funo que invocada para um objeto particular. Por exemplo, o tipo lista possui um mtodo append ( ), portanto,
podemos anexar qualquer objeto a uma lista como esta:
>>> x = [zebra, 49, -879, aardvark, 200]
>>> x.append (mais)
>>>x
[zebra, 49, -879, aardvark, 200, mais]

O objeto x sabe que uma lista (todos os objetos Python sabem qual o seu prprio tipo de dados), logo, ns no precisamos especificar o tipo de dados explicitamente. Na implementao do mtodo append( ), o primeiro argumento ir ser
o objeto x por si mesmo isto feito automaticamente pelo Python como parte de
seu suporte sinttico para mtodos.
O mtodo append( ) se transforma, isto , muda a lista original. Isto possvel
porque listas so mutveis. Isto tambm potencialmente mais eficiente do que
criar uma nova lista com os itens originais e o item extra e, depois, reatar a referencial do objeto nova lista, particularmente para lista muito longas.
Em uma linguagem procedural, a mesma coisa pode ser obtida usando o append
( ) das listas como este (que perfeitamente vlido para a sintaxe Python):
>>> list.append (x,
extra)
>>>x
[zebra, 49, -879, aardvark, 200, mais, extra]

Aqui, ns especificamos os tipos de dados e o mtodo do tipo de dados, e lhe demos, como o primeiro argumento, o item de dados do tipo de dados que queramos
para invocar o mtodo, seguido por qualquer argumento adicional. (Diante da
hereditariedade existe uma semntica sutil que difere entre as duas sintaxes; a
primeira forma uma que mais comumente usada em prtica. Hereditariedade
abordada no Captulo 6).
Se voc no est familiarizado com programao via orientada objetos isto pode
parecer um pouco estranho de incio. Por agora, apenas aceite que o Python possui funes convencionais, como estes: funoNome(argumentos); e mtodos
que so chamados, por exemplo: objetoNome.metodoNome(argumentos).
(Programao via objeto orientado ser abordada no Captulo 6).
O operador ponto ("atributo de acesso") usado para acessar um atributo do objeto. Um atributo pode ser qualquer tipo de objeto, ainda que, por enquanto, ns
tenhamos mostrado apenas atributos de mtodos. J que um atributo pode ser
um objeto que possui atributos, os quais, em troca podem, ter atributos, e assim
por diante, ns podemos usar quantos operadores ponto forem necessrios para
acessar o atributo particular que quisermos.
O tipo list possui muitos outros mtodos, incluindo insert( ),que usado
para inserir um item numa posio dada no ndice, e remove( ), que remove

"Lindo Corao" da Python

19

um item numa posio dada no ndice. Como j foi notado anteriormente, os ndices do Python so sempre baseados em 0.
Ns vimos anteriormente que podemos obter caracteres das strings usando operadores em colchetes, e notamos que, no momento, este operador poder ser usado com qualquer sequncia. Listas so sequncias, portanto, ns podemos fazer
coisas como esta:
>>>x
[zebra, 49, -879, aardvark, 200, mais, extra]
>>> x[0]
zebra
>>> x[4]
200

Tuplas tambm so sequncias, logo, se x tem sido uma tupla, ns podemos recuperar itens usando colchetes, exatamente do mesmo modo como fizemos na lista
x. Mas, j que listas so mutveis (diferente de string e tuplas, que so imutveis) , podemos tambm usar o operador em colchetes para agrupar elementos
na lista. Por exemplo:
>>>> x[1] = quarenta e nove
>>> x
[zebra, quarenta e nove, -879, aardvark, 200, mais, extra]

Se ns dermos uma posio de ndice que esteja fora de alcance, uma exceo
ser lanada ns iremos fazer uma introduo muito breve sobre manipulao
de excees na parte #5, e abordar completamente excees no Captulo 4.
Ns usamos o termo sequncia uma poro de vezes at agora, contando com uma
compreenso informal de seu significado, e iremos continuar a fazer isso adiante.
De qualquer maneira, Python define precisamente quais caractersticas uma sequncia deve suportar, e assim por diante, para vrias outras categorias que um
tipo de dados possa pertencer, como veremos no Captulo 8.
Listas, tuplas e outros tipos de dados colecionveis do Python sero abordados
no Captulo 3.

Parte #4: Operaes Lgicas


Uma das caractersticas fundamentais de qualquer linguagem de programao
so suas operaes lgicas. Python fornece quatro grupos de operaes lgicas, e
ns iremos rever os aspectos fundamentais de todos eles aqui.

O operador de identidade
J que todas as variveis do Python so realmente referncia de objetos, algumas
vezes, faz sentido de perguntar dois ou mais referncia de objetos so referidos
para os mesmo objetos. O operador is trata-se de um operador binrio que
retorna true se sua referncia de objeto esquerda est se referindo ao mesmo
referencia de objeto da direita.

20

Captulo 1. Rpida Introduo Programao procedural

Aqui esto alguns exemplos:


>>> a= [Reteno, 3, None]
>>> b = [Reteno, 3, None]
>>> a e b
False
>>>b = a
>>>a e b
True

Perceba que, usualmente, no faz sentido usar o is para comparar ints, strs
e a maioria dos tipos de dados, j que a grande maioria invariavelmente quer
comparar seus valores. De fato, usar is para comparar itens de dados pode levar
a resultados no muito intuitivos, como vimos no exemplo anterior, em que, ainda
que a e b foram atribudos inicialmente a mesma lista de valores, as listas, por si
mesmas, so retidas como objetos list separados e, portanto, is retorna como
False da primeira vez que o utilizamos.
Um dos benefcios oferecidos pelas comparaes de identidade que elas so
muito rpidas. Isto ocorre porque os objetos referidos no precisam ser examinados por si prprios. O operador is precisa comparar apenas a memria de
endereos dos objetos o mesmo endereo significa o mesmo objeto.
O caso mais comum do uso do is ocorre quando se compara um item de dados
com um objeto nulo, None, o qual normalmente utilizado como um valor placemarking (marcador) que significa unknow ou nonexistent:
>>> a = Algo
>>>b= None
>>> a is not none , b is none
(true, true)

Para inverter o teste de identidade, ns usamos o not is.


O objetivo do operador de identidade verificar se, entre duas referncias de objetos, h referncia ao mesmo objeto, ou verificar se um objeto None. Se quisermos comparar os valores dos objetos devemos usar um operador de comparao
ao invs deste procedimento.

Operadores de comparao
O Python fornece o padro para operadores de comparao binria, com as semnticas esperadas: < menor que, <= menor que ou igual a, == igual a, != no igual
a, > = maior que ou igual a, e > maior que. Estes operadores comparam valores
de objetos, isto , os objetos que a referncia do objeto utiliza em sua comparao
para referir-se a ele. Aqui esto alguns exemplos digitados num Shell Python:
>>>b = 6
>>>a = = b
False
>>>a<b
True

"Lindo Corao" da Python

21

>>>a<= b, a !=b,a =b a>b


(True, True, False, False)

Tudo est como espervamos com os inteiros. Similarmente, as strings aparecem


tambm para comparar adequadamente:
>>>a = muitos caminhos
>>>b = muitos caminhos
>>> a is b
False
>>>a == b
True

Ainda que a e b sejam objetos diferentes (possuem identidades diferentes), eles


possuem os mesmo valores, ento, eles comparam igualmente. Esteja atento, porm, porque o Python usa o UniCode para a representao de strings, comparando strings que contm caracteres no ASCII, logo, isto pode se tornar um
problema muito srio e complicado, ainda que no parea de incio ns iremos
discutir isso de forma mais completa no Captulo 2.
Particularmente, uma caracterstica muito boa dos operadores de comparao do
Python que eles podem ser conectveis. Por exemplo:
>>>a = 9
>>>0 <= a <= 10
True

Este um jeito bacana de testar um determinado item de dados que est no range ao
invs de ter que fazer duas comparaes separadas e ligadas o and, como a maioria
das linguagens requerem. Tambm possui a adicional virtude de avaliar o item de
dados apenas uma vez (desde que ele aparea apenas uma vez na expresso), algo
que pode fazer uma grande diferena caso a computao de dados do valor do item
seja muito cara, ou caso acessar o item de dados cause efeitos colaterais.
Graas ao forte aspecto da tipagem dinmica do Python, comparaes que no
fazem sentido iro causar uma exceo que ser lanada. Por exemplo:
>>> trs < 4
Traceback (most recent call last):
...
TypeError :unordenable types : str( )< int( )

Quando uma exceo lanada e no tratada, Python imprime um traceback


junto com a mensagem de erro da exceo. Para esclarecer melhor, ns omitimos
a parte da sada da traceback, substituindo-a com uma elipse*. O mesmo TypeError poderia ocorrer se ns escrevssemos 3<4, j que o Python no vai tentar
adivinhar nossas intenes- a abordagem correta explicitar a converso, por
exemplo, int (3)<4, ou usar os tipos comparveis, que so ambos os inteiros ou
ambas as strings.
Python nos possibilita uma fcil criao de tipos de dados personalizados que
iro integrar-se de maneira perfeita; por exemplo, ns poderamos criar nosso
prprio tipo numrico personalizado o que seria capaz de participar de compa-

Comparando
Strings
63

22

Captulo 1. Rpida Introduo Programao procedural

raes com o tipo int inteiro e com outros tipos numricos personalizados, mas
no com a string ou outros tipos no numricos.

O operador de Associao
FuzzyBool
Alternativo
248

Para tipos de dados sequenciais ou colecionveis, como strings, listas e tuplas,


ns podemos testar a associao com o operador in e, para ausncia, o operador
not in. Por exemplo:
>>> p= (4, sapo, 9, -33, 9, 2)
>>> 2 inp
True
>>> cachorro not in p
True

Para listas e tuplas, o operador in usa uma procura linear, que pode se tornar
lenta para colees muito grandes (dezenas de milhares de itens ou mais). Por
outro lado, in muito rpido quando usado com um dicionrio ou um set. Esses
dois tipos de dados colecionveis so abordados no Captulo 3. Aqui est como in
pode ser usado com uma string:
>>frase = A Paz no permitida durante as festas
>>> v in frase
True
>>> anel em frase
True

Convenientemente, no caso das strings, o membership operator pode ser usado


para teste de substrings de qualquer tamanho. (Como percebido anteriormente,
um caractere apenas uma string de tamanho 1.)

Operadores Lgicos
Python fornece trs operadores lgicos: and, or e not. Tanto and como or usam
um curto-circuito lgico e retornam a operando que determinou o resultado eles
no retornam um boleano (a menos que eles realmente possuam operando boleanas). Vamos ver o que isto significa na prtica:
>>>
>>>
>>>
>>>
2
>>>
5
>>>
0

cinco = 5
dois = 2
zero = 0
cindo and dois
dois and cinco
cinco and zero

*Um traceback (alguma vezes chamado de um backtrace) uma lista que contm todas as invocaes
feitas do ponto de onde a exceo no tratada ocorreu de volta ao topo da pilha de invocaes.

"Lindo Corao" da Python

23

Se a expresso ocorre em um contexto boleano, o resultado avaliado como um


boleano; logo, a expresso anterior pode se tornar True, True e False, isto ,
uma declarao if.
>>>nada= 0
>>>cinco or dois
5
>>>dois or cinco
2
>>>zero or cinco
5
>>>zero or nada
0

O operador ou similar; aqui, o resultado num contexto boleano poderia ser


True, True e False.
O operador unrio not avalia se ele um argumento em um contexto boleano,
e, como de se esperar, sempre acaba retornando um resultado boleano; ento,
para continuar o exemplo anterior, not (zero or nada) poder produzir True
e not dois poder produzir False.

Parte #5: Controle do fluxo das declaraes


Ns mencionamos anteriormente que cada declarao encontrada em um arquivo
.py executada em turno, comeando com a primeira e, progressivamente, linha por
linha. O fluxo (ou corrente) de controle pode ser desviado por uma funo ou mtodo
invocado ou por um controle de estrutura, tal como um desvio condicional ou uma
declarao loop. O controle tambm desviado quando uma exceo lanada.
Nesta subseo, ns iremos ver a declarao Python if e seus loops while e
for; as consideraes deferidas das funes ficam para a Parte #8, e os mtodos
ficam para o Captulo 6. Ns iremos tambm, verificar as bases da manipulao
de excees; e iremos abordar o sujeito no Captulo 4. Mas, primeiro, vamos iluminar melhor alguns itens de terminologia.
Uma expresso Boleana qualquer coisa que possa ser avaliada para produzir
um valor Boleano (True ou False). No Python, uma expresso avaliada como
False, caso seja a constante pr-definida False, o objeto especial None, uma
sequncia de coleo vazia (e.g., uma string, lista ou tupla vazia), ou um item de
dado numrico de valor 0, qualquer outra coisa considerada como True. Quando criamos nossos prprios tipos de dados personalizados (e.g., no Captulo 6),
podemos decidir por ns mesmos o que eles iro retornar num contexto Boleano.
Na linguagem Python, um bloco de cdigos, isto , uma sequncia de uma ou
mais declaraes, chamado de uma suite. Porque algumas das sintaxes Python
requerem que uma sute esteja presente, o Python providencia a palavra-chave
pass, que uma declarao que no faz nada e que pode ser usada quando uma
sute requisitada (ou onde ns queiramos indicar, o que considerado ser um
caso particular), mas nenhum processamento necessrio.

24

Captulo 1. Rpida Introduo Programao procedural

A declarao if
A sintaxe geral para a declarao if do Python esta:*
If boleana_expresso1:

Suite1
elif boleana_expresso2:

Suite2
...
elif boleana_expressoN:

suiteN
else:

else_sute

Pode existir zero ou mais clusulas elif, e, a clusula final else opcional. Se
quisermos relatar para um caso particular, mas no quisermos fazer nada se isto
ocorrer, podemos usar o pass como uma sute de desvio.
A primeira coisa que chama a ateno de usurio de C++ ou Java que no existem parnteses ou chaves. Outra coisa que se nota dois pontos (delimitador):
este parte da sintaxe e muito fcil de se esquecer a princpio. Dois pontos so
usados com else, elif e, essencialmente, em qualquer outro lugar onde uma
suite estiver adiante.
Diferente da maioria das outras linguagens de programao, Python utiliza uma
indentao para dar significado s suas estruturas de blocos. Alguns programadores no gostam disso, especialmente antes de tentarem usar isso , e acabam levando esta questo para o lado pessoal. Mas, o cdigo necessrio apenas alguns dias
para se acostumar com isso, e, aps algumas semanas ou meses, se torna muito
melhor e menos desordenado para se ler do que um cdigo que utiliza colchetes.
J que sutes so indicadas com o uso de uma indentao, a pergunta que naturalmente nos incomoda : Que tipo de indentao?. A guia de boas prticas do
Python recomenda quatro espaos por nvel de indentao, e somente espaos
(no podem ser tabs). A maioria dos editores de texto mais modernos pode ser
configurada para gerenciar este problema automaticamente (o editor do IDLE
faz isso, claro, e muitos outros editores compatveis com o Python tambm).
Python ir funcionar bem com qualquer nmero de espaos, tabulaes ou uma
mistura dos dois, desde que usado uma identao consistente. Neste livro, ns
iremos seguir a guia de boas prticas oficial do Python.
Aqui est um exemplo muito simples da declarao se:
if x:

print (x no zero)

Neste caso, se a condio (x) avaliada como True a sute (a invocao da funo
print( ) ), a mesma ser executada.

* Neste livro, elipses (...) so usadas para indicar linhas que no foram mostradas.

"Lindo Corao" da Python

25

if linhas < 1000:



print(pequeno)
elif linhas <10000:

print (mdio)
else:

print(grande)

Esta uma declarao sutilmente mais elaborada que imprime uma palavra que
descreve o valor das variveis lines.

A declarao while
A declarao while usada para executar uma sute zero ou mais vezes: o nmero de vezes vai depender do estado do while da expresso boleana no loop.
Aqui est a sintaxe:
while boleana_expresso

suite

Na verdade, a sintaxe completa do loop de while mais sofisticada do que isto,


j que tanto break como continue so suportadas, e tambm uma clusula
opcional else que ns iremos discutir no Captulo 4. A declarao break transfere o controle para a declarao seguinte, o mais interno do loop, no qual a
declarao break aparece isto , ela quebra o loop. A declarao continue
transfere o controle ao incio do loop. Tanto break quanto continue so usados,
normalmente, dentro da declarao if para mudar condicionalmente um comportamento do loop.
while True

item = get_next_item( )

if not item:

break

process_item(item)

Este loop while possui uma estrutura muito tpica e vai funcionar na medida em
que ainda existam itens para ele processar. (Tanto get_next_item
( ) quanto process_item( ) so supostas funes personalizadas, definidas
num outro lugar). Neste exemplo, a sute da declarao while contm uma declarao if, a qual, por si mesma, tem uma sute como deve ser neste caso,
consiste de uma nica declarao break.

A declarao for...in
O loop do Python for usa novamente a palavra chave in (a qual, em outros contextos, o membership operator) e possui a seguinte sintaxe:
for varivel in reitervel
Sute

Assim como o loop while, o loop for suporta break e continue, e tambm pos-

26

Captulo 1. Rpida Introduo Programao procedural

sui uma clusula opcional else. A varivel configurada para referir-se para
cada objeto no interable em turnos. Um interable qualquer tipo de dados
que possa ser iterado e estar apto a ter strings includas (em que a iterao
caracterizada pelo caractere), listas, tuplas e outros tipos de dados colecionveis
do Python.
for pais in[Denmark , Finlad, Norway, Sweden]:
print (pais)

Aqui, ns levamos em considerao uma abordagem muito simples para imprimir uma lista de pases. Na prtica, isto muito mais comum do que usar uma
varivel:
Paises = [Denmark, Finland, Norway, Sweden]
for pais em paises
print (pais)

De fato, uma lista completa (ou tupla) pode ser impressa usando a funo print
( ) diretamente, por exemplo, print(paises), mas ns normalmente preferimos imprimir colees usando um loop for (ou uma lista de compreenso, abordada mais adiante) para alcanar um controle completo sobre a formatao.
for letra in ABCDEFGHIJKLMNOPQRSTUWXYZ:
if letra in AEIOU:
print(letra, uma vogal)
mais:
print(letra, uma consoante)

Neste fragmento, o primeiro uso da palavra-chave in parte de uma declarao de for, com a varivel letra tomando os valores A, B e assim
por diante, at Z, mudando a cada iterao do loop. Na segunda linha do
fragmento, ns usamos if novamente, mas, desta vez, como operador teste
de associao. Note tambm que este exemplo mostra suites aninhadas. A
sute do loop for a declarao if...else, e tanto o desvio if como o else
possuem suas prprias suites.

Manipuladores de exceo bsicos


Muitas das funes e mtodos Python indicam erros ou outros eventos importantes lanando uma exceo. Uma exceo um objeto como qualquer outro objeto
Python, e, quando convertido em uma string (e.g., quando imprimido), a exceo
produz uma mensagem de texto. Uma forma simples da sintaxe para manipuladores de exceo esta:
Try:
Testar_sute
Except exceo as varivel:
Exceo_sute1
...
Except exceoN as varivelN>
Exceo_suteN

Lista
de compreenses
110

"Lindo Corao" da Python

27

Perceba que a parte as varivel opcional; ns podemos apenas notar que


uma exceo particular foi lanada e no realmente importanta-nos
A sintaxe completa mais sofisticada; por exemplo, cada clusula excepct pode
identificar mltiplas excees e h uma clusula opcional else. Tudo isto
abordado no Captulo 4.
A lgica funciona da mesma maneira. Se as declaraes de try da sute do bloco
de cdigos forem todas executadas sem lanar uma exceo, os blocos except
sero omitidos. Se uma exceo lanada dentro do bloco try, o controle imediatamente passado para a sute correspondente primeira exceo equivalente
isto significa que qualquer declarao na sute que siga aquela que causou a
exceo no ser executada. Se isto ocorrer e se a parte try varivel for determinada e, depois, colocada dentro da suite manipulador-de-exceo, varivel
ir se referir ao objeto de exceo.
Se uma exceo ocorre na manipulao do bloco except, ou se uma exceo que
for lanada no bater com qualquer um dos blocos except, em primeiro lugar,
Python vai procurar por um bloco except correspondente mais prximo do escopo seguinte. A procura por um manipulador de exceo adequado trabalha de
escopo e at a chamada de pilha at que um identificador adequado seja encontrado e que a exceo seja tratada, mas, se no for encontrado nenhum manipulador adequado, o programa encerra com uma exceo no manipulada. No caso
de uma exceo no manipulada, Python imprime uma traceback, assim como as
mensagens de texto da exceo.
Aqui est um exemplo:
s= imput(entre um iteirador: )
try:
i= int (s)
print (inteiro valido introduzido: , i)
Except ValueError as err:
print (err)

Caso o usurio entre com 3.5, a sada ser:


invalid literal for int() with base 10: '3.5'

Mas, se a entrada for feita com 13, a sada ser:


Inteiro vlido introduzido: 13

Muitos livros consideram que o manipulador de excees seja um tpico muito


avanado e adiam o assunto o quanto for possvel. Mas, lanar e, especialmente,
manipular excees, fundamental para que o Python funcione; fato que nos levou
a fazer uso deste conceito desde o princpio. E, assim como ns pudemos ver, usar
manipuladores de excees pode fazer com que os cdigos fiquem muito mais legveis, separando os casos excepcionais dos processos que realmente importam.

28

Captulo 1. Rpida Introduo Programao procedural

Parte #6: Operadores Aritmticos


Python fornece um conjunto completo de operadores aritmticos, incluindo operadores binrios para as quatro operaes matemticas bsicas: = adio, - subtrao, * multiplicao e / diviso. Alm do mais, muitos tipos de dados Python podem
ser usados com operadores de incremento associado como + = *. Os operadores+, - e
* comportam-se como o esperado quando ambos operadores so inteiros:
>>> 5+6
11
>>> 3-7
-4
>>> 4*8
32

Perceba que o pode ser usado tanto como um operador unrio (negativo) quanto como um operador binrio (subtrao); algo comum nas outras linguagens de
programao. Onde Python se difere dos demais na parte da diviso:
>>> 12/3
4.0
>>> 3/2
1.5

O operador de diviso produz um valor de ponto flutuante, no um inteiro; muitas


outras linguagens iro produzir um inteiro, truncando qualquer parte fracionada. Se
ns precisarmos de um resultado inteiro, poderemos sempre converter usando int (
) (ou usando o operador de diviso de truncamento //, discutido mais adiante).
>>>
>>>
5
>>>
>>>
13

a = 5
a
a += 8
a

Num primeiro aspecto, as declaraes anteriores no so muito surpreendentes,


particularmente para as pessoas familiarizadas com linguagens como C.
Nessas linguagens, associao de incremento um atalho para associar os resultados de uma operao por exemplo, a+=8 , essencialmente, o mesmo que a=a+8.
De qualquer maneira, existem duas sutilezas importantes aqui, um especfico do
Python e um sobre operadores de incremento em qualquer outra linguagem.
O primeiro ponto para relembrar que o tipo de dados int imutvel isto ,
uma vez designado, um valor int no pode ser modificado. Logo, o que realmente
acontece atrs das cenas quando um operador de incremento associado utilizado em um objeto imutvel, que a operao feita e um objeto que contm
resultado criado, e, depois, a referncia-alvo do objeto reatada para referir-se
ao objeto resultado ao invs do objeto que foi referido anteriormente. Portanto, no
caso anterior, quando a declarao a+=8 foi encontrada, Python computou a+8,
armazenando o resultado em um novo objeto int e, depois, amarrando novamen-

29

"LIndo Corao" da Python


i = 73

73

i += 2

73
75

Figura 1.3 Incremento Associvel de um objeto imutvel

te, para que ele se refira a este novo int. ( E, se o objeto original a foi referido de
modo que no possua mais referncia de objeto referidos a ele, este ser programado para o garbage collection). Figura 1.3 ilustra este ponto.
Outra sutileza que a operador= b no igual ao a= a operador b. A verso
incrementada olha o valor de a apenas uma vez, logo, isto pode ser potencialmente
rpido. Ademais, se a uma expresso complexa (e.g., uma lista de elementos com
uma posio de ndice calculado como sendo itens[offset+ndice], usar a verso incrementada causar menos erros, j que o calculo precisa modificar o mantenedor
e este precisa mudar para apenas uma ao invs de duas expresses.
Python sobrecarrega (i.e., reusos para um tipo de dados diferente) os operadores
o(a)+ e += tanto em string quanto em listas; o primeiro significa concatenao e
o outro significa anexao para string e extend (anexar outro lista) para listas:
>>>nome = John
>>>nome=+ Doe
JohnDoe
>>>nome+= Doe
>>>nome
John Doe

Assim como os inteiros, as strings so imutveis, logo, quando += utilizado,


uma nova string criada e a refernci do lado esquerdo da expresso reatado a
ela, exatamente como escrito anteriormente pelo ints. Listas suportam a mesma sintaxe, mas so diferentes por trs das cenas:
>>>semeante = [gergelim, girassol]
>>>semente=+ [abbora]
>>>semente
[gergelim, girassol, abbora]

J que listas so mutveis, quando =+ usado, o objeto lista original modificado, ento, nenhum reatamento de seeds necessrio. Figura 1.4 mostra como isto ocorre.
J que a sintaxe Python, de maneira muito inteligente, esconde a distino entre
tipos de dados mutveis e imutveis, afinal de contas, por que so necessrios os
dois tipos? As razes para isso so mais pelo desempenho. Tipos imutveis so potencialmente muito mais eficientes para implementar (j que eles nunca mudem)
do que tipos mutveis. Ademais, alguns tipos de dados colecionveis, por exemplo,
sets, podem trabalhar apenas com tipos imutveis. Por outro lado, tipos mutveis
so bem mais convenientes de usar. Onde esta distino realmente importa, ns
discutiremos isso por exemplo, no Captulo 4, quando discutirmos argumentamos
setados como default para funes customizada no Captulo 3, quando discutirmos

30
m = [5, 9]

Captulo 1. Rpida Introduo Programao procedural


m

m += [6]

Figura 1.4 Incremento Associado de um objeto mutvel

sobre listas, sets e alguns outros tipos de dados, e novamente no Captulo 6,quando
discuture. como criar tipos de dados personalizados.
A operador do lado direito para o operador += da lista deve ser um interable; caso
no seja, uma exceo lanada:
>>> seeds += 5
Traceback (most recent call last):
...
TypeError: 'int' object is not iterable

A forma correta para prolongar uma lista usar um objeto interable, como
outra lista:
>>>semente += [5]
>>>semente
[gergelim, girassol, abbora, 5]

E, claro, o objeto iterable utilizado para prolongar a lista pelo fato de ter, por si
mesmo, mais de um item:
>>>semear += [9, 1, 5, papoula]
>>>semear
[geregelim, girassol, abbora, 5, 9, 1, 5,

papoula]

Anexando uma string simples por exemplo, durian ao invs de uma lista
contendo uma string, [durian], leva a um resultado lgico, mas, quem sabe, um
resultado surpreendente:
>>>semente = [gergelim, girassol, abbora]
>>>semente += durian
>>>semente
[gergelim, girassol, abbora, d, u, r, i, a, n, ]

O operador += da lista estende a lista anexando a cada item cada iterable que
fornecido; e, uma vez que uma string itervel, ela leva cada caractere na string
a ser anexado individualmente. Se ns usarmos na lista o mtodo append( ), o
argumento ser sempre adicionado como um nico item.

Parte #7: Entrada/Sada


Para estarmos aptos a escrever programas genuinamente completos, ns devemos estar tambm aptos a produzir entradas por exemplo, do usurio para o
terminal, e dos arquivos para o terminal- e, da mesma forma, produzir sadas,

"LIndo Corao" da Python

31

ambas para o terminal ou para os arquivos. Nos j fizemos uso da funo embutida do Python print ( ), ainda que ns tenhamos adiado sua abordagem completa para o Captulo 4. Nesta subseo, ns iremos nos concentrar no terminal
I/O e usar redirecionamentos shell para ler e escrever arquivos.
Python fornece a funo embutida input( ) para aceitar entrada dos usurios.
Esta funo toma um argumento de string opcional (que impresso no terminal);
ele, ento, espera o usurio digitar uma resposta e finalizar pressionando Enter
(ou Return). Se o usurio no digitar texto algum, mas apenas apertar o Enter,
a funo input( ) retorna uma string vazia; de qualquer maneira, ele retorna
uma string contendo o que o usurio digitou, sem qualquer finalizador de linha.
Aqui est nosso primeiro e completo programa til; ele se adianta em muito se
o compararmos com os programas anteriores a nica coisa realmente nova
exibida na funo ( ):
print("Type integers, each followed by Enter; or just Enter to finish")
total = 0
count = 0
while True:
line = input("integer: ")
if line:
try:
number = int(line)
except ValueError as err:
print(err)
continue
total += number
count += 1
else:
break
if count:
print("count =", count, "total =", total, "mean =", total /
count)

O programa (no arquivo sum1.py nos exemplos do livro) possui apenas 17 linhas
executveis. Aqui est o que acontece em uma tpica execuo:
Type integers, each followed by Enter; or just Enter to finish
number: 12
number: 7
number: 1x
invalid literal for int() with base 10: '1x'
number: 15
number: 5
number:
count = 4 total = 39 mean = 9.75

Ainda que este programa seja muito curto, amplamente robusto. Se o usurio
entrar com uma string que no possa ser convertida em um inteiro o problema

32

Exemplos do
livro
3

Captulo 1. Rpida Introduo Programao procedural

assumido por um manipulador de exceo que imprime uma mensagem adequada e envia o controle para o incio do loop ("continuar o loop"). E a ltima
declarao se assegura que o usurio no entre com qualquer nmero; o sumrio
no colocado na sada e a diviso por zero prevenida.
A manipulao de arquivos totalmente abordada no Captulo 7; mas, por enquanto, ns podemos criar arquivos simples direcionando as sadas da funo
print ( ) do terminal. Por exemplo:
C:\>teste.py>resultado.txt

causar a sada de uma funo simples print( ) chamada no programa fictcio teste.py, que deve ser escrito no arquivo resultados.txt. Esta sintaxe
funciona com o terminal do Windows e do Unix. Para o Windows, ns devemos
escrever C:\Python30\python.exe teste.py>resultados.txt, caso o
Python 2 estiveja configurada como padro no computador, ou python teste.py>resultados.txt, se Python 3 vier primeiro no PATH (ainda que ns
no queiramos falar sobre isso novamente), e para Unixes ns devemos fazer o
programa executvel (chmod +x teste.py) e, ento, invoc-lo escrevendo ./
teste: a menos que acontea de o diretrio estar no PATH.
Ler dados pode ser alcanado redirecionando um arquivo dado como entrada
numa forma analgica feito para redirecionar a sada. De qualquer maneira, se
ns usarmos o redirecionamento com sum1.py, o programa poder falhar. Isto
ocorre porque a funo output( ) lana uma exceo quando recebe um caractere EOF (fim de arquivo). Aqui est uma verso muito mais robusta (sum2.
py) que pode aceitar entradas do usurio, quando este digitar manualmente no
teclado, ou via redirecionamento de arquivo:
print("Type integers, each followed by Enter; or ^D or ^Z to finish")
total = 0
count = 0
while True:
try:
line = input()
if line:
number = int(line)
total += number
count += 1
except ValueError as err:
print(err)
continue
except EOFError:
break
if count:
print("count =", count, "total =", total, "mean =", total /
count)

Dada a linha de comando sum2.py<dados\sum2.dad (onde o arquivo sum2.

"Lindo Corao" da Python

33

dado contm uma lista de nmeros, um por linha, e est nos exemplos do subdiretrio dados), a sada para o terminal ser:
Type integers, each followed by Enter; or ^D or ^Z to finish
count = 37 total = 1839 mean = 49.7027027027

Ns criamos muitas pequenas mudanas para fazer o programa mais adequado


para usar tanto de forma interativa quanto usar o redirecionamento. Primeiro,
ns temos que mudar a terminao de uma linha em branco para um caractere
EOF (Ctrl+D no Unix, Ctrl+Z, Enter no Windows). Isto torna o programa mais
robusto quando ele precisa manipular arquivos de entrada que contm linhas em
branco. Precisamos tambm deixar de imprimir um prompt para cada nmero,
j que no faz sentido ter um para cada redirecionamento de sada. E, por fim,
temos de usar um bloco nico try, com dois manipuladores de exceo.
Perceba que, se um inteirador invlido for acionado (tanto via teclado ou devido
a uma linha ruim dos dados em um redirecionamento de arquivos de entrada),
a converso int( ) vai lanar uma exceo ValueError e o fluxo do controle
ser imediatamente enviado para o bloco relevante except isto significa que
tanto total quanto count no sero incrementados quando um dado invlido
for encontrado, o que exatamente o que esperamos que acontea.
Ns poderamos simplesmente ter usado dois manipuladores de exceo separados ao invs de todo este processo:
while True:
try:
line = input()
if line:
try:
number = int(line)
except ValueError as err:
print(err)
continue
total += number
count += 1
except EOFError:
break

Mas preferencialmente melhor agrupar as excees juntas no final do que fazer


o processo principal de organizao, o quanto for possvel.

Parte #8: Criando e Chamando Funes


perfeitamente possvel escrever programas usando os tipos de dados e controles de estrutura que j abordamos nas partes anteriores. De qualquer maneira,
normalmente, ns iremos fazer, essencialmente, o mesmo processo repetidamente, mas com uma pequena diferena, assim como uma diferena de valor inicial.

34

Captulo 1. Rpida Introduo Programao procedural

Python fornece vrios sentidos para sutes encapsuladas, como funes que podem ser parametrizadas atravs dos argumentos que lhe so passados. Aqui est
a sintaxe geral para criar uma funo:
def funoNome(argumentos):
Suite

Os argumentos so opcionais, e mltiplos argumentos devem estar separados


por vrgulas. Toda funo Python possui um valor de retorno, este valor None
por padro, a menos que ns retornemos a funo usando a sintaxe return value, em que ser retornado o valor em cada caso. O valor retornado pode ser
apenas um valor ou uma tupla de valores. O valor retornado pode ser ignorado
por um invocador que, em cada caso, ser simplesmente ignorado.
Note que def uma declarao que trabalha de um jeito similar ao operador associao. Quando def executado, um objeto de funo criado e uma referncia
objeto com o nome especificado criado e configurado para referir-se ao objeto de
funo. J que funes so objetos, elas podem ser armazenadas em um tipo de
dados colecionvel e passadas como argumentos para outras funes, assim como
vimos nos captulos anteriores.
Uma necessidade frequente quando escrevemos aplicaes em terminais interativos que temos de obter um inteiro do usurio. Aqui est a funo que faz
exatamente isto:
def get_int(msg):
while True:
try:
Pythons Beautiful Heart 35
i = int(input(msg))
return i
except ValueError as err:
print(err)

Esta funo toma um argumento, msg. Dentro do loop while, o usurio abordado com um prompt, a fim de dar entrada num inteiro. Se eles entrarem com
algo invlido, uma exceo ValueError ser lanada, a mensagem de erro
ser impressa e o loop se repetir. Uma vez que um iteirador vlido seja acionado, ele retornado ao invocador. Aqui est como ns deveremos cham-lo:
idade = obter_int(entrar sua idade:)

Neste exemplo, o nico argumento unitrio mandatrio, porque ns no podemos fornecer um valor padro. De fato, Python suporta uma sintaxe muito
sofisticada e flexvel para parmetros de funes, os quais suportam argumentos
padres. Toda esta sintaxe abordada no Captulo 4.
Ainda que criemos nossas prprias funes e isto seja muito satisfatrio, em muitos casos no ser necessrio. Isto ocorre porque Python possui um monte de funes embutidas e uma grande gama de funes nos mdulos da biblioteca padro,
ento, o que queremos provvel e j est pronto e disponvel.

"Lindo Corao" da Python

35

Um modulo Python apenas um arquivo .py que contm cdigo Python, assim
como funes personalizadas e definies de classes (tipos de dados personalizados), e algumas variveis. Para acessar a funcionalidade em um mdulo, ns
devemos import-lo. Por exemplo:
Import sys

Para importar um mdulo, ns usamos a declarao import seguida pelo nome


de um arquivo .py, mas omitindo a extenso*. Uma vez que um mdulo tenha
sido importado, ns podemos acessar qualquer funcionalidade, classes ou variveis que ele contenha. Por exemplo:
Print(sys.argv)

Este mdulo sys fornece a varivel argv uma lista em que o primeiro item o
nome no qual o programa foi invocado e o segundo e tambm os itens subsequentes, os argumentos da linha de comando do programa. As duas linhas anteriores
mencionadas constituem o programa completo ecoargs.py. Se o programa foi
invocado com a linha de comando ecoargs.py, ele ser impresso [ecoargs.
py, -v] no terminal. (No Unix, a primeira entrada poder ser ./ecoargs.py)
No geral, a sintaxe para usar a funo de um mdulo moduloNome.
funoNome(argumentos). Isto faz uso do operador de ponto (acessar atributos) que ns introduzimos na parte #3. A biblioteca padro contm vrios
mdulos e ns
iremos fazer uso de muitos deles ao longo do livro. O mdulo padro possui, quebra linha, nomes em minsculo; logo, alguns programadores iro usar nomes com
a primeira letra em maisculo (e.g., MeuModulo) para seus prprios mdulos, a
fim de manter a distino entre um e outro.
Vamos ver um exemplo: o mdulo random (no arquivo random.py da biblioteca
padro), que fornece funes muito utilizadas:
Import random
X= random.randint(1, 6)
Y= random.choice([ma, banana, cereja, durio])
Operador(.)
de
ponto
operador
18

Depois de estas declaraes terem sido executadas, x ir conter um inteiro, inclusive entre 1 e 6; e y ir conter uma das strings da lista passada para a funo
random.choice( ).
conveniente colocar todas as declaraes import no incio dos arquivos .py,
depois da linha shebang e depois da documentao do mdulo. (Documentao de
mdulos ser abordada no Captulo 5.) Ns recomendamos importar os mdulos
da biblioteca principal primeiro, depois os mdulos da biblioteca de terceiros e,
finalmente, seus prprios mdulos.
*O mdulo sys, outro embutido dos mdulos, e mdulos implementados em C no possuem
necessariamente e correspondentemente arquivos .py mas eles so usados exatamente do mesmo
jeito que estes outros tambm o so.

36

Captulo 1. Rpida Introduo Programao procedural

Exemplos
Na seo anterior, ns aprendemos o suficiente sobre Python para escrever programas reais. Nesta seo, ns iremos estudar programas completos que usam
apenas o que j foi abordado sobre Python antes. Estes exemplos so tanto para
mostrar o que possvel fazer com o que aprendemos quanto para ajudar a consolidar tudo que j foi aprendido at este ponto.
Linha
shebang
10

Nos captulos subsequentes, ns iremos melhorar a abordagem sobre linguagem


Python e suas bibliotecas; dessa forma, estaremos aptos a escrever programas
mais concisos e mais robustos do que estes ilustrados aqui mas, primeiro, devemos dar fundamento para estes exemplos posteriores.

Bigdigits.py
O primeiro programa que ns iremos rever extremamente curto, ainda que ele
tenha alguns aspectos sutis, incluindo uma lista de listas. Aqui est o que acontece: dado um nmero na linha de comando, o programa libera o mesmo nmero
dentro do terminal usando grandes dgitos.
Pelos sites afora, existem punhados de usurios partilhando uma linha de imprimir altamente rpida, que usada para prticas comuns para cada trabalho
impresso do usurio, precedido por uma pgina de capa que exibir seus nomes
de usurio e alguns outros detalhes de identificao impresssos, que utiliza este
37
tipo Examples
de tcnica.
Ns iremos rever o cdigo em trs partes: a importao, a criao das listas que
We will review the code in three parts: the import, the creation of the lists
atam os dados aos programas usados e o processo por si mesmo. Mas, primeiro,
holding the data the program uses, and the processing itself. But rst, lets
vamos ver este exemplo em funcionamento:
look at a sample run:
bigdigits.py 41072819
bigdigits.py 41072819
*
*
***
*****
**
**
*
*
*
* *
*
*
*
*
* *
*
*
*
*
******
*
*
*
*
*
*
*
*
*
*
***
***
*

***
*
*

***
*

*
*

*
*

*
*
*****

***
*
*

*
*
***

*
**
*
*
*
*
***

****
*
*
****
*
*
*

*
*

We have not shown the console prompt (or the leading ./ for Unix users); we
will take them for granted from now on.
Ns no precisamos mostras o prompt do terminal (ou o ./ para usurios Unix);
ns iremos
esconced-lo
daqui para frente.
import
sys
Import sys

Since we must read in an argument from the command line (the number
J que
ns devemos
ler em
argumento
da linha
nmero
parathe
a
to output),
we need
to um
access
the sys.argv
list,de
socomando
we begin(oby
importing
sada),
ns
precisamos
acessar
a
lista
sys.argv;
logo,
comearemos
importando
sys module.
o mdulo sys.
We represent each number as a list of strings. For example, here is zero:
Zero = [" *** ",
" *
* ",
"*
*",

will take them for granted from now on.


We have not shown the console prompt (or the leading ./ for Unix users); we
will takeimport
them sys
for granted from now on.
Exemplos
37
Since
must read in an argument from the command line (the number
importwe
sys
to output), we need to access the sys.argv list, so we begin by importing the
Since
we
must read
in nmero
an argument
fromlista
the de
command
(the number
module.
sys
Ns
representamos
cada
como uma
strings. line
Por exemplo,
aqui
to
output),
we
need
to
access
the
list,
so
we
begin
by
importing
the
sys.argv
zero:
represent each number as a list of strings. For example, here is zero:
module.
sys We
Zero =each
[" number
*** ", as a list of strings. For example, here is zero:
We represent
" *
* ",
Zero = [" ***
"* ", *",
" * "* * ", *",
"* "* *", *",
"* " * *",* ",
"* " ***
*", "]
" *
* ",
One detail
note"]is that the Zero list of strings is spread over multiple lines.
" to***

Um Python
detalhestatements
que se deve
notar occupy
que a lista
Zero
das
strings
espalhada
por
set type
normally
a single
line,
but
they can
span multiple
linhas
mltiplas.
As
declaraes
Python
normalmente
ocupam
uma
nica
linha,
Onelines
detail
to
note
is
that
the
list
of
strings
is
spread
over
multiple
lines.
Zero
if they are a parenthesized expression, a list, set, or dictionary literal, a 112
mas
elasstatements
podem
por
mltiplas
linhasline,
se estiverem
em:span
umamultiple
expresso
Python
normally
occupy
a single
but they
can
function
call espalhar
argument
list,
or a multiline
statement
where
every
end-of-lineset type
dict
entre
parnteses,
uma
lista,
set
ou
dicionrio
literal,
uma
chamada
funo
lislines
if
they
are
a
parenthesized
expression,
a
list,
set,
or
dictionary
literal,
character except the last is escaped by preceding it with a backslashde
(\a).
In 112
type
ta
deallargumentos
ou
uma
declarao
de can
multilinhas,
em
que indentation
cada
final
function
callcases
argument
list,
or aofmultiline
statement
where
everycaractere
end-of-line
these
any
number
lines
be spanned
and
does
notdict 118
de
linha
exclui
a ltima
escapou,
precedendo-a
barra lateral
character
except
the
lastque
is escaped
by
preceding
itcom
withuma
a backslash
(\). In(\).type
matter
for the
second
and
subsequent
lines.
Em
todos cases
estes any
casos,
qualquer
nmero
pode
ser
espalhada does
a indntaall these
number
of lines
cande
belinhas
spanned
and
indentation
not
Eachfor
list
a number
has
seven
strings,
all of uniform width, 118
o
no
importa
para aand
segunda
linha ou
para
as linhas
subsequentes.
matter
therepresenting
second
subsequent
lines.
although what this width is differs from number to number. The lists for the
Cada
lista
representa
umathe
nmero
strings,
com
larguEach
listnumbers
representing
number
haspossui
seven
strings,
all todas
of uniform
width,
other
follow
sameque
pattern
assete
for
zero,
although
they uma
are
laid
out
ra
uniforme,
ainda
que
esta
largura
difere
de
nmero
para
nmero.
A
lista
para
although
what
this
width
is
differs
from
number
to
number.
The
lists
for
the
for compactness rather than for clarity:
outros
nmeros follow
segue the
o mesmo
usado
para zero,they
ainda
elas
other numbers
same padro
patternque
as for
zero, although
areque
laid
outestejam
"deitadas"
para
menos
espao
ao"ivs
da"forma
anterior mais clara:
One = [" rather
* ", usar
"**
",
" *clarity:
",
" * ",
* ",
* ", "***"]
for compactness
than
for
38

Two = [" *** ", "*


*", "* * ", " * ", " *
", "*
", "*****"]
One #= ...
[" * ", "** ", " * ", " * ", " * ", " * ", "***"]
Two = [" *** ",
"*
*",
"* * ",
" * ", "to* Procedural
", "*
", "*****"]
Chapter
1. Rapid
Introduction
Programming
# ...

38

Tipos
de Set
112

Chapter 1. Rapid Introduction to Procedural Programming

Nine = [" ****", "*

*", "*

*", " ****", "

*", "

= of
[" data
****",
****",
*", "
The lastNine
piece
we "*
need*",
is a "*
list of*",
all"the
lists "of digits:

*", "

*", "

*"]

*"]

The
last
data
we
need
is a list
all
theSix,
lists
of digits:
A ltima
parte
dosofdados
precisamos
of
uma
lista
de todas
asEight,
listas de
dgitos:
Digits
=piece
[Zero,
One,que
Two,
Three,
Four,
Five,
Seven,
Nine]
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]

Digits
[Zero,the
One,
Two, lists
Three,
Four, and
Five,
Six, Seven,
Eight,
Nine]
We could
have =created
directly,
avoided
creating
the extra
Digits
Ns
poderamos
ter criado as listas de Digits diretamente, e evitar a criao de
variables.
For example:
We could
havePor
created
the Digits lists directly, and avoided creating the extra
variveis
extras.
exemplo:
variables.
Digits = [For example:
[" *** ", " *
* ", "*
*", "*
*", "*
*",
Digits = [
" *
* ", " *** "], # Zero
[" *** ", " *
* ", "*
*", "*
*", "*
*",
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
" *
* ", " *** "], # Zero
# ...
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
[" ****", "*
*", "*
*", " ****", "
*", "
*",
# ...
"
*"] # Nine
[" ****", "*
*", "*
*", " ****", "
*", "
*",
]
"
*"] # Nine
] to use a separate variable for each number both for ease of
We preferred

understanding and because it looks neater using the variables.


We preferred to use a separate variable for each number both for ease of
Weunderstanding
will quote the rest
the code
one neater
go so that
youthe
canvariables.
try to gure out how
andofbecause
it in
looks
using
it works before reading the explanation that follows.
We will quote the rest of the code in one go so that you can try to gure out how
ittry:
works before reading the explanation that follows.

Tipos
de
dicionrios
118

38

Captulo 1. Rpida Introduo Programao procedural

Ns preferimos usar uma varivel separada para cada nmero, tanto pela facilidade de entender melhor quanto porque o cdigo fica mais elegante quando se
usa as variveis.
Ns iremos mencionar o resto do cdigo em uma tentativa para que voc possa
tentar entender como funciona antes de ler as explicaes a seguir.
try:
digits = sys.argv[1]
row = 0
while row < 7:
line = ""
column = 0
while column < len(digits):
number = int(digits[column])
digit = Digits[number]
line += digit[row] + " "
column += 1
print(line)
row += 1
except IndexError:
print("usage: bigdigits.py <number>")
except ValueError as err:
print(err, "in", digits)

O cdigo completo est empacotado em um manipulador de exceo que pode capturar os dois erros que podem ocorrer. Ns comeamos restaurando o argumento
da linha de comando do programa. A lista sys.argv baseada em 0, como todas
as listas Python; o item que est na posio 0 do ndice o nome do programa
invocado, logo, quando o programa est rodando, esta lista sempre comea com
pelo menos um item. Se nenhum argumento foi dado, ns iremos tentar acessar
o segundo item em uma lista de um-item, e isto ir causar uma exceo IndexError, que ser lanada. Se isto ocorrer, o fluxo do controle imediatamente
enviado para o bloco de manipulao de excees correspondente e, aqui, ns simplesmente imprimimos o uso do programa. Aps o final do bloco try a execuo
continua; mas no ter mais cdigos; logo, o programa simplesmente termina.
Se nenhum IndexError ocorrer, a string de digits guarda o argumento da
linha de comando, que ns esperamos que seja uma sequncia de caracteres de
dgitos. (Relembrando a parte #2, na qual j explicamos que os identificadores
so sensitivos a letras maisculas e minsculas, digits e Digits so diferentes). Cada grande dgito representado por sete string e, para dar a sada do
nmero corretamente, ns devemos enviar para a sada o topo da fileira de cada
dgito, depois, na prxima fileira, e assim por diante, at que todas as sete fileiras
tenham sido enviadas. Ns usamos um loop while para iterar cada fileira. Ao
invs disso, ns poderamos tambm ter feito simples e facilmente o seguinte:
for rowin (0,1,2,3,4,5,6): e, depois, ns iremos obter uma maneira muito
melhor para atuar com a funo range( ).
Ns usamos a string da line para guardar a fileira de string com todos os dgitos
envolvidos. Depois, utilizamos o loop por colunas, isto , em cada caractere, suces-

Exemplos

39

sivamente, no argumento da linha de comando. Ns restauramos cada caractere


com digits[column] e convertemos o dgito em um inteiro chamado number.
Se a converso falhar, uma exceo de ValueError ser lanada e o fluxo do
controle ser imediatamente transferido para o manipulador de excees correspondente. Neste caso, ns imprimimos uma mensagem de erro e o controlador a
retoma depois de o bloco try. Como notado anteriormente, desde que no haja
mais cdigos at este ponto, o programa ir simplesmente terminar.
Se a converso obtiver sucesso, ns usaremos number como um ndice remissivo
dentro da lista Digits, a qual ns iremos extrair da lista digit das strings. Depois, ns adicionamos a string row-th desta lista para a linha que ns estamos
construindo e, finalmente, anexamos dois espaos para dar alguma separao
horizontal entre cada dgito.
Cada vez que o loop interno while finalizar, ns devemos imprimir a linha que
estava sendo construda. A chave para entender este programa est onde ns
anexamos cada string de fileira de dgitos para a linha de fileiras correntes. Tente
executar o programa para sentir como isto funciona. Ns iremos retornar a este
programa nos exerccios a fim de melhorar um pouco esta sada.

Generate_grid.py
Uma necessidade que ocorre frequentemente a gerao de dados de teste. No
existe um programa genrico para fazer isto, j que dados de teste so normalmente enormes. Python geralmente usada para produzir dados de teste porque
ela muito fcil para escrever e modificar programas Python. Nesta subseo, ns
iremos criar um programa que gera uma rede de inteiros aleatrios; os usurios
podem especificar quantas fileiras e colunas eles desejam o range que abrange os
interior. Ns iremos comear olhando (um exemplo) sendo executado:
generate_grid.py
rows: 4x
invalid literal for int() with base 10: '4x'
rows: 4
columns: 7
minimum (or Enter for 0): -100
maximum (or Enter for 1000):
554 720 550 217 810 649 912
-24 908 742 -65 -74 724 825
711 968 824 505 741 55 723
180 -60 794 173 487 4 -35

O programa trabalha interativamente e, no incio, ns fizemos um erro de digitao quando entramos com o nmero de fileiras. O programa respondeu imprimindo uma mensagem de erro e depois pedindo-nos para entrar com o nmero

Range
131

40

Captulo 1. Rpida Introduo Programao procedural

de fileiras novamente. Para o mximo, ns apenas pressionamos Enter, a fim de


aceitar a configurao padro.
Ns iremos rever o cdigo em quatro partes: a importao, a definio de uma
funo get_int( ) (uma verso mais sofisticada do que aquela exibida na Parte
#8), a interao do usurio para obter os valores de uso e o processo por si mesmo.
Importar aleatrio

Ns precisamos do mdulo aleatrio para nos dar acesso funo random.randint( ).

aleatrio.
aleaint
( ) 36

def get_int(msg, minimum, default):


while True:
try:
line = input(msg)
if not line and default is not None:
return default
i = int(line)
if i < minimum:
print("must be >=", minimum)
else:
return i
except ValueError as err:
print(err)

Esta funo necessita de trs argumentos: uma string de mensagem, um valor


mnimo e um valor padro. Se o usurio apenas pressionar o Enter, haver duas
possibilidades. Se default None, isto , nenhum valor padro foi dado, o fluxo
do controlador ir cair atravs da linha int( ). Ali, a converso ir falhar (j
que "no seja convertido em um espao") e uma exceo ValueError ser lanada. Mas, se default no for None, ento ele ser retornado. De outra maneira,
a funo ir empreender a converso do texto que o usurio entrou em um iteirador, e, se a converso bem-sucedida, ela ir, ento, checar se o inteiro possui
um valor pelo menos igual ao mnimo que foi especificado.
Portanto, a funo ir sempre retornar, tanto default (se o usurio pressionou
Enter) como em um inteiro vlido, que ser bem maior do que, ou igual, o minimum especificado.
Fileiras = obter_int(fileiras: , 1, Nada)
Colunas = obter_int(colunas:, 1, Nada)
Mnimo = obter_int(mnimo (ou Enter para 0): , -1000000. 0)
Padro = 1000
Se padro <mnimo

Padro = 2 * mnimo
Mximo = obter_int(mximo (ou Enter para + str(padro) +): ,

Mnimo, padro)

Nossa funo get_int transforma em algo fcil obter o nmero de fileiras e colunas e o valor aleatrio mnimo que o usurio deseja. Para fileiras e colunas, ns
damos um valor padro de None, isto , nenhum padro; logo, o usurio deve en-

Exemplos

41

trar com um iteirador. Neste caso, para mnimo, ns fornecemos um valor padro
de 0 e, para o mximo, ns fornecemos um valor padro de 1000, ou duplamente
o mnimo, caso o mnimo seja maior ou igual a 1000.
Como pde ser notado nos exemplos anteriores, a funo do argumento para chamar as listas pode passar por cima de qualquer nmero de linhas, e a indentao
irrelevante para suas linhas secundrias ou subsequentes.
Uma vez que ns j saibamos quantas fileiras e colunas o usurio exige e o valor
mnimo e mximo dos nmeros aleatrios que eles querem, j possvel estarmos prontos para fazer o processamento.
rows = get_int("rows: ", 1, None)
columns = get_int("columns: ", 1, None)
minimum = get_int("minimum (or Enter for 0): ", -1000000, 0)
default = 1000
if default < minimum:
default = 2 * minimum
maximum = get_int("maximum (or Enter for " + str(default) + "): ",
minimum, default)

Para gerar a grade, ns usamos trs loops while: o externo, que trabalha por colunas, o do centro, que tambm funciona por colunas, e o do interior, que funciona
por caracteres. No centro do loop, ns obtemos um nmero aleatrio no range especificado e, ento, convertido em uma string. O loop while interno usado para
encher a string com os espaos impressos entre as linhas; logo, cada nmero
representado por uma string de 10 caracteres no total. Ns usamos a string line
para acumular os nmeros em cada fileira e imprimir a linha aps cada nmero
de colunas ter sido adicionado. Isto completa nosso segundo exemplo.
Python fornece funcionalidades de formatao de string muito sofisticadas, assim como um excelente suporte para loops for...in, ento, verses mais realistas do bigdigits.py e do generate_grid.py poderiam usar loops for...
in, e generate_grid.py poderia ser usado na capacitao de formataes de
string do Python ao invs de grosseiros enchedores de espaos. Mas ns estivemos limitando-nos s oito partes do Python, introduzidas neste captulo, e elas
so suficientes o bastante para escrever programas completos e muito teis. Em
cada captulo subsequente, ns iremos aprender novas caractersticas Python,
de modo a progredir pelos programas que veremos atravs do livro e, por fim,
estaremos aptos a escrever de modo sofisticado.

Sumrio
Neste captulo, ns aprendemos como editar e executar programas Python e revisamos alguns pequenos, mas completos, programas. Mas a maioria das pginas
destes captulos foram dedicadas s oito partes do lindo corao do Python
suficiente para escrever programas reais.
Ns comeamos com dois dos mais bsicos tipos de dados do Python, int e str.

42

Captulo 1. Rpida Introduo Programao procedural

Inteiros literais so escritos do mesmo jeito que muitas outras linguagens de


programao o fazem. Strings literais so escritas usando aspas nicas ou duplas; no importa se, qua tipo desde que, os mesmo tipos de aspas so usadas.
Ns podemos fazer converso entre string e inteiros, por exemplo, int (250) e
str(125). Se a converso de um inteiros falhar, uma exceo ValueError ser
lanada; enquanto que quase tudo o mais pode ser convertido em uma string.
Strings so sequncias, logo, aquelas funes e operaes que podem ser usadas
com sequncias podem ser usadas com string. Por exemplo, ns podemos acessar
um caractere particular usando o item operador acessor ([ ]), concatenando
string usando + e anexando uma string outra usando +=. J que string so
imutveis por trs das cenas, a anexao cria uma nova string que concatenada s string dadas e reata o objeto da string do lado esquerdo referente string
resultante. Ns podemos, tambm, iterar, em uma string, caractere por caractere,
usando um loop for...in. E tambm possvel usar a funo embutida len(
) para informar quantos caracteres contm uma string.
Para objetos imutveis, como strings, inteiros e tuplas, ns podemos escrever nossos
cdigos, ainda que uma referncia de objeto seja o prprio objeto a ser referenciado.
possvel fazer isto com objeto mutveis, ainda que qualquer mudana feita em
um objeto mutvel afete todas as ocorrncias do objeto (e.g., todos as referncias de
objetos para o objeto); ns iremos abordar este assunto no Captulo 3.
Python fornece muitos tipos de dados colecionavis embutidos e possui alguns
outros em sua biblioteca padro. Ns aprendemos sobre os tipos lista e tupla
e, de forma particular, como criar tuplas e listas de literais, por exemplo, even=
[2,4,6,8]. Listas, como tudo o mais no Python, so objetos, portanto, ns podemos chamar mtodos para elas por exemplo, even.append(10) ir adicionar
um item extra para a lista. J que string, listas e tuplas so sequncias, possvel, portanto, iter-las, item por item, usando um loop for...in e descobrir em
quantos itens elas tm usado a funo len( ). Ns podemos, tambm, recuperar
um item particular numa lista ou tupla usando o operador de acesso a itens ([ ]),
concatenando duas listas ou tuplas, usando + e anexando uma na outra usando
+=. Se ns quisermos anexar um nico item para uma lista, ns devemos tambm
usar list, append( ) ou usar += com o item criado dentro de uma lista de um s
item- por exemplo, even +=[12]. E, j que listas so mutveis, possvel usar [ ]
para modificar itens individuais, por exemplo, even[1]=16.
Os rpidos operadores de identidade is e not is podem ser usados para checar
se existe, entre duas referncia de objetos, referncia mesma coisa isto particularmente muito utilizado quando se est checando em oposio ao objeto singular None. Todos os operadores de comparao usuais esto disponveis (<, <=,
= =, !=, >=, >), mas eles podem ser usados apenas com tipos de dados compatveis
e, ento, apenas as operaes so suportadas. Os tipos de dados que vimos at
agora int, str, list e tuple so todos capazes de suportar o grupo de
operadores de comparao. Ao comparar tipos incompatveis, por exemplo, comparar um int com um str ou uma list, iremos produzir, de maneira completa
e sensvel, uma exceo TypeError.

Sumrio

43

Python suporta os operadores lgicos padres and, or e not. Tanto e como ou so


operadores de curto-circuito que retornam a operao que determinou seus resultados e este pode no ser um boleano (ainda que este resultado possa ser convertido num boleano); j o operador not sempre retorna como False ou True.
Ns podemos testar associaes de tipos de sequncias, incluindo listas, strings e
tuplas, usando os operadores in e not in. Testes de associaes usam uma procura linear lenta nas listas e tuplas e um algoritmo hbrido, potencialmente mais
rpido para strings, mas o resultado raramente abordado, exceto para string,
listas e tuplas muito longas. No Captulo 3, ns iremos aprender sobre os vetores
de associao do Python e como configurar tipos de dados colecionveis, ambos do
teste de associao que foi executado de maneira muito rpida. Tambm possvel encontrar um objeto de tipo varivel (i.e, o tipo do objeto que a referncia do
objeto se refere) usando type ( ) mas esta funo normalmente utilizada
apenas para depurar e testar.
Python fornece muitas estruturas de controle, incluindo a ramificao condicional com if...elif...else, loopins condicionais com while, loop sobre sequncias com for...in, e manipulador de exceo com blocos try...except.
Tanto while quanto o loop for...in podem ser finalizados prematuramente
usando a declarao break e ambos podem transferir o controle para o incio
usando continue.
Os operadores aritmticos comuns so suportados, incluindo +, -, * e /, ainda que
Python seja incomum com /; esta sempre produz um resultado em ponto flutuante, mesmo que nas duas operaes sejam inteiros. (A diviso de truncamento que
muitas outras linguagens utilizam est tambm disponvel no Python como //.)
Python tambm fornece operadores de incremento associado como += e *; estes
criam novos objetos e os reatam por debaixo do processo se seus operadores do
lado esquerdo forem imutveis. Os operadores aritmticos so sobrecarregados
pelos tipos str e lista, como pudemos notar anteriormente.
O terminal I/O pode ser executado usando output( ) e print( ); e usar um
redirecionamento de arquivos no terminal torna possvel usarmos estas mesmas
funes embutidas para ler e escrever arquivos.
Em adio rica funcionalidade dos embutidos do Python, sua extensa biblioteca padro tambm disponvel com mdulos acessveis; desde que eles tenham
sido importados, atravs da declarao import. Um mdulo comumente importado o sys, que retm a lista sys.argv da linha de comando dos argumentos.
E, quanto Python no possuir a funo que precisamos, podemos facilmente
criar uma que poder fazer o que necessrio utilizando a declarao def.
Fazendo uso das funcionalidades descritas neste capitulo ser possvel escrever programas Python pequenos, porm muito teis. No captulo seguinte, ns
iremos aprender mais sobre os tipos de dados do Python, indo mais a fundo nos
ints e strs, e tambm aprenderemos mais sobre tuplas e listas e alguma coisa
sobre outros tipos de dados colecionveis do Python. Depois, no Captulo 4, ns
iremos abordar as estruturas de controle do Python em muito mais detalhes
e iremos aprender como criar nossas prprias funes, a fim de que possamos

using the def statement.


By making use of the functionality described in this chapter it is possible to
write short but useful Python programs. In the following chapter we will learn
44
Captulo
1. Rpida
Introduo
Programao
more
about Pythons data
types, going
into more
depth for
s and
ints and strprocedural
introducing some entirely new data types. In Chapter 3 we will learn more
empacotar
para
evitar
a duplicao
dosother
cdigos
e promover,
about
tuples funcionalidades
and lists, and also
about
some
of Pythons
collection
data tambm, Then,
o reusoinde
cdigos.4 we will cover Pythons control structures in much
types.
Chapter
more detail, and will learn how to create our own functions so that we can
package up functionality to avoid code duplication and promote code reuse.

Exerccios

O objetivo dos exerccios propostos aqui e por todas as partes do livro encorajar
Exercises
|||

Books
examples
3

voc a fazer uma experincia real com o Python e lhe fornecer a experincia suficiente
paraofabsorver
o material
exposto
em cada
um
dosiscaptulos.
Os exemplos
The
purpose
the exercises
here, and
throughout
the
book,
to encourage
you
e
exerccios
abrangem
tanto
a
parte
de
processamento
numrico
quanto
de texto;
to experiment with Python, and to get hands-on experience to help you absorb
eles
apelam
para
uma
audincia
to
ampla
quanto
possvel,
sem
contar
que so
each chapters material. The examples and exercises cover both numeric and
bastante
pequenos;
dessa
forma,
damos
nfase
nos
atos
pensar
e
aprender,
text processing to appeal to as wide an audience as possible, and they are kept ao
invs
de apenas
cdigos. is
Todos
os exerccios
possuemrather
um resultado,
fairly
small
so thatcopiar
the emphasis
on thinking
and learning
than justfornecidos
com
os
exemplos
do
livro.
typing code. Every exercise has a solution provided with the books examples.
1. Uma variao muito bacana do programa bigdigits.py que, ao invs de
1. One nice variation of the bigdigits.py program is where instead of
imprimir *s, o dgito relevante que impresso no lugar. Por exemplo:
printing *s, the relevant digit is printed instead. For example:

Exemplos do
livro
3

bigdigits_ans.py 719428306
77777
1
9999
4
7 11
9
9
44
7
1
9
9
4 4
7
1
9999 4 4
7
1
9 444444
7
1
9
4
7
111
9
4

222
2
2

888
2

8
8

2
2
2
22222

333

8
8

000

888

3
3

8
8

33
8
8

888

3
3

3
333

0
0
0

0
0
0
0

0
000

666
6
6
6666
6
6
6
6
666

Two approaches can be taken. The easiest is to simply change the *s in


Dois caminhos podem ser tomados. O mais fcil simplesmente mudar o *s
the lists. But this isnt very versatile and is not the approach you should
nas listas. Mas isto no muito verstil e no a soluo mais adequada para
se escolher. Ao invs disso, mude o processamento do cdigo, de maneira que,
ao invs de adicionar cada string de fileiras dos dgitos na linha em que voc
est, voc adiciona caractere por caractere e, mesmo que um * seja encontrado,
voc usa o dgito relevante.
Isto pode ser feito copiando bigdigits.py e modificando cinco linhas. Isto
vem a ser algo difcil, mas um pouco sutil.
Uma soluo fornecida em bigdigits_ans.py.
2. IDLE pode ser usado como uma calculadora muito poderosa e flexvel, mas, algumas vezes, mais conveniente que se tenha uma calculadora para este uso
especfico. Crie um programa que fornea prompts ao usurio a fim de que ele
possa entrar com um nmero num loop while; gradualmente, v construindo
uma lista com os nmeros dados. Quando o usurio tiver terminado (simplesmente pressionando o Enter), imprima os nmeros dados, o clculo dos nmeros, a soma dos nmeros, o maior e o menor nmero dado e o peso dos nmeros
(sum/count). Aqui est uma execuo simples:

Exerccios

45

average1_ans.py
enter a number or Enter to finish: 5
enter a number or Enter to finish: 4
enter a number or Enter to finish: 1
enter a number or Enter to finish: 8
enter a number or Enter to finish: 5
enter a number or Enter to finish: 2
enter a number or Enter to finish:
numbers: [5, 4, 1, 8, 5, 2]
count = 6 sum = 25 lowest = 1 highest = 8 mean = 4.16666666667

Isto ir ocupar cerca de quatro linhas para inicializar as variveis necessrias


(uma lista vazia simplesmente [ ]) e menos de 15 linhas para o loop while,
incluindo a manipulao de erros bsica. possvel imprimir no final somente
com algumas linhas, ento todo o programa, incluindo as linhas em branco
com o objetivo de uma clareza maior, pode ser feito com cerca de 25 linhas.
3. Em algumas situaes, ns precisamos gerar textos de teste por exemplo,
para popular o design de um site da web antes que o contedo real esteja disponvel, ou para fornecer testes de contedo quando est desenvolvendo um
escritor de relatrios. Para este fim, escreva um programa que gere poesias,
diga-se de passagem, horrorosas ( do tipo que deixaria voc envergonhado).
Crie algumas listas de palavras, por exemplo, artigos (o/a, um/uma, etc.),
substantivos ("ou", "a", "um", "uma", etc), verbos (cantar, correr, pular) e
advrbios (vagarosamente, silenciosamente, bem, mal). Depois, faa um
loop cinco vezes e, em cada iterao, utilize a funo randow.choice( ) para
apanhar, dentre eles, um artigo, um substantivo, um verbo e um advrbio. Utilize random.randint( ) para escolher entre duas estruturas de sentenas,
ou apenas um artigo, substantivo ou verbo, e imprima as sentenas. Aqui est
um exemplo executado:
awfulpoetry1_ans.py
her man heard politely
his boy sang
another woman hoped
her girl sang slowly
the cat heard loudly
Randow.
rantint( ) e
randow.
choice
36

Voc vai precisar importar o mdulo random (aleatrio). As listas podem ser
executadas por volta de 4 a 10 linhas, dependendo de quantas palavras voc
colocou nelas e o loop, por si mesmo, j exige menos do que dez linha; portanto,
com algumas linhas em branco, todo o programa pode ser feito em algo por volta
de 20 linhas de cdigo. Uma soluo fornecida em awfulpoetry_ans.py.
4. Para fazer programas de poesias horrveis mais versteis, adicione alguns
cdigos a ele; dessa forma, se o usurio entrar com um nmero na linha de
comando (entre 1 e 10, inclusive), o programa ir imprimir as vrias linhas.
Se nenhum argumento para a linha de comando for dado, o padro imprimir
cinco linhas, assim como antes. Voc vai precisar mudar o loop principal (e.g.,
para um loop while). Tenha em mente que os operadores de comparao do

46

Captulo 1. Rpida Introduo Programao procedural

Python podem ser conectados, portanto, no h necessidade de usar lgica e


checar se o argumento est ao alcance. A funcionalidade adicional pode ser
executada adicionando cerca de dez linhas de cdigo. Uma soluo est em e
awfulpoetry2_ans.py.
5. Seria bacana se consegussemos calcular a mdia (valor central) e tambm
peso os significados igual do programa de mdia do Exerccio 2. No Python,
uma lista pode facilmente ser classificada usando o mtodo list.sorted(
), mas no iremos abordar este mtodo por enquanto, portanto, ele no ser
utilizado aqui. Estenda o programa de mdia com um bloco de cdigos que
classifique a lista dos nmeros se este desempenho lhe for motivo de preocupao, resolva o problema utilizando a abordagem mais fcil que voc possa
pensar. Uma vez que a lista esteja classificada, a mdia ser o valor central se
a lista possuir um nmero mpar de itens. Calcule a mdia e imprima junto
com as outras informaes.
Este procedimento pode se tornar uma armadilha, principalmente para programadores inexperientes. Se voc possuir alguma experincia Python, ainda
assim vai lhe parecer algo desafiante, pelo menos se voc limitou-se a usar
apenas o que foi ensinado at agora. A classificao pode ser feita em cerca de
doze linhas e o clculo da mdia (em que voc no poder usar o operador de
mdulo, j que este ainda no foi abordado), em quatro linhas. A soluo est
em average2_ans.py.

Você também pode gostar