Você está na página 1de 30

IntroduoaPython

CentrodeInform-ca
UniversidadeFederaldePernambuco
SistemasdeInformao

ViniciusCardosoGarcia
vcg@cin.ufpe.br

2011ViniciusCardosoGarcia
Referncias
Notasdeauladoprof.TiagoA.E.Ferreira
(UFRPE)
HowtoThinkLikeaComputerScien-st
hSp://www.greenteapress.com/thinkpython/
thinkCSpy
AprendaComputaocomPython
hSp://www.franciscosouza.com.br/
aprendacompy/
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
2
ALinguagemPython
Desenvolvidanonaldosanosde1980
NomeinspiradonoMontyPythonsFlyingCircus
umalinguagemorientadaaobjeto
VantagensdePython
umalinguagemvers-lemuitoelegante
umalinguagemderpidaproto-pao,quando
comparadaaC/C++ouFortran.
DesvantagensdePython
umalinguageminterpretada.
Nocapazdegerarumaaplicaoquerodestand-alone
ParaserodarumprogramaPythonnecessriotero
interpretadorinstalado!
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
3
Outrascaracters<cas
Pythonumsodwareopen-source.
Sendoresidentedossistemaslinux(etambmMac
OS).
Pythonestdisponvelparatodososgrandes
sistemas.
Linux,windows,Mac/OS,etc.
Pythonportvel.
OcdigoPythonintuijvoebastanteamigvel.
OPython,suasextenesebibliotecassode
facilinstalao.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
4
Ondeencontrar?
possvelobterointerpretadorPythonnosite:
hSp://www.python.org
HtambmositedopythonBrasil
hSp://www.python.org.br
ListasdediscussosobrePython:
NoBrasil
hSp://www.python.org.br/wiki/EnvolvaSe
hSp://groups.google.com/group/pug-pe
NoMundo
hSp://mail.python.org/mailman/lis-nfo
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
5
VariveisemPython
Umadascaracters-casmaispoderosasde
umalinguagemdeprogramaoa
habilidadedemanipularvariveis.
Umavarivelumnomequeserefereaum
valor.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
6
Aprenda Computao com Python Documentation, Verso 1.1
>>> type(17)
<type int>
Nenhuma surpresa: strings pertencem ao tipo string e inteiros pertencem ao tipo int. Menos obviamente, nmeros
com um ponto decimal pertencem a um tipo chamado float, porque estes nmeros so representados em um formato
chamado ponto utuante
1
:
>>> type(3.2)
<type float>
O que dizer de valores como "17" e "3.2"? Eles parecem nmeros, mas esto entre aspas, como strings:
>>> type("17")
<type string>
>>> type("3.2")
<type string>
Eles so strings.
Ao digitar um nmero grande, tentador usar pontos entre grupos de trs dgitos, assim: 1.000.000. Isso no funciona
por que Python usa o ponto como separador decimal. Usar a vrgula, como se faz em ingls, resulta numa expresso
vlida, mas no no nmero que queramos representar:
>>> print 1,000,000
1 0 0
No nada do que se esperava! Python interpreta 1,000,000 como uma tupla, algo que veremos no Captulo 9. Por
hora, lembre-se apenas de no colocar vrgulas nos nmeros.
4.2 2.2 Variveis
Uma das caractersticas mais poderosas de uma linguagem de programao a habilidade de manipular variveis.
Uma varivel um nome que se refere a um valor.
O comando de atribuio cria novas variveis e d a elas valores:
>>> mensagem = "E a, Doutor?"
>>> n = 17
>>> pi = 3.14159
Este exemplo faz trs atribuies. A primeira atribui a string "E a, Doutor?" a uma nova varivel chamada
mensagem. A segunda d o valor inteiro 17 a n, e a terceira atribui o nmero de ponto utuante 3.14159 varivel
chamada pi.
Uma maneira comum de representar variveis no papel escrever o nome delas com uma seta apontando para o
valor da varivel. Esse tipo de gura chamado de diagrama de estado porque mostra em que estado cada varivel
est (pense nisso como o estado de esprito da varivel). O diagrama a seguir mostra o resultado das instrues de
atribuio:
1
N.T.: Observe o uso de ponto no lugar da vrgula para separar a parte inteira da parte fracionria.
18 Captulo 4. Captulo 2: Variveis, expresses e comandos
Aprenda Computao com Python Documentation, Verso 1.1
O comando print tambm funciona com variveis:
>>> print mensagem
E a, Doutor?
>>> print n
17
>>> print pi
3.14159
Em cada um dos casos, o resultado o valor da varivel. Variveis tambm tm tipo. Novamente, podemos perguntar
ao interpretador quais so eles:
>>> type(mensagem)
<type string>
>>> type(n)
<type int>
>>> type(pi)
<type float>
O tipo de uma varivel o tipo do valor ao qual ela se refere.
4.3 2.3 Nomes de variveis e palavras reservadas
Os programadores geralmente escolhem nomes signicativos para suas variveis, pois os nomes documentam para o
que a varivel usada.
Nomes de variveis podem ser arbitrariamente longos. Eles podem conter tanto letras quanto nmeros, mas tm de
comear com uma letra. Embora seja vlida a utilizao de letras maisculas, por conveno, no usamos. Se voc o
zer, lembre-se de que maisculas e minsculas so diferentes. Bruno e bruno so variveis diferentes.
O caractere para sublinhado ( _ ) pode aparecer em um nome. Ele muito utilizado em nomes com mltiplas palavras,
tal como em meu_nome ou preco_do_cha_na_china.
Se voc der a uma varivel um nome invlido, causar um erro de sintaxe:
>>> 76trombones = "grande parada"
SyntaxError: invalid syntax
>>> muito$ = 1000000
SyntaxError: invalid syntax
>>> class = "Ciencias da Computacao 101"
SyntaxError: invalid syntax
76trombones invlida por no comear com uma letra. muito$ invlida por conter um caractere ilegal, o
cifro. Mas o que est errado com class?
4.3. 2.3 Nomes de variveis e palavras reservadas 19
VariveisemPython
Variveistambmtm-po.Novamente,
podemosperguntaraointerpretadorquais
soeles:
O-podeumavarivelo-podovalorao
qualelaserefere.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
7
Aprenda Computao com Python Documentation, Verso 1.1
O comando print tambm funciona com variveis:
>>> print mensagem
E a, Doutor?
>>> print n
17
>>> print pi
3.14159
Em cada um dos casos, o resultado o valor da varivel. Variveis tambm tm tipo. Novamente, podemos perguntar
ao interpretador quais so eles:
>>> type(mensagem)
<type string>
>>> type(n)
<type int>
>>> type(pi)
<type float>
O tipo de uma varivel o tipo do valor ao qual ela se refere.
4.3 2.3 Nomes de variveis e palavras reservadas
Os programadores geralmente escolhem nomes signicativos para suas variveis, pois os nomes documentam para o
que a varivel usada.
Nomes de variveis podem ser arbitrariamente longos. Eles podem conter tanto letras quanto nmeros, mas tm de
comear com uma letra. Embora seja vlida a utilizao de letras maisculas, por conveno, no usamos. Se voc o
zer, lembre-se de que maisculas e minsculas so diferentes. Bruno e bruno so variveis diferentes.
O caractere para sublinhado ( _ ) pode aparecer em um nome. Ele muito utilizado em nomes com mltiplas palavras,
tal como em meu_nome ou preco_do_cha_na_china.
Se voc der a uma varivel um nome invlido, causar um erro de sintaxe:
>>> 76trombones = "grande parada"
SyntaxError: invalid syntax
>>> muito$ = 1000000
SyntaxError: invalid syntax
>>> class = "Ciencias da Computacao 101"
SyntaxError: invalid syntax
76trombones invlida por no comear com uma letra. muito$ invlida por conter um caractere ilegal, o
cifro. Mas o que est errado com class?
4.3. 2.3 Nomes de variveis e palavras reservadas 19
Avaliandoexpresses
Umaexpressoumacombinaodevalores,variveise
operadores
Emboraexpressescontenhamvalores,variveise
operadores,nemtodaexpressocontmtodosestes
elementos.Umvalorporsisconsideradoumaexpresso,
domesmomodoqueumavarivel
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
8
Aprenda Computao com Python Documentation, Verso 1.1
Ocorre que class uma das palavras reservadas em Python. Palavras reservadas denem as regras e a estrutura da
linguagem e no podem ser usadas como nomes de variveis.
Python tem 29 palavras reservadas:
and def exec if not return
assert del finally import or try
break elif for in pass while
class else from is print yield
continue except global lambda raise
Pode ser til ter essa lista mo
2
. Se o interpretador acusar erro sobre um de seus nomes de varivel e voc no
souber o porqu, veja se o nome est na lista.
4.4 2.4 Comandos
Um comando uma instruo que o interpretador Python pode executar. Vimos at agora dois tipos de comandos: de
exibio (print) e de atribuio.
Quando voc digita um comando na linha de comando, o Python o executa e mostra o resultado, se houver um. O
resultado de um comando print a exibio de um valor. Comandos de atribuio no produzem um resultado
visvel.
Um script normalmente contm uma sequncia de comandos. Se houver mais de um comando, os resultados apare-
cero um de cada vez, conforme cada comando seja executado.
Por exemplo, o script:
print 1
x = 2
print 2
produz a sada:
1
2
Lembrando que o comando de atribuio no produz sada.
4.5 2.5 Avaliando expresses
Uma expresso uma combinao de valores, variveis e operadores. Se voc digitar uma expresso na linha de
comando, o interpretador avalia e exibe o resultado:
>>> 1 + 1
2
Embora expresses contenham valores, variveis e operadores, nem toda expresso contm todos estes elementos. Um
valor por si s considerado uma expresso, do mesmo modo que uma varivel:
>>> 17
17
>>> x
2
2
N.T.: esta lista pode ser obtida atravs do prprio interpretador Python, com apenas dois comandos: import keyword; print
keyword.kwlist
20 Captulo 4. Captulo 2: Variveis, expresses e comandos
Aprenda Computao com Python Documentation, Verso 1.1
Ocorre que class uma das palavras reservadas em Python. Palavras reservadas denem as regras e a estrutura da
linguagem e no podem ser usadas como nomes de variveis.
Python tem 29 palavras reservadas:
and def exec if not return
assert del finally import or try
break elif for in pass while
class else from is print yield
continue except global lambda raise
Pode ser til ter essa lista mo
2
. Se o interpretador acusar erro sobre um de seus nomes de varivel e voc no
souber o porqu, veja se o nome est na lista.
4.4 2.4 Comandos
Um comando uma instruo que o interpretador Python pode executar. Vimos at agora dois tipos de comandos: de
exibio (print) e de atribuio.
Quando voc digita um comando na linha de comando, o Python o executa e mostra o resultado, se houver um. O
resultado de um comando print a exibio de um valor. Comandos de atribuio no produzem um resultado
visvel.
Um script normalmente contm uma sequncia de comandos. Se houver mais de um comando, os resultados apare-
cero um de cada vez, conforme cada comando seja executado.
Por exemplo, o script:
print 1
x = 2
print 2
produz a sada:
1
2
Lembrando que o comando de atribuio no produz sada.
4.5 2.5 Avaliando expresses
Uma expresso uma combinao de valores, variveis e operadores. Se voc digitar uma expresso na linha de
comando, o interpretador avalia e exibe o resultado:
>>> 1 + 1
2
Embora expresses contenham valores, variveis e operadores, nem toda expresso contm todos estes elementos. Um
valor por si s considerado uma expresso, do mesmo modo que uma varivel:
>>> 17
17
>>> x
2
2
N.T.: esta lista pode ser obtida atravs do prprio interpretador Python, com apenas dois comandos: import keyword; print
keyword.kwlist
20 Captulo 4. Captulo 2: Variveis, expresses e comandos
Operaescomstrings
Demaneirageral,vocnopodeexecutaroperaesmatem-casem
strings,aindaqueasstringssepareamcomnmeros.Oquesegue
invlido(assumindoquemensagemdo-postring)
Ooperador*tambmfuncionacomstrings;elerealizarepe-o.Por
exemplo,"Legal"*3"LegalLegaLegal".Umdosoperadorestemqueser
umastring;ooutrotemqueseruminteiro.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
9
Aprenda Computao com Python Documentation, Verso 1.1
4.7 2.7 Ordem dos operadores
Quando mais de um operador aparece em uma expresso, a ordem de avaliao depende das regras de precedncia.
Python segue as mesmas regras de precedncia para seus operadores matemticos que a matemtica. O acrnimo
PEMDAS uma maneira prtica de lembrar a ordem das operaes:
P: Parnteses tm a mais alta precedncia e podem ser usados para forar uma expresso a ser avaliada
na ordem que voc quiser. J que expresses entre parnteses so avaliadas primeiro, 2
*
(3-1) 4, e
(1+1)
**
(5-2) 8. Voc tambm pode usar parnteses para tornar uma expresso mais fcil de ler, como em
(minuto
*
100) / 60, ainda que isso no altere o resultado.
E: Exponenciao ou potenciao tem a prxima precedncia mais alta, assim 2
**
1+1 3 e no 4, e 3
*
1
**
3
3 e no 27.
MDAS: Multiplicao e Diviso tm a mesma precedncia, que mais alta do que a da Adio e da Subtrao,
que tambm tm a mesma precedncia. Assim 2
*
3-1 d 5 em vez de 4, e 2/3-1 -1, no 1 (lembre-se de
que na diviso inteira, 2/3=0).
Operadores com a mesma precedncia so avaliados da esquerda para a direita. Assim, na expresso
minuto
*
100/60, a multiplicao acontece primeiro, resultando em 5900/60, o que se transforma pro-
duzindo 98. Se as operaes tivessem sido avaliadas da direita para a esquerda, o resultado poderia ter sido
59
*
1, que 59, que est errado.
4.8 2.8 Operaes com strings
De maneira geral, voc no pode executar operaes matemticas em strings, ainda que as strings se paream com
nmeros. O que segue invlido (assumindo que mensagem do tipo string):
mensagem-1
"Al"/123
mensagem
*
"Al"
"15"+2
Interessante o operador +, que funciona com strings, embora ele no faa exatamente o que voc poderia esperar.
Para strings, o operador + representa concatenao, que signica juntar os dois operandos ligando-os pelos extremos.
Por exemplo:
fruta = "banana"
assada = " com canela"
print fruta + assada
A sada deste programa banana com canela. O espao antes da palavra com parte da string e necessrio
para produzir o espao entre as strings concatenadas.
O operador
*
tambm funciona com strings; ele realiza repetio. Por exemplo, "Legal"
*
3
"LegalLegaLegal". Um dos operadores tem que ser uma string; o outro tem que ser um inteiro.
Por um lado, esta interpretao de + e
*
faz sentido pela analogia entre adio e multiplicao. Assim como 4
*
3
equivale a 4+4+4, no de estranhar que "Legal"
*
3 seja o mesmo que "Legal"+"Legal"+"Legal". Por
outro lado, uma diferena signicativa separa concatenao e repetio de adio e multiplicao. Voc saberia men-
cionar uma propriedade da adio e da multiplicao que no ocorre na concatenao e na repetio?
22 Captulo 4. Captulo 2: Variveis, expresses e comandos
Aprenda Computao com Python Documentation, Verso 1.1
4.7 2.7 Ordem dos operadores
Quando mais de um operador aparece em uma expresso, a ordem de avaliao depende das regras de precedncia.
Python segue as mesmas regras de precedncia para seus operadores matemticos que a matemtica. O acrnimo
PEMDAS uma maneira prtica de lembrar a ordem das operaes:
P: Parnteses tm a mais alta precedncia e podem ser usados para forar uma expresso a ser avaliada
na ordem que voc quiser. J que expresses entre parnteses so avaliadas primeiro, 2
*
(3-1) 4, e
(1+1)
**
(5-2) 8. Voc tambm pode usar parnteses para tornar uma expresso mais fcil de ler, como em
(minuto
*
100) / 60, ainda que isso no altere o resultado.
E: Exponenciao ou potenciao tem a prxima precedncia mais alta, assim 2
**
1+1 3 e no 4, e 3
*
1
**
3
3 e no 27.
MDAS: Multiplicao e Diviso tm a mesma precedncia, que mais alta do que a da Adio e da Subtrao,
que tambm tm a mesma precedncia. Assim 2
*
3-1 d 5 em vez de 4, e 2/3-1 -1, no 1 (lembre-se de
que na diviso inteira, 2/3=0).
Operadores com a mesma precedncia so avaliados da esquerda para a direita. Assim, na expresso
minuto
*
100/60, a multiplicao acontece primeiro, resultando em 5900/60, o que se transforma pro-
duzindo 98. Se as operaes tivessem sido avaliadas da direita para a esquerda, o resultado poderia ter sido
59
*
1, que 59, que est errado.
4.8 2.8 Operaes com strings
De maneira geral, voc no pode executar operaes matemticas em strings, ainda que as strings se paream com
nmeros. O que segue invlido (assumindo que mensagem do tipo string):
mensagem-1
"Al"/123
mensagem
*
"Al"
"15"+2
Interessante o operador +, que funciona com strings, embora ele no faa exatamente o que voc poderia esperar.
Para strings, o operador + representa concatenao, que signica juntar os dois operandos ligando-os pelos extremos.
Por exemplo:
fruta = "banana"
assada = " com canela"
print fruta + assada
A sada deste programa banana com canela. O espao antes da palavra com parte da string e necessrio
para produzir o espao entre as strings concatenadas.
O operador
*
tambm funciona com strings; ele realiza repetio. Por exemplo, "Legal"
*
3
"LegalLegaLegal". Um dos operadores tem que ser uma string; o outro tem que ser um inteiro.
Por um lado, esta interpretao de + e
*
faz sentido pela analogia entre adio e multiplicao. Assim como 4
*
3
equivale a 4+4+4, no de estranhar que "Legal"
*
3 seja o mesmo que "Legal"+"Legal"+"Legal". Por
outro lado, uma diferena signicativa separa concatenao e repetio de adio e multiplicao. Voc saberia men-
cionar uma propriedade da adio e da multiplicao que no ocorre na concatenao e na repetio?
22 Captulo 4. Captulo 2: Variveis, expresses e comandos
Conversoentre<pos
Intconverteumvalorparainteiro
Inttambmconvertepontoutuanteparainteiro

Afunooatconverteinteirosestringsemnmerosempontoutuante

afunostrconverteparao-postring
Paraconverterastringemumvalornumrico,u-liza-seafuno:
eval(1234)
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
10
Aprenda Computao com Python Documentation, Verso 1.1
Como outro exemplo, a funo id recebe um valor ou uma varivel e retorna um inteiro, que atua como um identi-
cador nico para aquele valor:
>>> id(3)
134882108
>>> bia = 3
>>> bia(beth)
134882108
Todo valor temumid, que umnmero nico relacionado ao local onde ele est guardado na memria do computador.
O id de uma varivel o id do valor a qual ela se refere.
5.2 3.2 Converso entre tipos
Python prov uma coleo de funes nativas que convertem valores de um tipo em outro. A funo int recebe um
valor e o converte para inteiro, se possvel, ou, se no, reclama:
>>> int(32)
32
>>> int(Al)
ValueError: invalid literal for int() : Al
int tambm pode converter valores em ponto utuante para inteiro, mas lembre que isso trunca a parte fracionria:
>>> int(3.99999)
3
>>> int(-2.3)
-2
A funo float converte inteiros e strings em nmeros em ponto utuante:
>>> float(32)
32.0
>>> float(3.14159)
3.14159
Finalmente, a funo str converte para o tipo string:
>>> str(32)
32
>>> str(3.14149)
3.14149
Pode parecer curioso que Python faa distino entre o valor inteiro 1 e o valor em ponto utuante 1.0. Eles podem
representar o mesmo nmero, mas pertencem a tipos diferentes. A razo que eles so representados de modo
diferente dentro do computador.
5.3 3.3 Coero entre tipos
Agora que podemos converter entre tipos, temos outra maneira de lidar com a diviso inteira. Voltando ao exemplo do
captulo anterior, suponha que queiramos calcular a frao de hora que j passou. A expresso mais bvia, minuto
/ 60, faz aritmtica inteira, assim, o resultado sempre 0, mesmo aos 59 minutos passados da hora.
Uma soluo converter minuto para ponto utuante e fazer a diviso em ponto utuante:
26 Captulo 5. Captulo 3: Funes
Aprenda Computao com Python Documentation, Verso 1.1
Como outro exemplo, a funo id recebe um valor ou uma varivel e retorna um inteiro, que atua como um identi-
cador nico para aquele valor:
>>> id(3)
134882108
>>> bia = 3
>>> bia(beth)
134882108
Todo valor temumid, que umnmero nico relacionado ao local onde ele est guardado na memria do computador.
O id de uma varivel o id do valor a qual ela se refere.
5.2 3.2 Converso entre tipos
Python prov uma coleo de funes nativas que convertem valores de um tipo em outro. A funo int recebe um
valor e o converte para inteiro, se possvel, ou, se no, reclama:
>>> int(32)
32
>>> int(Al)
ValueError: invalid literal for int() : Al
int tambm pode converter valores em ponto utuante para inteiro, mas lembre que isso trunca a parte fracionria:
>>> int(3.99999)
3
>>> int(-2.3)
-2
A funo float converte inteiros e strings em nmeros em ponto utuante:
>>> float(32)
32.0
>>> float(3.14159)
3.14159
Finalmente, a funo str converte para o tipo string:
>>> str(32)
32
>>> str(3.14149)
3.14149
Pode parecer curioso que Python faa distino entre o valor inteiro 1 e o valor em ponto utuante 1.0. Eles podem
representar o mesmo nmero, mas pertencem a tipos diferentes. A razo que eles so representados de modo
diferente dentro do computador.
5.3 3.3 Coero entre tipos
Agora que podemos converter entre tipos, temos outra maneira de lidar com a diviso inteira. Voltando ao exemplo do
captulo anterior, suponha que queiramos calcular a frao de hora que j passou. A expresso mais bvia, minuto
/ 60, faz aritmtica inteira, assim, o resultado sempre 0, mesmo aos 59 minutos passados da hora.
Uma soluo converter minuto para ponto utuante e fazer a diviso em ponto utuante:
26 Captulo 5. Captulo 3: Funes
Aprenda Computao com Python Documentation, Verso 1.1
Como outro exemplo, a funo id recebe um valor ou uma varivel e retorna um inteiro, que atua como um identi-
cador nico para aquele valor:
>>> id(3)
134882108
>>> bia = 3
>>> bia(beth)
134882108
Todo valor temumid, que umnmero nico relacionado ao local onde ele est guardado na memria do computador.
O id de uma varivel o id do valor a qual ela se refere.
5.2 3.2 Converso entre tipos
Python prov uma coleo de funes nativas que convertem valores de um tipo em outro. A funo int recebe um
valor e o converte para inteiro, se possvel, ou, se no, reclama:
>>> int(32)
32
>>> int(Al)
ValueError: invalid literal for int() : Al
int tambm pode converter valores em ponto utuante para inteiro, mas lembre que isso trunca a parte fracionria:
>>> int(3.99999)
3
>>> int(-2.3)
-2
A funo float converte inteiros e strings em nmeros em ponto utuante:
>>> float(32)
32.0
>>> float(3.14159)
3.14159
Finalmente, a funo str converte para o tipo string:
>>> str(32)
32
>>> str(3.14149)
3.14149
Pode parecer curioso que Python faa distino entre o valor inteiro 1 e o valor em ponto utuante 1.0. Eles podem
representar o mesmo nmero, mas pertencem a tipos diferentes. A razo que eles so representados de modo
diferente dentro do computador.
5.3 3.3 Coero entre tipos
Agora que podemos converter entre tipos, temos outra maneira de lidar com a diviso inteira. Voltando ao exemplo do
captulo anterior, suponha que queiramos calcular a frao de hora que j passou. A expresso mais bvia, minuto
/ 60, faz aritmtica inteira, assim, o resultado sempre 0, mesmo aos 59 minutos passados da hora.
Uma soluo converter minuto para ponto utuante e fazer a diviso em ponto utuante:
26 Captulo 5. Captulo 3: Funes
Aprenda Computao com Python Documentation, Verso 1.1
Como outro exemplo, a funo id recebe um valor ou uma varivel e retorna um inteiro, que atua como um identi-
cador nico para aquele valor:
>>> id(3)
134882108
>>> bia = 3
>>> bia(beth)
134882108
Todo valor temumid, que umnmero nico relacionado ao local onde ele est guardado na memria do computador.
O id de uma varivel o id do valor a qual ela se refere.
5.2 3.2 Converso entre tipos
Python prov uma coleo de funes nativas que convertem valores de um tipo em outro. A funo int recebe um
valor e o converte para inteiro, se possvel, ou, se no, reclama:
>>> int(32)
32
>>> int(Al)
ValueError: invalid literal for int() : Al
int tambm pode converter valores em ponto utuante para inteiro, mas lembre que isso trunca a parte fracionria:
>>> int(3.99999)
3
>>> int(-2.3)
-2
A funo float converte inteiros e strings em nmeros em ponto utuante:
>>> float(32)
32.0
>>> float(3.14159)
3.14159
Finalmente, a funo str converte para o tipo string:
>>> str(32)
32
>>> str(3.14149)
3.14149
Pode parecer curioso que Python faa distino entre o valor inteiro 1 e o valor em ponto utuante 1.0. Eles podem
representar o mesmo nmero, mas pertencem a tipos diferentes. A razo que eles so representados de modo
diferente dentro do computador.
5.3 3.3 Coero entre tipos
Agora que podemos converter entre tipos, temos outra maneira de lidar com a diviso inteira. Voltando ao exemplo do
captulo anterior, suponha que queiramos calcular a frao de hora que j passou. A expresso mais bvia, minuto
/ 60, faz aritmtica inteira, assim, o resultado sempre 0, mesmo aos 59 minutos passados da hora.
Uma soluo converter minuto para ponto utuante e fazer a diviso em ponto utuante:
26 Captulo 5. Captulo 3: Funes
Operadores
ExpressesBooleanas
Ooperador==comparadoisvalores
eproduzumaexpressobooleana
Ooperador==umdosoperadores
decomparao;osoutrosso
Operadoreslgicos
Existemtrsoperadoreslgicos:
and,or,not(e,ou,no).
Porexemplo,x>0andx<10
verdadeirosomentesexfor
maiorque0emenorque10.
EmPython,qualquernmero
diferentedezerointerpretado
comoverdadeiro(True)
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
11
Aprenda Computao com Python Documentation, Verso 1.1
O operador mdulo se revela surpreendentemente til. Por exemplo, voc pode checar se um nmero divisvel por
outro - se x % y d zero, ento x divisvel por y.
Voc tambm pode extrair o algarismo ou algarismos mais direita de um nmero. Por exemplo, x % 10 resulta o
algarismo mais direita de x (na base 10). Similarmente, x % 100 resulta nos dois dgitos mais direita.
6.2 4.2 Expresses booleanas
Uma expresso booleana uma expresso que verdadeira (True) ou falsa (False). Em Python, uma expresso que
verdadeira tem o valor 1, e uma expresso que falsa tem o valor 0.
O operador == compara dois valores e produz uma expresso booleana:
>>> 5 == 5
True
>>> 5 == 6
False
No primeiro comando, os dois operadores so iguais, ento a expresso avalia como True (verdadeiro); no segundo
comando, 5 no igual a 6, ento temos False (falso).
O operador == um dos operadores de comparao; os outros so:
x != y # x diferente de y
x > y # x maior que y
x < y # x menor que y
x >= y # x maior ou igual a y
x <= y # x menor ou igual a y
Embora esses operadores provavelmente sejam familiares a voc, os smbolos em Python so diferentes dos smbolos
da matemtica. Um erro comum usar um sinal de igual sozinho (=) em vez de um duplo (==). Lembre-se de que =
um operador de atribuio e == um operador de comparao. Tambm no existem coisas como =< ou =>.
6.3 4.3 Operadores lgicos
Existem trs operadores lgicos: and, or, not (e, ou, no). A semntica (signicado) destes operadores similar
aos seus signicados em ingls (ou portugus). Por exemplo, x > 0 and x < 10 verdadeiro somente se x for
maior que 0 e menor que 10.
n%2 == 0 or n%3 == 0 verdadeiro se qualquer das condies for verdadeira, quer dizer, se o nmero n for
divisvel por 2 ou por 3.
Finalmente, o operador lgico not nega uma expresso booleana, assim, not(x > y) verdadeiro se (x > y)
for falso, quer dizer, se x for menor ou igual a y.
A rigor, os operandos de operadores lgicos deveriam ser expresses booleanas, mas Python no muito rigoroso.
Qualquer nmero diferente de zero interpretado como verdadeiro (True):
>>> x = 5
>>> x and 1
1
>>> y = 0
>>> y and 1
0
Em geral, esse tipo de coisa no considerado de bom estilo. Se voc precisa comparar um valor com zero, deve
faz-lo explicitamente.
36 Captulo 6. Captulo 4: Condicionais e recursividade
Aprenda Computao com Python Documentation, Verso 1.1
O operador mdulo se revela surpreendentemente til. Por exemplo, voc pode checar se um nmero divisvel por
outro - se x % y d zero, ento x divisvel por y.
Voc tambm pode extrair o algarismo ou algarismos mais direita de um nmero. Por exemplo, x % 10 resulta o
algarismo mais direita de x (na base 10). Similarmente, x % 100 resulta nos dois dgitos mais direita.
6.2 4.2 Expresses booleanas
Uma expresso booleana uma expresso que verdadeira (True) ou falsa (False). Em Python, uma expresso que
verdadeira tem o valor 1, e uma expresso que falsa tem o valor 0.
O operador == compara dois valores e produz uma expresso booleana:
>>> 5 == 5
True
>>> 5 == 6
False
No primeiro comando, os dois operadores so iguais, ento a expresso avalia como True (verdadeiro); no segundo
comando, 5 no igual a 6, ento temos False (falso).
O operador == um dos operadores de comparao; os outros so:
x != y # x diferente de y
x > y # x maior que y
x < y # x menor que y
x >= y # x maior ou igual a y
x <= y # x menor ou igual a y
Embora esses operadores provavelmente sejam familiares a voc, os smbolos em Python so diferentes dos smbolos
da matemtica. Um erro comum usar um sinal de igual sozinho (=) em vez de um duplo (==). Lembre-se de que =
um operador de atribuio e == um operador de comparao. Tambm no existem coisas como =< ou =>.
6.3 4.3 Operadores lgicos
Existem trs operadores lgicos: and, or, not (e, ou, no). A semntica (signicado) destes operadores similar
aos seus signicados em ingls (ou portugus). Por exemplo, x > 0 and x < 10 verdadeiro somente se x for
maior que 0 e menor que 10.
n%2 == 0 or n%3 == 0 verdadeiro se qualquer das condies for verdadeira, quer dizer, se o nmero n for
divisvel por 2 ou por 3.
Finalmente, o operador lgico not nega uma expresso booleana, assim, not(x > y) verdadeiro se (x > y)
for falso, quer dizer, se x for menor ou igual a y.
A rigor, os operandos de operadores lgicos deveriam ser expresses booleanas, mas Python no muito rigoroso.
Qualquer nmero diferente de zero interpretado como verdadeiro (True):
>>> x = 5
>>> x and 1
1
>>> y = 0
>>> y and 1
0
Em geral, esse tipo de coisa no considerado de bom estilo. Se voc precisa comparar um valor com zero, deve
faz-lo explicitamente.
36 Captulo 6. Captulo 4: Condicionais e recursividade
Aprenda Computao com Python Documentation, Verso 1.1
O operador mdulo se revela surpreendentemente til. Por exemplo, voc pode checar se um nmero divisvel por
outro - se x % y d zero, ento x divisvel por y.
Voc tambm pode extrair o algarismo ou algarismos mais direita de um nmero. Por exemplo, x % 10 resulta o
algarismo mais direita de x (na base 10). Similarmente, x % 100 resulta nos dois dgitos mais direita.
6.2 4.2 Expresses booleanas
Uma expresso booleana uma expresso que verdadeira (True) ou falsa (False). Em Python, uma expresso que
verdadeira tem o valor 1, e uma expresso que falsa tem o valor 0.
O operador == compara dois valores e produz uma expresso booleana:
>>> 5 == 5
True
>>> 5 == 6
False
No primeiro comando, os dois operadores so iguais, ento a expresso avalia como True (verdadeiro); no segundo
comando, 5 no igual a 6, ento temos False (falso).
O operador == um dos operadores de comparao; os outros so:
x != y # x diferente de y
x > y # x maior que y
x < y # x menor que y
x >= y # x maior ou igual a y
x <= y # x menor ou igual a y
Embora esses operadores provavelmente sejam familiares a voc, os smbolos em Python so diferentes dos smbolos
da matemtica. Um erro comum usar um sinal de igual sozinho (=) em vez de um duplo (==). Lembre-se de que =
um operador de atribuio e == um operador de comparao. Tambm no existem coisas como =< ou =>.
6.3 4.3 Operadores lgicos
Existem trs operadores lgicos: and, or, not (e, ou, no). A semntica (signicado) destes operadores similar
aos seus signicados em ingls (ou portugus). Por exemplo, x > 0 and x < 10 verdadeiro somente se x for
maior que 0 e menor que 10.
n%2 == 0 or n%3 == 0 verdadeiro se qualquer das condies for verdadeira, quer dizer, se o nmero n for
divisvel por 2 ou por 3.
Finalmente, o operador lgico not nega uma expresso booleana, assim, not(x > y) verdadeiro se (x > y)
for falso, quer dizer, se x for menor ou igual a y.
A rigor, os operandos de operadores lgicos deveriam ser expresses booleanas, mas Python no muito rigoroso.
Qualquer nmero diferente de zero interpretado como verdadeiro (True):
>>> x = 5
>>> x and 1
1
>>> y = 0
>>> y and 1
0
Em geral, esse tipo de coisa no considerado de bom estilo. Se voc precisa comparar um valor com zero, deve
faz-lo explicitamente.
36 Captulo 6. Captulo 4: Condicionais e recursividade
Operadores
Aritm-cos
Operaes
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
12
Operadores
! Aritmticos: + Adio
- Subtrao
* Multiplicao
/ Diviso
** Exponenciao
" Operaes:
** Exponenciao
% Diviso modular (mod)
Operadores
! Aritmticos: + Adio
- Subtrao
* Multiplicao
/ Diviso
** Exponenciao
" Operaes:
** Exponenciao
% Diviso modular (mod)
Usandoosoperadores
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
13
Execuocondicional
Estruturaif:
Construo:
OBlocodeComandossserexecutadocasocondioseja
verdadeira.Casocontrrio,serdespresado.
Aestruturaifpodeseraninhadae/oucompostaporelif(elseif)e/
ouelse.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
14
Aprenda Computao com Python Documentation, Verso 1.1
6.4 4.4 Execuo condicional
Para poder escrever programas teis, quase sempre precisamos da habilidade de checar condies e mudar o compor-
tamento do programa de acordo com elas. As instrues condicionais nos do essa habilidade. A forma mais simples
a instruo if (se):
if x > 0
print "x positivo"
A expresso booleana depois da instruo if chamada de condio. Se ela verdadeira (true), ento a instruo
endentada executada. Se no, nada acontece.
Assim como outras instrues compostas, a instruo if constituda de um cabealho e de um bloco de instrues:
CABECALHO:
PRIMEIRO COMANDO
...
ULTIMO COMANDO
O cabealho comea com uma nova linha e termina com dois pontos (:). Os comandos ou instrues endentados que
seguem so chamados de bloco. A primeira instruo no endentada marca o m do bloco. Um bloco de comandos
dentro de um comando composto ou instruo composta chamado de corpo do comando.
No existe limite para o nmero de instrues que podem aparecer no corpo de uma instruo if, mas tem que haver
pelo menos uma. Ocasionalmente, til ter um corpo sem nenhuma instruo (usualmente, como um delimitador de
espao para cdigo que voc ainda no escreveu). Nesse caso, voc pode usar o comando pass, que indica ao Python:
passe por aqui sem fazer nada.
6.5 4.5 Execuo alternativa
Um segundo formato da instruo if a execuo alternativa, na qual existem duas possibilidades e a condio
determina qual delas ser executada. A sintaxe se parece com:
if x % 2 == 0:
print x, " par"
else:
print x, " impar"
Se o resto da diviso de x por 2 for 0, ento sabemos que x par, e o programa exibe a mensagem para esta condio.
Se a condio falsa, o segundo grupo de instrues executado. Desde que a condio deva ser verdadeira (True) ou
falsa (False), precisamente uma das alternativas vai ser executada. As alternativas so chamadas ramos (branches),
porque existem ramicaes no uxo de execuo.
Por nal, se voc precisa checar a paridade de nmeros com frequncia, pode colocar este cdigo dentro de uma
funo:
def imprimeParidade(x):
if x % 2 == 0:
print x, " par"
else:
print x, " impar"
Para qualquer valor de x, imprimeParidade exibe uma mensagem apropriada. Quando voc a chama, pode
fornecer uma expresso de resultado inteiro como um argumento:
>>> imprimeParidade(17)
>>> imprimeParidade(y+1)
6.4. 4.4 Execuo condicional 37
Aprenda Computao com Python Documentation, Verso 1.1
6.6 4.6 Condicionais encadeados
s vezes existem mais de duas possibilidades e precisamos de mais que dois ramos. Uma condicional encadeada
uma maneira de expressar uma operao dessas:
if x < y:
print x, " menor que", y
elif x > y:
print x, " maior que", y
else:
print x, "e", y, "so iguais"
elif uma abreviao de else if (seno se). De novo, precisamente um ramo ser executado. No existe limite
para o nmero de instrues elif, mas se existir uma instruo else ela tem que vir por ltimo:
if escolha == A:
funcaoA()
elif escolha == B:
funcaoB()
elif escolha == C:
funcaoC()
else:
print "Escolha invlida."
Cada condio checada na ordem. Se a primeira falsa, a prxima checada, e assim por diante. Se uma delas
verdadeira, o ramo correspondente executado, e a instruo termina. Mesmo que mais de uma condio seja
verdadeira, apenas o primeiro ramo verdadeiro executa.
Como exerccio, coloque os exemplos acima em funes chamadas comparar(x, y) e
executar(escolha).
6.7 4.7 Condicionais aninhados
Um condicional tambm pode ser aninhado dentro de outra. Poderamos ter escrito o exemplo tricotmico (dividido
em trs) como segue:
if x == y:
print x, "e", y, "so iguais"
else:
if x < y:
print x, " menor que", y
else:
print x, " maior que", y
O condicional mais externo tem dois ramos. O primeiro ramo contm uma nica instruo de sada. O segundo ramo
contm outra instruo if, que por sua vez tem dois ramos. Os dois ramos so ambos instrues de sada, embora
pudessem conter instrues condicionais tambm.
Embora a endentao das instrues torne a estrutura aparente, condicionais aninhados tornam-se difceis de ler rapi-
damente. Em geral, uma boa ideia evitar o aninhamento quando for possvel.
Operadores lgicos frequentemente fornecem uma maneira de simplicar instrues condicionais aninhadas. Por
exemplo, podemos reescrever o cdigo a seguir usando uma nica condicional:
if 0 < x:
if x < 10:
print "x um nmero positivo de um s algarismo."
38 Captulo 6. Captulo 4: Condicionais e recursividade
Aprenda Computao com Python Documentation, Verso 1.1
6.6 4.6 Condicionais encadeados
s vezes existem mais de duas possibilidades e precisamos de mais que dois ramos. Uma condicional encadeada
uma maneira de expressar uma operao dessas:
if x < y:
print x, " menor que", y
elif x > y:
print x, " maior que", y
else:
print x, "e", y, "so iguais"
elif uma abreviao de else if (seno se). De novo, precisamente um ramo ser executado. No existe limite
para o nmero de instrues elif, mas se existir uma instruo else ela tem que vir por ltimo:
if escolha == A:
funcaoA()
elif escolha == B:
funcaoB()
elif escolha == C:
funcaoC()
else:
print "Escolha invlida."
Cada condio checada na ordem. Se a primeira falsa, a prxima checada, e assim por diante. Se uma delas
verdadeira, o ramo correspondente executado, e a instruo termina. Mesmo que mais de uma condio seja
verdadeira, apenas o primeiro ramo verdadeiro executa.
Como exerccio, coloque os exemplos acima em funes chamadas comparar(x, y) e
executar(escolha).
6.7 4.7 Condicionais aninhados
Um condicional tambm pode ser aninhado dentro de outra. Poderamos ter escrito o exemplo tricotmico (dividido
em trs) como segue:
if x == y:
print x, "e", y, "so iguais"
else:
if x < y:
print x, " menor que", y
else:
print x, " maior que", y
O condicional mais externo tem dois ramos. O primeiro ramo contm uma nica instruo de sada. O segundo ramo
contm outra instruo if, que por sua vez tem dois ramos. Os dois ramos so ambos instrues de sada, embora
pudessem conter instrues condicionais tambm.
Embora a endentao das instrues torne a estrutura aparente, condicionais aninhados tornam-se difceis de ler rapi-
damente. Em geral, uma boa ideia evitar o aninhamento quando for possvel.
Operadores lgicos frequentemente fornecem uma maneira de simplicar instrues condicionais aninhadas. Por
exemplo, podemos reescrever o cdigo a seguir usando uma nica condicional:
if 0 < x:
if x < 10:
print "x um nmero positivo de um s algarismo."
38 Captulo 6. Captulo 4: Condicionais e recursividade
elifaabreviaodeelseif
Condicionaisaninhados
Ainstruoreturn
Ocomandoreturnpermiteterminaraexecuodeuma
funoantesqueelaalcanceseum.Umarazoparaus-lo
sevocdetectarumacondiodeerro
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
15
Aprenda Computao com Python Documentation, Verso 1.1
A instruo print executada somente se a zermos passar por ambos os condicionais, ento, podemos usar um
operador and:
if 0 < x and x < 10:
print "x um nmero positivo de um s algarismo."
Esses tipos de condies so comuns, assim, Python prov uma sintaxe alternativa que similar notao matemtica:
if 0 < x < 10:
print "x um nmero positivo de um s algarismo."
6.8 4.8 A instruo return
O comando return permite terminar a execuo de uma funo antes que ela alcance seu m. Uma razo para us-lo
se voc detectar uma condio de erro:
import math
def imprimeLogaritmo(x):
if x <= 0:
print "Somente nmeros positivos, por favor."
return
resultado = math.log(x)
print "O log de x ", resultado
A funo imprimeLogaritmo recebe um parmetro de nome x. A primeira coisa que ela faz checar se x menor
ou igual a 0, neste caso ela exibe uma mensagem de erro e ento usa return para sair da funo. O uxo de execuo
imediatamente retorna ao ponto chamador, quer dizer, de onde a funo foi chamada, e as linhas restantes da funo
no so executadas.
Lembre-se que para usar uma funo do mdulo de matemtica, math, voc tem de import-lo.
6.9 4.9 Recursividade
J mencionamos que vlido uma funo chamar outra funo, e voc viu vrios exemplos disso. Mas ainda no
tnhamos dito que tambm vlido uma funo chamar a si mesma. Talvez no seja bvio porque isso bom, mas
trata-se de uma das coisas mais mgicas e interessantes que um programa pode fazer. Por exemplo, d uma olhada na
seguinte funo:
def contagemRegressiva(n):
if n == 0:
print "Fogo!"
else:
print n
contagemRegressiva(n-1)
contagemRegressiva espera que o parmetro, n, seja um inteiro positivo. Se n for 0, ela produz como
sada a palavra Fogo!. De outro modo, ela produz como sada n e ento chama uma funo de nome
contagemRegressiva ela mesma passando n-1 como argumento.
O que acontece se chamarmos essa funo da seguinte maneira:
>>> contagemRegressiva(3)
6.8. 4.8 A instruo return 39
Recursividade
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
16
Aprenda Computao com Python Documentation, Verso 1.1
A instruo print executada somente se a zermos passar por ambos os condicionais, ento, podemos usar um
operador and:
if 0 < x and x < 10:
print "x um nmero positivo de um s algarismo."
Esses tipos de condies so comuns, assim, Python prov uma sintaxe alternativa que similar notao matemtica:
if 0 < x < 10:
print "x um nmero positivo de um s algarismo."
6.8 4.8 A instruo return
O comando return permite terminar a execuo de uma funo antes que ela alcance seu m. Uma razo para us-lo
se voc detectar uma condio de erro:
import math
def imprimeLogaritmo(x):
if x <= 0:
print "Somente nmeros positivos, por favor."
return
resultado = math.log(x)
print "O log de x ", resultado
A funo imprimeLogaritmo recebe um parmetro de nome x. A primeira coisa que ela faz checar se x menor
ou igual a 0, neste caso ela exibe uma mensagem de erro e ento usa return para sair da funo. O uxo de execuo
imediatamente retorna ao ponto chamador, quer dizer, de onde a funo foi chamada, e as linhas restantes da funo
no so executadas.
Lembre-se que para usar uma funo do mdulo de matemtica, math, voc tem de import-lo.
6.9 4.9 Recursividade
J mencionamos que vlido uma funo chamar outra funo, e voc viu vrios exemplos disso. Mas ainda no
tnhamos dito que tambm vlido uma funo chamar a si mesma. Talvez no seja bvio porque isso bom, mas
trata-se de uma das coisas mais mgicas e interessantes que um programa pode fazer. Por exemplo, d uma olhada na
seguinte funo:
def contagemRegressiva(n):
if n == 0:
print "Fogo!"
else:
print n
contagemRegressiva(n-1)
contagemRegressiva espera que o parmetro, n, seja um inteiro positivo. Se n for 0, ela produz como
sada a palavra Fogo!. De outro modo, ela produz como sada n e ento chama uma funo de nome
contagemRegressiva ela mesma passando n-1 como argumento.
O que acontece se chamarmos essa funo da seguinte maneira:
>>> contagemRegressiva(3)
6.8. 4.8 A instruo return 39
Ateno,cuidadocomarecursividadeinnita!
Entradapeloteclado
Pythonfornecefunesna-vasquepegamentradaspeloteclado:raw_input
Quandoestafunochamada,oprogramapraeesperaqueousuriodigitealgumacoisa.
QuandoousurioapertaateclaEnterouReturn,oprogramaprossegueeafunoraw_input
retornaoqueousuriodigitoucomoumastring
Seesperamosqueaentradasejauminteiro,podemosusarafunoinput
Infelizmente,seousuriodigitarumcaracterequenosejaumnmero,o
programatrava
Paraevitaresse-podeerro,geralmentebomusarraw_inputparapegar
umastringe,ento,usarfunesdeconversoparaconverterparaoutros
-pos.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
17
Aprenda Computao com Python Documentation, Verso 1.1
6.12 4.12 Entrada pelo teclado
Os programas que temos escrito at agora so um pouco crus, no sentido de no aceitarem dados entrados pelo usurio.
Eles simplesmente fazem a mesma coisa todas as vezes.
Python fornece funes nativas que pegam entradas pelo teclado. A mais simples chamada raw_input. Quando
esta funo chamada, o programa pra e espera que o usurio digite alguma coisa. Quando o usurio aperta a tecla
Enter ou Return, o programa prossegue e a funo raw_input retorna o que o usurio digitou como uma string:
>>> entrada = raw_input()
O que voc est esperando?
>>> print entrada
O que voc est esperando?
Antes de chamar raw_input, uma boa ideia exibir uma mensagem dizendo ao usurio o que ele deve entrar. Esta
mensagem uma como se fosse uma pergunta (prompt). Esta pergunta pode ser enviada como um argumento para
raw_input:
>>> nome = raw_input("Qual... o seu nome? ")
Qual... o seu nome? Arthur, Rei dos Bretes!
>>> print nome
Arthur, Rei dos Bretes!
Se esperamos que a entrada seja um inteiro, podemos usar a funo input:
pergunta = "Qual... a velocidade de vo de uma andorinha?\n"
velocidade = input(pergunta)
Se o usurio digita uma string de nmeros, ela convertida para um inteiro e atribuda a velocidade. Infelizmente,
se o usurio digitar um caractere que no seja um nmero, o programa trava:
>>> velocidade = input(pergunta)
Qual... a velocidade de vo de uma andorinha?
De qual voc fala, uma andorinha Africana ou uma Europeia?
SyntaxError: invalid syntax
Para evitar esse tipo de erro, geralmente bom usar raw_input para pegar uma string e, ento, usar funes de
converso para converter para outros tipos.
6.13 4.13 Glossrio
aninhamento (nesting) Estrutura de programa dentro da outra, como um comando condicional dentro de um bloco
de outro comando condicional.
bloco (block) Grupo de comandos consecutivos com a mesma endentao.
caso base (base case) Bloco de comando condicional numa funo recursiva que no resulta em uma chamada recur-
siva.
comando composto (compound statement) Comando que consiste de um cabealho e um corpo. O cabealho ter-
mina com um dois-pontos (:). O corpo endentado em relao ao cabealho.
comando condicional (conditional statement) Comando que controla o uxo de execuo dependendo de alguma
condio.
condio (condition) A expresso booleana que determina qual bloco ser executado num comando condicional.
corpo (body) O bloco que se segue ao cabealho em um comando composto.
42 Captulo 6. Captulo 4: Condicionais e recursividade
Aprenda Computao com Python Documentation, Verso 1.1
6.12 4.12 Entrada pelo teclado
Os programas que temos escrito at agora so um pouco crus, no sentido de no aceitarem dados entrados pelo usurio.
Eles simplesmente fazem a mesma coisa todas as vezes.
Python fornece funes nativas que pegam entradas pelo teclado. A mais simples chamada raw_input. Quando
esta funo chamada, o programa pra e espera que o usurio digite alguma coisa. Quando o usurio aperta a tecla
Enter ou Return, o programa prossegue e a funo raw_input retorna o que o usurio digitou como uma string:
>>> entrada = raw_input()
O que voc est esperando?
>>> print entrada
O que voc est esperando?
Antes de chamar raw_input, uma boa ideia exibir uma mensagem dizendo ao usurio o que ele deve entrar. Esta
mensagem uma como se fosse uma pergunta (prompt). Esta pergunta pode ser enviada como um argumento para
raw_input:
>>> nome = raw_input("Qual... o seu nome? ")
Qual... o seu nome? Arthur, Rei dos Bretes!
>>> print nome
Arthur, Rei dos Bretes!
Se esperamos que a entrada seja um inteiro, podemos usar a funo input:
pergunta = "Qual... a velocidade de vo de uma andorinha?\n"
velocidade = input(pergunta)
Se o usurio digita uma string de nmeros, ela convertida para um inteiro e atribuda a velocidade. Infelizmente,
se o usurio digitar um caractere que no seja um nmero, o programa trava:
>>> velocidade = input(pergunta)
Qual... a velocidade de vo de uma andorinha?
De qual voc fala, uma andorinha Africana ou uma Europeia?
SyntaxError: invalid syntax
Para evitar esse tipo de erro, geralmente bom usar raw_input para pegar uma string e, ento, usar funes de
converso para converter para outros tipos.
6.13 4.13 Glossrio
aninhamento (nesting) Estrutura de programa dentro da outra, como um comando condicional dentro de um bloco
de outro comando condicional.
bloco (block) Grupo de comandos consecutivos com a mesma endentao.
caso base (base case) Bloco de comando condicional numa funo recursiva que no resulta em uma chamada recur-
siva.
comando composto (compound statement) Comando que consiste de um cabealho e um corpo. O cabealho ter-
mina com um dois-pontos (:). O corpo endentado em relao ao cabealho.
comando condicional (conditional statement) Comando que controla o uxo de execuo dependendo de alguma
condio.
condio (condition) A expresso booleana que determina qual bloco ser executado num comando condicional.
corpo (body) O bloco que se segue ao cabealho em um comando composto.
42 Captulo 6. Captulo 4: Condicionais e recursividade
DenindoFunesemPython
Nocontextodeprogramao,funoumasequncianomeadade
instruesoucomandos,querealizamumaoper-aodesejada.

Algumasfunesrequeremargumentos,aquelesvaloresquecontrolam
comoafunofazseutrabalho
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
18
Aprenda Computao com Python Documentation, Verso 1.1
5.5 3.5 Composio
Do mesmo modo como nas funes matemticas, as funes do Python podem ser compostas, o que signica que voc
pode usar uma expresso como parte de outra. Por exemplo, voc pode usar qualquer expresso como um argumento
para uma funo:
>>> x = math.cos(angulo + pi/2)
Esta instruo toma o valor de pi, divide-o por 2, e soma o resultado ao valor de angulo. A soma ento passada
como um argumento para a funo cos.
Voc tambm pode pegar o resultado de uma funo e pass-lo como um argumento para outra:
>>> x = math.exp(math.log(10.0))
Esta instruo encontra o logaritmo natural (base e) de 10 e ento eleva e quela potncia. O resultado atribudo a
x.
5.6 3.6 Adicionando novas funes
At aqui, temos utilizado somente as funes que vm com Python, mas tambm possvel adicionar novas funes.
Criar novas funes para resolver seus prprios problemas uma das coisas mais teis de uma linguagem de progra-
mao de propsito geral.
No contexto de programao, funo uma sequncia nomeada de instrues ou comandos, que realizam uma oper-
ao desejada. Esta operao especicada numa denio de funo. At agora, as funes que usamos neste livro
so pr-denidas e suas denies no foram apresentadas. Isso demonstra que podemos usar funes sem ter que nos
preocupar com os detalhes de suas denies.
A sintaxe para uma denio de funo :
def NOME_DA_FUNCAO( LISTA DE PARAMETROS ) :
COMANDOS
Voc pode usar o nome que quiser para as funes que criar, exceto as palavras reservadas do Python. A lista de
parmetros especica que informao, se houver alguma, voc tem que fornecer para poder usar a nova funo.
Uma funo pode ter quantos comandos forem necessrios, mas eles precisam ser endentados a partir da margem
esquerda. Nos exemplos deste livro, usaremos uma endentao de dois espaos.
As primeiras funes que vamos mostrar no tero parmetros, ento, a sintaxe ter esta aparncia:
def novaLinha():
print
Esta funo chamada de novaLinha. Os parnteses vazios indicam que ela no tem parmetros. Contm apenas
um nico comando, que gera como sada um caractere de nova linha (isso o que acontece quando voc usa um
comando print sem qualquer argumento).
A sintaxe para a chamada desta nova funo a mesma sintaxe para as funes nativas:
print Primeira Linha.
novaLinha()
print Segunda Linha.
A sada deste programa :
28 Captulo 5. Captulo 3: Funes
Aprenda Computao com Python Documentation, Verso 1.1
tresLinhas()
print Segunda Linha.
Esse programa contm duas denies de funes: novaLinha e tresLinhas. Denies de funes so exe-
cutadas como quaisquer outros comandos, mas o efeito criar a nova funo. Os comandos dentro da denio da
funo no so executados at que a funo seja chamada, logo, a denio da funo no gera nenhuma sada.
Como voc j deve ter imaginado, preciso criar uma funo antes de poder execut-la. Emoutras palavras, a denio
da funo tem que ser executada antes que ela seja chamada pela primeira vez.
Como exerccio, mova as ltimas trs linhas deste programa para o topo, de modo que a chamada da
funo aparea antes das denies. Rode o programa e veja que mensagem de erro voc ter.
Tambm a ttulo de exerccio, comece com a verso que funciona do programa e mova a denio de
novaLinha para depois da denio de tresLinhas. O que acontece quando voc roda este pro-
grama?
5.8 3.8 Fluxo de execuo
Para assegurar que uma funo esteja denida antes do seu primeiro uso, preciso saber em que ordem os comandos
so executados, ou seja, descobrir qual o uxo de execuo do programa.
A execuo sempre comea com o primeiro comando do programa. Os comandos so executados um de cada vez,
pela ordem, de cima para baixo.
As denies de funo no alteram o uxo de execuo do programa, mas lembre-se que comandos dentro da funo
no so executados at a funo ser chamada. Embora no seja comum, voc pode denir uma funo dentro de outra.
Neste caso, a denio mais interna no executada at que a funo mais externa seja chamada.
Chamadas de funo so como um desvio no uxo de execuo. Em vez de ir para o prximo comando, o uxo salta
para a primeira linha da funo chamada, executa todos os comandos l e ento volta atrs para retomar de onde havia
deixado.
Parece muito simples, at a hora em que voc lembra que uma funo pode chamar outra. Enquanto estiver no meio
de uma funo, o programa poderia ter de executar os comandos em uma outra funo. Mas enquanto estivesse
executando esta nova funo, o programa poderia ter de executar ainda outra funo!
Felizmente, Python adepto de monitorar a posio onde est, assim, cada vez que uma funo se completa, o
programa retoma de onde tinha parado na funo que a chamou. Quando chega ao m do programa, ele termina.
Qual a moral dessa histria srdida? Quando voc for ler um programa, no o leia de cima para baixo. Em vez disso,
siga o uxo de execuo.
5.9 3.9 Parmetros e argumentos
Algumas das funes nativas que voc j usou requerem argumentos, aqueles valores que controlam como a funo
faz seu trabalho. Por exemplo, se voc quer achar o seno de um nmero, voc tem que indicar qual nmero . Deste
modo, sin recebe um valor numrico como um argumento.
Algumas funes recebem mais de um argumento. Por exemplo, pow recebe dois argumentos, a base e o expoente.
Dentro da funo, os valores que lhe so passados so atribudos a variveis chamadas parmetros.
Veja um exemplo de uma funo denida pelo usurio, que recebe um parmetro:
def imprimeDobrado(bruno):
print bruno, bruno
30 Captulo 5. Captulo 3: Funes
Aprenda Computao com Python Documentation, Verso 1.1
Esta funo recebe um nico argumento e o atribui a um parmetro chamado bruno. O valor do parmetro (a essa
altura, no sabemos qual ser) impresso duas vezes, seguido de uma nova linha. Estamos usando bruno para
mostrar que o nome do parmetro deciso sua, mas claro que melhor escolher um nome que seja mais ilustrativo.
A funo imprimeDobrado funciona para qualquer tipo que possa ser impresso:
>>> imprimeDobrado(Spam)
Spam Spam
>>> imprimeDobrado(5)
5 5
>>> imprimeDobrado(3.14159)
3.14159 3.14159
Na primeira chamada da funo, o argumento uma string. Na segunda, um inteiro. Na terceira um float.
As mesmas regras de composio que se aplicam a funes nativas tambm se aplicam s funes denidas pelo
usurio, assim, podemos usar qualquer tipo de expresso como um argumento para imprimeDobrado:
>>> imprimeDobrado(Spam
*
4)
SpamSpamSpamSpam SpamSpamSpamSpam
>>> imprimeDobrado(math.cos(math.pi))
-1.0 -1.0
Como acontece normalmente, a expresso avaliada antes da execuo da funo, assimimprimeDobrado imprime
SpamSpamSpamSpam SpamSpamSpamSpam em vez de Spam
*
4 Spam
*
4.
Como exerccio, escreva um chamada a imprimeDobrado que imprima Spam
*
4 Spam
*
4.
Dica: strings podem ser colocadas tanto entre aspas simples quanto duplas e o tipo de aspas que no
for usado para envolver a string pode ser usado dentro da string, como parte dela.
Tambm podemos usar uma varivel como argumento:
>>> miguel = Eric, the half a bee.
>>> imprimeDobrado(miguel)
Eric, the half a bee. Eric, the half a bee.
N.T.: Eric, the half a bee uma msica do grupo humorstico britnico Monty Python. A linguagem Python foi
batizada em homenagem ao grupo e, por isso, os programadores gostam de citar piadas deles em seus exemplos.
Repare numa coisa importante: o nome da varivel que passamos como um argumento (miguel) no tem nada a ver
com o nome do parmetro (bruno). No importa de que modo o valor foi chamado de onde veio (do chamador);
aqui, em imprimeDobrado, chamamos a todo mundo de bruno.
5.10 3.10 Variveis e parmetros so locais
Quando voc cria uma varivel local dentro de uma funo, ela s existe dentro da funo e voc no pode us-la fora
de l. Por exemplo:
def concatDupla(parte1, parte2):
concat = parte1 + parte2
imprimeDobrado(concat)
Esta funo recebe dois argumentos, concatena-os, e ento imprime o resultado duas vezes. Podemos chamar a funo
com duas strings:
>>> canto1 = Pie Jesu domine,
>>> canto2 = dona eis requiem.
>>> concatDupla(canto1, canto2)
Pie Jesu domine, Dona eis requiem. Pie Jesu domine, Dona eis requiem.
5.10. 3.10 Variveis e parmetros so locais 31
Aprenda Computao com Python Documentation, Verso 1.1
Esta funo recebe um nico argumento e o atribui a um parmetro chamado bruno. O valor do parmetro (a essa
altura, no sabemos qual ser) impresso duas vezes, seguido de uma nova linha. Estamos usando bruno para
mostrar que o nome do parmetro deciso sua, mas claro que melhor escolher um nome que seja mais ilustrativo.
A funo imprimeDobrado funciona para qualquer tipo que possa ser impresso:
>>> imprimeDobrado(Spam)
Spam Spam
>>> imprimeDobrado(5)
5 5
>>> imprimeDobrado(3.14159)
3.14159 3.14159
Na primeira chamada da funo, o argumento uma string. Na segunda, um inteiro. Na terceira um float.
As mesmas regras de composio que se aplicam a funes nativas tambm se aplicam s funes denidas pelo
usurio, assim, podemos usar qualquer tipo de expresso como um argumento para imprimeDobrado:
>>> imprimeDobrado(Spam
*
4)
SpamSpamSpamSpam SpamSpamSpamSpam
>>> imprimeDobrado(math.cos(math.pi))
-1.0 -1.0
Como acontece normalmente, a expresso avaliada antes da execuo da funo, assimimprimeDobrado imprime
SpamSpamSpamSpam SpamSpamSpamSpam em vez de Spam
*
4 Spam
*
4.
Como exerccio, escreva um chamada a imprimeDobrado que imprima Spam
*
4 Spam
*
4.
Dica: strings podem ser colocadas tanto entre aspas simples quanto duplas e o tipo de aspas que no
for usado para envolver a string pode ser usado dentro da string, como parte dela.
Tambm podemos usar uma varivel como argumento:
>>> miguel = Eric, the half a bee.
>>> imprimeDobrado(miguel)
Eric, the half a bee. Eric, the half a bee.
N.T.: Eric, the half a bee uma msica do grupo humorstico britnico Monty Python. A linguagem Python foi
batizada em homenagem ao grupo e, por isso, os programadores gostam de citar piadas deles em seus exemplos.
Repare numa coisa importante: o nome da varivel que passamos como um argumento (miguel) no tem nada a ver
com o nome do parmetro (bruno). No importa de que modo o valor foi chamado de onde veio (do chamador);
aqui, em imprimeDobrado, chamamos a todo mundo de bruno.
5.10 3.10 Variveis e parmetros so locais
Quando voc cria uma varivel local dentro de uma funo, ela s existe dentro da funo e voc no pode us-la fora
de l. Por exemplo:
def concatDupla(parte1, parte2):
concat = parte1 + parte2
imprimeDobrado(concat)
Esta funo recebe dois argumentos, concatena-os, e ento imprime o resultado duas vezes. Podemos chamar a funo
com duas strings:
>>> canto1 = Pie Jesu domine,
>>> canto2 = dona eis requiem.
>>> concatDupla(canto1, canto2)
Pie Jesu domine, Dona eis requiem. Pie Jesu domine, Dona eis requiem.
5.10. 3.10 Variveis e parmetros so locais 31
Aprenda Computao com Python Documentation, Verso 1.1
Esta funo recebe um nico argumento e o atribui a um parmetro chamado bruno. O valor do parmetro (a essa
altura, no sabemos qual ser) impresso duas vezes, seguido de uma nova linha. Estamos usando bruno para
mostrar que o nome do parmetro deciso sua, mas claro que melhor escolher um nome que seja mais ilustrativo.
A funo imprimeDobrado funciona para qualquer tipo que possa ser impresso:
>>> imprimeDobrado(Spam)
Spam Spam
>>> imprimeDobrado(5)
5 5
>>> imprimeDobrado(3.14159)
3.14159 3.14159
Na primeira chamada da funo, o argumento uma string. Na segunda, um inteiro. Na terceira um float.
As mesmas regras de composio que se aplicam a funes nativas tambm se aplicam s funes denidas pelo
usurio, assim, podemos usar qualquer tipo de expresso como um argumento para imprimeDobrado:
>>> imprimeDobrado(Spam
*
4)
SpamSpamSpamSpam SpamSpamSpamSpam
>>> imprimeDobrado(math.cos(math.pi))
-1.0 -1.0
Como acontece normalmente, a expresso avaliada antes da execuo da funo, assimimprimeDobrado imprime
SpamSpamSpamSpam SpamSpamSpamSpam em vez de Spam
*
4 Spam
*
4.
Como exerccio, escreva um chamada a imprimeDobrado que imprima Spam
*
4 Spam
*
4.
Dica: strings podem ser colocadas tanto entre aspas simples quanto duplas e o tipo de aspas que no
for usado para envolver a string pode ser usado dentro da string, como parte dela.
Tambm podemos usar uma varivel como argumento:
>>> miguel = Eric, the half a bee.
>>> imprimeDobrado(miguel)
Eric, the half a bee. Eric, the half a bee.
N.T.: Eric, the half a bee uma msica do grupo humorstico britnico Monty Python. A linguagem Python foi
batizada em homenagem ao grupo e, por isso, os programadores gostam de citar piadas deles em seus exemplos.
Repare numa coisa importante: o nome da varivel que passamos como um argumento (miguel) no tem nada a ver
com o nome do parmetro (bruno). No importa de que modo o valor foi chamado de onde veio (do chamador);
aqui, em imprimeDobrado, chamamos a todo mundo de bruno.
5.10 3.10 Variveis e parmetros so locais
Quando voc cria uma varivel local dentro de uma funo, ela s existe dentro da funo e voc no pode us-la fora
de l. Por exemplo:
def concatDupla(parte1, parte2):
concat = parte1 + parte2
imprimeDobrado(concat)
Esta funo recebe dois argumentos, concatena-os, e ento imprime o resultado duas vezes. Podemos chamar a funo
com duas strings:
>>> canto1 = Pie Jesu domine,
>>> canto2 = dona eis requiem.
>>> concatDupla(canto1, canto2)
Pie Jesu domine, Dona eis requiem. Pie Jesu domine, Dona eis requiem.
5.10. 3.10 Variveis e parmetros so locais 31
Valoresderetorno
Funesqueretornamvaloressochamadas
defunesfruNferas,oufunesquedo
frutos,nafaltadeumnomemelhor
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
19
Aprenda Computao com Python Documentation, Verso 1.1
J vimos a instruo return antes, mas em uma funo frutfera a instruo return inclui um valor de retorno.
Esta instruo signica: Retorne imediatamente desta funo e use a expresso em seguida como um valor de re-
torno. A expresso fornecida pode ser arbitrariamente complicada, de modo que poderamos ter escrito esta funo
de maneira mais concisa:
def area(raio):
return math.pi
*
raio
**
2
Por outro lado, variveis temporrias como temp muitas vezes tornam a depurao mais fcil.
s vezes til ter mltiplos comandos return, um em cada ramo de uma condicional:
def valorAbsoluto(x):
if x < 0:
return -x
else:
return x
J que estes comandos return esto em ramos alternativos da condicional, apenas um ser executado. To logo um
seja executado, a funo termina sem executar qualquer instruo ou comando subsequente.
O cdigo que aparece depois de uma instruo return, ou em qualquer outro lugar que o uxo de execuo jamais
alcance, chamado cdigo morto (dead code).
Em uma funo frutfera, uma boa ideia assegurar que todo caminho possvel dentro do programa encontre uma
instruo return. Por exemplo:
def valorAbsoluto(x):
if x < 0:
return -x
elif x > 0:
return x
Este programa no est correto porque se x for 0, nenhuma das condies ser verdadeira, e a funo terminar sem
encontrar um comando return. Neste caso, o valor de retorno ser um valor especial chamado None:
>>> print valorAbsoluto(0)
None
Como exerccio, escreva uma funo compare que retorne 1 se x > y, 0 se x == y e -1 se x < y.
7.2 5.2 Desenvolvimento de programas
Neste ponto, voc deve estar apto a olhar para funes completas e dizer o que elas fazem. Tambm, se voc vem
fazendo os exerccios, voc escreveu algumas pequenas funes. Conforme escrever funes maiores, voc pode
comear a ter mais diculdade, especialmente comerros emtempo de execuo (erros de runtime) ou erros semnticos.
Para lidar com programas de crescente complexidade, vamos sugerir uma tcnica chamada desenvolvimento incre-
mental. A meta do desenvolvimento incremental evitar sees de depurao (debugging) muito longas pela adio e
teste de somente uma pequena quantidade de cdigo de cada vez.
Como exemplo, suponha que voc queira encontrar a distncia entre dois pontos, dados pelas coordenadas (x1,y1) e
(x2,y2). Pelo teorema de Pitgoras, a distncia :
distancia = V (x2 - x1)2 + (y2 - y1)2 (5.1)
XXX: falta o sinal de raiz e elevar os expoentes desta frmula
O primeiro passo considerar como deveria ser uma funo distancia em Python. Em outras palavras, quais so
as entradas (parmetros) e qual a sada (valor de retorno)?
46 Captulo 7. Captulo 5: Funes frutferas
Aprenda Computao com Python Documentation, Verso 1.1
J vimos a instruo return antes, mas em uma funo frutfera a instruo return inclui um valor de retorno.
Esta instruo signica: Retorne imediatamente desta funo e use a expresso em seguida como um valor de re-
torno. A expresso fornecida pode ser arbitrariamente complicada, de modo que poderamos ter escrito esta funo
de maneira mais concisa:
def area(raio):
return math.pi
*
raio
**
2
Por outro lado, variveis temporrias como temp muitas vezes tornam a depurao mais fcil.
s vezes til ter mltiplos comandos return, um em cada ramo de uma condicional:
def valorAbsoluto(x):
if x < 0:
return -x
else:
return x
J que estes comandos return esto em ramos alternativos da condicional, apenas um ser executado. To logo um
seja executado, a funo termina sem executar qualquer instruo ou comando subsequente.
O cdigo que aparece depois de uma instruo return, ou em qualquer outro lugar que o uxo de execuo jamais
alcance, chamado cdigo morto (dead code).
Em uma funo frutfera, uma boa ideia assegurar que todo caminho possvel dentro do programa encontre uma
instruo return. Por exemplo:
def valorAbsoluto(x):
if x < 0:
return -x
elif x > 0:
return x
Este programa no est correto porque se x for 0, nenhuma das condies ser verdadeira, e a funo terminar sem
encontrar um comando return. Neste caso, o valor de retorno ser um valor especial chamado None:
>>> print valorAbsoluto(0)
None
Como exerccio, escreva uma funo compare que retorne 1 se x > y, 0 se x == y e -1 se x < y.
7.2 5.2 Desenvolvimento de programas
Neste ponto, voc deve estar apto a olhar para funes completas e dizer o que elas fazem. Tambm, se voc vem
fazendo os exerccios, voc escreveu algumas pequenas funes. Conforme escrever funes maiores, voc pode
comear a ter mais diculdade, especialmente comerros emtempo de execuo (erros de runtime) ou erros semnticos.
Para lidar com programas de crescente complexidade, vamos sugerir uma tcnica chamada desenvolvimento incre-
mental. A meta do desenvolvimento incremental evitar sees de depurao (debugging) muito longas pela adio e
teste de somente uma pequena quantidade de cdigo de cada vez.
Como exemplo, suponha que voc queira encontrar a distncia entre dois pontos, dados pelas coordenadas (x1,y1) e
(x2,y2). Pelo teorema de Pitgoras, a distncia :
distancia = V (x2 - x1)2 + (y2 - y1)2 (5.1)
XXX: falta o sinal de raiz e elevar os expoentes desta frmula
O primeiro passo considerar como deveria ser uma funo distancia em Python. Em outras palavras, quais so
as entradas (parmetros) e qual a sada (valor de retorno)?
46 Captulo 7. Captulo 5: Funes frutferas
CAPTULO 7
Captulo 5: Funes frutferas
Tpicos
Captulo 5: Funes frutferas
5.1 Valores de retorno
5.2 Desenvolvimento de programas
5.3 Composio
5.4 Funes booleanas
5.5 Mais recursividade
5.6 Voto de conana (Leap of faith)
5.7 Mais um exemplo
5.8 Checagem de tipos
5.9 Glossrio
7.1 5.1 Valores de retorno
Algumas das funes nativas do Python que temos usado, como as funes matemticas, produziram resultados.
Chamar a funo gerou um novo valor, o qual geralmente atribumos uma varivel ou usamos como parte de uma
expresso:
e = math.exp(1.0)
altura = raio
*
math.sin(angulo)
Mas at agora, nenhuma das funes que ns escrevemos retornou um valor.
Neste captulo, iremos escrever funes que retornam valores, as quais chamaremos de funes frutferas, ou funes
que do frutos, na falta de um nome melhor. O primeiro exemplo area, que retorna a rea de um crculo dado o seu
raio:
import math
def area(raio):
temp = math.pi
*
raio
**
2
return temp
45
OLaowhile
Construo
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
20
while condio :!
!Bloco de comandos!
Aprenda Computao com Python Documentation, Verso 1.1
Com a reatribuio torna-se ainda mais importante distinguir entre uma operao de atribuio e um comando de
igualdade. Como Python usa o sinal de igual ( = ) para atribuio, existe a tendncia de lermos um comando como a
= b como um comando de igualdade. Mas no !
Em primeiro lugar, igualdade comutativa e atribuio no . Por exemplo, em matemtica, se a = 7 ento 7 = a. Mas
em Python, o comando a = 7 permitido e 7 = a no .
Alm disso, em matemtica, uma expresso de igualdade sempre verdadeira. Se a = b agora, ento, a ser sempre
igual a b. Em Python, um comando de atribuio pode tornar duas variveis iguais, mas elas no tm que permanecer
assim:
a = 5
b = a # a e b agora so iguais
b = 3 # a e b no so mais iguais
Aterceira linha muda o valor de a mas no muda o valor de b, ento, elas no so mais iguais. (Emalgumas linguagens
de programao, um smbolo diferente usado para atribuio, como <- ou :=, para evitar confuso.)
Embora a reatribuio seja freqentemente til, voc deve us-la com cautela. Se o valor das variveis muda freqen-
temente, isto pode fazer o cdigo difcil de ler e de depurar.
8.2 6.2 O comando while
Os computadores so muito utilizados para automatizar tarefas repetitivas. Repetir tarefas idnticas ou similares sem
cometer erros uma coisa que os computadores fazem bem e que as pessoas fazem poorly.
Vimos dois programas, nLinhas e contagemRegressiva, que usam recursividade (recurso) para fazer a
repetio, que tambm chamada iterao. Porque a iterao muito comum, Python tem vrias caractersticas
para torn-la mais fcil. A primeira delas em que vamos dar uma olhada o comando while.
Aqui est como ca contagemRegressiva com um comando while:
def contagemRegressiva(n):
while n > 0:
print n
n = n-1
print "Fogo!"
Desde que removemos a chamada recursiva, esta funo no recursiva.
Voc quase pode ler o comando while como se fosse Ingls. Ele signica, Enquanto (while) n for maior do que 0,
siga exibindo o valor de n e diminuindo 1 do valor de n. Quando chegar a 0, exiba a palavra Fogo!.
Mais formalmente, aqui est o uxo de execuo para um comando while:
1. Teste a condio, resultando 0 ou 1.
2. Se a condio for falsa (0), saia do comando while e continue a execuo a partir do prximo comando.
3. Se a condio for verdadeira (1), execute cada um dos comandos dentro do corpo e volte ao passo 1.
56 Captulo 8. Captulo 6: Iterao
Aprenda Computao com Python Documentation, Verso 1.1
O corpo consiste de todos os comandos abaixo do cabealho, com a mesma endentao.
Este tipo de uxo chamado de um loop (ou lao) porque o terceiro passo cria um loop ou um lao de volta ao topo.
Note que se a condio for falsa na primeira vez que entrarmos no loop, os comandos dentro do loop jamais sero
executados.
O corpo do loop poderia alterar o valor de uma ou mais variveis de modo que eventualmente a condio se torne falsa
e o loop termine. Se no for assim, o loop se repetir para sempre, o que chamado de um loop innito. Uma fonte
de diverso sem m para os cientistas da computao a observao de que as instrues da embalagem de shampoo,
Lave, enxge, repita um loop innito.
No caso de contagemRegressiva, podemos provar que o loop terminar porque sabemos que o valor de n nito,
e podemos ver que o valor de n diminui dentro de cada repetio (iterao) do loop, ento, eventualmente chegaremos
ao 0. Em outros casos, isto no to simples de armar:
def sequencia(n):
while n != 1:
print n,
if n%2 == 0: # n par
n = n/2
else: # n impar
n = n
*
3+1
A condio para este loop n != 1, ento o loop vai continuar at que n seja 1, o que tornar a condio falsa.
Dentro de cada repetio (iterao) do loop, o programa gera o valor de n e ento checa se ele par ou impar. Se ele
for par, o valor de n dividido por 2. Se ele for impar, o valor substitudo por n
*
3+1. Por exemplo, se o valor
inicial (o argumento passado para seqncia) for 3, a seqncia resultante ser 3, 10, 5, 16, 8, 4, 2, 1.
J que n s vezes aumenta e s vezes diminui, no existe uma prova bvia de que n jamais venha a alcanar 1, ou de
que o programa termine. Para alguns valores particulares de n, podemos provar o trmino. Por exemplo, se o valor
inicial for uma potncia de dois, ento o valor de n ser par dentro de cada repetio (iterao) do loop at que alcance
1. O exemplo anterior termina com uma dessas seqncias comeando em 16.
Valores especcos parte, A questo interessante se h como provarmos que este programa termina para todos os
valores de n. At hoje, ningum foi capaz de provar que sim ou que no!
Como um exerccio, reescreva a funo nLinhas da seo 4.9 usando iterao em vez de recurso.
8.3 6.3 Tabelas
Uma das coisas para qual os loops so bons para gerar dados tabulares. Antes que os computadores estivessem
readily disponveis, as pessoas tinham que calcular logaritmos, senos, cossenos e outras funes matemticas mo.
Para tornar isto mais fcil, os livros de matemtica continham longas tabelas listando os valores destas funes. Criar
as tabelas era demorado e entediante, e elas tendiam a ser cheias de erros.
Quando os computadores entraram em cena, uma das reaes iniciais foi Isto timo! Podemos usar computadores
para geras as tabelas, assim no haver erros. Isto veio a se tornar verdade (na maioria das vezes) mas shortsighted.
Rapidamente, porm, computadores e calculadoras tornaram-se to pervasivos que as tabelas caram obsoletas.
Bem, quase. Para algumas operaes, os computadores usam tabelas de valores para conseguir uma resposta aprox-
imada e ento realizar clculos para melhorar a aproximao. Em alguns casos, tm havido erros nas tabelas un-
derlying, o caso mais famoso sendo o da tabela usada pelo processador Pentium da Intel para executar a diviso em
ponto-utuante.
Embora uma tabela de logaritmos no seja mais to til quanto j foi um dia, ela ainda d um bom exemplo de iterao.
O seguinte programa gera uma seqncia de valores na coluna da esquerda e seus respectivos logaritmos na coluna da
direita:
8.3. 6.3 Tabelas 57
OLaofor
Construo
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
21
for alvo in sequencia :!
!Bloco de comandos!
Aprenda Computao com Python Documentation, Verso 1.1
Este loop percorre a string e exibe cada letra em sua prpria linha. A condio do loop indice < len(fruta),
assim, quando ndice igual ao comprimento da string, a condio se torna falsa, e o corpo do loop no executado.
O ltimo caractere acessado aquele com o ndice len(fruta)-1, que vem a ser o ltimo caractere da string.
Como um exerccio, escreva uma funo que tome uma string como argumento e devolva suas letras de
trs para frente, uma por linha.
Usar um ndice para percorrer um conjunto de valores to comum que Python oferece uma sintaxe alternativa
simplicada - o loop for:
for char in fruta:
print char
A cada vez atravs do loop, o prximo caractere da string atribudo varivel char. O loop continua at que no
reste mais caracteres.
O exemplo seguinte mostra como usar concatenao e um loop for para gerar uma srie abecedrio. Abecedrio
se refere a uma srie ou lista na qual os elementos aparecem em ordem alfabtica. Por exemplo, no livro de Robert
McCloskeys Make Way for Ducklings, os nomes dos ducklings so Jack, Kack, Lack, Mack, Nack, Ouack, Pack e
Quack. O loop seguinte, produz como sada aqueles nomes, em ordem:
prefixos = "JKLMNOPQ"
sufixo = "ack"
for letra in prefixos:
print letra + sufixo
A sada deste programa :
Jack
Kack
Lack
Mack
Nack
Oack
Pack
Qack
Naturalmente, esta sada no est cem por cento certa porque Ouack e Quack esto escritos de maneira errada.
Como um exerccio, modique o programa para corrigir este erro.
9.4 7.4 Fatias de strings
Um segmento de uma string chamado de uma fatia. Selecionar uma fatia similar a selecionar um caractere:
>>> s = "Pedro, Paulo e Maria"
>>> print s[0:5]
Pedro
>>> print s[7:12]
Paulo
>>> print s[16:21]
Maria
O operador [n:m] retorna a parte da string do n-simo caractere ao m-simo caractere, incluindo o primeiro mas
excluindo o ltimo. Este comportamento no intuitivo; ele faz mais sentido se voc imaginar os ndices apontando
para os intervalos entre os caracteres, como no seguinte diagrama:
9.4. 7.4 Fatias de strings 67
Aprenda Computao com Python Documentation, Verso 1.1
Este loop percorre a string e exibe cada letra em sua prpria linha. A condio do loop indice < len(fruta),
assim, quando ndice igual ao comprimento da string, a condio se torna falsa, e o corpo do loop no executado.
O ltimo caractere acessado aquele com o ndice len(fruta)-1, que vem a ser o ltimo caractere da string.
Como um exerccio, escreva uma funo que tome uma string como argumento e devolva suas letras de
trs para frente, uma por linha.
Usar um ndice para percorrer um conjunto de valores to comum que Python oferece uma sintaxe alternativa
simplicada - o loop for:
for char in fruta:
print char
A cada vez atravs do loop, o prximo caractere da string atribudo varivel char. O loop continua at que no
reste mais caracteres.
O exemplo seguinte mostra como usar concatenao e um loop for para gerar uma srie abecedrio. Abecedrio
se refere a uma srie ou lista na qual os elementos aparecem em ordem alfabtica. Por exemplo, no livro de Robert
McCloskeys Make Way for Ducklings, os nomes dos ducklings so Jack, Kack, Lack, Mack, Nack, Ouack, Pack e
Quack. O loop seguinte, produz como sada aqueles nomes, em ordem:
prefixos = "JKLMNOPQ"
sufixo = "ack"
for letra in prefixos:
print letra + sufixo
A sada deste programa :
Jack
Kack
Lack
Mack
Nack
Oack
Pack
Qack
Naturalmente, esta sada no est cem por cento certa porque Ouack e Quack esto escritos de maneira errada.
Como um exerccio, modique o programa para corrigir este erro.
9.4 7.4 Fatias de strings
Um segmento de uma string chamado de uma fatia. Selecionar uma fatia similar a selecionar um caractere:
>>> s = "Pedro, Paulo e Maria"
>>> print s[0:5]
Pedro
>>> print s[7:12]
Paulo
>>> print s[16:21]
Maria
O operador [n:m] retorna a parte da string do n-simo caractere ao m-simo caractere, incluindo o primeiro mas
excluindo o ltimo. Este comportamento no intuitivo; ele faz mais sentido se voc imaginar os ndices apontando
para os intervalos entre os caracteres, como no seguinte diagrama:
9.4. 7.4 Fatias de strings 67
Aprenda Computao com Python Documentation, Verso 1.1
Em vez de produzir a sada El, Mundo!, este cdigo produz o erro em tempo de execuo (runtime error):
TypeError: object doesnt support item assignment (ErroDeTipo: objeto no d suporte
atribuio de item.)
Strings so imutveis, o que signica que voc no pode mudar uma string que j existe. O melhor que voc pode
fazer criar uma nova string que seja uma variao da original:
saudacao = "Al, mundo!"
novaSaudacao = E + saudacao[1:]
print novaSaudacao
A soluo aqui concatenar uma nova primeira letra com uma fatia de saudacao. Esta operao no tem nenhum
efeito sobre a string original.
9.7 7.7 Uma funo find (encontrar)
O que faz a seguinte funo?:
def find(str, ch):
indice = 0
while indice < len(str):
if str[indice] == ch:
return indice
indice = indice + 1
return -1
Num certo sentido, find (encontrar) o oposto do operador []. Em vez de pegar um ndice e extrair o caractere
correspondente, ela pega um caractere e encontra (nds) em qual ndice aquele caractere aparece. Se o caractere no
encontrado, a funo retorna -1.
Este o primeiro exemplo que vemos de uma instruo return dentro de um loop. Se str[indice] == ch, a
funo retorna imediatamente, abandonando o loop prematuramente.
Se o caractere no aparece na string, ento o programa sai do loop normalmente e retorna -1.
Este padro de computao s vezes chamado de travessia eureka, porque to logo ele encontra (nd) o que est
procurando, ele pode gritar Eureka! e parar de procurar.
Como um exerccio, modique a funo nd (encontrar) de modo que ela receba um terceiro parmetro,
o ndice da string por onde ela deve comear sua procura.
9.8 7.8 Iterando e contando
O programa seguinte conta o nmero e vezes que a letra a aparece em uma string:
fruta = "banana"
contador = 0
for letra in fruta:
if letra == a:
contador = contador + 1
print contador
Este programa demonstra um outro padro de computao chamado de contador. A varivel contador inicializada
em 0 e ento incrementada cada vez que um a encontrado. (Incrementar o mesmo que aumentar em um; o
oposto de decrementar, e no tem relao com excremento, que um substantivo.) Quando se sai do loop, contador
guarda o resultado - o nmero total de as.
9.7. 7.7 Uma funo find (encontrar) 69
Listas
Umalistaumconjuntoordenadodevalores,ondecada
valoriden-cadoporumndice.
Osvaloresquecompemumalistasochamadoselementos.
Listassosimilaresastrings,quesoconjuntosordenadosde
caracteres,comadiferenaqueoselementosdeumalista
podempossuirqualquer-po
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
22
CAPTULO 10
Captulo 8: Listas
Tpicos
Captulo 8: Listas
8.1 Valores da lista
8.2 Acessado elementos
8.3 Comprimento da lista
8.4 Membros de uma lista
8.5 Listas e laos for
8.6 Operaes em listas
8.7 Fatiamento de listas
8.8 Listas so mutveis
8.9 Remoo em lista
8.10 Ojetos e valores
8.11 Apelidos
8.12 Clonando listas
8.13 Lista como parmetro
8.14 Lista aninhadas
8.15 Matrizes
8.16 Strings e listas
8.17 Glossrio
Outros termos utilizados neste captulo
Uma lista um conjunto ordenado de valores, onde cada valor identicado por um ndice. Os valores que compem
uma lista so chamados elementos. Listas so similares a strings, que so conjuntos ordenados de caracteres, com a
diferena que os elementos de uma lista podem possuir qualquer tipo. Listas e strings XXX e outras coisas que se
comportam como conjuntos ordenados XXX so chamados seqncias.
10.1 8.1 Valores da lista
Existem vrias maneiras de criar uma nova lista; a mais simples envolver os elementos em colchetes ([ e ]):
>>> [10, 20, 30, 40]
>>> [spam, bungee, swallow]
73
Aprenda Computao com Python Documentation, Verso 1.1
O primeiro exemplo uma lista de quatro inteiros. O segundo uma lista de trs strings. Os elementos de uma lista
no necessitam ser do mesmo tipo. A lista a seguir contm uma string, um valor oat, um valor inteiro, e mirabile
dictu uma outra lista:
>>> [alo, 2.0, 5, [10,20]]
Uma lista dentro de outra lista dita estar aninhada.
Listas que contm inteiros consecutivos so comuns, ento Python fornece uma maneira simples de cri-los:
>>> range(1,5)
[1, 2, 3, 4]
A funo range pega dois argumentos e devolve uma lista que contm todos os inteiros do primeiro at o segundo,
incluindo o primeiro mas no incluindo o segundo!
Existem outras formas de range. Com um argumento simples, ela cria uma lista que inicia em 0:
>>> range(10)
[0,1, 2, 3, 4, 5, 6, 7, 8, 9]
Se existe um terceiro argumento, ele especica o espao entre os valores sucessivos, que chamado de tamanho do
passo. Este exemplo conta de 1 at 10 em passos de 2:
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
Finalmente, existe uma lista especial que no contm elementos. Ela chamada lista vazia, e sua notao [].
Com todas estas formas de criar listas, seria decepcionante se no pudssemos atribuir valores de listas a variveis ou
passar listas como parmetros a funes. Felizmente, podemos.
>>> vocabulario = [melhorar, castigar, defenestrar]
>>> numeros = [17, 123]
>>> vazio = []
>>> print vocabulario, numeros, vazio
[melhorar, castigar, defenestrar] [17, 123] []
10.2 8.2 Acessado elementos
A sintaxe para acessar os elementos de uma lista a mesma que a sintaxe para acessar os caracteres de uma string XXX
o operator colchete ([]). A expresso dentro dos colchetes especica o ndice. Lembre-se que os ndices iniciam em
0:
>>> print numeros[0]
>>> numeros[1]= 5
O operador colchete pode aparecer em qualquer lugar em uma expresso. Quando ele aparece no lado esquerdo de
uma atribuio, ele modica um dos elementos em uma lista, de forma que o um-simo elemento de numeros, que
era 123, agora 5.
Qualquer expresso inteira pode ser utilizada como um ndice:
>>> numeros[3-2]
5
>>> numeros[1.0]
TypeError: sequence index must be integer
Se voc tentar ler ou escrever um elemento que no existe, voc recebe um erro de tempo de execuo (runtime error):
74 Captulo 10. Captulo 8: Listas
Aprenda Computao com Python Documentation, Verso 1.1
O primeiro exemplo uma lista de quatro inteiros. O segundo uma lista de trs strings. Os elementos de uma lista
no necessitam ser do mesmo tipo. A lista a seguir contm uma string, um valor oat, um valor inteiro, e mirabile
dictu uma outra lista:
>>> [alo, 2.0, 5, [10,20]]
Uma lista dentro de outra lista dita estar aninhada.
Listas que contm inteiros consecutivos so comuns, ento Python fornece uma maneira simples de cri-los:
>>> range(1,5)
[1, 2, 3, 4]
A funo range pega dois argumentos e devolve uma lista que contm todos os inteiros do primeiro at o segundo,
incluindo o primeiro mas no incluindo o segundo!
Existem outras formas de range. Com um argumento simples, ela cria uma lista que inicia em 0:
>>> range(10)
[0,1, 2, 3, 4, 5, 6, 7, 8, 9]
Se existe um terceiro argumento, ele especica o espao entre os valores sucessivos, que chamado de tamanho do
passo. Este exemplo conta de 1 at 10 em passos de 2:
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
Finalmente, existe uma lista especial que no contm elementos. Ela chamada lista vazia, e sua notao [].
Com todas estas formas de criar listas, seria decepcionante se no pudssemos atribuir valores de listas a variveis ou
passar listas como parmetros a funes. Felizmente, podemos.
>>> vocabulario = [melhorar, castigar, defenestrar]
>>> numeros = [17, 123]
>>> vazio = []
>>> print vocabulario, numeros, vazio
[melhorar, castigar, defenestrar] [17, 123] []
10.2 8.2 Acessado elementos
A sintaxe para acessar os elementos de uma lista a mesma que a sintaxe para acessar os caracteres de uma string XXX
o operator colchete ([]). A expresso dentro dos colchetes especica o ndice. Lembre-se que os ndices iniciam em
0:
>>> print numeros[0]
>>> numeros[1]= 5
O operador colchete pode aparecer em qualquer lugar em uma expresso. Quando ele aparece no lado esquerdo de
uma atribuio, ele modica um dos elementos em uma lista, de forma que o um-simo elemento de numeros, que
era 123, agora 5.
Qualquer expresso inteira pode ser utilizada como um ndice:
>>> numeros[3-2]
5
>>> numeros[1.0]
TypeError: sequence index must be integer
Se voc tentar ler ou escrever um elemento que no existe, voc recebe um erro de tempo de execuo (runtime error):
74 Captulo 10. Captulo 8: Listas
Aprenda Computao com Python Documentation, Verso 1.1
O primeiro exemplo uma lista de quatro inteiros. O segundo uma lista de trs strings. Os elementos de uma lista
no necessitam ser do mesmo tipo. A lista a seguir contm uma string, um valor oat, um valor inteiro, e mirabile
dictu uma outra lista:
>>> [alo, 2.0, 5, [10,20]]
Uma lista dentro de outra lista dita estar aninhada.
Listas que contm inteiros consecutivos so comuns, ento Python fornece uma maneira simples de cri-los:
>>> range(1,5)
[1, 2, 3, 4]
A funo range pega dois argumentos e devolve uma lista que contm todos os inteiros do primeiro at o segundo,
incluindo o primeiro mas no incluindo o segundo!
Existem outras formas de range. Com um argumento simples, ela cria uma lista que inicia em 0:
>>> range(10)
[0,1, 2, 3, 4, 5, 6, 7, 8, 9]
Se existe um terceiro argumento, ele especica o espao entre os valores sucessivos, que chamado de tamanho do
passo. Este exemplo conta de 1 at 10 em passos de 2:
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
Finalmente, existe uma lista especial que no contm elementos. Ela chamada lista vazia, e sua notao [].
Com todas estas formas de criar listas, seria decepcionante se no pudssemos atribuir valores de listas a variveis ou
passar listas como parmetros a funes. Felizmente, podemos.
>>> vocabulario = [melhorar, castigar, defenestrar]
>>> numeros = [17, 123]
>>> vazio = []
>>> print vocabulario, numeros, vazio
[melhorar, castigar, defenestrar] [17, 123] []
10.2 8.2 Acessado elementos
A sintaxe para acessar os elementos de uma lista a mesma que a sintaxe para acessar os caracteres de uma string XXX
o operator colchete ([]). A expresso dentro dos colchetes especica o ndice. Lembre-se que os ndices iniciam em
0:
>>> print numeros[0]
>>> numeros[1]= 5
O operador colchete pode aparecer em qualquer lugar em uma expresso. Quando ele aparece no lado esquerdo de
uma atribuio, ele modica um dos elementos em uma lista, de forma que o um-simo elemento de numeros, que
era 123, agora 5.
Qualquer expresso inteira pode ser utilizada como um ndice:
>>> numeros[3-2]
5
>>> numeros[1.0]
TypeError: sequence index must be integer
Se voc tentar ler ou escrever um elemento que no existe, voc recebe um erro de tempo de execuo (runtime error):
74 Captulo 10. Captulo 8: Listas
Aprenda Computao com Python Documentation, Verso 1.1
O primeiro exemplo uma lista de quatro inteiros. O segundo uma lista de trs strings. Os elementos de uma lista
no necessitam ser do mesmo tipo. A lista a seguir contm uma string, um valor oat, um valor inteiro, e mirabile
dictu uma outra lista:
>>> [alo, 2.0, 5, [10,20]]
Uma lista dentro de outra lista dita estar aninhada.
Listas que contm inteiros consecutivos so comuns, ento Python fornece uma maneira simples de cri-los:
>>> range(1,5)
[1, 2, 3, 4]
A funo range pega dois argumentos e devolve uma lista que contm todos os inteiros do primeiro at o segundo,
incluindo o primeiro mas no incluindo o segundo!
Existem outras formas de range. Com um argumento simples, ela cria uma lista que inicia em 0:
>>> range(10)
[0,1, 2, 3, 4, 5, 6, 7, 8, 9]
Se existe um terceiro argumento, ele especica o espao entre os valores sucessivos, que chamado de tamanho do
passo. Este exemplo conta de 1 at 10 em passos de 2:
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
Finalmente, existe uma lista especial que no contm elementos. Ela chamada lista vazia, e sua notao [].
Com todas estas formas de criar listas, seria decepcionante se no pudssemos atribuir valores de listas a variveis ou
passar listas como parmetros a funes. Felizmente, podemos.
>>> vocabulario = [melhorar, castigar, defenestrar]
>>> numeros = [17, 123]
>>> vazio = []
>>> print vocabulario, numeros, vazio
[melhorar, castigar, defenestrar] [17, 123] []
10.2 8.2 Acessado elementos
A sintaxe para acessar os elementos de uma lista a mesma que a sintaxe para acessar os caracteres de uma string XXX
o operator colchete ([]). A expresso dentro dos colchetes especica o ndice. Lembre-se que os ndices iniciam em
0:
>>> print numeros[0]
>>> numeros[1]= 5
O operador colchete pode aparecer em qualquer lugar em uma expresso. Quando ele aparece no lado esquerdo de
uma atribuio, ele modica um dos elementos em uma lista, de forma que o um-simo elemento de numeros, que
era 123, agora 5.
Qualquer expresso inteira pode ser utilizada como um ndice:
>>> numeros[3-2]
5
>>> numeros[1.0]
TypeError: sequence index must be integer
Se voc tentar ler ou escrever um elemento que no existe, voc recebe um erro de tempo de execuo (runtime error):
74 Captulo 10. Captulo 8: Listas
Listassomutveis
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
23
Aprenda Computao com Python Documentation, Verso 1.1
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a + b
>>> print c
[1, 2, 3, 4, 5, 6]
Similarmente, o operador
*
repete uma lista um nmero dado de vezes:
>>> [0]
*
4
[0, 0, 0, 0]
>>> [1, 2, 3]
*
3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
O primeiro exemplo repete [0] quatro vezes. O segundo exemplo repete a lista [1, 2, 3] trs vezes.
10.7 8.7 Fatiamento de listas
A operao de fatiamento que vimos na Seo 7.4 tambm funciona sobre listas:
>>> lista = [a, b, c, d, e, f]
>>> lista[1:3]
[b, c]
>>> lista[:4]
[a, b, c, d]
>>> lista[3:]
[d, e, f]
>>> lista[:]
[a, b, c, d, e, f]
10.8 8.8 Listas so mutveis
Diferente das strings, as listas so mutveis, o que signica que podemos modicar seus elementos. Utilizando o
operador colchete no lado esquerdo de uma atribuio, podemos atualizar um de seus elementos:
>>> fruta = ["banana", "abacaxi", "laranja"]
>>> fruta[0] = "abacate"
>>> fruta[-1] = "tangerina"
>>> print fruta
[abacate, abacaxi, tangerina]
Com o operador de fatiamento podemos atualizar vrios elementos de uma vez:
>>> lista = [a, b, c, d, e, f]
>>> lista[1:3] = [x, y]
>>> print lista
[a, x, y, d, e, f]
Tambm podemos remover elementos de uma lista atribuindo a lista vazia a eles:
>>> lista = [a, b, c, d, e, f]
>>> lista[1:3] = []
>>> print lista
[a, d, e, f]
E podemos adicionar elementos a uma lista enando-os numa fatia vazia na posio desejada:
10.7. 8.7 Fatiamento de listas 77
Aprenda Computao com Python Documentation, Verso 1.1
>>> lista = [a, d, f]
>>> lista[1:1] = [b, c]
>>> print lista
[a, b, c, d, f]
>>> lista[4:4] = [e]
>>> print lista
[a, b, c, d, e, f]
10.9 8.9 Remoo em lista
Utilizando fatias para remover elementos pode ser complicado, e desta forma propenso a erro. Python fornece uma
alternativa que mais legvel.
del remove um elemento de uma lista:
>>> a = [um, dois, tres]
>>> del a[1]
>>> a
[um, tres]
Como voc deveria esperar, del trata valores negativos e causa erros de tempo de execuo se o ndice estiver fora da
faixa.
Voc tambm pode utilizar uma faixa como um ndice para del:
>>> lista = [a, b, c, d, e, f]
>>> del lista[1:5]
>>> print lista
[a, f]
Como de costume, fatias selecionam todos os elementos at, mas no incluindo, o segundo ndice.
10.10 8.10 Ojetos e valores
Se executamos estas declaraes de atribuio:
>>> a = "banana"
>>> b = "banana"
sabemos que a e b se referem a uma string com as letras banana. Mas no podemos dizer se elas apontam para a
mesma string.
Existem dois possveis estados:
Em um caso, a e b se referem a duas coisas diferentes que possuem o mesmo valor. No segundo caso, elas se referem
mesma coisa. Estas coisas possume nomes - elas so chamadas objetos. Um objeto algo ao qual uma varivel
pode se referenciar.
78 Captulo 10. Captulo 8: Listas
Aprenda Computao com Python Documentation, Verso 1.1
>>> lista = [a, d, f]
>>> lista[1:1] = [b, c]
>>> print lista
[a, b, c, d, f]
>>> lista[4:4] = [e]
>>> print lista
[a, b, c, d, e, f]
10.9 8.9 Remoo em lista
Utilizando fatias para remover elementos pode ser complicado, e desta forma propenso a erro. Python fornece uma
alternativa que mais legvel.
del remove um elemento de uma lista:
>>> a = [um, dois, tres]
>>> del a[1]
>>> a
[um, tres]
Como voc deveria esperar, del trata valores negativos e causa erros de tempo de execuo se o ndice estiver fora da
faixa.
Voc tambm pode utilizar uma faixa como um ndice para del:
>>> lista = [a, b, c, d, e, f]
>>> del lista[1:5]
>>> print lista
[a, f]
Como de costume, fatias selecionam todos os elementos at, mas no incluindo, o segundo ndice.
10.10 8.10 Ojetos e valores
Se executamos estas declaraes de atribuio:
>>> a = "banana"
>>> b = "banana"
sabemos que a e b se referem a uma string com as letras banana. Mas no podemos dizer se elas apontam para a
mesma string.
Existem dois possveis estados:
Em um caso, a e b se referem a duas coisas diferentes que possuem o mesmo valor. No segundo caso, elas se referem
mesma coisa. Estas coisas possume nomes - elas so chamadas objetos. Um objeto algo ao qual uma varivel
pode se referenciar.
78 Captulo 10. Captulo 8: Listas
CopiandoObjetosMutveis
Seaumaobjetomutvel,porexemploumalista,
sezermosb=a,oobjetobumarefernciado
objetoa.
Assimqualqueralteraoembirree-rema.
Pararealizarumacpiaindependente,faa:
b=a[:]
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
24
ConstruindoMatrizes
EmPythonpossvelconstruirmatrizesatravsdelistas
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
25
Aprenda Computao com Python Documentation, Verso 1.1
poderia ser representada como:
>>> matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matriz uma lista com trs elementos, onde cada elemento uma linha da matriz. Podemos selecionar uma linha
inteira da matriz da maneira habitual:
>>> matriz[1]
[4, 5, 6]
Ou podemos extrair um nico elemento da matriz utilinado a forma de duplo ndice:
>>> matriz[1][1]
5
O primeiro ndice seleciona a linha, e o segundo ndice seleciona a coluna. Embora esta maneira de representar
matrizes seja comum, ela no a nica possibilidade. Uma pequena variao utilizar uma lista de colunas ao invs
de uma lista de linhas.
Mais adiante veremos uma alternativa mais radical utilizando um dicionrio.
10.16 8.16 Strings e listas
Duas das mais teis funes no mdulo string envolvem listas de strings. A funo split (separar) quebra uma
string em uma lista de palavras. Por padro, qualquer nmero de caracteres espao em branco considerado um limite
de uma palavra:
>>> import string
>>> poesia = "O orvalho no carvalho..."
>>> string.split(poesia)
[O, orvalho, no, carvalho...]
Um argumento opcional chamado um delimitador pode ser utilizado para especicar qual caracter utilizar como
limites da palavra. O exemplo a seguir utiliza a string va:
>>> string.split(poesia, va)
[O or, lho no car, lho...]
Perceba que o delimitador no aparece na lista.
A funo join (juntar) o inverso de split. Ela pega uma lista de strings e concatena os elementos com um espao
entre cada par:
>>> lista = [O, orvalho, no, carvalho...]
>>> string.join(lista)
O orvalho no carvalho...
Como split, join recebe um delimitador que inserido entre os elementos:
>>> string.join(lista, _)
O_orvalho_no_carvalho...
82 Captulo 10. Captulo 8: Listas
Tuplas
Umatuplaumasequnciaqualquerdeobjetosseparados
porvrgulas,con-dosentreparnteses.
similaraumalistaexcetoporeleserimutvel
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
26
ControledeExceeseErros
Quandoumerroocorrenaexecuodeum
programaumaexceolevantada!
Estasexceespodemsercapturadasetratadas:
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
27
try:!
!do something!
except error:!
!do something
else!
MdulosemPython
EmPythonexistemvriosmdulos(bibliotecas)quecontm
funesjimplementadas
possvelinvocarestesmduloscomo:
frommoduloimportfunc1,func2,
frommoduloimport*
importmodulo
Comocomandodir()possvelvericarquaisfunespertencema
umdadomdulo
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
28
MdulosemPython
!" #$%&'()
!"#$%&'
!"#"$%$!&'(%)*$+,-./%0$01%$"#2.34%0$5%)'6$2.6$7%-6+$3+7%#'"-%0$7"#"$.+$
7#%8#"+"9 $ !%-6+$ :%)'6# $ 2."/2.6# $ 60'#.'.#"$ -%$ !&'(%)$ 6$ 01%$ 6;6:.'"-%0$
2.")-%$3+7%#'"-%0
<=
9$>/60$01%$:%+73/"-%0$2.")-%$3+7%#'"-%0$76/"$7#3+63#"$
46?$ 6$ "#+"?6)"-%0$ 6+$ "#2.34%$ @:%+$ 6;'6)01%$A97&:B$ %.$ A97&%BC* $ 7%00.6+$
*+,-).+/-$ 7#,7#3%$ 6$ ":63'"+$0(/1 2345*6)9 $ D1%$ %EF6'%0 $25*6'-3(*$ @G$ :"##68"-"$
0%+6)'6$.+"$3)0'H):3"$6+$+6+,#3"*$2.6$53:"$-307%)I46/$-6$5%#+"$8/%E"/$7"#"$
%$7#%8#"+"C9
J0 $+,-./%0$ 01%$ /%:"/3?"-%0 $ 76/%$ 3)'6#7#6'"-%# $ "'#"4G0 $ -"$ /30'"$ -6$ 7"0'"0$
789:;<7=9:1 @)>)?.+3@C* $ 2.6 $ )%#+"/+6)'6 $ 3):/.3 $ " $ 7"0'" $ :%##6)'6 $ 6+$
7#3+63#%$/.8"#9
J0$+,-./%0$01%$:"##68"-%0$"'#"4G0$-"$3)0'#.K1%$5,.(439$L60'"$5%#+"*$"%$.0"#$
"/8.+" $ 60'#.'.#" $ -% $ +,-./%* $ G $ )6:600M#3% $ 3-6)'353:"# $ % $ +,-./%9 $ N0'% $ G$
:("+"-%$-6$5,.(43+AB(1+C)('&3+9
<= O"0%$06F"$)6:600M#3%$6;6:.'"#$-6$)%4%$%$+,-./%$-.#")'6$"$6;6:.K1%$-"$"7/3:"K1%*$6/6$'6#M$
2.6$:"##68"-%$%.'#"$46?$"'#"4G0$-"$5.)K1%$4-'(+%DE9
__maln__
lunco
svs.paLh
svs.exlL()
Mdulo prlnclpal em execuco.
svs
paLh
exlL
Mdulo !"! (#$%&'()!"!)
%*(+ e uma llsLa.
,-#( e uma funco.
lunco deflnlda em ..$*#/...
Chamando ,-#( de !"!.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
29
A<vidadePr<ca
FazerodownloadeinstalarointerpretadorPython2.7.2
Pesquisarumambiente/ferramentaasuaescolha
IDLE;Eclipse;Gedit;TexMate;etc
Observequepossvelcompilarumprogramasemousodeuma
janelagrca:
Escreve-seocdigoemumeditordetexto
Usa-sepythonprograma.pyparasecompilarocdigosalvonoarquivo
programa.py
EscrevaumprogramaemPythonqueleiadoisnmeros,
determinaseumml-plodooutroeimprimenatelaesta
informaocomosdoisnmerosordenadosdeforma
crescente.
AlgoritmoseEstruturadeDados
IntroduoaPython
2011ViniciusCardosoGarcia
30