Escolar Documentos
Profissional Documentos
Cultura Documentos
Programando Phyton PDF
Programando Phyton PDF
Criando e executando
Programas PYTHON.
Rpida Introduo
programao procedural
Este captulo ir lhe fornecer informao suficiente para iniciar sua escrita de
programas Python. Ns recomendamos, de forma veemente, que voc instale o
Python caso ainda no o tenha feito, a fim de que possa experenciar algo concreto com tudo o que aprender aqui. (A introduo explica como obter e instalar
Python com as principais plataformas ver pgina 4).
Esta primeira seo do captulo vai lhe mostrar como criar e executar programas
Python. Voc pode usar o seu editor de texto simples para escrever seu cdigo
Python, mas o ambiente de programao IDLE, discutido nesta seo, no lhe
fornece apenas um editor para cdigos, mas tambm algumas funcionalidades
adicionais, incluindo facilidades para experimentao com cdigo Python e para
a depurao de programas Python.
A segunda seo apresenta oito partes-chave de Python, que, por si mesmas,
so o suficiente para escrever programas Python muito teis. Estas partes sero
todas abordadas de maneira mais extensa em captulos posteriores, e, conforme
o livro for progredindo, eles sero suplementados por todo o restante do Python;
portanto, ao final do livro, voc j ter aprendido toda a linguagem e estar apto
a utilizar tudo o que isto pode oferecer para seus programas.
A seo final deste captulo introduz dois pequenos programas, os quais usam o
subset das caractersticas do Python, introduzidos na segunda seo. Desta forma, voc poder provar imediatamente, o gosto da programao Python.
Codificadores
de
caracteres
85
extenso .py, ainda que, em alguns sistemas semelhantes ao Unix (e.g., linux e
Mac OS X), algumas aplicaes Python no possuam extenso, e os programas
Python GUI (Graphical User Interface) geralmente vm com uma extenso .pyw,
particularmente no Windows e no Mac OS X. Neste livro, ns sempre usamos
uma extenso .py para programas de terminais do Python e mdulos Python, e
.pyw para programas GUI. Todos os exemplos apresentados neste livro executam sem alteraes em todas as plataformas em que Python 3 est disponvel.
Apenas para ter certeza de que tudo est funcionando corretamente e para criar
o primeiro exemplo clssico, crie um arquivo chamado hello.py em um editor
de texto simples (o bloco de notas do Windows j serve muito bem ns logo iremos usar um editor melhor) com os seguintes itens:
#!/usr/bin/env
python3
Inicie um Prompt de Comando e, no Windows, entre com os seguintes comandos (os quais pressupem que o Python j esteja instalado no local padro) a
sada do prompt de comando pode ser vista em negrito; e, o que voc digitou,
em Courier New:
C:\>cd c:\py3g
C:\py3eg\>C:\Python30\python.exe
hello.py
Desde que o comando cd (mudar diretrio) possua uma lista de diretrios absoluta, no importa de qual diretrio voc inicie.
Usurios Unix devem entrar com (supondo que o Python 3 esteja no PATH):*
$
$
cd $HOME/py3eg
python3 hello.py
O Windows usa associaes de registro de arquivos para chamar automaticamente o interpretador Python, quando um nome-de-arquivo com extenso .py
iniciado dentro de um terminal.
Se a sada no Windows aparecer como:
(hello,World!)
* O Prompt do Unix pode ser diferente do que o $ mostrado aqui; caso isso acontea, saiba que no
algo relevante.
Print
()
171
10
Isto significa que o Python 2 est no sistema e est sendo invocado no lugar do
Python 3. Uma soluo modificar a associao do arquivo .py do Python 2
para o Python 3.
Outra soluo (menos conveniente, mais segura) colocar o interpretador do
Python 3 no caminho (supondo que ele esteja instalado no local padro) e executar explicitamente todas as vezes:
C:\py3eg\>path=c:\python30;%path%
C:\py3eg\>python hello.py
Isto pode se tornar mais conveniente para criar um arquivo py3.bat com a linha
nica path=c:\python30;%path% e salvar este arquivo no diretrio C:\Windows. Depois, toda vez que voc iniciar um terminal para executar programas
do Python3, comece executando py3.bat. Ou,de forma alternada, voc pode executar py3.bat automaticamente. Para fazer isso, modifique as propriedades do
terminal (encontre o terminal no menu Iniciar, depois clique com boto direito
do mouse para aparecer na tela de Propiedades o texto /u /k c:\windows\py3.
bat (note os espaos antes, entre e depois das opes /u e /k e certifique-se de
ter adicionado este no final, aps cmd.exe).
No Unix, devemos primeiro fazer do arquivo um executvel e, somente depois,
poderemos execut-lo:
$
$
chmod +x hello.py
./hello.py
Ns precisamos executar o comando chmod apenas uma vez, claro; depois disso,
podemos digitar simplesmente ./hello.py e o programa ir rodar.
No Unix, quando um programa invocado no terminal, os primeiros dois bytes
do arquivo so lidos.* Se estes bytes so os caracteres ASCII #!, o shell assume
que o arquivo deve ser executado por um interpretador e que a linha do primeiro
arquivo especifica qual interpretador usar. Esta linha chamada de linha shebang (execuo shell) e, se presente, dever ser a primeira linha do arquivo.
A linha shebang comumente escrita em uma destas duas formas:
#!/usr/bin/python3
Ou
#!/usr/bin/env
python 3
Se a escrita usar a primeira forma, o interpretador especificado usado. Esta forma pode ser necessria para os programas Python que sero executados por um
servidor da web, ainda que o caminho especificado possa ser diferente do que foi
mostrado. Se a escrita usar a segunda forma, o primeiro interpretador Python3
encontrado no ambiente corrente do shell usado. A segunda forma mais verstil porque permite a possibilidade de o interpretador Python3 no ficar locali* A interao entre o usurio e o terminal gerenciado por um programa shell. A distino entre o
terminal e o shell no nos diz respeito aqui, ento iremos utilizar os termos intercambivelmente.
11
Obtendo e
instalando
Python
4
12
depurador que pode ser usado para avanar atravs do cdigo a fim de ajudar a
identificar e acabar com os erros de programao (bugs). O Shell Python especialmente til para testar algoritmos simples, fragmentos de cdigo e expresses regulares, alm de ser usado tambm como uma calculadora poderosa e muito flexvel.
Muitos outros ambientes de desenvolvimento Python esto disponveis, mas ns
recomendamos que voc use o IDLE, pelo menos no comeo. Uma alternativa
criar seus programas no editor de texto simples da sua escolha e depur-los
usando invocaes para print ( ) .
possvel invocar o interpretador do Python sem um programa Python especfico. Se isto for feito, o interpretador inicia de modo interativo. Neste modo,
possvel entrar com declaraes Python e ver os resultados exatamente da mesma forma como se usssemos a janela IDLE do Python Shell, e com os mesmo
prompts>>>>. Mas o IDLE muito mais fcil de usar, portanto, ns recomendamos usar o IDLE para experimentao de fragmentos de cdigo. Os pequenos e
interativos exemplos que mostramos at agora pressupem serem executados
em um interpretador interativo do Python ou no IDLE Python Shell.
Agora, ns j sabemos como criar e executar programas Python, mas, objetivamente, no vamos chegar muito longe conhecendo apenas uma nica funo. Na
prxima seo, iremos aumentar consideravelmente nosso conhecimento Python.
Isso nos tornar aptos a criar pequenos, mas muito teis, programas Python,
algo que iremos fazer na ltima seo deste captulo.
13
-973
210624583337114373395836055367340864637790190801098222508621955072
0
"Infinitely Demanding"
'Simon Critchley'
'positively abg '
' '
Tradicionalmente, Shell Python usa >>> como seus prompts, ainda que isto
possa ser modificado. A sintaxe colchete pode ser usada com itens de dados de
qualquer tipo de dados que seja uma sequncia, assim como string e listas. Esta
consistncia de sintaxe uma das razes para que a linguagem Python ser to
bonita. Perceba que todas as posies de ndice do Python comea com 0.
No Python, tanto str, e os tipos bsicos numricos, como int so imutveis isto
, uma vez atribuidos, seus valores no podem ser modificados. De primeira instncia, isto pode parecer uma limitao muito estranha, a sintaxe do Python no um
problema de prtica. A nica razo para mencionarmos este fato que, ainda que
possamos usar colchetes para resgatar o caractere dado na posio do ndice em
uma string, ns no poderemos us-lo para atribuir um novo caractere. (Perceba
que, no Python um caractere simplesmente uma string de extenso 1.)
Para converter um item de dados de um tipo para outro, podemos usar a sintaxe
datetype (item). Por exemplo:
>>> int (45)
45
>>> str (912)
912
A converso int( ) tolerante espaos em branco, logo, int(45) funcionaria bem tambm. A converso str( ) pode ser aplicada em quase nenhum
itens de dados. Ns podemos facilmente fazer nosso prprio suporte de dados
14
A sintaxe simplesmente referencia de objeto = valor. No h necessidade para uma pr-declarao ou para especificar o tipo do valor. Quando o
Python executa a primeira declarao, ele cria um objeto str com o texto azul e
cria uma referncia de objeto chamado x que se refere ao objeto str. Para todos
os objetivos prticos ns podemos dizer que varivel x foi atribuida a string
"azul". A segunda declarao similar. A terceira declarao cria uma nova referencia de objeto chamado z e o ajusta para se referenciar com o mesmo objeto que
a referencia de objeto x se refere (neste caso, o str contem o texto azul).
O operador = no o mesmo operador de atribuio varivel de algumas outras
linguagens. O operador = ata um referencia de objeto a um objeto da memria.
Se a referencia de objeto j existe, ele simplesmente reatado para se referenciar
ao objeto direita do operador =; se a referencia de objeto no existe, ele criado
pelo operador =.
Vamos continuar com o exemplo x, y, z e fazer alguns reatamentos como notado
anteriormente, os comentrios comeam com um # e continuam at o fim da linha:
print (x,
z = y
print (z,
x = z
print (x,
y,
z)
# print: azul
verde
azul
y,
z)
# print: azul
verde
azul
y,
z)
# print: azul
verde
azul
15
a = 7
b = a
OsOscrculos
representam
objetos
referenciais
crculos
representam
refrencia
de objeto
Os
Osretngulos
retngulos representam
representamobjetos
objetosna
namemria
memria
a = 7
b = a
a = "Liberty"
"Liberty"
Aps a quarta declarao (x = z), todos as trs referncia de objetos so referidos a mesma str. J que no existe mais referncia de objetos para a string
azul, Python est livre para joga-los fora.
Figura 1.2 mostra a relao entre objetos e referncia de objetos de forma
esquematizada:
Os nomes usados para referncia de objetos (chamados identificadores) possuem
poucas restries. Em particular, eles no podem ser iguais a nenhuma palavrachave do Python, e devem iniciar com uma letra ou um trao inferior (underscore), e serem seguidas por zero ou alguma letra diferente de espao sublinhado
ou dgito. No existe limite para o tamanho, e as letras e dgitos so definidos
pelo UniCode, isto , elas so includas, mas no limitadas, s letras e dgitos
do ASCII (a, b, ...z, A, B,...Z, 0, 1, ..., 9). Os identificadores Python
diferenciam entre letras maisculas e minsculas, ento, por exemplo, LIMITE,
Limite e limite so trs diferentes identificadores. Ainda mais detalhes e
alguns exemplos um tanto quanto exticos so dados no Capitulo 2.
Python utiliza dynamic typing (tipagem dinmica), o que significa que uma referncia de objeto pode ser reatado para se referir a um objeto diferente (o qual pode
ser um tipo diferente de dados) a qualquer momento. Linguagens que utilizam
uma tipagem forte (como C++ e Java) permitem apenas operaes que so definidas pelos tipos de dados envolvidos para serem executados. Python tambm aplica
esta restrio, mas no pode ser classificada como tendo uma tipagem forte em seu
caso, porque as operaes vlida podem mudar por exemplo, se um referncia de
objeto reatado a um objeto de um tipo diferente de dados. Por exemplo:
rota= 866
print (rota, type (rota)) # imprimir: 866 <class int>
rota = Norte
print(rota, type (rota)) #imprimir: Norte <class str>
16
to, usar / com rota poderia causar um typeError para ser lanada, j que / no
mais uma operao vlida para uma string.
A funo type ( ) retorna os tipos de dados (tambm conhecido como a classe) do item de dados que fornecido- esta funo pode ser muito utilizada para
testar e depurar, mas normalmente no vai aparecer no cdigo de produo, j
que existe uma alternativa bem melhor, como veremos no Captulo 6.
Se ns estamos experimentando o cdigo Python dentro de um interpretador
interativo ou em um Shell Python, bem como o nico fornecido pelo IDLE, simplesmente digitar o nome de uma referncia de objeto j o bastante para fazer
com que Python imprima seu valor. Por exemplo:
>>> x = azul
>>> y = verde
>>> z = x
>>> x
azul
>>> x, y, z
(azul, verde, azul)
Isto muito mais conveniente do que invocar a funo print ( ) a todo momento, mas funciona apenas quando usamos o Python interativamente qualquer programa e mdulos que escrevemos devem usar print ( ) ou funes
similares para produzir sadas. Perceba que Python exibiu a ltima sada em
parnteses separados por vrgulas isto significa uma tuple, isto , uma sequncia ordenada e imutvel de objetos. Ns iremos ver a respeito de tuple na
parte seguinte.
Quando Python imprimi uma tupla, ele a cerca em parnteses. Muitos programadores emulam isso e sempre cercam as tuplas literais escrevendo-as, entre
parnteses. Se ns temos um item tupla e queremos usar parnteses, preciso
17
ainda usar a vrgula por exemplo, (1,). Uma tupla vazia criada usando parnteses vazios, ( ). A vrgula tambm usada para separar argumentos chamados
de funes, portanto, se queremos passar uma tupla literal como um argumento,
devemos cerca-la entre parnteses para fugir de confuses.
Shallow
e Deep
Copy
34
Listas podem ser criadas a partir de colchetes ([ ]), assim como fizemos aqui;
mais tarde, ns veremos outras maneiras de criar listas. A quarta lista mostra uma lista vazia.
Por baixo da cobertura, listas e tuplas no armazenam itens de dados, mas sim referncia de objetos. Quando listas e tuplas so criadas (e quando itens so inseridos
no caso das listas), elas fazem cpias das referenciais de objetos que lhes formam
dados. No caso de itens literais como inteiros ou strings, um objeto do tipo de dados
apropriado criado na memria e adequadamente inicializado, e, depois, uma referncia de objeto referindo-se ao objeto criado e posto na lista ou na tupla.
Como tudo mais em Python, tipos de dados colecionveis so objetos, ento, ns
podemos encaixar tipos de dados colecionveis dentro de outros tipos de dados
colecionveis, por exemplo, para criar listas de listas, sem formalidades. Em algumas situaes, o fato que listas, tuplas e grande parte de outros tipos de dados
colecionveis do Python retm referncia de objetos ao invs de objetos fazem um
diferencial isto abordado no Captulo 3 (que comea na pgina 99).
Em programao procedural, ns podemos invocar funes e, normalmente, passar itens de dados como argumentos. Por exemplo, ns j vimos a funo print
( ). Outra funo frequentemente usada pelo Python len( ), a qual toma
um nico item de dados como seu argumento e retorna o tamanho do item como
um int. Aqui h algumas chamadas para len( ) ns no temos usado negrito
para as sadas do interpretador, pois supomos que voc possa perceber o que voc
digita e o que representado pelo interpretador, como agora:
>>> len( (um,))
1
>>>len([3, 5, 1, 2, pausar
6
>>> len(automaticamente)
15
, 5])
Tuplas, listas e strings so sized, isto , elas so tipos de dados que possuem
uma noo de tamanho e qualquer item de dados de qualquer tipo de dados pode
ser, de forma significativa, passada para a funo len ( ). (Uma exceo lanada se um tipo de dados sem tamanho transferido para len ( ). )
Todos os itens de dados do Python so objetos (tambm chamados de instncias)
de um tipo de dados particular (tambm chamado de classe). Ns iremos usar os
Shallow
e Deep
Copy
136
18
O objeto x sabe que uma lista (todos os objetos Python sabem qual o seu prprio tipo de dados), logo, ns no precisamos especificar o tipo de dados explicitamente. Na implementao do mtodo append( ), o primeiro argumento ir ser
o objeto x por si mesmo isto feito automaticamente pelo Python como parte de
seu suporte sinttico para mtodos.
O mtodo append( ) se transforma, isto , muda a lista original. Isto possvel
porque listas so mutveis. Isto tambm potencialmente mais eficiente do que
criar uma nova lista com os itens originais e o item extra e, depois, reatar a referencial do objeto nova lista, particularmente para lista muito longas.
Em uma linguagem procedural, a mesma coisa pode ser obtida usando o append
( ) das listas como este (que perfeitamente vlido para a sintaxe Python):
>>> list.append (x,
extra)
>>>x
[zebra, 49, -879, aardvark, 200, mais, extra]
Aqui, ns especificamos os tipos de dados e o mtodo do tipo de dados, e lhe demos, como o primeiro argumento, o item de dados do tipo de dados que queramos
para invocar o mtodo, seguido por qualquer argumento adicional. (Diante da
hereditariedade existe uma semntica sutil que difere entre as duas sintaxes; a
primeira forma uma que mais comumente usada em prtica. Hereditariedade
abordada no Captulo 6).
Se voc no est familiarizado com programao via orientada objetos isto pode
parecer um pouco estranho de incio. Por agora, apenas aceite que o Python possui funes convencionais, como estes: funoNome(argumentos); e mtodos
que so chamados, por exemplo: objetoNome.metodoNome(argumentos).
(Programao via objeto orientado ser abordada no Captulo 6).
O operador ponto ("atributo de acesso") usado para acessar um atributo do objeto. Um atributo pode ser qualquer tipo de objeto, ainda que, por enquanto, ns
tenhamos mostrado apenas atributos de mtodos. J que um atributo pode ser
um objeto que possui atributos, os quais, em troca podem, ter atributos, e assim
por diante, ns podemos usar quantos operadores ponto forem necessrios para
acessar o atributo particular que quisermos.
O tipo list possui muitos outros mtodos, incluindo insert( ),que usado
para inserir um item numa posio dada no ndice, e remove( ), que remove
19
um item numa posio dada no ndice. Como j foi notado anteriormente, os ndices do Python so sempre baseados em 0.
Ns vimos anteriormente que podemos obter caracteres das strings usando operadores em colchetes, e notamos que, no momento, este operador poder ser usado com qualquer sequncia. Listas so sequncias, portanto, ns podemos fazer
coisas como esta:
>>>x
[zebra, 49, -879, aardvark, 200, mais, extra]
>>> x[0]
zebra
>>> x[4]
200
Tuplas tambm so sequncias, logo, se x tem sido uma tupla, ns podemos recuperar itens usando colchetes, exatamente do mesmo modo como fizemos na lista
x. Mas, j que listas so mutveis (diferente de string e tuplas, que so imutveis) , podemos tambm usar o operador em colchetes para agrupar elementos
na lista. Por exemplo:
>>>> x[1] = quarenta e nove
>>> x
[zebra, quarenta e nove, -879, aardvark, 200, mais, extra]
Se ns dermos uma posio de ndice que esteja fora de alcance, uma exceo
ser lanada ns iremos fazer uma introduo muito breve sobre manipulao
de excees na parte #5, e abordar completamente excees no Captulo 4.
Ns usamos o termo sequncia uma poro de vezes at agora, contando com uma
compreenso informal de seu significado, e iremos continuar a fazer isso adiante.
De qualquer maneira, Python define precisamente quais caractersticas uma sequncia deve suportar, e assim por diante, para vrias outras categorias que um
tipo de dados possa pertencer, como veremos no Captulo 8.
Listas, tuplas e outros tipos de dados colecionveis do Python sero abordados
no Captulo 3.
O operador de identidade
J que todas as variveis do Python so realmente referncia de objetos, algumas
vezes, faz sentido de perguntar dois ou mais referncia de objetos so referidos
para os mesmo objetos. O operador is trata-se de um operador binrio que
retorna true se sua referncia de objeto esquerda est se referindo ao mesmo
referencia de objeto da direita.
20
Perceba que, usualmente, no faz sentido usar o is para comparar ints, strs
e a maioria dos tipos de dados, j que a grande maioria invariavelmente quer
comparar seus valores. De fato, usar is para comparar itens de dados pode levar
a resultados no muito intuitivos, como vimos no exemplo anterior, em que, ainda
que a e b foram atribudos inicialmente a mesma lista de valores, as listas, por si
mesmas, so retidas como objetos list separados e, portanto, is retorna como
False da primeira vez que o utilizamos.
Um dos benefcios oferecidos pelas comparaes de identidade que elas so
muito rpidas. Isto ocorre porque os objetos referidos no precisam ser examinados por si prprios. O operador is precisa comparar apenas a memria de
endereos dos objetos o mesmo endereo significa o mesmo objeto.
O caso mais comum do uso do is ocorre quando se compara um item de dados
com um objeto nulo, None, o qual normalmente utilizado como um valor placemarking (marcador) que significa unknow ou nonexistent:
>>> a = Algo
>>>b= None
>>> a is not none , b is none
(true, true)
Operadores de comparao
O Python fornece o padro para operadores de comparao binria, com as semnticas esperadas: < menor que, <= menor que ou igual a, == igual a, != no igual
a, > = maior que ou igual a, e > maior que. Estes operadores comparam valores
de objetos, isto , os objetos que a referncia do objeto utiliza em sua comparao
para referir-se a ele. Aqui esto alguns exemplos digitados num Shell Python:
>>>b = 6
>>>a = = b
False
>>>a<b
True
21
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( )
Comparando
Strings
63
22
raes com o tipo int inteiro e com outros tipos numricos personalizados, mas
no com a string ou outros tipos no numricos.
O operador de Associao
FuzzyBool
Alternativo
248
Para 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
Operadores Lgicos
Python fornece trs operadores lgicos: and, or e not. Tanto and como or usam
um curto-circuito lgico e retornam a operando que determinou o resultado eles
no retornam um boleano (a menos que eles realmente possuam operando boleanas). Vamos ver o que isto significa na prtica:
>>>
>>>
>>>
>>>
2
>>>
5
>>>
0
cinco = 5
dois = 2
zero = 0
cindo and dois
dois and cinco
cinco and zero
*Um traceback (alguma vezes chamado de um backtrace) uma lista que contm todas as invocaes
feitas do ponto de onde a exceo no tratada ocorreu de volta ao topo da pilha de invocaes.
23
24
A declarao if
A sintaxe geral para a declarao if do Python esta:*
If boleana_expresso1:
Suite1
elif boleana_expresso2:
Suite2
...
elif boleana_expressoN:
suiteN
else:
else_sute
Pode existir zero ou mais clusulas elif, e, a clusula final else opcional. Se
quisermos relatar para um caso particular, mas no quisermos fazer nada se isto
ocorrer, podemos usar o pass como uma sute de desvio.
A primeira coisa que chama a ateno de usurio de C++ ou Java que no existem parnteses ou chaves. Outra coisa que se nota dois pontos (delimitador):
este parte da sintaxe e muito fcil de se esquecer a princpio. Dois pontos so
usados com else, elif e, essencialmente, em qualquer outro lugar onde uma
suite estiver adiante.
Diferente da maioria das outras linguagens de programao, Python utiliza uma
indentao para dar significado s suas estruturas de blocos. Alguns programadores no gostam disso, especialmente antes de tentarem usar isso , e acabam levando esta questo para o lado pessoal. Mas, o cdigo necessrio apenas alguns dias
para se acostumar com isso, e, aps algumas semanas ou meses, se torna muito
melhor e menos desordenado para se ler do que um cdigo que utiliza colchetes.
J que sutes so indicadas com o uso de uma indentao, a pergunta que naturalmente nos incomoda : Que tipo de indentao?. A guia de boas prticas do
Python recomenda quatro espaos por nvel de indentao, e somente espaos
(no podem ser tabs). A maioria dos editores de texto mais modernos pode ser
configurada para gerenciar este problema automaticamente (o editor do IDLE
faz isso, claro, e muitos outros editores compatveis com o Python tambm).
Python ir funcionar bem com qualquer nmero de espaos, tabulaes ou uma
mistura dos dois, desde que usado uma identao consistente. Neste livro, ns
iremos seguir a guia de boas prticas oficial do Python.
Aqui est um exemplo muito simples da declarao se:
if x:
print (x no zero)
Neste caso, se a condio (x) avaliada como True a sute (a invocao da funo
print( ) ), a mesma ser executada.
* Neste livro, elipses (...) so usadas para indicar linhas que no foram mostradas.
25
Esta uma declarao sutilmente mais elaborada que imprime uma palavra que
descreve o valor das variveis lines.
A declarao while
A declarao while usada para executar uma sute zero ou mais vezes: o nmero de vezes vai depender do estado do while da expresso boleana no loop.
Aqui est a sintaxe:
while boleana_expresso
suite
Este loop while possui uma estrutura muito tpica e vai funcionar na medida em
que ainda existam itens para ele processar. (Tanto get_next_item
( ) quanto process_item( ) so supostas funes personalizadas, definidas
num outro lugar). Neste exemplo, a sute da declarao while contm uma declarao if, a qual, por si mesma, tem uma sute como deve ser neste caso,
consiste de uma nica declarao break.
A declarao for...in
O loop do Python for usa novamente a palavra chave in (a qual, em outros contextos, o membership operator) e possui a seguinte sintaxe:
for varivel in reitervel
Sute
Assim como o loop while, o loop for suporta break e continue, e tambm pos-
26
sui uma clusula opcional else. A varivel configurada para referir-se para
cada objeto no interable em turnos. Um interable qualquer tipo de dados
que possa ser iterado e estar apto a ter strings includas (em que a iterao
caracterizada pelo caractere), listas, tuplas e outros tipos de dados colecionveis
do Python.
for pais in[Denmark , Finlad, Norway, Sweden]:
print (pais)
Aqui, ns levamos em considerao uma abordagem muito simples para imprimir uma lista de pases. Na prtica, isto muito mais comum do que usar uma
varivel:
Paises = [Denmark, Finland, Norway, Sweden]
for pais em paises
print (pais)
De fato, uma lista completa (ou tupla) pode ser impressa usando a funo print
( ) diretamente, por exemplo, print(paises), mas ns normalmente preferimos imprimir colees usando um loop for (ou uma lista de compreenso, abordada mais adiante) para alcanar um controle completo sobre a formatao.
for letra in ABCDEFGHIJKLMNOPQRSTUWXYZ:
if letra in AEIOU:
print(letra, uma vogal)
mais:
print(letra, uma consoante)
Neste fragmento, o primeiro uso da palavra-chave in parte de uma declarao de for, com a varivel letra tomando os valores A, B e assim
por diante, at Z, mudando a cada iterao do loop. Na segunda linha do
fragmento, ns usamos if novamente, mas, desta vez, como operador teste
de associao. Note tambm que este exemplo mostra suites aninhadas. A
sute do loop for a declarao if...else, e tanto o desvio if como o else
possuem suas prprias suites.
Lista
de compreenses
110
27
28
Perceba que o pode ser usado tanto como um operador unrio (negativo) quanto como um operador binrio (subtrao); algo comum nas outras linguagens de
programao. Onde Python se difere dos demais na parte da diviso:
>>> 12/3
4.0
>>> 3/2
1.5
a = 5
a
a += 8
a
29
73
i += 2
73
75
te, para que ele se refira a este novo int. ( E, se o objeto original a foi referido de
modo que no possua mais referncia de objeto referidos a ele, este ser programado para o garbage collection). Figura 1.3 ilustra este ponto.
Outra sutileza que a operador= b no igual ao a= a operador b. A verso
incrementada olha o valor de a apenas uma vez, logo, isto pode ser potencialmente
rpido. Ademais, se a uma expresso complexa (e.g., uma lista de elementos com
uma posio de ndice calculado como sendo itens[offset+ndice], usar a verso incrementada causar menos erros, j que o calculo precisa modificar o mantenedor
e este precisa mudar para apenas uma ao invs de duas expresses.
Python sobrecarrega (i.e., reusos para um tipo de dados diferente) os operadores
o(a)+ e += tanto em string quanto em listas; o primeiro significa concatenao e
o outro significa anexao para string e extend (anexar outro lista) para listas:
>>>nome = John
>>>nome=+ Doe
JohnDoe
>>>nome+= Doe
>>>nome
John Doe
J que listas so mutveis, quando =+ usado, o objeto lista original modificado, ento, nenhum reatamento de seeds necessrio. Figura 1.4 mostra como isto ocorre.
J que a sintaxe Python, de maneira muito inteligente, esconde a distino entre
tipos de dados mutveis e imutveis, afinal de contas, por que so necessrios os
dois tipos? As razes para isso so mais pelo desempenho. Tipos imutveis so potencialmente muito mais eficientes para implementar (j que eles nunca mudem)
do que tipos mutveis. Ademais, alguns tipos de dados colecionveis, por exemplo,
sets, podem trabalhar apenas com tipos imutveis. Por outro lado, tipos mutveis
so bem mais convenientes de usar. Onde esta distino realmente importa, ns
discutiremos isso por exemplo, no Captulo 4, quando discutirmos argumentamos
setados como default para funes customizada no Captulo 3, quando discutirmos
30
m = [5, 9]
m += [6]
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.
31
ambas para o terminal ou para os arquivos. Nos j fizemos uso da funo embutida do Python print ( ), ainda que ns tenhamos adiado sua abordagem completa para o Captulo 4. Nesta subseo, ns iremos nos concentrar no terminal
I/O e usar redirecionamentos shell para ler e escrever arquivos.
Python fornece a funo embutida input( ) para aceitar entrada dos usurios.
Esta funo toma um argumento de string opcional (que impresso no terminal);
ele, ento, espera o usurio digitar uma resposta e finalizar pressionando Enter
(ou Return). Se o usurio no digitar texto algum, mas apenas apertar o Enter,
a funo input( ) retorna uma string vazia; de qualquer maneira, ele retorna
uma string contendo o que o usurio digitou, sem qualquer finalizador de linha.
Aqui est nosso primeiro e completo programa til; ele se adianta em muito se
o compararmos com os programas anteriores a nica coisa realmente nova
exibida na funo ( ):
print("Type integers, each followed by Enter; or just Enter to finish")
total = 0
count = 0
while True:
line = input("integer: ")
if line:
try:
number = int(line)
except ValueError as err:
print(err)
continue
total += number
count += 1
else:
break
if count:
print("count =", count, "total =", total, "mean =", total /
count)
O programa (no arquivo sum1.py nos exemplos do livro) possui apenas 17 linhas
executveis. Aqui est o que acontece em uma tpica execuo:
Type integers, each followed by Enter; or just Enter to finish
number: 12
number: 7
number: 1x
invalid literal for int() with base 10: '1x'
number: 15
number: 5
number:
count = 4 total = 39 mean = 9.75
Ainda que este programa seja muito curto, amplamente robusto. Se o usurio
entrar com uma string que no possa ser convertida em um inteiro o problema
32
Exemplos do
livro
3
assumido por um manipulador de exceo que imprime uma mensagem adequada e envia o controle para o incio do loop ("continuar o loop"). E a ltima
declarao se assegura que o usurio no entre com qualquer nmero; o sumrio
no colocado na sada e a diviso por zero prevenida.
A manipulao de arquivos totalmente abordada no Captulo 7; mas, por enquanto, ns podemos criar arquivos simples direcionando as sadas da funo
print ( ) do terminal. Por exemplo:
C:\>teste.py>resultado.txt
causar a sada de uma funo simples print( ) chamada no programa fictcio teste.py, que deve ser escrito no arquivo resultados.txt. Esta sintaxe
funciona com o terminal do Windows e do Unix. Para o Windows, ns devemos
escrever C:\Python30\python.exe teste.py>resultados.txt, caso o
Python 2 estiveja configurada como padro no computador, ou python teste.py>resultados.txt, se Python 3 vier primeiro no PATH (ainda que ns
no queiramos falar sobre isso novamente), e para Unixes ns devemos fazer o
programa executvel (chmod +x teste.py) e, ento, invoc-lo escrevendo ./
teste: a menos que acontea de o diretrio estar no PATH.
Ler dados pode ser alcanado redirecionando um arquivo dado como entrada
numa forma analgica feito para redirecionar a sada. De qualquer maneira, se
ns usarmos o redirecionamento com sum1.py, o programa poder falhar. Isto
ocorre porque a funo output( ) lana uma exceo quando recebe um caractere EOF (fim de arquivo). Aqui est uma verso muito mais robusta (sum2.
py) que pode aceitar entradas do usurio, quando este digitar manualmente no
teclado, ou via redirecionamento de arquivo:
print("Type integers, each followed by Enter; or ^D or ^Z to finish")
total = 0
count = 0
while True:
try:
line = input()
if line:
number = int(line)
total += number
count += 1
except ValueError as err:
print(err)
continue
except EOFError:
break
if count:
print("count =", count, "total =", total, "mean =", total /
count)
33
dado contm uma lista de nmeros, um por linha, e est nos exemplos do subdiretrio dados), a sada para o terminal ser:
Type integers, each followed by Enter; or ^D or ^Z to finish
count = 37 total = 1839 mean = 49.7027027027
34
Python fornece vrios sentidos para sutes encapsuladas, como funes que podem ser parametrizadas atravs dos argumentos que lhe so passados. Aqui est
a sintaxe geral para criar uma funo:
def funoNome(argumentos):
Suite
Esta funo toma um argumento, msg. Dentro do loop while, o usurio abordado com um prompt, a fim de dar entrada num inteiro. Se eles entrarem com
algo invlido, uma exceo ValueError ser lanada, a mensagem de erro
ser impressa e o loop se repetir. Uma vez que um iteirador vlido seja acionado, ele retornado ao invocador. Aqui est como ns deveremos cham-lo:
idade = obter_int(entrar sua idade:)
Neste exemplo, o nico argumento unitrio mandatrio, porque ns no podemos fornecer um valor padro. De fato, Python suporta uma sintaxe muito
sofisticada e flexvel para parmetros de funes, os quais suportam argumentos
padres. Toda esta sintaxe abordada no Captulo 4.
Ainda que criemos nossas prprias funes e isto seja muito satisfatrio, em muitos casos no ser necessrio. Isto ocorre porque Python possui um monte de funes embutidas e uma grande gama de funes nos mdulos da biblioteca padro,
ento, o que queremos provvel e j est pronto e disponvel.
35
Um modulo Python apenas um arquivo .py que contm cdigo Python, assim
como funes personalizadas e definies de classes (tipos de dados personalizados), e algumas variveis. Para acessar a funcionalidade em um mdulo, ns
devemos import-lo. Por exemplo:
Import sys
Este mdulo sys fornece a varivel argv uma lista em que o primeiro item o
nome no qual o programa foi invocado e o segundo e tambm os itens subsequentes, os argumentos da linha de comando do programa. As duas linhas anteriores
mencionadas constituem o programa completo ecoargs.py. Se o programa foi
invocado com a linha de comando ecoargs.py, ele ser impresso [ecoargs.
py, -v] no terminal. (No Unix, a primeira entrada poder ser ./ecoargs.py)
No geral, a sintaxe para usar a funo de um mdulo moduloNome.
funoNome(argumentos). Isto faz uso do operador de ponto (acessar atributos) que ns introduzimos na parte #3. A biblioteca padro contm vrios
mdulos e ns
iremos fazer uso de muitos deles ao longo do livro. O mdulo padro possui, quebra linha, nomes em minsculo; logo, alguns programadores iro usar nomes com
a primeira letra em maisculo (e.g., MeuModulo) para seus prprios mdulos, a
fim de manter a distino entre um e outro.
Vamos ver um exemplo: o mdulo random (no arquivo random.py da biblioteca
padro), que fornece funes muito utilizadas:
Import random
X= random.randint(1, 6)
Y= random.choice([ma, banana, cereja, durio])
Operador(.)
de
ponto
operador
18
Depois de estas declaraes terem sido executadas, x ir conter um inteiro, inclusive entre 1 e 6; e y ir conter uma das strings da lista passada para a funo
random.choice( ).
conveniente colocar todas as declaraes import no incio dos arquivos .py,
depois da linha shebang e depois da documentao do mdulo. (Documentao de
mdulos ser abordada no Captulo 5.) Ns recomendamos importar os mdulos
da biblioteca principal primeiro, depois os mdulos da biblioteca de terceiros e,
finalmente, seus prprios mdulos.
*O mdulo sys, outro embutido dos mdulos, e mdulos implementados em C no possuem
necessariamente e correspondentemente arquivos .py mas eles so usados exatamente do mesmo
jeito que estes outros tambm o so.
36
Exemplos
Na seo anterior, ns aprendemos o suficiente sobre Python para escrever programas reais. Nesta seo, ns iremos estudar programas completos que usam
apenas o que j foi abordado sobre Python antes. Estes exemplos so tanto para
mostrar o que possvel fazer com o que aprendemos quanto para ajudar a consolidar tudo que j foi aprendido at este ponto.
Linha
shebang
10
Bigdigits.py
O primeiro programa que ns iremos rever extremamente curto, ainda que ele
tenha alguns aspectos sutis, incluindo uma lista de listas. Aqui est o que acontece: dado um nmero na linha de comando, o programa libera o mesmo nmero
dentro do terminal usando grandes dgitos.
Pelos sites afora, existem punhados de usurios partilhando uma linha de imprimir altamente rpida, que usada para prticas comuns para cada trabalho
impresso do usurio, precedido por uma pgina de capa que exibir seus nomes
de usurio e alguns outros detalhes de identificao impresssos, que utiliza este
37
tipo Examples
de tcnica.
Ns iremos rever o cdigo em trs partes: a importao, a criao das listas que
We will review the code in three parts: the import, the creation of the lists
atam os dados aos programas usados e o processo por si mesmo. Mas, primeiro,
holding the data the program uses, and the processing itself. But rst, lets
vamos ver este exemplo em funcionamento:
look at a sample run:
bigdigits.py 41072819
bigdigits.py 41072819
*
*
***
*****
**
**
*
*
*
* *
*
*
*
*
* *
*
*
*
*
******
*
*
*
*
*
*
*
*
*
*
***
***
*
***
*
*
***
*
*
*
*
*
*
*
*****
***
*
*
*
*
***
*
**
*
*
*
*
***
****
*
*
****
*
*
*
*
*
We have not shown the console prompt (or the leading ./ for Unix users); we
will take them for granted from now on.
Ns no precisamos mostras o prompt do terminal (ou o ./ para usurios Unix);
ns iremos
esconced-lo
daqui para frente.
import
sys
Import sys
Since we must read in an argument from the command line (the number
J que
ns devemos
ler em
argumento
da linha
nmero
parathe
a
to output),
we need
to um
access
the sys.argv
list,de
socomando
we begin(oby
importing
sada),
ns
precisamos
acessar
a
lista
sys.argv;
logo,
comearemos
importando
sys module.
o mdulo sys.
We represent each number as a list of strings. For example, here is zero:
Zero = [" *** ",
" *
* ",
"*
*",
Um Python
detalhestatements
que se deve
notar occupy
que a lista
Zero
das
strings
espalhada
por
set type
normally
a single
line,
but
they can
span multiple
linhas
mltiplas.
As
declaraes
Python
normalmente
ocupam
uma
nica
linha,
Onelines
detail
to
note
is
that
the
list
of
strings
is
spread
over
multiple
lines.
Zero
if they are a parenthesized expression, a list, set, or dictionary literal, a 112
mas
elasstatements
podem
por
mltiplas
linhasline,
se estiverem
em:span
umamultiple
expresso
Python
normally
occupy
a single
but they
can
function
call espalhar
argument
list,
or a multiline
statement
where
every
end-of-lineset type
dict
entre
parnteses,
uma
lista,
set
ou
dicionrio
literal,
uma
chamada
funo
lislines
if
they
are
a
parenthesized
expression,
a
list,
set,
or
dictionary
literal,
character except the last is escaped by preceding it with a backslashde
(\a).
In 112
type
ta
deallargumentos
ou
uma
declarao
de can
multilinhas,
em
que indentation
cada
final
function
callcases
argument
list,
or aofmultiline
statement
where
everycaractere
end-of-line
these
any
number
lines
be spanned
and
does
notdict 118
de
linha
exclui
a ltima
escapou,
precedendo-a
barra lateral
character
except
the
lastque
is escaped
by
preceding
itcom
withuma
a backslash
(\). In(\).type
matter
for the
second
and
subsequent
lines.
Em
todos cases
estes any
casos,
qualquer
nmero
pode
ser
espalhada does
a indntaall these
number
of lines
cande
belinhas
spanned
and
indentation
not
Eachfor
list
a number
has
seven
strings,
all of uniform width, 118
o
no
importa
para aand
segunda
linha ou
para
as linhas
subsequentes.
matter
therepresenting
second
subsequent
lines.
although what this width is differs from number to number. The lists for the
Cada
lista
representa
umathe
nmero
strings,
com
larguEach
listnumbers
representing
number
haspossui
seven
strings,
all todas
of uniform
width,
other
follow
sameque
pattern
assete
for
zero,
although
they uma
are
laid
out
ra
uniforme,
ainda
que
esta
largura
difere
de
nmero
para
nmero.
A
lista
para
although
what
this
width
is
differs
from
number
to
number.
The
lists
for
the
for compactness rather than for clarity:
outros
nmeros follow
segue the
o mesmo
usado
para zero,they
ainda
elas
other numbers
same padro
patternque
as for
zero, although
areque
laid
outestejam
"deitadas"
para
menos
espao
ao"ivs
da"forma
anterior mais clara:
One = [" rather
* ", usar
"**
",
" *clarity:
",
" * ",
* ",
* ", "***"]
for compactness
than
for
38
38
Tipos
de Set
112
*", "*
*", "
= of
[" data
****",
****",
*", "
The lastNine
piece
we "*
need*",
is a "*
list of*",
all"the
lists "of digits:
*", "
*", "
*"]
*"]
The
last
data
we
need
is a list
all
theSix,
lists
of digits:
A ltima
parte
dosofdados
precisamos
of
uma
lista
de todas
asEight,
listas de
dgitos:
Digits
=piece
[Zero,
One,que
Two,
Three,
Four,
Five,
Seven,
Nine]
Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
Digits
[Zero,the
One,
Two, lists
Three,
Four, and
Five,
Six, Seven,
Eight,
Nine]
We could
have =created
directly,
avoided
creating
the extra
Digits
Ns
poderamos
ter criado as listas de Digits diretamente, e evitar a criao de
variables.
For example:
We could
havePor
created
the Digits lists directly, and avoided creating the extra
variveis
extras.
exemplo:
variables.
Digits = [For example:
[" *** ", " *
* ", "*
*", "*
*", "*
*",
Digits = [
" *
* ", " *** "], # Zero
[" *** ", " *
* ", "*
*", "*
*", "*
*",
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
" *
* ", " *** "], # Zero
# ...
[" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
[" ****", "*
*", "*
*", " ****", "
*", "
*",
# ...
"
*"] # Nine
[" ****", "*
*", "*
*", " ****", "
*", "
*",
]
"
*"] # Nine
] to use a separate variable for each number both for ease of
We preferred
Tipos
de
dicionrios
118
38
Ns preferimos usar uma varivel separada para cada nmero, tanto pela facilidade de entender melhor quanto porque o cdigo fica mais elegante quando se
usa as variveis.
Ns iremos mencionar o resto do cdigo em uma tentativa para que voc possa
tentar entender como funciona antes de ler as explicaes a seguir.
try:
digits = sys.argv[1]
row = 0
while row < 7:
line = ""
column = 0
while column < len(digits):
number = int(digits[column])
digit = Digits[number]
line += digit[row] + " "
column += 1
print(line)
row += 1
except IndexError:
print("usage: bigdigits.py <number>")
except ValueError as err:
print(err, "in", digits)
O cdigo completo est empacotado em um manipulador de exceo que pode capturar os dois erros que podem ocorrer. Ns comeamos restaurando o argumento
da linha de comando do programa. A lista sys.argv baseada em 0, como todas
as listas Python; o item que est na posio 0 do ndice o nome do programa
invocado, logo, quando o programa est rodando, esta lista sempre comea com
pelo menos um item. Se nenhum argumento foi dado, ns iremos tentar acessar
o segundo item em uma lista de um-item, e isto ir causar uma exceo IndexError, que ser lanada. Se isto ocorrer, o fluxo do controle imediatamente
enviado para o bloco de manipulao de excees correspondente e, aqui, ns simplesmente imprimimos o uso do programa. Aps o final do bloco try a execuo
continua; mas no ter mais cdigos; logo, o programa simplesmente termina.
Se nenhum IndexError ocorrer, a string de digits guarda o argumento da
linha de comando, que ns esperamos que seja uma sequncia de caracteres de
dgitos. (Relembrando a parte #2, na qual j explicamos que os identificadores
so sensitivos a letras maisculas e minsculas, digits e Digits so diferentes). Cada grande dgito representado por sete string e, para dar a sada do
nmero corretamente, ns devemos enviar para a sada o topo da fileira de cada
dgito, depois, na prxima fileira, e assim por diante, at que todas as sete fileiras
tenham sido enviadas. Ns usamos um loop while para iterar cada fileira. Ao
invs disso, ns poderamos tambm ter feito simples e facilmente o seguinte:
for rowin (0,1,2,3,4,5,6): e, depois, ns iremos obter uma maneira muito
melhor para atuar com a funo range( ).
Ns usamos a string da line para guardar a fileira de string com todos os dgitos
envolvidos. Depois, utilizamos o loop por colunas, isto , em cada caractere, suces-
Exemplos
39
Generate_grid.py
Uma necessidade que ocorre frequentemente a gerao de dados de teste. No
existe um programa genrico para fazer isto, j que dados de teste so normalmente enormes. Python geralmente usada para produzir dados de teste porque
ela muito fcil para escrever e modificar programas Python. Nesta subseo, ns
iremos criar um programa que gera uma rede de inteiros aleatrios; os usurios
podem especificar quantas fileiras e colunas eles desejam o range que abrange os
interior. Ns iremos comear olhando (um exemplo) sendo executado:
generate_grid.py
rows: 4x
invalid literal for int() with base 10: '4x'
rows: 4
columns: 7
minimum (or Enter for 0): -100
maximum (or Enter for 1000):
554 720 550 217 810 649 912
-24 908 742 -65 -74 724 825
711 968 824 505 741 55 723
180 -60 794 173 487 4 -35
O programa trabalha interativamente e, no incio, ns fizemos um erro de digitao quando entramos com o nmero de fileiras. O programa respondeu imprimindo uma mensagem de erro e depois pedindo-nos para entrar com o nmero
Range
131
40
aleatrio.
aleaint
( ) 36
Nossa funo get_int transforma em algo fcil obter o nmero de fileiras e colunas e o valor aleatrio mnimo que o usurio deseja. Para fileiras e colunas, ns
damos um valor padro de None, isto , nenhum padro; logo, o usurio deve en-
Exemplos
41
trar com um iteirador. Neste caso, para mnimo, ns fornecemos um valor padro
de 0 e, para o mximo, ns fornecemos um valor padro de 1000, ou duplamente
o mnimo, caso o mnimo seja maior ou igual a 1000.
Como pde ser notado nos exemplos anteriores, a funo do argumento para chamar as listas pode passar por cima de qualquer nmero de linhas, e a indentao
irrelevante para suas linhas secundrias ou subsequentes.
Uma vez que ns j saibamos quantas fileiras e colunas o usurio exige e o valor
mnimo e mximo dos nmeros aleatrios que eles querem, j possvel estarmos prontos para fazer o processamento.
rows = get_int("rows: ", 1, None)
columns = get_int("columns: ", 1, None)
minimum = get_int("minimum (or Enter for 0): ", -1000000, 0)
default = 1000
if default < minimum:
default = 2 * minimum
maximum = get_int("maximum (or Enter for " + str(default) + "): ",
minimum, default)
Para gerar a grade, ns usamos trs loops while: o externo, que trabalha por colunas, o do centro, que tambm funciona por colunas, e o do interior, que funciona
por caracteres. No centro do loop, ns obtemos um nmero aleatrio no range especificado e, ento, convertido em uma string. O loop while interno usado para
encher a string com os espaos impressos entre as linhas; logo, cada nmero
representado por uma string de 10 caracteres no total. Ns usamos a string line
para acumular os nmeros em cada fileira e imprimir a linha aps cada nmero
de colunas ter sido adicionado. Isto completa nosso segundo exemplo.
Python fornece funcionalidades de formatao de string muito sofisticadas, assim como um excelente suporte para loops for...in, ento, verses mais realistas do bigdigits.py e do generate_grid.py poderiam usar loops for...
in, e generate_grid.py poderia ser usado na capacitao de formataes de
string do Python ao invs de grosseiros enchedores de espaos. Mas ns estivemos limitando-nos s oito partes do Python, introduzidas neste captulo, e elas
so suficientes o bastante para escrever programas completos e muito teis. Em
cada captulo subsequente, ns iremos aprender novas caractersticas Python,
de modo a progredir pelos programas que veremos atravs do livro e, por fim,
estaremos aptos a escrever de modo sofisticado.
Sumrio
Neste captulo, ns aprendemos como editar e executar programas Python e revisamos alguns pequenos, mas completos, programas. Mas a maioria das pginas
destes captulos foram dedicadas s oito partes do lindo corao do Python
suficiente para escrever programas reais.
Ns comeamos com dois dos mais bsicos tipos de dados do Python, int e str.
42
Sumrio
43
Exerccios
O objetivo dos exerccios propostos aqui e por todas as partes do livro encorajar
Exercises
|||
Books
examples
3
voc a fazer uma experincia real com o Python e lhe fornecer a experincia suficiente
paraofabsorver
o material
exposto
em cada
um
dosiscaptulos.
Os exemplos
The
purpose
the exercises
here, and
throughout
the
book,
to encourage
you
e
exerccios
abrangem
tanto
a
parte
de
processamento
numrico
quanto
de texto;
to experiment with Python, and to get hands-on experience to help you absorb
eles
apelam
para
uma
audincia
to
ampla
quanto
possvel,
sem
contar
que so
each chapters material. The examples and exercises cover both numeric and
bastante
pequenos;
dessa
forma,
damos
nfase
nos
atos
pensar
e
aprender,
text processing to appeal to as wide an audience as possible, and they are kept ao
invs
de apenas
cdigos. is
Todos
os exerccios
possuemrather
um resultado,
fairly
small
so thatcopiar
the emphasis
on thinking
and learning
than justfornecidos
com
os
exemplos
do
livro.
typing code. Every exercise has a solution provided with the books examples.
1. Uma variao muito bacana do programa bigdigits.py que, ao invs de
1. One nice variation of the bigdigits.py program is where instead of
imprimir *s, o dgito relevante que impresso no lugar. Por exemplo:
printing *s, the relevant digit is printed instead. For example:
Exemplos do
livro
3
bigdigits_ans.py 719428306
77777
1
9999
4
7 11
9
9
44
7
1
9
9
4 4
7
1
9999 4 4
7
1
9 444444
7
1
9
4
7
111
9
4
222
2
2
888
2
8
8
2
2
2
22222
333
8
8
000
888
3
3
8
8
33
8
8
888
3
3
3
333
0
0
0
0
0
0
0
0
000
666
6
6
6666
6
6
6
6
666
Exerccios
45
average1_ans.py
enter a number or Enter to finish: 5
enter a number or Enter to finish: 4
enter a number or Enter to finish: 1
enter a number or Enter to finish: 8
enter a number or Enter to finish: 5
enter a number or Enter to finish: 2
enter a number or Enter to finish:
numbers: [5, 4, 1, 8, 5, 2]
count = 6 sum = 25 lowest = 1 highest = 8 mean = 4.16666666667
Voc vai precisar importar o mdulo random (aleatrio). As listas podem ser
executadas por volta de 4 a 10 linhas, dependendo de quantas palavras voc
colocou nelas e o loop, por si mesmo, j exige menos do que dez linha; portanto,
com algumas linhas em branco, todo o programa pode ser feito em algo por volta
de 20 linhas de cdigo. Uma soluo fornecida em awfulpoetry_ans.py.
4. Para fazer programas de poesias horrveis mais versteis, adicione alguns
cdigos a ele; dessa forma, se o usurio entrar com um nmero na linha de
comando (entre 1 e 10, inclusive), o programa ir imprimir as vrias linhas.
Se nenhum argumento para a linha de comando for dado, o padro imprimir
cinco linhas, assim como antes. Voc vai precisar mudar o loop principal (e.g.,
para um loop while). Tenha em mente que os operadores de comparao do
46