Você está na página 1de 40

7

Criando e executando
Programas PYTHON.
O lindo corao do Python
Rpida Introduo
programao procedural
Este captulo ir lhe fornecer informao suciente para iniciar sua escrita de
programas Python. Ns recomendamos, de forma veemente, que voc instale o
Python caso ainda no o tenha feito, a m de que possa experenciar algo con-
creto 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 suciente 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 nal 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 nal deste captulo introduz dois pequenos programas, os quais usam o
subset das caractersticas do Python, introduzidos na segunda seo. Desta for-
ma, 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 codicadores de caracteres: o ASCII ou
o UTF-8. Por padro, os arquivos Python assumem usar o codicador de carac-
teres UTF-8, um superset de ASCII que pode representar muito bem qualquer
caractere, em qualquer linguagem. Arquivos Python geralmente possuem uma
1
Codi-
cadores
de
carac-
teres
85
8 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 execu-
tam 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 ire-
mos 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 nal 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, come-
ando 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 uxo
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 dire-
trio 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, normal-
mente, est disponvel em Iniciar => Todos os programas => Acess-
rios. 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.
9
Inicie um Prompt de Comando e, no Windows, entre com os seguintes coman-
dos (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 absolu-
ta, 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 ans.
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 Python-
no 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 compor-
tamentos padro que podem ser modicados, como veremos a seguir. Por outro
lado, algo digno de nota a respeito de print ( ) que ele pode suportar quan-
tos 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. Su-
pondo 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 automatica-
mente 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
Criando e Executando um Programa Python
10 Captulo 1. Rpida Introduo Programao procedural
Isto signica que o Python 2 est no sistema e est sendo invocado no lugar do
Python 3. Uma soluo modicar 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 execu-
tar 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:\Win-
dows. Depois, toda vez que voc iniciar um terminal para executar programas
do Python3, comece executando py3.bat. Ou,de forma alternada, voc pode exe-
cutar py3.bat automaticamente. Para fazer isso, modique 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 certique-se de
ter adicionado este no nal, 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 especica qual interpretador usar. Esta linha chamada de linha she-
bang (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 especicado usado. Esta for-
ma pode ser necessria para os programas Python que sero executados por um
servidor da web, ainda que o caminho especicado 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 ver-
stil porque permite a possibilidade de o interpretador Python3 no car 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.
11
zado em /usr/bin (e.g., ele poder car 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 tipicamen-
te 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
Obten-
do e
insta-
lando
Python
4
Figura 1.1. Shell Python do IDLE.
Criando e Executando um Programa Python
12 Captulo 1. Rpida Introduo Programao procedural
depurador que pode ser usado para avanar atravs do cdigo a m de ajudar a
identicar e acabar com os erros de programao (bugs). O Shell Python especial-
mente til para testar algoritmos simples, fragmentos de cdigo e expresses regu-
lares, alm de ser usado tambm como uma calculadora poderosa e muito exvel.
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 espe-
cco. Se isto for feito, o interpretador inicia de modo interativo. Neste modo,
possvel entrar com declaraes Python e ver os resultados exatamente da mes-
ma 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 recomenda-
mos 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, objetiva-
mente, 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 pro-
cura 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 embu-
tidos, 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:
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
xado de bytes. J as string, podem ser delimitadas atravs de "quotas" duplas
ou simples, enquanto o mesmo tipo usado em ambos os nais, 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 modicado. 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 modicados. De primeira instn-
cia, 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) funcio-
naria bem tambm. A converso str( ) pode ser aplicada em quase nenhum
itens de dados. Ns podemos facilmente fazer nosso prprio suporte de dados
"Lindo Corao" da Python
14 Captulo 1. Rpida Introduo Programao procedural
customizados da converso str( ), e tambm com o int( ) ou qualquer outra
converso, se elas zerem 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 ti-
pos 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 va-
riveis como estas, mas, ao invs disso possui referencia de objetos. Quando eles
se transformam em objetos imutveis, como ints e strs, no existe uma dife-
rena 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 neces-
sidade para uma pr-declarao ou para especicar 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 refe-
rencia 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 m da linha:
print (x, y, z) # print: azul verde azul
z = y
print (z, y, z) # print: azul verde azul
x = z
print (x, y, z) # print: azul verde azul
15
Aps a quarta declarao (x = z), todos as trs referncia de objetos so re-
feridos 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 identicadores) possuem
poucas restries. Em particular, eles no podem ser iguais a nenhuma palavra-
chave do Python, e devem iniciar com uma letra ou um trao inferior (unders-
core), 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 denidos
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 identicadores Python
diferenciam entre letras maisculas e minsculas, ento, por exemplo, LIMITE,
Limite e limite so trs diferentes identicadores. Ainda mais detalhes e
alguns exemplos um tanto quanto exticos so dados no Capitulo 2.
Python utiliza dynamic typing (tipagem dinmica), o que signica que uma refe-
rncia 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 deni-
das pelos tipos de dados envolvidos para serem executados. Python tambm aplica
esta restrio, mas no pode ser classicada 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 rera a uma nova refern-
cia 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-
Figura 1.2 Referncia de Objetos e objetos.
"Lindo Corao" da Python
a = 7 a 7
Os crculos representam objetos referenciais
Os retngulos representam objetos na memria
a = 7
b = a
a 7
b
a 7 a = 7
b = a
a = "Liberty"
b
"Liberty"
Os crculos representam refrencia de objeto
Os retngulos representam objetos na memria
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 clas-
se) 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, sim-
plesmente 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 mo-
mento, mas funciona apenas quando usamos o Python interativamente qual-
quer 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 signica uma tuple, isto , uma se-
quncia 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 ar-
rys 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 qual-
quer nmero de itens de dados de qualquer tipo de dados. Tuplas so imutveis,
portanto, uma vez que foram criadas, no permitido modic-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 progra-
madores emulam isso e sempre cercam as tuplas literais escrevendo-as, entre
parnteses. Se ns temos um item tupla e queremos usar parnteses, preciso
17
ainda usar a vrgula por exemplo, (1,). Uma tupla vazia criada usando parn-
teses 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.
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 zemos aqui;
mais tarde, ns veremos outras maneiras de criar listas. A quarta lista mos-
tra uma lista vazia.
Por baixo da cobertura, listas e tuplas no armazenam itens de dados, mas sim re-
ferncia 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 refe-
rncia 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 al-
gumas 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, pas-
sar 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 , 5])
6
>>> len(automaticamente)
15
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 signicativa, passada para a funo len ( ). (Uma exceo lan-
ada 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
34
"Lindo Corao" da Python
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. Essen-
cialmente, um mtodo simplesmente uma funo que invocada para um obje-
to 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 pr-
prio tipo de dados), logo, ns no precisamos especicar o tipo de dados explicita-
mente. 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 eciente do que
criar uma nova lista com os itens originais e o item extra e, depois, reatar a refe-
rencial 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 especicamos os tipos de dados e o mtodo do tipo de dados, e lhe de-
mos, 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 pos-
sui 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 ob-
jeto. 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
19
um item numa posio dada no ndice. Como j foi notado anteriormente, os n-
dices do Python so sempre baseados em 0.
Ns vimos anteriormente que podemos obter caracteres das strings usando ope-
radores em colchetes, e notamos que, no momento, este operador poder ser usa-
do 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 recu-
perar itens usando colchetes, exatamente do mesmo modo como zemos na lista
x. Mas, j que listas so mutveis (diferente de string e tuplas, que so imut-
veis) , 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 signicado, e iremos continuar a fazer isso adiante.
De qualquer maneira, Python dene precisamente quais caractersticas uma se-
quncia 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.
"Lindo Corao" da Python
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 exami-
nados por si prprios. O operador is precisa comparar apenas a memria de
endereos dos objetos o mesmo endereo signica 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 place-
marking (marcador) que signica 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 vericar se, entre duas referncias de ob-
jetos, h referncia ao mesmo objeto, ou vericar se um objeto None. Se quiser-
mos 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 semn-
ticas 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
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, po-
rm, porque o Python usa o UniCode para a representao de strings, compa-
rando 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 Type-
Error 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-
Compa-
rando
Strings
63
"Lindo Corao" da Python
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
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 bole-
anas). Vamos ver o que isto signica na prtica:
>>> cinco = 5
>>> dois = 2
>>> zero = 0
>>> cindo and dois
2
>>> dois and cinco
5
>>> cinco and zero
0
Fuzzy-
Bool
Alter-
nativo
248
*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.
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 uxo 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 uxo (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 cam para a Parte #8, e os mtodos
cam para o Captulo 6. Ns iremos tambm, vericar as bases da manipulao
de excees; e iremos abordar o sujeito no Captulo 4. Mas, primeiro, vamos ilu-
minar 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-denida 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. Quan-
do 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.
"Lindo Corao" da Python
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 nal 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 exis-
tem 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 signicado s suas estruturas de blocos. Alguns programado-
res no gostam disso, especialmente antes de tentarem usar isso , e acabam levan-
do 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 natu-
ralmente 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
congurada 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 ocial 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.
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 n-
mero 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 sosticada 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 trans-
fere 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 com-
portamento 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, denidas
num outro lugar). Neste exemplo, a sute da declarao while contm uma de-
clarao 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 con-
textos, 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-
"Lindo Corao" da Python
26 Captulo 1. Rpida Introduo Programao procedural
sui uma clusula opcional else. A varivel congurada 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 impri-
mir 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 preferi-
mos imprimir colees usando um loop for (ou uma lista de compreenso, abor-
dada 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 decla-
rao 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 importan-
tes 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 manipula-
dores de exceo esta:
Try:
Testar_sute
Except exceo as varivel:
Exceo_sute1
...
Except exceoN as varivelN>
Exceo_suteN
Lista
de com-
preen-
ses
110
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 sosticada; por exemplo, cada clusula excepct pode
identicar 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 ime-
diatamente passado para a sute correspondente primeira exceo equivalente
isto signica 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 deter-
minada 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 es-
copo seguinte. A procura por um manipulador de exceo adequado trabalha de
escopo e at a chamada de pilha at que um identicador adequado seja encon-
trado e que a exceo seja tratada, mas, se no for encontrado nenhum manipu-
lador 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 quem muito mais leg-
veis, separando os casos excepcionais dos processos que realmente importam.
"Lindo Corao" da Python
28 Captulo 1. Rpida Introduo Programao procedural
Parte #6: Operadores Aritmticos
Python fornece um conjunto completo de operadores aritmticos, incluindo opera-
dores binrios para as quatro operaes matemticas bsicas: = adio, - subtra-
o, * 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) quan-
to 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 utuante, 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).
>>> a = 5
>>> a
5
>>> a += 8
>>> a
13
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 resulta-
dos de uma operao por exemplo, a+=8 , essencialmente, o mesmo que a=a+8.
De qualquer maneira, existem duas sutilezas importantes aqui, um especco 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 modicado. Logo, o que realmente
acontece atrs das cenas quando um operador de incremento associado utili-
zado 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
te, para que ele se rera 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 progra-
mado 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 in-
crementada causar menos erros, j que o calculo precisa modicar 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 signica concatenao e
o outro signica 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 mes-
ma 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 modicado, en-
to, 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, anal de contas, por que so necessrios os
dois tipos? As razes para isso so mais pelo desempenho. Tipos imutveis so po-
tencialmente muito mais ecientes 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
Figura 1.3 Incremento Associvel de um objeto imutvel
i = 73
i 73
i += 2
i 73
75
"LIndo Corao" da Python
30 Captulo 1. Rpida Introduo Programao procedural
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 deve-
mos 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,
Figura 1.4 Incremento Associado de um objeto mutvel
m = [5, 9]
m 0 1
5 9
m += [6]
m 0 1 2
5 9 6
31
ambas para o terminal ou para os arquivos. Nos j zemos uso da funo embuti-
da do Python print ( ), ainda que ns tenhamos adiado sua abordagem com-
pleta 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 nalizar 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 nalizador 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
"LIndo Corao" da Python
32 Captulo 1. Rpida Introduo Programao procedural
assumido por um manipulador de exceo que imprime uma mensagem ade-
quada 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 en-
quanto, 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 ct-
cio 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 congurada como padro no computador, ou python tes-
te.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 carac-
tere EOF (m 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 fi-
nish")
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.
Exem-
plos do
livro
3
33
dado contm uma lista de nmeros, um por linha, e est nos exemplos do subdi-
retrio 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 m,
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 uxo do controle
ser imediatamente enviado para o bloco relevante except isto signica 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 separa-
dos 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 nal 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 contro-
les de estrutura que j abordamos nas partes anteriores. De qualquer maneira,
normalmente, ns iremos fazer, essencialmente, o mesmo processo repetidamen-
te, mas com uma pequena diferena, assim como uma diferena de valor inicial.
"Lindo Corao" da Python
34 Captulo 1. Rpida Introduo Programao procedural
Python fornece vrios sentidos para sutes encapsuladas, como funes que po-
dem 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 va-
lue, 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 as-
sociao. Quando def executado, um objeto de funo criado e uma referncia
objeto com o nome especicado criado e congurado 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 inte-
rativos 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 abor-
dado com um prompt, a m 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 acio-
nado, 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 po-
demos fornecer um valor padro. De fato, Python suporta uma sintaxe muito
sosticada e exvel 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 mui-
tos casos no ser necessrio. Isto ocorre porque Python possui um monte de fun-
es embutidas e uma grande gama de funes nos mdulos da biblioteca padro,
ento, o que queremos provvel e j est pronto e disponvel.
35
Um modulo Python apenas um arquivo .py que contm cdigo Python, assim
como funes personalizadas e denies de classes (tipos de dados personali-
zados), 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 vari-
veis 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 subsequen-
tes, 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 ./ecoar-
gs.py)
No geral, a sintaxe para usar a funo de um mdulo moduloNome.
funoNome(argumentos). Isto faz uso do operador de ponto (acessar atri-
butos) 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, que-
bra linha, nomes em minsculo; logo, alguns programadores iro usar nomes com
a primeira letra em maisculo (e.g., MeuModulo) para seus prprios mdulos, a
m 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])
Depois de estas declaraes terem sido executadas, x ir conter um inteiro, in-
clusive 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,
nalmente, 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.
Opera-
dor(.)
de
ponto
opera-
dor
18
"Lindo Corao" da Python
36 Captulo 1. Rpida Introduo Programao procedural
Exemplos
Na seo anterior, ns aprendemos o suciente sobre Python para escrever pro-
gramas 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 con-
solidar tudo que j foi aprendido at este ponto.
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, deve-
mos 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 acon-
tece: 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 im-
primir 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 identicao impresssos, que utiliza este
tipo de tcnica.
Ns iremos rever o cdigo em trs partes: a importao, a criao das listas que
atam os dados aos programas usados e o processo por si mesmo. Mas, primeiro,
vamos ver este exemplo em funcionamento:
bigdigits.py 41072819
* * *** ***** *** *** * ****
** ** * * * * * * * ** * *
* * * * * * * * * * * * *
* * * * * * * *** * ****
****** * * * * * * * * *
* * * * * * * * * *
* *** *** * ***** *** *** *
Ns no precisamos mostras o prompt do terminal (ou o ./ para usurios Unix);
ns iremos esconced-lo daqui para frente.
Import sys
J que ns devemos ler em um argumento da linha de comando (o nmero para a
sada), ns precisamos acessar a lista sys.argv; logo, comearemos importando
o mdulo sys.
Linha
she-
bang
10
Examples 37
We will review the code in three parts: the import, the creation of the lists
holding the data the program uses, and the processing itself. But rst, lets
look at a sample run:
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.
import sys
Since we must read in an argument from the command line (the number
to output), we need to access the sys.argv list, so we begin by importing the
sys module.
We represent each number as a list of strings. For example, here is zero:
Zero = [" *** ",
" * * ",
"* *",
"* *",
"* *",
" * * ",
" *** "]
One detail to note is that the Zero list of strings is spread over multiple lines.
Python statements normally occupy a single line, but they set type
112
dict
type
118
can span multiple
lines if they are a parenthesized expression, a list, set, or dictionary literal, a
function call argument list, or a multiline statement where every end-of-line
character except the last is escaped by preceding it with a backslash (\). In
all these cases any number of lines can be spanned and indentation does not
matter for the second and subsequent lines.
Each list representing a number has seven strings, all of uniform width,
although what this width is differs from number to number. The lists for the
other numbers follow the same pattern as for zero, although they are laid out
for compactness rather than for clarity:
One = [" * ", "** ", " * ", " * ", " * ", " * ", "***"]
Two = [" *** ", "* *", "* * ", " * ", " * ", "* ", "*****"]
# ...
37
Ns representamos cada nmero como uma lista de strings. Por exemplo, aqui
zero:
Um detalhe que se deve notar que a lista Zero das strings espalhada por
linhas mltiplas. As declaraes Python normalmente ocupam uma nica linha,
mas elas podem espalhar por mltiplas linhas se estiverem em: uma expresso
entre parnteses, uma lista, set ou dicionrio literal, uma chamada funo de lis-
ta de argumentos ou uma declarao de multilinhas, em que cada caractere nal
de linha exclui a ltima que escapou, precedendo-a com uma barra lateral (\).
Em todos estes casos, qualquer nmero de linhas pode ser espalhada a indnta-
o no importa para a segunda linha ou para as linhas subsequentes.
Cada lista representa um nmero que possui sete strings, todas com uma largu-
ra uniforme, ainda que esta largura difere de nmero para nmero. A lista para
outros nmeros segue o mesmo padro que usado para zero, ainda que elas es-
tejam "deitadas" para usar menos espao ao ivs da forma anterior mais clara:
A ltima parte dos dados que precisamos uma lista de todas as listas de dgitos:
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
Ns poderamos ter criado as listas de Digits diretamente, e evitar a criao de
variveis extras. Por exemplo:
Tipos
de Set
112
Tipos
de
dicio-
nrios
118
Exemplos
Examples 37
We will review the code in three parts: the import, the creation of the lists
holding the data the program uses, and the processing itself. But rst, lets
look at a sample run:
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.
import sys
Since we must read in an argument from the command line (the number
to output), we need to access the sys.argv list, so we begin by importing the
sys module.
We represent each number as a list of strings. For example, here is zero:
Zero = [" *** ",
" * * ",
"* *",
"* *",
"* *",
" * * ",
" *** "]
One detail to note is that the Zero list of strings is spread over multiple lines.
Python statements normally occupy a single line, but they set type
112
dict
type
118
can span multiple
lines if they are a parenthesized expression, a list, set, or dictionary literal, a
function call argument list, or a multiline statement where every end-of-line
character except the last is escaped by preceding it with a backslash (\). In
all these cases any number of lines can be spanned and indentation does not
matter for the second and subsequent lines.
Each list representing a number has seven strings, all of uniform width,
although what this width is differs from number to number. The lists for the
other numbers follow the same pattern as for zero, although they are laid out
for compactness rather than for clarity:
One = [" * ", "** ", " * ", " * ", " * ", " * ", "***"]
Two = [" *** ", "* *", "* * ", " * ", " * ", "* ", "*****"]
# ...
Examples 37
We will review the code in three parts: the import, the creation of the lists
holding the data the program uses, and the processing itself. But rst, lets
look at a sample run:
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.
import sys
Since we must read in an argument from the command line (the number
to output), we need to access the sys.argv list, so we begin by importing the
sys module.
We represent each number as a list of strings. For example, here is zero:
Zero = [" *** ",
" * * ",
"* *",
"* *",
"* *",
" * * ",
" *** "]
One detail to note is that the Zero list of strings is spread over multiple lines.
Python statements normally occupy a single line, but they set type
112
dict
type
118
can span multiple
lines if they are a parenthesized expression, a list, set, or dictionary literal, a
function call argument list, or a multiline statement where every end-of-line
character except the last is escaped by preceding it with a backslash (\). In
all these cases any number of lines can be spanned and indentation does not
matter for the second and subsequent lines.
Each list representing a number has seven strings, all of uniform width,
although what this width is differs from number to number. The lists for the
other numbers follow the same pattern as for zero, although they are laid out
for compactness rather than for clarity:
One = [" * ", "** ", " * ", " * ", " * ", " * ", "***"]
Two = [" *** ", "* *", "* * ", " * ", " * ", "* ", "*****"]
# ...
38 Chapter 1. Rapid Introduction to Procedural Programming
Nine = [" ****", "* *", "* *", " ****", " *", " *", " *"]
The last piece of data we need is a list of all the lists of digits:
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
We could have created the Digits lists directly, and avoided creating the extra
variables. For example:
Digits = [
[" *** ", " * * ", "* *", "* *", "* *",
" * * ", " *** "], # Zero
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
# ...
[" ****", "* *", "* *", " ****", " *", " *",
" *"] # Nine
]
We preferred to use a separate variable for each number both for ease of
understanding and because it looks neater using the variables.
We will quote the rest of the code in one go so that you can try to gure out how
it works before reading the explanation that follows.
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)
The whole code is wrapped in an exception handler that can catch the two
things that can go wrong. We begin by retrieving the programs command-line
argument. The sys.argv list is 0-based like all Python lists; the item at index
position 0 is the name the program was invoked as, so in a running program
this list always starts out with at least one item. If no argument was given we
38 Chapter 1. Rapid Introduction to Procedural Programming
Nine = [" ****", "* *", "* *", " ****", " *", " *", " *"]
The last piece of data we need is a list of all the lists of digits:
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
We could have created the Digits lists directly, and avoided creating the extra
variables. For example:
Digits = [
[" *** ", " * * ", "* *", "* *", "* *",
" * * ", " *** "], # Zero
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
# ...
[" ****", "* *", "* *", " ****", " *", " *",
" *"] # Nine
]
We preferred to use a separate variable for each number both for ease of
understanding and because it looks neater using the variables.
We will quote the rest of the code in one go so that you can try to gure out how
it works before reading the explanation that follows.
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)
The whole code is wrapped in an exception handler that can catch the two
things that can go wrong. We begin by retrieving the programs command-line
argument. The sys.argv list is 0-based like all Python lists; the item at index
position 0 is the name the program was invoked as, so in a running program
this list always starts out with at least one item. If no argument was given we
38 Captulo 1. Rpida Introduo Programao procedural
Ns preferimos usar uma varivel separada para cada nmero, tanto pela faci-
lidade de entender melhor quanto porque o cdigo ca 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 cap-
turar 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 Inde-
xError, que ser lanada. Se isto ocorrer, o uxo do controle imediatamente
enviado para o bloco de manipulao de excees correspondente e, aqui, ns sim-
plesmente imprimimos o uso do programa. Aps o nal 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 identicadores
so sensitivos a letras maisculas e minsculas, digits e Digits so diferen-
tes). Cada grande dgito representado por sete string e, para dar a sada do
nmero corretamente, ns devemos enviar para a sada o topo da leira de cada
dgito, depois, na prxima leira, e assim por diante, at que todas as sete leiras
tenham sido enviadas. Ns usamos um loop while para iterar cada leira. 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 leira de string com todos os dgitos
envolvidos. Depois, utilizamos o loop por colunas, isto , em cada caractere, suces-
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 uxo do
controle ser imediatamente transferido para o manipulador de excees corres-
pondente. 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. De-
pois, ns adicionamos a string row-th desta lista para a linha que ns estamos
construindo e, nalmente, anexamos dois espaos para dar alguma separao
horizontal entre cada dgito.
Cada vez que o loop interno while nalizar, ns devemos imprimir a linha que
estava sendo construda. A chave para entender este programa est onde ns
anexamos cada string de leira de dgitos para a linha de leiras correntes. Tente
executar o programa para sentir como isto funciona. Ns iremos retornar a este
programa nos exerccios a m 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 normal-
mente enormes. Python geralmente usada para produzir dados de teste porque
ela muito fcil para escrever e modicar programas Python. Nesta subseo, ns
iremos criar um programa que gera uma rede de inteiros aleatrios; os usurios
podem especicar quantas leiras 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 zemos um erro de digi-
tao quando entramos com o nmero de leiras. O programa respondeu impri-
mindo uma mensagem de erro e depois pedindo-nos para entrar com o nmero
Range
131
Exemplos
40 Captulo 1. Rpida Introduo Programao procedural
de leiras novamente. Para o mximo, ns apenas pressionamos Enter, a m de
aceitar a congurao padro.
Ns iremos rever o cdigo em quatro partes: a importao, a denio de uma
funo get_int( ) (uma verso mais sosticada 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.ran-
dint( ).
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 uxo
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 lan-
ada. 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 itei-
rador, e, se a converso bem-sucedida, ela ir, ento, checar se o inteiro possui
um valor pelo menos igual ao mnimo que foi especicado.
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 mini-
mum especicado.
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 leiras e co-
lunas e o valor aleatrio mnimo que o usurio deseja. Para leiras e colunas, ns
damos um valor padro de None, isto , nenhum padro; logo, o usurio deve en-
alea-
trio.
aleaint
( ) 36
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 cha-
mar 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 leiras e colunas o usurio exige e o valor
mnimo e mximo dos nmeros aleatrios que eles querem, j possvel estar-
mos 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 co-
lunas, 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 es-
pecicado 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 leira 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 sosticadas, as-
sim como um excelente suporte para loops for...in, ento, verses mais rea-
listas 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 estive-
mos limitando-nos s oito partes do Python, introduzidas neste captulo, e elas
so sucientes 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 m,
estaremos aptos a escrever de modo sosticado.
Sumrio
Neste captulo, ns aprendemos como editar e executar programas Python e re-
visamos alguns pequenos, mas completos, programas. Mas a maioria das pginas
destes captulos foram dedicadas s oito partes do lindo corao do Python
suciente para escrever programas reais.
Ns comeamos com dois dos mais bsicos tipos de dados do Python, int e str.
Exemplos
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 du-
plas; 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 concatena-
da 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 pode-
mos 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, poss-
vel, 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 modicar 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 par-
ticularmente muito utilizado quando se est checando em oposio ao objeto sin-
gular 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, com-
parar um int com um str ou uma list, iremos produzir, de maneira completa
e sensvel, uma exceo TypeError.
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 resul-
tados e este pode no ser um boleano (ainda que este resultado possa ser conver-
tido 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 pro-
cura 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 congurar tipos de dados colecionveis, ambos do
teste de associao que foi executado de maneira muito rpida. Tambm poss-
vel 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 ramicao condicio-
nal com if...elif...else, loopins condicionais com while, loop sobre sequ-
ncias com for...in, e manipulador de exceo com blocos try...except.
Tanto while quanto o loop for...in podem ser nalizados 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 utuan-
te, 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 bibliote-
ca padro tambm disponvel com mdulos acessveis; desde que eles tenham
sido importados, atravs da declarao import. Um mdulo comumente impor-
tado 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 escre-
ver 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 m de que possamos
Sumrio
44 Captulo 1. Rpida Introduo Programao procedural
empacotar funcionalidades para evitar a duplicao dos cdigos e promover, tam-
bm, o reuso de cdigos.
Exerccios
O objetivo dos exerccios propostos aqui e por todas as partes do livro encorajar
voc a fazer uma experincia real com o Python e lhe fornecer a experincia su-
ciente para absorver o material exposto em cada um dos captulos. Os exemplos
e exerccios abrangem tanto a parte de processamento numrico quanto de texto;
eles apelam para uma audincia to ampla quanto possvel, sem contar que so
bastante pequenos; dessa forma, damos nfase nos atos pensar e aprender, ao
invs de apenas copiar cdigos. Todos os exerccios possuem um resultado, forne-
cidos com os exemplos do livro.
1. Uma variao muito bacana do programa bigdigits.py que, ao invs de
imprimir *s, o dgito relevante que impresso no lugar. Por exemplo:

Dois caminhos podem ser tomados. O mais fcil simplesmente mudar o *s
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 leiras 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 modicando 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 exvel, mas, al-
gumas vezes, mais conveniente que se tenha uma calculadora para este uso
especco. Crie um programa que fornea prompts ao usurio a m 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 (simples-
mente pressionando o Enter), imprima os nmeros dados, o clculo dos nme-
ros, a soma dos nmeros, o maior e o menor nmero dado e o peso dos nmeros
(sum/count). Aqui est uma execuo simples:
Exem-
plos do
livro
3
44 Chapter 1. Rapid Introduction to Procedural Programming
the scenes if their left-hand operand is immutable. The arithmetic operators
are overloaded by the str and list types as we noted earlier.
Console I/O can be achieved using input() and print(); and using le redi-
rection in the console, we can use these same built-in functions to read and
write les.
In addition to Pythons rich built-in functionality, its extensive standard
library is also available, with modules accessible once they have been imported
using the import statement. One commonly imported module is sys, which
holds the sys.argv list of command-line arguments. And when Python doesnt
have the function we need we can easily create one that does what we want
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
more about Pythons data types, going into more depth for ints and strs and
introducing some entirely new data types. In Chapter 3 we will learn more
about tuples and lists, and also about some of Pythons other collection data
types. Then, in Chapter 4 we will cover Pythons control structures in much
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.
Exercises |||
The purpose of the exercises here, and throughout the book, is to Books
exam-
ples
3
encourage you
to experiment with Python, and to get hands-on experience to help you absorb
each chapters material. The examples and exercises cover both numeric and
text processing to appeal to as wide an audience as possible, and they are kept
fairly small so that the emphasis is on thinking and learning rather than just
typing code. Every exercise has a solution provided with the books examples.
1. One nice variation of the bigdigits.py program is where instead of
printing *s, the relevant digit is printed instead. For example:
bigdigits_ans.py 719428306
77777 1 9999 4 222 888 333 000 666
7 11 9 9 44 2 2 8 8 3 3 0 0 6
7 1 9 9 4 4 2 2 8 8 3 0 0 6
7 1 9999 4 4 2 888 33 0 0 6666
7 1 9 444444 2 8 8 3 0 0 6 6
7 1 9 4 2 8 8 3 3 0 0 6 6
7 111 9 4 22222 888 333 000 666
Two approaches can be taken. The easiest is to simply change the *s in
the lists. But this isnt very versatile and is not the approach you should
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 nal 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 dis-
ponvel, ou para fornecer testes de contedo quando est desenvolvendo um
escritor de relatrios. Para este m, 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. Uti-
lize 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
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
Ran-
dow.
ran-
tint( ) e
randow.
choice
36
Exerccios
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 signicados igual do programa de mdia do Exerccio 2. No Python,
uma lista pode facilmente ser classicada 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
classique a lista dos nmeros se este desempenho lhe for motivo de preo-
cupao, resolva o problema utilizando a abordagem mais fcil que voc possa
pensar. Uma vez que a lista esteja classicada, 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 pro-
gramadores inexperientes. Se voc possuir alguma experincia Python, ainda
assim vai lhe parecer algo desaante, pelo menos se voc limitou-se a usar
apenas o que foi ensinado at agora. A classicao 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