SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Introdu¸c˜ao `a Programa¸c˜ao de
Computadores com Python∗
1.a
edi¸c˜ao
Prof.o
Sidney Roberto de Sousa
Conte´udo
1 Criando e executando um programa em Python . . . . . . . . . . 1
2 Imprimindo texto na tela . . . . . . . . . . . . . . . . . . . . . . 3
3 Criando coment´arios . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Lendo valores do usu´ario . . . . . . . . . . . . . . . . . . . . . . 5
5 Trabalhando com strings . . . . . . . . . . . . . . . . . . . . . . 6
6 Trabalhando com n´umeros inteiros . . . . . . . . . . . . . . . . 11
7 Trabalhando com n´umeros reais . . . . . . . . . . . . . . . . . . 12
8 Opera¸c˜oes matem´aticas . . . . . . . . . . . . . . . . . . . . . . 13
9 Trabalhando com booleanos e opera¸c˜oes l´ogicas . . . . . . . . . 16
10 Controlando o fluxo do programa . . . . . . . . . . . . . . . . . 18
11 Utilizando la¸cos de repeti¸c˜ao . . . . . . . . . . . . . . . . . . . 24
12 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
13 Dicion´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
14 Manipula¸c˜ao de arquivos . . . . . . . . . . . . . . . . . . . . . . 40
15 Lidando com erros . . . . . . . . . . . . . . . . . . . . . . . . . 47
1 Criando e executando um programa em Python
Um programa Python b´asico ´e escrito dentro de um script Python. Um script
Python ´e simplesmente um arquivo textual contendo linhas de c´odigo escritas
utilizando a linguagem de programa¸c˜ao Python. Estas linhas, em conjunto,
cont´em instru¸c˜oes para fazer o computador realizar alguma tarefa.
Para criar um script Python, primeiramente vocˆe deve escolher um editor de
texto adequado. Um editor de texto ´e um programa pelo qual ´e poss´ıvel criar,
editar e salvar arquivos que cont´em basicamente texto simples – como os scripts
∗
Este material est´a baseado no Python 3≥3.4.
1
1 Criando e executando um programa em Python 2
Python, por exemplo. Existem diversos editores de texto dispon´ıveis na internet.
Em nossas aulas, utilizaremos o editor Notepad++1
. Este editor de texto possui
a capacidade de destacar as palavras reservadas da linguagem Python, o que
auxiliar´a bastante na cria¸c˜ao de nossos scripts.
Para criar um novo script Python, vocˆe deve abrir o Notepad++, clicar no
menu Arquivo e ent˜ao na op¸c˜ao Novo. Ap´os, clique no menu Arquivo nova-
mente e ent˜ao clique na op¸c˜ao Salvar como. Ao abrir a janela Salvar como,
escolha uma pasta para o seu arquivo e dˆe um nome ao seu script, preferenci-
almente, utilizando letras min´usculas, sem espa¸cos em branco, acentua¸c˜oes ou
caracteres especiais. Ainda na nomenclatura do seu arquivo, utilize a extens˜ao
.py. Esta extens˜ao ´e utilizada para se identificar scripts Python no sistema ope-
racional.
Uma vez que o script Python foi criado, ´e poss´ıvel executar o programa
escrito nele utilizando o interpretador do Python. Para tanto, basta executar o
comando python no Prompt de Comando do Windows. Por exemplo, digamos
que o script exemplo.py tenha sido salvo na pasta
C:Userssidney.sousaCursoPython. No Prompt de Comando, ´e preciso
entrar nesta pasta utilizando o comando cd. Ap´os, utilizamos o comando python
para executar o script. A figura 1 exibe este processo.
Fig. 1: Abrindo a pasta onde o script est´a contido e, por fim, executando o script.
Como nosso script ainda n˜ao possui nenhuma linha de c´odigo, nada ´e impresso
na tela ap´os executarmos o comando python. Na pr´oxima se¸c˜ao, come¸caremos
a programar o nosso script!
1
Dispon´ıvel em https://notepad-plus-plus.org/. Acessado em 4 de abril de 2016.
2 Imprimindo texto na tela 3
2 Imprimindo texto na tela
Ainda no script exemplo.py da se¸c˜ao anterior, iremos criar um programa para
imprimir na tela uma mensagem para o usu´ario. Para tanto, utilizaremos a fun¸c˜ao
print, a qual recebe como parˆametro uma mensagem de texto. Esta mensagem
deve estar dentro de aspas simples, aspas duplas ou aspas triplas. Nesta apostila,
por padr˜ao, utilizaremos aspas simples na impress˜ao de mensagens nos exemplos.
A seguir, o script exemplo.py utiliza a fun¸c˜ao print para imprimir trˆes mensagens
na tela, cada qual utilizando um padr˜ao de aspas:
1 print(’Ol´a , mundo!’)
2 print("Eu tamb´em sou uma mensagem!")
3 print(’’’... e eu tamb´em sou uma mensagem!’’’)
Ap´os executarmos este script, a sa´ıda ser´a a seguinte:
1 Ol´a , mundo!
2 Eu tamb´em sou uma mensagem!
3 ... e eu tamb´em sou uma mensagem!
Como vocˆe pode ver, cada mensagem apareceu em uma linha diferente. Isto
ocorreu porquˆe cada mensagem foi impressa utilizando uma chamada diferente
`a fun¸c˜ao print. Por´em, ´e poss´ıvel imprimir mais de uma mensagem utilizando
uma ´unica chamada `a fun¸c˜ao print. Para tanto, ´e preciso utilizar o caractere
n˜ao imprim´ıvel n. Observe o exemplo a seguir:
1 print(’Primeira linha . nSegunda linha . nTerceira linha.’)
A sa´ıda da execu¸c˜ao deste exemplo ser´a:
1 Primeira linha.
2 Segunda linha.
3 Terceira linha.
No exemplo acima, o caractere n for¸cou a quebra de linha no ponto em que
ele foi inserido. O resultado disso ´e que a mensagem original foi dividida em trˆes
linhas.
Outro efeito poss´ıvel na impress˜ao de texto na tela ´e a tabula¸c˜ao, utilizando
o caractere n˜ao imprim´ıvel t. Como exemplo, considere o script abaixo:
1 print(’Esta frase n~ao possui tabula¸c~ao.’)
2 print(’tEsta frase possui tabula¸c~ao.’)
Sa´ıda:
1 Esta frase n~ao possui tabula¸c~ao.
2 Esta frase possui tabula¸c~ao.
3 Criando coment´arios 4
No exemplo acima, o caractere t for¸cou uma tabula¸c˜ao no in´ıcio da segunda
frase. Cada ocorrˆencia do caractere t for¸ca uma tabula¸c˜ao, conforme exibe o
exemplo abaixo:
1 print(’Esta frase n~ao possui tabula¸c~ao.’)
2 print(’tttEsta frase possui 3 tabula¸c~oes.’)
Sa´ıda:
1 Esta frase n~ao possui tabula¸c~ao.
2 Esta frase possui 3 tabula¸c~oes.
Exerc´ıcios:
(a) Escreva um script que imprima na tela o poema a seguir utilizando uma
ou mais chamadas `a fun¸c˜ao print, sabendo que cada frase possui uma
tabula¸c˜ao em seu in´ıcio.
1 BILHETE
2
3 Se tu me amas , ama -me baixinho
4 N~ao o grites de cima dos telhados
5 Deixa em paz os passarinhos
6 Deixa em paz a mim!
7 Se me queres ,
8 enfim ,
9 tem de ser bem devagarinho , Amada ,
10 que a vida ´e breve , e o amor mais breve ainda
11
12 Mario Quintana
(b) Escreva um script que imprima na tela o mesmo poema acima, por´em
utilizando somente uma chamada `a fun¸c˜ao print.
3 Criando coment´arios
Um coment´ario consiste em uma anota¸c˜ao ou lembrete que vocˆe deseja colocar
no c´odigo do seu script. Coment´arios n˜ao s˜ao c´odigo Python e n˜ao afetam em
nada a execu¸c˜ao do seu script. Observe o exemplo abaixo:
1 # A linha abaixo exibe uma mensagem pro usu´ario
2 print(’Ol´a , seja bem vindo!’)
O script acima cont´em duas linhas. A primeira linha cont´em um coment´ario
explicando ao leitor do c´odigo do script o que a linha de c´odigo abaixo faz. Para
criar um coment´ario de uma ´unica linha, assim como o do exemplo acima, basta
4 Lendo valores do usu´ario 5
colocar no in´ıcio da linha o caractere #. Caso este caractere seja colocado no
in´ıcio de uma linha de c´odigo v´alida, este c´odigo ´e desabilitado e, consequente-
mente, n˜ao executado. No exemplo abaixo, desabilitamos a linha do script do
exemplo anterior que imprime a mensagem na tela:
1 # A linha abaixo exibe uma mensagem pro usu´ario
2 #print(’Ol´a , seja bem vindo !’)
´E poss´ıvel criar coment´arios com duas ou mais linhas. Por´em, para isto ´e
necess´ario inserir trˆes aspas simples antes e depois do texto de coment´ario. O
exemplo abaixo exibe o uso de coment´arios de v´arias linhas:
1 ’’’
2 ´E poss´ıvel criar coment´arios de v´arias linhas ,
3 utilizando aspas triplas no in´ıcio e no final do
4 coment´ario.
5 ’’’
6 print(’Lembre -se: coment´arios n~ao s~ao trechos de c´odigo v´alidos!’)
Utilize coment´arios sempre que desejar deixar algum lembrete a si mesmo ou
a outra pessoa sobre o seu c´odigo. Nesta apostila, coment´arios ser˜ao utiliza-
dos esporadicamente nos scripts de exemplo para deixar alguma observa¸c˜ao ou
lembrete.
4 Lendo valores do usu´ario
Todos os programas dos scripts vistos at´e ent˜ao nesta apostila n˜ao s˜ao interativos.
Ou seja, eles n˜ao promovem a intera¸c˜ao direta entre o usu´ario e computador.
A partir de agora, vamos aprender a ler dados do usu´ario a fim de alimentar os
nossos programas.
Primeiramente, iremos aprender a realizar a leitura de uma mensagem de
texto do usu´ario. O script abaixo pergunta ao usu´ario o seu nome e ent˜ao exibe
na tela uma mensagem cordial:
1 nome = input(’Informe o seu nome:’)
2 print(’Ol´a , %s!’%nome)
A primeira linha do script acima realiza as seguintes tarefas. Primeiramente,
a fun¸c˜ao input exibe na tela uma mensagem solicitando o nome do usu´ario. Em
seguida, o cursor do Prompt do Windows ir´a esperar que o usu´ario digite o dado
solicitado. Ap´os digitar o seu nome, o usu´ario deve digitar a tecla ENTER para
confirmar a leitura.
Por fim, a fun¸c˜ao input retorna o nome digitado pelo usu´ario, o qual ´e arma-
zenado na vari´avel nome. Isto ´e feito por meio de uma opera¸c˜ao de atribui¸c˜ao.
Uma opera¸c˜ao de atribui¸c˜ao possui a seguinte estrutura:
vari´avel = c´odigo que resulta em algum valor
5 Trabalhando com strings 6
Opera¸c˜oes de atribui¸c˜ao s˜ao divididas em duas partes, separadas pelo opera-
dor de atribui¸c˜ao =. Elas devem ser analisadas da direita para a esquerda. O
lado direito de uma opera¸c˜ao de atribui¸c˜ao sempre cont´em algum c´odigo que
ir´a resultar em algum valor — por exemplo, uma equa¸c˜ao matem´atica, uma
fun¸c˜ao que retorna algum valor, entre outros. Por sua vez, o lado esquerdo de
uma opera¸c˜ao de atribui¸c˜ao, na maioria das vezes, cont´em uma vari´avel que ir´a
armazenar o valor gerado no lado direito da opera¸c˜ao.
Neste ponto, vocˆe deve estar se perguntando: o que ´e uma vari´avel?
Uma vari´avel representa um espa¸co de mem´oria onde um determinado valor
´e armazenado. No exemplo anterior, a vari´avel nome representa o espa¸co de
mem´oria onde o nome do usu´ario ´e salvo para ser utilizado durante o programa
escrito no script. Quando a execu¸c˜ao do script termina, a vari´avel ´e destru´ıda e,
assim, seu valor ´e perdido.
Voltando ao ´ultimo exemplo, na segunda linha do script ´e impressa uma
mensagem cordial ao usu´ario, utilizando a fun¸c˜ao print. Para que o valor da
vari´avel nome possa ser impresso, ´e utilizado o caractere %s na mensagem
dentro da fun¸c˜ao print. Ele funciona como um “coringa”, sendo substitu´ıdo
em tempo de execu¸c˜ao pelo valor da vari´avel nome, a qual ´e passada na fun¸c˜ao
print utilizando como prefixo o caractere %. Este prefixo informa `a fun¸c˜ao print
que o valor a ser colocado no lugar do caractere %s est´a na vari´avel nome. A
seguir, um exemplo de execu¸c˜ao do script do exemplo anterior:
1 Informe o seu nome:Sidney
2 Ol´a , Sidney!
5 Trabalhando com strings
Uma string ´e basicamente um conjunto de caracteres. Uma palavra, uma frase
ou um texto composto por v´arias frases s˜ao exemplos de strings. Na se¸c˜ao
anterior, vimos um exemplo de script que lia o nome do usu´ario e o armazenava
na vari´avel nome. Podemos dizer que, neste exemplo, a vari´avel nome cont´em
uma string.
As strings s˜ao muito importantes na programa¸c˜ao de computadores. Muitos
dos dados que s˜ao processados e armazenados em sistemas de informa¸c˜ao s˜ao
strings. Por exemplo, em um sistema de gest˜ao escolar, temos v´arios dados
que s˜ao strings, como por exemplo o nome do estudante, seu endere¸co e o
nome de seu respons´avel. Temos ainda os nomes dos cursos, disciplinas, turmas,
professores e outros dados que tamb´em s˜ao strings.
Em um sistema de e-commerce, v´arias strings s˜ao processadas e armazenadas,
como os nomes dos produtos, suas descri¸c˜oes, opini˜oes de clientes, etc. De fato,
em muitos sistemas comerciais, boa parte dos dados consiste basicamente em
5 Trabalhando com strings 7
strings. Al´em disso, o uso de strings n˜ao se at´em a sistemas comerciais, mas
tamb´em ´e visto em softwares cient´ıficos, sistemas operacionais e muitos outros
tipos de sistemas.
Desta forma, saber escrever programas que processam strings ´e algo crucial
para um bom programador de computadores. A boa not´ıcia ´e que a linguagem
de programa¸c˜ao Python possui um suporte bem completo para o processamento
de strings.
Mas afinal, o que ´e processar uma string? O que isto significa?
Processar uma string consiste em realizar nela alguma dentre as seguintes
opera¸c˜oes:
• Transform´a-la em outra string;
• Selecionar de forma estrat´egica parte dela;
• Particion´a-la de forma estrat´egica.
Antes de aprender como realizar todas estas opera¸c˜oes, vocˆe precisa entender
a defini¸c˜ao sobre strings da primeira frase desta se¸c˜ao: uma string ´e basicamente
um conjunto de caracteres. Na teoria dos conjuntos, um conjunto pode ser
composto por nenhum elemento, um ´unico elemento ou v´arios elementos. No
caso das strings, podemos dizer que uma string pode ser composta por nenhum
caractere (o que chamamos de string vazia), um ´unico caractere ou v´arios
caracteres, conforme o exemplo abaixo:
1 string1 = ’’
2 string2 = ’a’
3 string3 = ’Eu possuo v´arios caracteres ’
No exemplo acima, cada string sendo atribu´ıda a uma vari´avel ´e cercada por
aspas simples. Toda string deve ser cercada por aspas, aspas simples ou aspas
triplas, conforme o exemplo abaixo:
1 string1 = ’Ol´a , mundo!’
2 string2 = "Eu tamb´em sou uma string!"
3 string3 = ’’’... e eu tamb´em sou uma string!’’’
Vocˆe pode escolher que forma de cercamento vocˆe ir´a utilizar. Por´em, caso
vocˆe cerque o in´ıcio de uma string com um tipo de aspas, o cercamento do final
da string deve utilizar o mesmo tipo de aspas. Caso contr´ario, vocˆe ter´a um erro
de sintaxe no seu c´odigo e ent˜ao seu script n˜ao ser´a executado.
Cada caractere dentro de uma string possui um ´ındice, que funciona como
um endere¸co do caractere dentro da string. O Python trabalha com dois tipos
de indexa¸c˜ao de caracteres: a indexa¸c˜ao padr˜ao e a indexa¸c˜ao negativa. A
tabela 1 exemplifica a indexa¸c˜ao de caracteres de uma string em Python:
5 Trabalhando com strings 8
O l ´a , m u n d o !
0 1 2 3 4 5 6 7 8 9 10
-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Tab. 1: Indexa¸c˜ao de strings em Python
Desta forma, podemos dizer que, na indexa¸c˜ao padr˜ao, o caractere ‘!’ est´a
localizado na posi¸c˜ao de ´ındice 10, enquanto que o caractere ‘,’ est´a localizado
na posi¸c˜ao de ´ındice 3. Se utilizarmos a indexa¸c˜ao negativa, podemos dizer que
o caractere ‘!’ est´a localizado na posi¸c˜ao de ´ındice -1, enquanto que o caractere
‘,’ est´a localizado na posi¸c˜ao de ´ındice -8.
´E poss´ıvel pegar caracteres de uma string, utilizando o ´ındice no qual o
caractere est´a localizado, conforme exibido no script a seguir:
1 frase = ’Ontem eu vi um animal.’
2 print(frase [0]) # ’O’
3 print(frase [6]) # ’e’
4 print(frase [ -3]) # ’a’
5 print(frase [ -10]) # ’u’
O uso de ´ındices tamb´em permite a extra¸c˜ao de parte de uma string, ou seja,
uma substring. Para tanto, ´e preciso saber qual o ´ındice do primeiro e ´ultimos
caracteres da substring a ser extra´ıda.
Como exemplo, considere a string “Trˆes tigres tristes”. Agora, imagine que
devemos extrair a substring “Trˆes” desta string. Para tanto, devemos encontrar
os ´ındices dos caracteres ‘T’ e ‘s’, respectivamente os caracteres inicial e final
desta substring:
T r ˆe s
0 1 2 3
Tab. 2: Indexa¸c˜ao da string “Trˆes”.
Assim, os caracteres encontram-se nos ´ındices 0 e 3 da substring. O script
abaixo realiza a extra¸c˜ao da substring “Trˆes” da string “Trˆes tigres tristes”:
1 string = ’Tr^es tigres tristes ’
2 substring = string [0:4] # extrai a substring ’Tr^es ’
3 print(substring)
A extra¸c˜ao ocorre na segunda linha do script, com a diretiva string[0:4].
Dentro dos colchetes da string, foram passados os ´ındices 0 e 4, definindo os
´ındices de in´ıcio e final do corte.
Neste momento vocˆe pode estar se perguntando: “Mas o ´ındice final da
substring ‘Trˆes’ n˜ao era 3?”. De fato, 3 ´e o ´ındice final da substring. Por´em, nas
5 Trabalhando com strings 9
diretivas de extra¸c˜ao de substrings, o ´ındice de in´ıcio do corte ´e inclusivo e o de
fim ´e exclusivo. Ou seja, a substring resultante conter´a todos os caracteres (em
ordem) contidos a partir do ´ındice de in´ıcio at´e o caractere contido no ´ultimo
´ındice anterior ao ´ındice de fim de corte.
Para entender este mecanismo, execute e observe o script abaixo:
1 string = ’Tr^es tigres tristes ’
2 substring = string [0:4] # extrai a substring ’Tr^es ’
3 print(substring)
4 substring = string [5:11] # extrai a substring ’tigres ’
5 print(substring)
6 substring = string [12:19] # extrai a substring ’tristes ’
7 print(substring)
Agora, imagine que devemos escrever um programa que leia do usu´ario uma
frase e ent˜ao deva extrair desta frase o primeiro e ´ultimo caracteres. Bem, extrair
o primeiro caractere de uma frase ´e simples, haja visto que ele sempre estar´a no
primeiro ´ındice, ou seja, o ´ındice 0:
1 frase = input(’Digite uma frase ’)
2 primeiro = frase [0]
3 print(primeiro)
Por´em, como faremos para extrair o ´ultimo caractere da frase, considerando
que n˜ao sabemos de antem˜ao qual frase o usu´ario digitar´a?
Bem, neste caso existem duas estrat´egias poss´ıveis: a primeira consiste em
descobrir qual o tamanho da frase; em seguida, com base neste dado, calculare-
mos qual ´e o ´ındice do ´ultimo caractere da frase. Considere a frase a seguir:
L u a c h e i a !
0 1 2 3 4 5 6 7 8 9
Tab. 3: Frase de exemplo.
A frase acima possui exatamente 10 caracteres2
. Assim, dizemos que ela pos-
sui tamanho 10. Em Python, o tamanho de uma string ´e dado pela quantidade
de caracteres que ela possui.
Desta forma, na string acima, os ´ındices de seus caracteres variam de 0 a
9. Ou seja, o ´ultimo caractere est´a no ´ındice 9. Assim, se uma string possui
tamanho n, o ´ultimo caractere estar´a sempre no ´ındice n – 1.
Voltando ao nosso problema, para encontrar o ´ultimo caractere da frase infor-
mada pelo usu´ario, devemos encontrar primeiramente o tamanho da string. Para
2
Vale salientar que o espa¸co em branco, na quarta posi¸c˜ao (´ındice 3) tamb´em ´e um caractere
v´alido.
5 Trabalhando com strings 10
tanto, utilizaremos a fun¸c˜ao len (de length, ou comprimento, em portuguˆes) do
Python:
1 frase = input(’Digite uma frase: ’)
2 primeiro = frase [0]
3 tamanho = len(frase)
4 ultimo = frase[tamanho - 1]
5 print(’Primeiro: %st ´Ultimo: %s’%( primeiro , ultimo))
A segunda estrat´egia ´e bem mais simples. Ela consiste simplesmente em
utilizar o sistema de indexa¸c˜ao negativa do Python, conforme exibido na tabela
1. Nela, o ´ultimo caractere de uma string sempre est´a no ´ındice -1. O script a
seguir utiliza esta estrat´egia mais simples:
1 frase = input(’Digite uma frase: ’)
2 primeiro = frase [0]
3 ultimo = frase [-1]
4 print(’Primeiro: %st ´Ultimo: %s’%( primeiro , ultimo))
Ora ou outra, existe a necessidade de concatenar duas ou mais strings, de
tal maneira a formar uma ´unica string resultante. Para tanto, ´e poss´ıvel utilizar
o operador +, conforme exibido no script a seguir:
1 frase1 = ’Estamos ’
2 frase2 = ’ ’
3 frase3 = ’juntas!’
4 frase_completa = frase1 + frase2 + frase3
5 print(frase_completa ) # Estamos juntas!
Tamb´em ´e poss´ıvel converter strings para mai´usculo ou min´usculo, utilizando
as fun¸c˜oes embutidas upper e lower. No script abaixo, a primeira string ´e
convertida para mai´usculo, enquanto que a segunda string tem sua primeira
metade convertida para mai´usculo e sua segunda metade para min´usculo:
1 frase1 = ’Eu e minha ^ansia por crescer!’
2 print(frase1.upper ())
3 frase2 = ’N~ao sei se quero crescer ou ficar na inf^ancia.’
4 ’’’
5 Nas duas linhas abaixo , para calcular o valor
6 da metade do tamanho da frase , ´e utilizado a
7 fun¸c~ao len() para calcular o tamanho da frase
8 e ent~ao utilizado o operador / para dividir o
9 tamanho por 2, a fun¸c~ao int() para converter
10 o resultado para um valor inteiro e ent~ao o
11 operador + para somar uma unidade ao resultado.
12 Fique tranquilo caso n~ao tenha entendido
13 completamente o script abaixo! Veremos mais
14 sobre opera¸c~oes matem´aticas em breve.
6 Trabalhando com n´umeros inteiros 11
15 ’’’
16 tamanho = len(frase2)
17 metade = int(tamanho / 2) + 1
18 primeira = frase2 [0: metade ]. upper ()
19 segunda = frase2[metade:tamanho ]. lower ()
20 frase2 = primeira + segunda
21 print(frase2)
Outra opera¸c˜ao muito comum quando lidamos com string ´e ter que substituir
uma determinada substring de uma determinada string por outra substring. Para
tanto, ´e poss´ıvel utilizar a fun¸c˜ao embutida replace, conforme o script abaixo:
1 frase = ’A Ana comeu banana ... mas que sacana!’
2 # A Ana comeu banana ... mas que espertinha!
3 print(frase.replace(’sacana ’, ’espertinha ’))
4 # A Ana comeu bANAna ... mas que sacANA!
5 print(frase.replace(’ana’, ’ANA’))
Por fim, uma opera¸c˜ao comum a se realizar em strings ´e remover espa¸cos
em branco no in´ıcio e no final. Muitas vezes, usu´arios ao preencher formul´arios
acabam deixando espa¸cos em branco indesejados nestas posi¸c˜oes. Para resolver
este problema, podemos utilizar a fun¸c˜ao embutida strip, conforme o exemplo a
seguir:
1 frase = ’ por favor , remova estes espa¸cos em branco ’
2 print(frase.strip ())
Exerc´ıcios
(a) Escreva um script que leia do usu´ario uma frase e ent˜ao divida esta frase
em trˆes partes, exibindo todas as trˆes partes na tela ao final.
(b) Escreva um script que leia do usu´ario uma frase e ent˜ao insira o caractere
‘[’ no in´ıcio da frase e o caractere ‘]’ no final desta.
(c) Escreva um script que armazene cada palavra da string “Um dia eu fui
uma string completa...” em uma vari´avel distinta, realizando os cortes
necess´arios na string.
6 Trabalhando com n´umeros inteiros
Muitos dos problemas do mundo real que necessitam de um programa de com-
putador para serem resolvidos envolvem n´umeros.
Considere o seguinte problema: uma pessoa possui 53 pacotes de biscoito
salgado e 87 pacotes de biscoito doce em seu estoque e ela precisa saber quantos
7 Trabalhando com n´umeros reais 12
pacotes de biscoito ela possui no total. Note que este problema envolve apenas
n´umeros inteiros, ou seja, n´umeros que n˜ao precisam de casas decimais para
represent´a-los. Vamos escrever um script para resolver este problema:
1 nro_pacotes_biscoito_salgado = 53
2 nro_pacotes_biscoito_doce = 87
3 total_pacotes = nro_pacotes_biscoito_salgado + nro_pacotes_biscoito_doce
4 print(’Voc^e possui %d pacotes de biscoito.’% total_pacotes )
Para resolver este problema, precisamos utilizar trˆes vari´aveis. Como dito na
se¸c˜ao 4, uma vari´avel ´e um local de armazenamento de dados. Vocˆe pode pen-
sar em uma vari´avel como uma gaveta capaz de armazenar itens. Toda vari´avel
possui um nome, o qual deve come¸car com uma letra e n˜ao pode conter carac-
teres especiais, como espa¸cos em branco, s´ımbolos e sinais diversos. A PEP 83
recomenda que vari´aveis sejam nomeadas utilizando somente letras min´usculas,
com as palavras separadas por um “underline” ( ).
A primeira vari´avel utilizada no programa acima chama-se
nro pacotes biscoito salgado. Ela guarda o n´umero de pacotes de biscoito
salgado contidos no estoque da pessoa do nosso problema. A segunda vari´avel
do nosso programa chama-se nro pacotes biscoito doce. Por sua vez, ela
guarda o n´umero de pacotes de biscoito doce existentes no estoque.
O n´umero total de pacotes ´e exibido na ´ultima linha do programa. A fim de
facilitar o entendimento do usu´ario a respeito do que foi realizado no programa,
exibimos a ele uma frase explicativa contendo o n´umero total de pacotes calcu-
lado. Note que utilizamos o caractere %d como coringa para substituir o valor
da vari´avel total pacotes na frase do usu´ario. Tivemos que utilizar %d ao inv´es
de %s, uma vez que o valor sendo inserido n˜ao ´e uma string, mas um n´umero
inteiro (‘d’ vem de decimal). O programa exibe a seguinte sa´ıda na tela:
1 Voc^e possui 140 pacotes de biscoito.
7 Trabalhando com n´umeros reais
Agora, imagine que a pessoa do exemplo anterior deseje saber qual o peso total
dos biscoitos que ela possui em estoque. Ela sabe que cada pacote de biscoito
salgado pesa 0,350 kg e cada pacote de biscoito doce pesa 0,414 kg. Note que
agora alguns n´umeros do nosso problema n˜ao s˜ao inteiros — no caso, os pesos
dos pacotes. Assim, n˜ao podemos trabalhar com os valores como se fossem
n´umeros inteiros. A seguir, a solu¸c˜ao para este problema:
3
Python Enhancement Proposal (em portuguˆes, Proposta de Melhoria Python). A PEP
8 est´a dispon´ıvel em https://www.python.org/dev/peps/pep-0008/. Acessado em 6 de
maio de 2016.
8 Opera¸c˜oes matem´aticas 13
1 nro_pacotes_biscoito_salgado = 53
2 nro_pacotes_biscoito_doce = 87
3 peso_biscoitos_salgados = nro_pacotes_biscoito_salgado * 0.350
4 peso_biscoitos_doces = nro_pacotes_biscoito_doce * 0.414
5 peso_total_pacotes = peso_biscoitos_salgados + peso_biscoitos_doces
6 print(’O seu estoque de biscoitos pesa %f kg.’% peso_total_pacotes )
Al´em das duas vari´aveis para armazenar o n´umero total de pacotes de cada
tipo de biscoito, o nosso programa possui mais trˆes vari´aveis para armazenar o
peso total de biscoitos salgados, o peso total de biscoitos doces e o peso total
de biscoitos em estoque. Diferentemente das duas vari´aveis anteriores, estas
vari´aveis armazenam n´umeros reais, ou seja, n´umeros com casas decimais.
Note que na mensagem de resposta na fun¸c˜ao print utilizamos o caractere %f
como coringa para injetar o valor da vari´avel peso total pacotes. Neste caso,
utilizamos o caractere %f pois o valor a ser injetado era um valor real (‘f’ vem de
floating point, ou ponto flutuante, em portuguˆes). O script anterior imprime
a mensagem na tela:
1 O seu estoque de biscoitos pesa 54.568000 kg.
Note que o n´umero do resultado possui trˆes zeros nas ´ultimas casas deci-
mais. ´E poss´ıvel arredondar este n´umero na impress˜ao dentro da fun¸c˜ao print,
adaptando o caractere %f:
1 print(’O seu estoque de biscoitos pesa %.2f kg.’% peso_total_pacotes )
Na linha acima, modificamos o caractere %f para %.2f, o que faz com que o
n´umero seja arredondado utilizando-se apenas duas casas decimais ap´os o ponto.
Como resultado, a mensagem abaixo ser´a exibida:
1 O seu estoque de biscoitos pesa 54.57 kg.
8 Opera¸c˜oes matem´aticas
Uma opera¸c˜ao bin´aria ´e uma opera¸c˜ao matem´atica que envolve dois valores
distintos. Tais valores podem ser constantes ou oriundos de vari´aveis. Como
exemplo, vamos escrever um script para realizar a soma de dois n´umeros infor-
mados pelo usu´ario:
1 resposta = input(’Digite o primeiro n´umero: ’)
2 numero1 = int(resposta)
3 resposta = input(’Digite o segundo n´umero: ’)
4 numero2 = int(resposta)
5 resultado = numero1 + numero2
6 print(’%d + %d = %d’%( numero1 , numero2 , resultado))
No exemplo acima, precisamos realizar a leitura dos dois n´umeros a serem
somados, os quais s˜ao informados pelo usu´ario. Por´em, a fun¸c˜ao input sempre
8 Opera¸c˜oes matem´aticas 14
retorna a resposta do usu´ario como string, o que impossibilitaria a realiza¸c˜ao
da soma dos valores informados. Desta forma, precisamos converter a resposta
do usu´ario que est´a em formato de string para um n´umero inteiro, utilizando a
fun¸c˜ao int.
Aplicamos a fun¸c˜ao int para obter os valores que s˜ao armazenados nas
vari´aveis numero1 e numero2. Ap´os realizar a soma dos valores e armaze-
nar o resultado na vari´avel resultado, exibimos a mensagem de forma objetiva
ao usu´ario. Por exemplo, se o usu´ario informar os valores 67 e 88, a mensagem
abaixo ser´a exibida na tela:
1 67 + 88 = 155
A tabela 4 mostra as opera¸c˜oes matem´aticas bin´arias poss´ıveis em Python.
Opera¸c˜ao Operador Express˜ao
Adi¸c˜ao + a = b + c
Subtra¸c˜ao - a = b - c
Multiplica¸c˜ao * a = b * c
Divis˜ao / a = b / c
Exponencia¸c˜ao ** a = b ** c
M´odulo (resto) % a = b % c
Tab. 4: Opera¸c˜oes matem´aticas bin´arias da linguagem Python.
Opera¸c˜oes matem´aticas do tipo a = a OPERADOR b podem ser abrevia-
das. A tabela 5 mostra as abrevia¸c˜oes poss´ıveis.
Express˜ao Express˜ao abreviada
a = a + c a += c
a = a - c a -= c
a = a * c a *= c
a = a / c a /= c
a = a ** c a **= c
a = a % c a %= c
Tab. 5: Abrevia¸c˜oes poss´ıveis em opera¸c˜oes matem´aticas.
Podemos compor opera¸c˜oes matem´aticas mais complexas, como f´ormulas
matem´aticas que envolvem n´umeros reais. O script a seguir auxilia o usu´ario a
calcular a f´ormula de Bhaskara:
1 resposta = input(’Digite o valor de a: ’)
2 a = float(resposta)
3 resposta = input(’Digite o valor de b: ’)
8 Opera¸c˜oes matem´aticas 15
4 b = float(resposta)
5 resposta = input(’Digite o valor de c: ’)
6 c = float(resposta)
7 delta = b ** 2 - 4 * a * c
8 print(’delta = %f’%delta)
No exemplo acima, os valores de a, b e c s˜ao reais. Para converter o valor
lido do usu´ario para real, utilizamos a fun¸c˜ao float. Na pen´ultima linha do script,
realizamos o c´alculo do valor delta. Este c´alculo envolve opera¸c˜oes de exponen-
cia¸c˜ao, subtra¸c˜ao e multiplica¸c˜ao. Em Python, algumas opera¸c˜oes matem´aticas
tem maior precedˆencia sobre outras, ou seja, s˜ao calculadas antes que outras. A
tabela 8 mostra a ordem de precedˆencia entre as opera¸c˜oes matem´aticas:
Ordem de precedˆencia Opera¸c˜ao
1o
exponencia¸c˜ao e m´odulo
2o
multiplica¸c˜ao e divis˜ao
3o
adi¸c˜ao e subtra¸c˜ao
Tab. 6: Ordem de precedˆencia dos operadores matem´aticos bin´arios.
Desta forma, no c´alculo do valor delta, a opera¸c˜ao de exponencia¸c˜ao b∗∗2 ´e
a primeira a ser calculada. Ap´os, a cadeia de multiplica¸c˜oes 4 ∗ a ∗ c ´e calculada.
Por fim, a subtra¸c˜ao entre os dois valores resultantes ´e calculada.
Caso a f´ormula precise ser calculada utilizando uma ordem de precedˆencia
diferente `a ordem normal, ´e preciso utilizar parˆenteses para se definir os trechos
de precedˆencia. Considere o exemplo a seguir:
1 resposta = input(’Digite o primeiro n´umero: ’)
2 numero1 = float(resposta)
3 resposta = input(’Digite o segundo n´umero: ’)
4 numero2 = float(resposta)
5 resultado = numero1 * (98 - numero2) * 4
6 print(’Resultado: %f’%resultado)
Note que na f´ormula da pen´ultima linha a subtra¸c˜ao 98 – numero2 seria
realizada por ´ultimo, normalmente. Por´em, como ela foi envolvida por parˆenteses,
ela ser´a calculada primeiramente que as outras opera¸c˜oes.
Exerc´ıcios
(a) Escreva um script que leia do usu´ario dois n´umeros inteiros a e b e ent˜ao
calcule o valor de ab
.
9 Trabalhando com booleanos e opera¸c˜oes l´ogicas 16
(b) Escreva um script que leia do usu´ario o valor do raio de um c´ırculo e ent˜ao
calcule o valor de sua ´area. A f´ormula da ´area do c´ırculo ´e dada por:
area = Π ∗ raio2
onde Π = 3.14159265
(c) Escreva um script que leia do usu´ario o valor do montante a ser empres-
tado e a taxa de juros e ent˜ao calcule o valor da parcela a ser paga pelo
empr´estimo, considerando que as parcelas ter˜ao valor fixo. As f´ormulas
para calcular o valor das parcelas a serem pagas pelo empr´estimo s˜ao da-
das abaixo:
montante = valor ∗ (1 + (taxa
100
∗ parcelas))
prestacao = montante
parcelas
onde montante ´e o valor final do empr´estimo com a taxa de juros mensal
aplicada, valor ´e o valor a ser emprestado, taxa ´e taxa de juros mensal,
parcelas ´e a quantidade de parcelas e prestacao ´e o valor a ser pago em
cada parcela.
9 Trabalhando com booleanos e opera¸c˜oes l´ogicas
Na linguagem Python, um valor booleano ´e um valor que s´o pode ter um dentre
dois valores: True ou False, respectivamente verdadeiro ou falso. Saber tra-
balhar com valores booleanos ´e essencial para a cria¸c˜ao de programas complexos
em Python, conforme veremos a partir desta se¸c˜ao.
Em Python, um valor booleano pode ser armazenado em uma vari´avel. Uma
opera¸c˜ao realizada entre dois valores booleanos ´e chamada de opera¸c˜ao l´ogica
(ou booleana) bin´aria. O resultado de uma opera¸c˜ao l´ogica s´o pode resultar em
um valor booleano, ou seja, True ou False.
Existem basicamente duas opera¸c˜oes l´ogicas bin´arias: as opera¸c˜oes and e
or. Uma opera¸c˜ao and s´o resulta no valor True se e somente se os dois valores
da opera¸c˜ao forem iguais a True; caso contr´ario, o resultado da opera¸c˜ao ser´a
False. A tabela 7 exibe os resultados para cada opera¸c˜ao and poss´ıvel entre
dois valores booleanos:
Por sua vez, uma opera¸c˜ao or s´o resulta no valor False se e somente se os
dois valores da opera¸c˜ao forem iguais a False. A tabela 8 exibe os resultados
para cada opera¸c˜ao or poss´ıvel entre dois valores booleanos:
Existe tamb´em em Python uma opera¸c˜ao l´ogica un´aria, isto ´e, uma opera¸c˜ao
que envolve apenas um valor: a opera¸c˜ao de nega¸c˜ao. Em Python, esta
9 Trabalhando com booleanos e opera¸c˜oes l´ogicas 17
a b a and b
True True True
True False False
False True False
False False False
Tab. 7: Resultados poss´ıveis para a opera¸c˜ao and.
a b a or b
True True True
True False True
False True True
False False False
Tab. 8: Resultados poss´ıveis para a opera¸c˜ao or.
opera¸c˜ao pode ser realizada por meio do operador not. A tabela 9 exibe os
valores poss´ıveis para cada opera¸c˜ao de nega¸c˜ao:
a not a
True False
False True
Tab. 9: Resultados poss´ıveis para a opera¸c˜ao not.
O script abaixo mostra alguns exemplos de opera¸c˜oes l´ogicas bin´arias e
un´arias:
1 a = True
2 b = False
3 resultado = a and b
4 print(resultado) # False
5 resultado = a or b
6 print(resultado) # True
7 resultado = not a
8 print(resultado) # False
9 resultado = not b
10 print(resultado) # True
11 resultado = False and True or False or True
12 print(resultado) # True
´E poss´ıvel criar opera¸c˜oes l´ogicas envolvendo n´umeros inteiros ou reais. Exis-
tem muitas situa¸c˜oes em que precisamos comparar dois ou mais n´umeros. As
10 Controlando o fluxo do programa 18
opera¸c˜oes and e or n˜ao se aplicam a n´umeros diretamente. As opera¸c˜oes l´ogicas
poss´ıveis entre dois valores num´ericos s˜ao exibidas na tabela 10:
Opera¸c˜ao Operador Express˜ao
Igual == a == b
Diferente != a != b
Maior > a >b
Menor < a<b
Maior ou igual >= a >= b
Menor ou igual <= a <= b
Tab. 10: Opera¸c˜oes l´ogicas bin´arias entre n´umeros da linguagem Python.
O script a seguir exemplifica as opera¸c˜oes da tabela acima:
1 numero = 67
2 outro_numero = -178.54
3 sao_iguais = numero == outro_numero
4 print(sao_iguais) # False
5 sao_diferentes = numero != outro_numero
6 print(sao_diferentes ) # True
7 primeiro_e_maior = numero > outro_numero
8 print( primeiro_e_maior ) # True
9 primeiro_e_menor = numero < outro_numero
10 print( primeiro_e_menor ) # False
11 menor_ou_igual = numero <= outro_numero
12 print(menor_ou_igual ) # False
13 maior_ou_igual = numero >= outro_numero
14 print(maior_ou_igual ) # True
A opera¸c˜ao l´ogica un´aria not possui precedˆencia sobre as opera¸c˜oes bin´arias.
Opera¸c˜oes l´ogicas bin´arias de compara¸c˜ao entre n´umeros (==, !=, >, <, >=,
<=) possuem precedˆencia sobre as opera¸c˜oes and e or. Se vocˆe deseja for¸car a
precedˆencia de uma determinada opera¸c˜ao l´ogica bin´aria, tal opera¸c˜ao deve ser
escrita entre parˆenteses, como no exemplo abaixo:
1 resultado = (98 < 89) and (True and False) or True
2 print(resultado) # True
10 Controlando o fluxo do programa
Cada programa visto nos exemplos desta apostila at´e ent˜ao possui um ´unico
fluxo poss´ıvel de execu¸c˜ao. Isto significa que todas as linhas de c´odigo do script
10 Controlando o fluxo do programa 19
do programa ser˜ao executadas, a menos que ocorra algum tipo de erro durante
a execu¸c˜ao do script.
Por´em, existem muitos problemas em que desejamos poder controlar o fluxo
de execu¸c˜ao do nosso programa, ou seja, controlar quais linhas de c´odigo ser˜ao
executadas de acordo com uma ou mais condi¸c˜oes. Neste caso, o programa ter´a
mais de um fluxo de execu¸c˜ao poss´ıvel.
Por exemplo, considere o programa que lˆe a idade do usu´ario. Digamos que
desejamos customizar a mensagem ao usu´ario de acordo com a sua idade. Se
o usu´ario tiver menos de 18 anos, informamos que ele ´e menor de idade; caso
contr´ario, informamos que ele j´a ´e maior de idade.
Para resolver este problema, utilizaremos as instru¸c˜oes if e else da linguagem
Python. A seguir, o script correspondente:
1 resposta = input(’Digite sua idade: ’)
2 idade = int(resposta)
3 if idade >= 18:
4 print(’Voc^e ´e maior de idade.’)
5 else:
6 print(’Voc^e ´e menor de idade.’)
A instru¸c˜ao if recebe como argumento um valor booleano. No nosso caso,
passamos como argumento uma express˜ao l´ogica, que por sua vez resultar´a em
um valor booleano. Se este valor for igual a True, ent˜ao o c´odigo delimitado pela
instru¸c˜ao if ser´a executado; caso contr´ario, o c´odigo delimitado pela instru¸c˜ao
else ser´a executado.
´E importante “abrir parˆenteses” nesta se¸c˜ao para falar sobre um assunto
muito importante na programa¸c˜ao em Python: identa¸c˜ao de c´odigo! Observe
este trecho do c´odigo do script do exemplo anterior:
1 if idade >= 18:
2 print(’Voc^e ´e maior de idade.’)
Como vocˆe j´a deve ter percebido, a segunda linha est´a mais `a direita em
compara¸c˜ao `a primeira linha. De fato, ela possui uma tabula¸c˜ao adicional em
compara¸c˜ao `a linha anterior. Isto se deve ao fato de que o c´odigo desta linha
pertence ao bloco da instru¸c˜ao if. Assim, ele foi colocado exatamente uma
tabula¸c˜ao `a direita (ou mais a dentro) para simbolizar tal fato. Na programa¸c˜ao
Python, chamamos este alinhamento de c´odigo de identa¸c˜ao.
Em Python, a identa¸c˜ao de c´odigo ´e obrigat´oria. Isto significa que, por
exemplo, o c´odigo a seguir n˜ao ser´a executado:
1 resposta = input(’Digite sua idade: ’)
2 idade = int(resposta)
3 if idade >= 18:
4 print(’Voc^e ´e maior de idade.’)
10 Controlando o fluxo do programa 20
5 else:
6 print(’Voc^e ´e menor de idade.’)
Ao executar o script acima, o interpretador do Python identificar´a a instru¸c˜ao
if da terceira linha e, consequentemente, ir´a verificar que a linha abaixo do if
n˜ao est´a corretamente identada. Assim, ele exibir´a na tela a mensagem abaixo:
1 IndentationError : expected an indented block
Ou seja, ele informar´a que houve um erro e que, no trecho de c´odigo onde o
erro foi identificado, era esperado um bloco de c´odigo identado.
Fechando os parˆenteses, voltemos ao assunto principal desta se¸c˜ao. No
exemplo anterior, temos apenas duas situa¸c˜oes que s˜ao mutuamente exclusivas.
Por´em, existem v´arios problemas os quais necessitam de m´ultiplas condi¸c˜oes para
realizar o roteamento de m´ultiplos fluxos de execu¸c˜ao poss´ıveis. Como exemplo,
considere o script abaixo, o qual lˆe a idade do usu´ario e informa em que faixa de
idade o usu´ario se encontra:
1 resposta = input(’Digite sua idade: ’)
2 idade = int(resposta)
3 if idade <= 10:
4 print(’Voc^e tem menos de 11 anos.’)
5 elif idade <= 20:
6 print(’Voc^e tem entre 11 e 20 anos.’)
7 elif idade <= 30:
8 print(’Voc^e tem entre 21 e 30 anos.’)
9 elif idade <= 50:
10 print(’Voc^e tem entre 31 e 50 anos.’)
11 else:
12 print(’Voc^e tem mais de 50 anos.’)
No exemplo acima, temos cinco condi¸c˜oes mutuamente exclusivas, ou seja,
a idade informada pelo usu´ario ir´a fazer com que apenas uma condi¸c˜ao seja
satisfeita. Assim, n˜ao ´e poss´ıvel com que o programa execute os trechos de
c´odigos de duas condi¸c˜oes distintas. Para garantir isto, utilizamos a instru¸c˜ao
elif, a qual consiste em uma abrevia¸c˜ao das instru¸c˜oes else e if associadas.
Se o usu´ario digitar uma idade maior que 50, nenhuma das quatro primeiras
condi¸c˜oes ser˜ao satisfeitas. Isto far´a com que o c´odigo do bloco da instru¸c˜ao
else seja executado. O bloco else sempre deve ser escrito ao final de todas as
condi¸c˜oes, uma vez que ele simboliza o ´ultimo caso, ou seja, a ´ultima op¸c˜ao caso
nenhuma das condi¸c˜oes anteriores tenham sido satisfeitas – ou seja, resultado
em True.
Agora, imagine que devemos escrever um programa que simule uma calcu-
ladora simples, capaz de efetuar adi¸c˜oes, subtra¸c˜oes, multiplica¸c˜oes e divis˜oes.
O nosso programa funcionar´a da seguinte forma. Ele solicitar´a ao usu´ario dois
10 Controlando o fluxo do programa 21
n´umeros reais. Ap´os isto, ele exibir´a ao usu´ario um menu de opera¸c˜oes ma-
tem´aticas a serem realizadas sobre os n´umeros que ele informou, conforme abaixo:
1 Digite a opera¸c~ao desejada:
2 1 Soma
3 2 Subtra¸c~ao
4 3 Multiplica¸c~ao
5 4 Divis~ao
Por exemplo, se o usu´ario deseja multiplicar os dois n´umeros que ele informou,
ent˜ao ele escolher´a a op¸c˜ao 3, digitando assim este n´umero no teclado para que
o programa possa enfim realizar a multiplica¸c˜ao dos dois valores. Vamos resolver
este problema utilizando as instru¸c˜oes if, elif e else:
1 resposta = input(’Digite o primeiro n´umero: ’)
2 primeiro_numero = float(resposta)
3 resposta = input(’Digite o segundo n´umero: ’)
4 segundo_numero = float(resposta)
5 print(’Digite a o¸c~ao desejada:’)
6 print(’1 - Soma ’)
7 print(’2 - Subtra¸c~ao ’)
8 print(’3 - Multiplica¸c~ao ’)
9 print(’4 - Divis~ao ’)
10 resposta = input(’’)
11 opcao = int(resposta)
12 resultado = 0
13 resultado_calculado = True
14 if opcao == 1:
15 resultado = primeiro_numero + segundo_numero
16 elif opcao == 2:
17 resultado = primeiro_numero - segundo_numero
18 elif opcao == 3:
19 resultado = primeiro_numero * segundo_numero
20 elif opcao == 4:
21 if segundo_numero != 0:
22 resultado = primeiro_numero / segundo_numero
23 else:
24 print(’N~ao ´e poss´ıvel dividir por 0!’)
25 resultado_calculado = False
26 else:
27 print(’Op¸c~ao inv´alida!’)
28 resultado_calculado = False
29
30 if resultado_calculado :
31 print(’Resultado: %f’%resultado)
10 Controlando o fluxo do programa 22
O script acima possui uma estrutura de c´odigo parecida com a do exemplo
anterior, com exce¸c˜ao ao bloco elif que trata a op¸c˜ao de divis˜ao (op¸c˜ao 4).
Aprendemos nas aulas de matem´atica que, em uma divis˜ao, o divisor n˜ao pode
ser zero. Desta forma, este bloco de c´odigo possui um tratamento para verificar
se o divisor, armazenado na vari´avel segundo numero, ´e diferente de zero, para
assim poder realizar o c´alculo da divis˜ao. Caso este tratamento n˜ao tivesse sido
feito e o programa executasse uma divis˜ao por zero, o interpretador do Python
lan¸caria o seguinte erro:
1 ZeroDivisionError : float division by zero
Ou seja, ele lan¸ca uma mensagem de erro, informando que houve uma divis˜ao
por zero e consequentemente o programa foi finalizado.
No final do script, existe um bloco if que n˜ao faz parte da cadeia de blocos if,
elif e else que faz a verifica¸c˜ao da op¸c˜ao do usu´ario. Este bloco ´e independente
e verifica se o c´alculo do resultado foi realizado com sucesso. Lembrando que
o c´alculo ´e realizado com sucesso quando o usu´ario digita uma op¸c˜ao v´alida e,
caso tenha optado pelo c´alculo da divis˜ao, o valor do divisor informado n˜ao tenha
sido igual a zero.
Condi¸c˜oes mutuamente exclusivas do tipo if-else que definem o valor de uma
vari´avel podem ser abreviadas, conforme o exemplo a seguir:
1 from random import randint
2 ’’’
3 A fun¸c~ao randint faz o sorteio
4 de um valor dentre os valores
5 informados como par^ametro nela
6 (no nosso exemplo abaixo , entre
7 1 e 11). A fun¸c~ao randint precisa
8 ser importada do m´odulo
9 random. Para tanto , usamos a
10 diretiva da linha acima.
11 ’’’
12 numero_aleatorio = randint (1, 10)
13 paridade = ’par’ if numero_aleatorio % 2 == 0 else ’´ımpar ’
14 print(paridade)
No exemplo acima, a fun¸c˜ao randint faz o sorteio de um valor entre 1 e 10 e
ent˜ao armazena tal valor na vari´avel numero aleatorio. Em seguida, a vari´avel
paridade recebe a string “par” caso o valor da vari´avel numero aleatorio seja
par ou a string “´ımpar” caso contr´ario.
Ainda no exemplo acima, a fun¸c˜ao randint precisou ser importada do m´odulo
random para que ent˜ao pud´essemos us´a-la. Para tanto, usamos a diretiva de
importa¸c˜ao da primeira linha do script. Ainda veremos nesta apostila outros
scripts que necessitar˜ao importar fun¸c˜oes ou m´odulos para realizar atividades
espec´ıficas.
10 Controlando o fluxo do programa 23
Exerc´ıcios:
(a) Escreva um programa que leia do usu´ario um n´umero inteiro e ent˜ao in-
forme na tela se o n´umero ´e divis´ıvel ou n˜ao por 7.
(b) Escreva um programa que leia do usu´ario sua altura (em metros) e seu
peso (em kg), calcule o seu ´ındice de massa corporal (IMC) e informe na
tela o seu grau de obesidade. O IMC ´e dado pela f´ormula abaixo:
IMC = peso/altura2
A tabela 11 exibe os graus de obesidade referentes a cada faixa de IMC:
Valor IMC Grau de obesidade
<18.5 Abaixo do peso
18.5 ≤ IMC<25 Peso normal
25 ≤ IMC<30 Sobrepeso
30 ≤ IMC<35 Obesidade de grau I
35 ≤ IMC<40 Obesidade de grau II
IMC ≥ 40 Obesidade de grau III
Tab. 11: Graus de obesidade de acordo com o IMC.
(c) Escreva um programa que leia as notas de quatro provas do usu´ario, calcula
a m´edia das notas. Se a m´edia for maior ou igual a 7, ent˜ao informe ao
usu´ario que ele foi aprovado. Se a m´edia for maior que 5 e menor que 7,
informe que ele est´a de recupera¸c˜ao. Por fim, se a m´edia for inferior a 5,
informe que ele foi reprovado.
(d) Escreva um script que leia do usu´ario o valor do montante a ser emprestado
e qual o tipo de cliente e ent˜ao calcule o valor da parcela a ser paga pelo
empr´estimo, considerando que as parcelas ter˜ao valor fixo e o valor da taxa
para o tipo de cliente. As f´ormulas para calcular o valor das parcelas a
serem pagas pelo empr´estimo s˜ao dadas abaixo:
montante = valor ∗ (1 + (taxa
100
∗ parcelas))
prestacao = montante
parcelas
onde montante ´e o valor final do empr´estimo com a taxa de juros mensal
aplicada, valor ´e o valor a ser emprestado, taxa ´e taxa de juros mensal,
parcelas ´e a quantidade de parcelas e prestacao ´e o valor a ser pago em
cada parcela.
A tabela 12 exibe as taxas de juros para cada tipo de cliente:
11 Utilizando la¸cos de repeti¸c˜ao 24
Tipo
de cliente
Taxa
de juros a.m. (%)
Standard 2.5
Platinum 1.99
Gold 1.2
Tab. 12: Taxas de juros para cada tipo de cliente.
11 Utilizando la¸cos de repeti¸c˜ao
Imagine que devemos escrever um programa para imprimir na tela a sequˆencia
de 1 at´e 4 em uma mesma linha. Este problema ´e extremamente simples e ´e
resolvido pelo script abaixo:
1 print(’1 2 3 4’)
Agora, considere que o nosso problema seja criar um programa que leia do
usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia de 1 at´e n
em uma mesma linha. Vamos tentar resolver este problema utilizando a mesma
estrat´egia da solu¸c˜ao anterior:
1 resposta = input(’Digite um n´umero inteiro positivo ’)
2 n = int(resposta)
3 # Garantindo que o valor de n seja positivo:
4 if n < 0:
5 n *= -1
6 elif n == 0:
7 n = 1
8 # E l´a vamos n´os ...
9 if n == 1:
10 print(’1’)
11 elif n == 2:
12 print(’1 2’)
13 elif n == 3:
14 print(’1 2 3’)
15 elif n == 4:
16 print(’1 2 3 4’)
17 elif n == 5:
18 print(’1 2 3 4 5’)
19 elif n == 6:
20 print(’1 2 3 4 5 6’)
21 # ... continua ... at´e quando?
Obviamente, o script acima n˜ao consegue resolver o problema de fato, uma
vez que ele s´o informa a resposta correta para valores de n entre [1..6]. O grande
problema do script acima ´e que ele n˜ao ´e escal´avel aos valores de n, ou seja, ele
n˜ao consegue resolver o problema para qualquer valor de n. A quest˜ao ´e: como
11 Utilizando la¸cos de repeti¸c˜ao 25
saberemos quais os poss´ıveis valores de n que o usu´ario poder´a digitar? N˜ao h´a
como saber! Assim, quantas condi¸c˜oes l´ogicas necessitar´ıamos para resolver o
problema de fato? Na realidade, infinitas condi¸c˜oes!
Desta forma, precisamos escrever um c´odigo que seja capaz de imprimir todos
os n´umeros da sequˆencia, por´em utilizando um n´umero fixo e m´ınimo de linhas
de c´odigo. Para tanto, precisamos de alguma forma escrever um c´odigo que
repita a impress˜ao dos n´umeros de forma categ´orica e estrat´egica.
Assim, para realmente resolver este problema, precisamos utilizar um la¸co
de repeti¸c˜ao (ou loop). A linguagem Python oferece dois la¸cos de repeti¸c˜ao
distintos: o la¸co while e o la¸co for. O script a seguir resolve o nosso problema
utilizando um la¸co while:
1 resposta = input(’Digite um n´umero inteiro positivo: ’)
2 n = int(resposta)
3 # Garantindo que o valor de n seja positivo:
4 if n < 0:
5 n *= -1
6 elif n == 0:
7 n = 1
8 contador = 1
9 while contador <= n:
10 print(contador , end=’ ’)
11 contador += 1
O la¸co while recebe como argumento uma condi¸c˜ao l´ogica, chamada de
condi¸c˜ao de manuten¸c˜ao do la¸co. No nosso exemplo, enquanto o valor da
vari´avel contador for menor ou igual ao valor da vari´avel n, o la¸co while repetir´a
a execu¸c˜ao do c´odigo localizado entre as chaves. No mundo da programa¸c˜ao de
computadores, chamamos de itera¸c˜ao cada repeti¸c˜ao que um la¸co realiza.
Note que agora, para qualquer valor de n, a mensagem correta ser´a impressa.
A vari´avel contador ´e inicializada com o valor 1, que ´e o primeiro valor que o
nosso programa deve imprimir. A cada itera¸c˜ao, o valor da vari´avel contador ´e
impresso. Logo em seguida, o valor da vari´avel ´e incrementado em uma unidade.
Assim, na pr´oxima itera¸c˜ao, o valor a ser impresso ´e uma unidade maior que o
valor atual.
Note tamb´em que utilizamos dentro da fun¸c˜ao print o parˆametro end com
o valor ‘ ’. O parˆametro end determina o que deve ser impresso sempre ao final
de cada mensagem impressa com a fun¸c˜ao print. Por padr˜ao, sempre ´e impresso
o caractere n˜ao imprim´ıvel n, o que causa sempre um pulo de linha ao final da
mensagem – e n˜ao necessita o uso expl´ıcito do parˆametro end. Como no nosso
exemplo a fun¸c˜ao print imprime na tela um n´umero da sequˆencia por vez e a
sequˆencia deve aparecer em uma ´unica linha, modificamos explicitamente o valor
do parˆametro end para ‘ ’, ou seja, um espa¸co em branco. Assim, os n´umeros
11 Utilizando la¸cos de repeti¸c˜ao 26
da sequˆencia aparecem separados por um espa¸co em branco entre eles.
O la¸co while s´o ´e executado se e somente se a sua condi¸c˜ao l´ogica de ma-
nuten¸c˜ao for satisfeita. Assim, para que um la¸co while execute ao menos uma
itera¸c˜ao, a sua condi¸c˜ao l´ogica de manuten¸c˜ao deve ser satisfeita ao menos uma
vez.
Agora, resolveremos novamente o problema, por´em utilizando o la¸co for:
1 resposta = input(’Digite um n´umero inteiro positivo: ’)
2 n = int(resposta)
3 # Garantindo que o valor de n seja positivo:
4 if n < 0:
5 n *= -1
6 elif n == 0:
7 n = 1
8 for contador in range(1, n + 1):
9 print(contador , end = ’ ’)
O la¸co for cont´em dois argumentos, separados pela palavrada reservada in.
No lado direito, temos um conjunto de valores, sendo que cada um dos valores
deste conjunto ser´a recebido pela vari´avel contador – no lado esquerdo – a cada
itera¸c˜ao.
No nosso exemplo, o conjunto de valores ´e fornecido pela fun¸c˜ao range.
Esta fun¸c˜ao ´e utilizada para gerar uma sequˆencia de valores. Ela recebe dois
parˆametros. O primeiro parˆametro ´e o valor inicial da sequˆencia. Por sua vez, o
segundo parˆametro ´e o valor imediatamente consecutivo ap´os o ´ultimo valor da
sequˆencia.
Por exemplo, se invocarmos a fun¸c˜ao range da seguinte forma:
1 range(1, 6)
Ela retornar´a a sequˆencia abaixo:
1 [1, 2, 3, 4, 5]
Ou seja, ela retornou uma sequˆencia cujo primeiro valor ´e igual ao primeiro
parˆametro informado (1) e o ´ultimo valor ´e igual ao valor que antecede o segundo
parˆametro (6). No exemplo anterior do la¸co for, utilizamos a fun¸c˜ao range da
seguinte forma:
1 range(1, n + 1)
Assim, ela retornar´a a sequˆencia abaixo:
1 [1, 2, 3, ... n]
Ou seja, uma sequˆencia que inicia com o valor 1 e termina com o valor n
informado pelo usu´ario.
11 Utilizando la¸cos de repeti¸c˜ao 27
O exemplo a seguir lˆe do usu´ario um valor positivo n e ent˜ao imprime uma
sequˆencia de n at´e 1 em uma mesma linha:
1 resposta = input(’Digite um n´umero inteiro positivo: ’)
2 n = int(resposta)
3 # Garantindo que o valor de n seja positivo:
4 if n < 0:
5 n *= -1
6 elif n == 0:
7 n = 1
8 for contador in reversed(range(1, n + 1)):
9 print(contador , end = ’ ’)
Como a fun¸c˜ao range ´e capaz de criar apenas sequˆencias crescentes, utiliza-
mos a fun¸c˜ao reversed para inverter a sequˆencia gerada pela fun¸c˜ao range.
´E poss´ıvel utilizar um la¸co de repeti¸c˜ao para percorrer os caracteres de uma
string. O exemplo abaixo insere uma barra vertical (|) entre cada caractere de
uma frase:
1 frase = ’Ontem eu vi um animal ’
2 for caractere in frase:
3 print(caractere , end = ’|’)
Exerc´ıcios
(a) Escreva um programa que leia do usu´ario um valor inteiro positivo n e
imprima na tela a sequˆencia:
1, 2, 3, ...n–1, n
Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser
impressa:
1, 2, 3, 4, 5
(b) Escreva um programa que leia do usu´ario um valor inteiro positivo n e
imprima na tela a sequˆencia:
n − 1, n − 2, n − 3, ...3, 2, 1
Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser
impressa:
11 Utilizando la¸cos de repeti¸c˜ao 28
5, 4, 3, 2, 1
(c) Escreva um programa que leia do usu´ario um valor inteiro positivo n e
imprima na tela a sequˆencia:
[1|2|3|..|n − 1|n − 2]
Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser
impressa:
[1|2|3|4|5]
(d) Escreva um programa que leia do usu´ario um valor inteiro positivo n e
imprima na tela a sequˆencia:
1, 2, 3, ...n, n − 1, n − 2, ..., 3, 2, 1
Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser
impressa:
1, 2, 3, 4, 5, 4, 3, 2, 1
(e) Escreva um algoritmo que leia do usu´ario um valor n entre [1..100] e ent˜ao
imprima na tela a seguinte sequˆencia:
1 1
2 1, 2
3 1, 2, 3
4 ...
5 1, 2, 3, ... n 1, n
6 1, 2, 3, ... n 1
7 ...
8 1, 2, 3
9 1, 2
10 1
Por exemplo, caso o valor n seja 5, a seguinte sequˆencia abaixo deve ser
impressa:
1 1
2 1, 2
3 1, 2, 3
4 1, 2, 3, 4, 5
5 1, 2, 3, 4
6 1, 2, 3
7 1, 2
8 1
12 Listas 29
Caso o valor de n seja 1, ent˜ao a sequˆencia abaixo deve ser impressa:
1 1
(f) Escreva um programa leia do usu´ario valores inteiros entre [0..100] at´e que
o usu´ario digite o valor -1 e ent˜ao calcule a m´edia aritm´etica destes valores
(P.S.: o valor -1 n˜ao deve ser inclu´ıdo no c´alculo).
(g) Escreva um programa que leia do usu´ario 10 valores inteiros entre [0..100]
e calcule o produto destes valores.
(h) Escreva um programa que leia do usu´ario um valor n entre [0..100] e
imprima na tela os primeiros n n´umeros da sequˆencia de Fibonacci. Em
uma sequˆencia de Fibonacci, os dois primeiros elementos da sequˆencia s˜ao
0 e 1. A partir do terceiro elemento, cada valor ´e a soma dos dois ´ultimos
valores da sequˆencia anteriores a ele. Como exemplo, a a sequˆencia de
Fibonacci para n igual 8 (ou seja, os oito primeiro elementos da sequˆencia):
0, 1, 1, 2, 3, 5, 8, 13
12 Listas
Todas as vari´aveis que criamos em nossos exemplos at´e ent˜ao possuem a capa-
cidade de armazenamento de apenas um valor por vez. Por exemplo, considere
o script abaixo:
1 numero = 1
2 numero = 2
3 numero = 4
4 numero = -9
5 print(numero)
Durante a sua execu¸c˜ao, o script atribui quatro valores distintos `a vari´avel
numero, por´em apenas o valor -9 ´e impresso, pois foi o ´ultimo valor associado
`a vari´avel. Ou seja, n˜ao ´e poss´ıvel armazenar mais de um valor simultaneamente
na vari´avel numero. O script abaixo exibe uma poss´ıvel solu¸c˜ao a este problema:
1 numero1 = 1
2 numero2 = 2
3 numero3 = 4
4 numero4 = -9
5 print(numero1)
6 print(numero2)
7 print(numero3)
8 print(numero4)
12 Listas 30
Neste exemplo, cada valor foi armazenado em uma vari´avel distinta e o valor
de cada vari´avel foi impresso separadamente no final do programa. Note que, se
tiv´essemos que armazenar mais valores, ter´ıamos que criar mais vari´aveis, al´em
de mais instru¸c˜oes para exibir tais valores na tela. Desta forma, esta solu¸c˜ao
deixa de ser pr´atica `a medida que o n´umero de valores aumenta.
Uma solu¸c˜ao mais elegante ao problema anterior ´e utilizar uma lista para
assim poder armazenar v´arios valores em uma ´unica vari´avel. Listas s˜ao estruturas
de dados que representam uma cole¸c˜ao de elementos, onde cada elemento ´e
representado por uma ´unica chave. O script abaixo apresenta uma poss´ıvel
solu¸c˜ao ao problema anterior, utilizando uma lista para armazenar os valores:
1 numeros = []
2 numeros.append (1)
3 numeros.append (2)
4 numeros.append (4)
5 numeros.append (-9)
6 for numero in numeros:
7 print(numero)
Na primeira linha do script, foi criada uma lista vazia. Preste aten¸c˜ao na sin-
taxe de cria¸c˜ao desta lista. No c´odigo anterior ao s´ımbolo de atribui¸c˜ao (=), foi
declarada uma vari´avel chamada numeros. No c´odigo posterior ao s´ımbolo de
atribui¸c˜ao, a vari´avel numeros recebe uma lista vazia, que em Python ´e expres-
sada por uma abertura de colchetes seguida por um encerramento de colchetes
([]).
A lista ´e preenchida com quatro n´umeros, onde cada n´umero ´e inserido na
lista por meio da fun¸c˜ao embutida append. Por fim, os valores da lista s˜ao
exibidos em um la¸co for. Vale a pena neste ponto observar a forma a qual o la¸co
´e utilizado para iterar sobre cada elemento da lista. Na parte direita da palavra
reservada in, foi passada a lista numeros. Na parte esquerda da palavra in, foi
criada uma vari´avel chamada numero, a qual receber´a a cada itera¸c˜ao cada um
dos elementos da lista, na ordem em que foram inseridos nela.
No exemplo anterior, os n´umeros preenchidos na lista numeros n˜ao s˜ao
provenientes do usu´ario, mas sim colocados diretamente no c´odigo do script. Em
casos como este, onde j´a se sabe previamente os valores que uma lista receber´a,
´e poss´ıvel preenchˆe-los de uma vez no momento da cria¸c˜ao da lista. O script
abaixo reescreve o script do exemplo anterior, utilizando o preenchimento direto:
1 numeros = [1, 2, 4, -9]
2 for numero in numeros:
3 print(numero)
Nos dois exemplos anteriores, utilizamos o la¸co for para exibir um elemento
por vez da lista. Caso deseje imprimir todos os elementos de uma vez, basta
12 Listas 31
imprimir a lista diretamente:
1 numeros = [1, 2, 4, -9]
2 print(numeros)
No script acima, a fun¸c˜ao print imprime a seguinte mensagem:
1 [1, 2, 4, -9]
Os elementos de uma lista podem ser acessados da mesma forma que os ca-
racteres de uma string, ou seja, utilizando o mesmo sistema de ´ındices (positivos
e negativos) que utilizamos com strings. O script abaixo cont´em alguns exem-
plos de acesso a valores de uma lista e extra¸c˜ao de fatias por meio de ´ındices de
elementos:
1 lista = [10, 20, 30, 40, 50, 60, 70, 80 ,90]
2 print(lista [0]) # Imprime 10
3 print(lista [5]) # Imprime 60
4 print(lista [ -1]) # Imprime 90
5 print(lista [0:4]) # Imprime [10, 20, 30, 40]
Os exemplos anteriores exibiram listas de inteiros. ´E poss´ıvel criar listas de
todos os tipos de dados que vimos at´e ent˜ao nesta apostila. O script abaixo
ilustra algumas listas de tipos variados:
1 numeros_reais = [1.5 , 4.56 , 3.7654 , -0.552]
2 print( numeros_reais )
3 dias_da_semana = [’Segunda ’, ’Ter¸ca ’, ’Quarta ’, ’Quinta ’, ’Sexta ’, ’S´abado ’, ’Domingo ’]
4 print( dias_da_semana )
5 valores_booleanos = [True , True , False , True , False , False]
6 print( valores_booleanos )
7 # ´E poss´ıvel criar listas com elementos de tipos distintos
8 tudo_misturado = [1, ’Ontem ’, False , 3.56]
9 print( tudo_misturado )
O exemplo a seguir lˆe do usu´ario quatro notas de um estudante, calcula a
sua m´edia, verifica se o estudante est´a aprovado (m´edia maior ou igual a 7),
reprovado (m´edia menor que 5) ou de recupera¸c˜ao (m´edia maior ou igual a 5 e
menor que 7). Caso ele esteja de recupera¸c˜ao, o programa informa qual dentre
as quatro notas que o estudante deve tentar substituir na prova substitutiva para
que ent˜ao ele seja aprovado:
1 notas = []
2 soma = 0
3 for i in range (0, 4):
4 resposta = input(’Digite a ’ + str(i + 1) + ’.a nota do estudante: ’)
5 nota = float(resposta)
6 notas.append(nota)
7 soma += nota
8 media = soma / 4
9 if media >= 7:
10 print(’Estudante aprovado ’)
11 elif media < 5:
12 print(’Estudante reprovado ’)
13 else:
14 menor = 10
15 ordem_nota = 1
16 ordem = 1
17 for nota in notas:
18 if menor > nota:
19 menor = nota
12 Listas 32
20 ordem_nota = ordem
21 ordem += 1
22 print(’Estudante de recupera¸c~ao.’)
23 print(’Precisa substituir a ’ + str(ordem_nota) + ’.a nota para ser aprovado.’)
Uma breve observa¸c˜ao sobre o exemplo acima: utilizamos a fun¸c˜ao str para
converter os valores num´ericos em strings, de tal forma que pud´essemos inseri-los
nas mensagens ao usu´ario. Execute o exemplo para entender o efeito desejado!
Nos exemplos sobre listas que vimos at´e agora, vimos algumas opera¸c˜oes
com listas, como acesso a elementos, extra¸c˜ao de fatias e itera¸c˜ao com la¸cos de
repeti¸c˜ao. Veremos a seguir algumas outras opera¸c˜oes poss´ıveis com listas.
O exemplo a seguir lˆe uma lista de n´umeros do usu´ario at´e que ele digite
o valor -1 (o qual n˜ao ´e inserido na lista) e ent˜ao exibe na tela o n´umero de
elementos inseridos na lista e o maior e menor valores existentes nela. Para
tanto, o script utiliza as fun¸c˜oes len para calcular a quantidade de elementos da
lista e as fun¸c˜oes max e min para encontrar o maior e menor valores dela:
1 numero = 0
2 numeros = []
3 while numero != -1:
4 resposta = input(’Digite um n´umero: ’)
5 numero = int(resposta)
6 if numero != -1:
7 numeros.append(numero)
8 quantidade = len(numeros)
9 maior = max(numeros)
10 menor = min(numeros)
11 print(’Quantidade de n´umeros inseridos: %d’%quantidade)
12 print(’Maior n´umero: %d’%maior)
13 print(’Menor n´umero: %d’%menor)
O script a seguir simula o sorteio da Mega-Sena. Primeiramente, s˜ao sortea-
dos seis n´umeros, onde cada n´umero varia de 1 a 60. A cada n´umero sorteado,
o programa verifica se ele j´a n˜ao foi sorteado anteriormente. Ap´os, o programa
solicita ao usu´ario que informe os seis n´umeros da sua aposta. Por fim, o pro-
grama compara os n´umeros do usu´ario com os n´umeros sorteados e informa ao
usu´ario se sua aposta foi vencedora:
1 import random
2
3 numero = random.randint (1, 60)
4 numeros_sorteados = [numero]
5 for i in range(0, 5):
6 while numero in numeros_sorteados :
7 numero = random.randint (1, 60)
8 numeros_sorteados .append(numero)
12 Listas 33
9
10 numeros_usuario = []
11 for i in range(0, 6):
12 resposta = input(’Digite o ’ + str(i + 1) + ’.o
n´umero: ’)
13 numero = int(resposta)
14 numeros_usuario .append(numero)
15
16 numeros_sorteados .sort ()
17 numeros_usuario .sort ()
18 print(’N´umeros sorteados:’)
19 print( numeros_sorteados )
20 print(’Seus n´umeros:’)
21 print( numeros_usuario )
22 if numeros_sorteados == numeros_usuario :
23 print(’Sua aposta foi vencedora!’)
24 else:
25 print(’Infelizmente , sua aposta n~ao foi vencedora.’)
Para sortear os valores, utilizamos a fun¸c˜ao randint do m´odulo random. Esta
fun¸c˜ao sorteia um n´umero inteiro entre os limites inferior e superior informados
– no exemplo, entre 1 e 60.
No script acima, para evitar que o programa sorteasse n´umeros repetidos, in-
serimos um la¸co while para repetir o sorteio caso o n´umero sorteado j´a existisse
na lista de n´umeros sorteados, utilizando a palavra reservada in para tanto. ´E
poss´ıvel comparar duas listas como um todo utilizando o operador ==. Para
que esta compara¸c˜ao funcionasse corretamente no nosso programa, utilizamos a
fun¸c˜ao embutida sort para ordenar as duas listas antes de realizarmos a com-
para¸c˜ao.
Existem basicamente duas formas de se remover um elemento de uma lista.
A primeira forma consiste em utilizar a fun¸c˜ao embutida remove, a qual recebe
como parˆametro o elemento a ser removido da lista:
1 lista = [1, 2, 3, 4, 5]
2 print(lista) # [1, 2, 3, 4, 5]
3 lista.remove (3)
4 print(lista) # [1, 2, 4, 5]
A segunda e ´ultima forma consiste em utilizar a fun¸c˜ao embutida pop. Ela
recebe como parˆametro o ´ındice do elemento a ser removido. Caso nenhum
´ındice seja informado, ela remove o ´ultimo elemento da lista:
1 lista = [1, 2, 3, 4, 5]
2 print(lista) # [1, 2, 3, 4, 5]
3 lista.pop()
12 Listas 34
4 print(lista) # [1, 2, 3, 4]
5 lista.pop (2)
6 print(lista) # [1, 2, 4]
O script a seguir exibe um exemplo mais complexo de uso da fun¸c˜ao remove.
O script realiza o sorteio de dez n´umeros inteiros distintos e ent˜ao os ordena sem
utilizar a fun¸c˜ao embutida sort (na ra¸ca!). Vale a pena parar alguns minutos
para tentar entender o funcionamento deste script!
1 import random
2
3 numeros = []
4 numero = random.randint (1, 100)
5 numeros.append(numero)
6 for i in range (0, 9):
7 while numero in numeros:
8 numero = random.randint (1, 100)
9 numeros.append(numero)
10 print(numeros)
11 for i in range (0, 5):
12 inicio = i
13 fim = 9 - i
14 maior = max(numeros[inicio : fim + 1])
15 menor = min(numeros[inicio : fim + 1])
16 numeros.remove(maior)
17 numeros.remove(menor)
18 numeros = numeros [0 : inicio] + [menor] + numeros[inicio : fim - 1] + [maior] + numeros[fim - 1:]
19 print(numeros)
Anteriormente, vimos como extrair uma sub lista de uma lista utilizando a
estrat´egia de extra¸c˜ao de fatias. Tamb´em ´e poss´ıvel extrair sub listas de forma
categ´orica. No exemplo a seguir, apenas os n´umeros ´ımpares de uma lista de
n´umeros s˜ao extra´ıdos e colocados em outra lista:
1 numeros = [12, 9, 87, -13, 54, 78]
2 impares = [numero for numero in numeros if numero % 2 == 1]
3 print(impares) # [9, 87, -13]
Na segunda linha do script acima, ´e realizada uma opera¸c˜ao de itera¸c˜ao inline
na lista numeros, selecionando apenas os n´umeros da lista que n˜ao s˜ao divis´ıveis
por 2, ou seja, os n´umeros ´ımpares.
O script abaixo adiciona uma lista inteira ao final de outra lista. Para tanto,
ele utiliza a fun¸c˜ao embutida extend:
1 lista1 = [’Ana’, ’Cristiane ’, ’J´ulia ’, ’Luciana ’]
2 lista2 = [’Jo~ao ’, ’Carlos ’, ’Tiago ’]
3 lista1.extend(lista2)
4 print(lista1) # [’Ana ’, ’Cristiane ’, ’J´ulia ’, ’Luciana ’, ’Jo~ao ’, ’Carlos ’, ’Tiago ’]
Em exemplos anteriores, vimos como utilizar a fun¸c˜ao embutida append para
inserir um novo elemento em uma lista. Ela insere o novo elemento sempre no
final da lista. Caso seja necess´ario inserir um novo elemento em uma posi¸c˜ao
espec´ıfica, utilize a fun¸c˜ao embutida insert, a qual recebe como parˆametro o
´ındice do novo elemento a ser inserido e o novo elemento:
1 lista = [’c~ao’, ’gato ’, ’can´ario ’]
2 lista.append(’on¸ca ’)
3 print(lista) # [’c~ao ’, ’gato ’, ’can´ario ’, ’on¸ca ’]
4 lista.insert (2, ’jaguatirica ’)
5 print(lista) # [’c~ao ’, ’gato ’, ’jaguatirica ’, ’can´ario ’, ’on¸ca ’]
12 Listas 35
No exemplo do sorteio da Mega-Sena, vimos o uso da palavra reservada
in para verificar se um elemento j´a existe dentro de uma lista. Caso deseje,
adicionalmente, pegar o´ındice no qual o elemento est´a localizado, utilize a fun¸c˜ao
embutida index para tanto. Lembre-se: a fun¸c˜ao index assume que o elemento
j´a existe na lista. Caso ele n˜ao exista, a fun¸c˜ao lan¸ca uma exce¸c˜ao (erro). A
seguir, um exemplo de uso da fun¸c˜ao index:
1 lista = [’c~ao’, ’gato ’, ’can´ario ’, ’vaca ’, ’cavalo ’]
2 indice_vaca = lista.index(’vaca ’)
3 print(lista[indice_vaca ]) # vaca
O script a seguir ordena uma lista em ordem decrescente. Para tanto, ele
ordena a lista de forma crescente, utilizando a fun¸c˜ao embutida sort e depois
inverte a lista utilizado a fun¸c˜ao embutida reverse:
1 lista = [’Jo~ao ’, ’Maria ’, ’Cec´ılia ’, ’Em´ılia ’, ’Fernando ’, ’Matheus ’, ’Ana ’]
2 lista.sort ()
3 lista.reverse ()
4 print(lista) # [’Matheus ’, ’Maria ’, ’Jo~ao ’, ’Fernando ’, ’Em´ılia ’, ’Cec´ılia ’, ’Ana ’]
O script abaixo contabiliza a quantidade de ocorrˆencias da palavra “c˜ao” em
uma lista. Para tanto, ele utiliza a fun¸c˜ao embutida count:
1 lista = [’c~ao’, ’gato ’, ’can´ario ’, ’vaca ’, ’cavalo ’, ’c~ao’]
2 nro_ocorrencias_cao = lista.count(’c~ao’)
3 print( nro_ocorrencias_cao )
Para fechar esta se¸c˜ao, vamos ver um exemplo envolvendo strings. Toda
string em Python possui uma fun¸c˜ao embutida chamada split, a qual particiona
a string de acordo com a ocorrˆencia de uma determinada sub string. O script
abaixo particiona uma frase de acordo com a ocorrˆencia de cada espa¸co em
branco. O resultado disso ´e que a fun¸c˜ao split quebra a frase original em palavras,
onde cada palavra da frase ´e um elemento da lista resultante:
1 frase = ’Estudar programa¸c~ao estimula o racioc´ınio l´ogico ’
2 palavras = frase.split(’ ’)
3 print(palavras) # [’Estudar ’, ’programa¸c~ao ’, ’estimula ’, ’o’, ’racioc´ınio ’, ’l´ogico ’]
Exerc´ıcios
(a) Escreva um script que crie uma lista de inteiros de tamanho 10, preencha a
lista com valores aleat´orios entre [0..100] e exiba a lista em ordem inversa.
(b) Escreva um script que leia do usu´ario 10 valores inteiros, armazene tais
valores em uma lista e exiba na tela apenas os valores que sejam divis´ıveis
por 3.
(c) Escreva um script que leia as notas de 15 alunos e as armazene em uma
lista. Ap´os, o script deve exibir as notas lidas e informar qual foi a nota
m´edia, a maior nota e a menor nota.
13 Dicion´arios 36
(d) Escreva um script que leia uma frase do usu´ario e ent˜ao exiba na tela a
quantidade de palavras que a frase tem. Considere que o usu´ario pode,
erroneamente, utilizar mais de um espa¸co em branco entre cada palavra
da frase.
(e) Escreva um script que sorteie 20 valores inteiros, onde cada valor varia
entre [1..10] e ent˜ao exiba na tela a lista dos valores e o n´umero de vezes
que o n´umero 7 aparece na lista.
(f) Escreva um script que leia do usu´ario o nome de 10 alunos e suas respecti-
vas m´edias finais e ent˜ao exiba na tela os nomes dos alunos que obtiveram
a maior e menor notas.
13 Dicion´arios
No cap´ıtulo anterior, aprendemos o que ´e uma lista e todas as suas opera¸c˜oes
b´asicas. Na Ciˆencia da Computa¸c˜ao, dizemos que listas s˜ao um tipo de estrutura
de dados, ou seja, s˜ao estruturas utilizadas para armazenar e recuperar dados
de forma organizada.
Outra estrutura de dados amplamente utilizada por programadores Python
s˜ao os dicion´arios. Itens de um dicion´ario s˜ao organizados como tuplas, onde
cada tupla ´e composta por uma chave e um valor. Dentro deste contexto, o
valor corresponde ao dado sendo armazenado e a chave ao ´ındice do valor.
Para entender o funcionamento de dicion´arios, observe o exemplo abaixo:
1 copas_ganhas = {}
2 copas_ganhas [’Brasil ’] = 5
3 copas_ganhas [’It´alia ’] = 4
4 copas_ganhas [’Argentina ’] = 2
5 print( copas_ganhas ) # {’It´alia ’: 4, ’Brasil ’: 5, ’Argentina ’: 2}
No exemplo acima, criamos o dicion´ario copa ganhas. Ele ´e utilizado para
armazenar a quantidade de copas do mundo de futebol ganhas por cada sele¸c˜ao.
Neste exemplo, ele armazena a quantidade de copas ganhas pelas sele¸c˜oes do
Brasil (5), It´alia (4) e Argentina (2).
Ou seja, no dicion´ario copa ganhas, os nomes das sele¸c˜oes correspondem
aos ´ındices do dicion´ario e a quantidade de copas ganhas correspondem aos
valores. Assim, ´e poss´ıvel recuperar a quantidade de copas ganhas por uma
sele¸c˜ao informando o nome da respectiva sele¸c˜ao. O script abaixo exibe na tela
a quantidade de copas ganhas pela Argentina:
1 copas_ganhas = {}
2 copas_ganhas[’Brasil ’] = 5
3 copas_ganhas[’It´alia ’] = 4
4 copas_ganhas[’Argentina ’] = 2
13 Dicion´arios 37
5 copas_ganhas[’Alemanha ’] = 4
6 print(copas_ganhas[’Argentina ’]) # 2
Quando j´a sabemos de antem˜ao os valores a serem armazenados em um
dicion´ario, podemos inicializ´a-lo com os seus valores. O script abaixo exemplifica
isto:
1 copas_ganhas = {’Brasil ’ : 5, ’It´alia ’ : 4, ’Argentina ’ : 2, ’Alemanha ’ : 4}
2 print( copas_ganhas )
Um dicion´ario tamb´em pode ser percorrido por um la¸co de repeti¸c˜ao. Para
tanto, podemos utilizar a fun¸c˜ao embutida items, conforme o exemplo abaixo:
1 copas_ganhas = {’Brasil ’ : 5, ’It´alia ’ : 4, ’Argentina ’ : 2, ’Alemanha ’ : 4}
2 for selecao , quantidade in copas_ganhas .items ():
3 print(’%s: %d’%( selecao , quantidade))
Observe que no la¸co for do script acima foram utilizadas duas vari´aveis ao
inv´es de uma ´unica no lado esquerdo da palavra reservada in, ou seja, como
fazemos usualmente. Isto foi necess´ario pois, a cada itera¸c˜ao, a fun¸c˜ao items
retorna a chave e o valor de cada item do dicion´ario.
Assim como as listas, dicion´arios podem ser utilizados para diversas finalida-
des. O script abaixo lˆe do usu´ario uma sequˆencia de n´umeros inteiros at´e que ele
digite o n´umero -1. Ap´os, para cada n´umero distinto que o usu´ario digitou (com
exce¸c˜ao do n´umero -1), ele informa quantas vezes cada n´umero foi digitado:
1 numero = 0
2 contagem = {}
3 while numero != -1:
4 resposta = input(’Digite um n´umero: ’)
5 numero = int(resposta)
6 if numero != -1:
7 if numero in contagem:
8 quantidade = contagem[numero]
9 contagem[numero] = quantidade + 1
10 else:
11 contagem[numero] = 1
12 print(contagem)
No exemplo acima, no trecho mais a dentro do script, ´e verificado se o
n´umero digitado pelo usu´ario j´a ´e uma chave no dicion´ario contagem, utilizando
a palavra reservada in para tanto. Caso ele j´a exista, o seu valor ´e incrementado
em uma unidade, ou seja, a contagem ´e incrementada; caso contr´ario, o n´umero
´e adicionado como chave no dicion´ario e seu valor inicial ´e 1, para fins de in´ıcio
de contagem.
Vimos no exemplo anterior como verificar se uma determinada chave j´a existe
em um dicion´ario utilizando a palavra reservada in. Para verificar se uma chave
ainda n˜ao existe em um dicion´ario, ´e preciso utilizar a palavra reservada not
associada `a palavra reservada in, conforme o exemplo abaixo:
13 Dicion´arios 38
1 cores_roupas = {’cal¸ca ’ : ’azul ’, ’meias ’ : ’branco ’, ’camiseta ’ : ’verde ’}
2 if ’blusa ’ not in cores_roupas :
3 cores_roupas [’blusa ’] = ’amarelo ’
4 print( cores_roupas )
Para remover um item de um dicion´ario, ´e preciso utilizar a palavra reservada
del, conforme exibido no script abaixo:
1 matriculas = {’Jo~ao ’ : ’05467 ’, ’Maria ’ : ’05468 ’, ’Alice ’ : ’05469 ’}
2 del matriculas[’Maria ’]
3 print(matriculas) # {’Jo~ao ’: ’05467’, ’Alice ’: ’05469 ’}
Observa¸c˜ao: ´E importante salientar que ´e extremamente recomend´avel que,
antes de se remover um determinado item, seja verificado se a chave do item
existe no dicion´ario.
Caso deseje remover todos os itens de um dicion´ario, utilize a fun¸c˜ao embutida
clear, conforme o exemplo abaixo:
1 matriculas = {’Jo~ao ’ : ’05467 ’, ’Maria ’ : ’05468 ’, ’Alice ’ : ’05469 ’}
2 matriculas.clear ()
3 print(matriculas) # {}
´E poss´ıvel criar dicion´arios de forma dinˆamica, utilizando o conceito de dict
comprehension. No exemplo abaixo, ´e criado um dicion´ario cujas chaves s˜ao
n´umeros inteiros entre [1..5] e, para cada item, o seu valor ´e o quadrado de sua
chave:
1 quadrados = {numero : numero ** 2 for numero in range (1, 6)}
2 print(quadrados) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Em algumas situa¸c˜oes, ´e necess´ario extrair todas as chaves de um determi-
nado dicion´ario para realizar algum tipo de processamento. Para tanto, basta
utilizar a fun¸c˜ao embutida keys. O exemplo abaixo extrai as chaves de um
dicion´ario para percorrer os seus itens:
1 lista_compras = {’feij~ao ’ : 2, ’arroz ’: 1, ’carne ’ : 3}
2 for chave in lista_compras.keys ():
3 print(’%s: %d’%(chave , lista_compras[chave ]))
Tamb´em existem situa¸c˜oes em que ´e necess´ario extrair apenas os valores de
um dicion´ario. Para tanto, ´e preciso utilizar a fun¸c˜ao embutida values, conforme
exibido no exemplo abaixo:
1 ana = {’nome ’ : ’Ana’, ’idade ’ : 23, ’sexo ’ : ’f’}
2 dados_ana = ana.values ()
3 print(dados_ana) # dict_values ([23, ’f’, ’Ana ’])
4 #Convertendo os dados em uma lista com a fun¸c~ao list
5 dados_ana = list(dados_ana)
6 print(dados_ana) # [23, ’f’, ’Ana ’]
Para ordenar um dicion´ario de acordo com suas chaves ou valores, ´e preciso
utilizar a classe OrderedDict do m´odulo collections. O exemplo abaixo exibe
13 Dicion´arios 39
como ordenar um dicion´ario de forma crescente ou decrescente de acordo com
suas chaves ou valores:
1 from collections import OrderedDict
2
3 alunos = {’Pedro ’ : 12, ’Juliana ’ : 10, ’Lucas ’ : 13}
4 # Ordena¸c~ao crescente pelas chaves
5 alunos_ordenados = OrderedDict(sorted(alunos.items ()))
6 # OrderedDict ([(’ Juliana ’, 16) , (’Lucas ’, 13), (’Pedro ’, 12)])
7 print( alunos_ordenados )
8 # Ordena¸c~ao decrescente pelas chaves
9 alunos_ordenados = OrderedDict(sorted(alunos.items (), reverse=True))
10 # OrderedDict ([(’ Pedro ’, 12), (’Lucas ’, 13), (’Juliana ’, 16)])
11 print( alunos_ordenados )
12 # Ordena¸c~ao crescente pelos valores
13 alunos_ordenados = OrderedDict(sorted(alunos.items (), key=lambda item: item [1]))
14 # OrderedDict ([(’ Juliana ’, 10) , (’Pedro ’, 12), (’Lucas ’, 13)])
15 print( alunos_ordenados )
16 # Ordena¸c~ao decrescente pelos valores
17 alunos_ordenados = OrderedDict(sorted(alunos.items (), reverse=True , key=lambda item: item [1]))
18 # OrderedDict ([(’ Lucas ’, 13), (’Pedro ’, 12), (’Juliana ’, 10)])
19 print( alunos_ordenados )
Em algumas situa¸c˜oes, cada item de um dicion´ario pode conter mais de um
valor. Neste caso, o valor do item deve ser uma lista. O exemplo abaixo exibe
este tipo de situa¸c˜ao:
1 mamiferos = [’cabra ’, ’coelho ’, ’gato ’, ’vaca ’]
2 peixes = [’pintado ’, ’dourado ’, ’tucunar´e ’]
3 aves = [’pardal ’, ’can´ario ’, ’seriema ’, ’pombo ’]
4 animais = {}
5 animais[’mamiferos ’] = mamiferos
6 animais[’peixes ’] = peixes
7 animais[’aves ’] = aves
8 ’’’
9 {
10 ’peixes ’: [’pintado ’, ’dourado ’, ’tucunar´e ’],
11 ’mamiferos ’: [’cabra ’, ’coelho ’, ’gato ’, ’vaca ’],
12 ’aves ’: [’pardal ’, ’can´ario ’, ’seriema ’, ’pombo ’]
13 }
14 ’’’
15 print(animais)
Exerc´ıcios
(a) Escreva um script que sorteie mil n´umeros entre [1..10] e ent˜ao exiba na
tela quantas vezes cada um dos n´umeros foi sorteado.
(b) Escreva um script que sorteie cem n´umeros entre [1..10] e ent˜ao remova
apenas os n´umeros que tiveram uma quantidade ´ımpar de ocorrˆencias.
(c) Escreva um script que leia do usu´ario uma lista de compras, onde para cada
item da compra vocˆe deve ler a sua descri¸c˜ao, quantidade e pre¸co unit´ario.
Os itens da lista devem ser armazenados em um dicion´ario, utilizando a
14 Manipula¸c˜ao de arquivos 40
descri¸c˜ao de cada item como chave. Ap´os, o script deve calcular o valor
total da compra.
14 Manipula¸c˜ao de arquivos
Todos os programas que escrevemos at´e ent˜ao por meio de nossos scripts s˜ao
executados em mem´oria prim´aria — no nosso caso, mem´oria RAM (Ran-
dom Access Memory, ou Mem´oria de Acesso Randˆomico). Por´em, quando ma-
nipulamos arquivos programaticamente, estamos trabalhando com dispositivos
de mem´oria secund´aria, uma vez que arquivos s˜ao gravados em dispositivos de
mem´oria n˜ao-vol´atil — ex., HDs, pendrives, etc.
Manipular arquivos programaticamente ´e uma atividade comum no dia a dia
de desenvolvimento de software. Como um primeiro exemplo, vamos considerar
que desejamos escrever um programa capaz de ler o conte´udo de um arquivo
textual, ou seja, um arquivo composto apenas por caracteres textuais:
1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo:
2 for linha in arquivo:
3 print(linha , end=’’)
O script acima utiliza a fun¸c˜ao open para abrir o arquivo arquivo.txt, o qual
est´a localizado no diret´orio /home/sidsu/Documentos. Observe a sintaxe
utilizada para realizar a abertura do arquivo. Utilizamos duas palavras reservadas
da linguagem Python que ainda n˜ao t´ınhamos visto nesta apostila: with e as.
Assim, na linha 1 do script abrimos o arquivo arquivo.txt e ent˜ao o refe-
renciamos utilizando a vari´avel arquivo. No la¸co for da linha 2, as linhas do
arquivo s˜ao lidas sequencialmente, uma linha a cada itera¸c˜ao. Por fim, na linha
3, imprimimos na tela o conte´udo da linha lida. Foi utilizado o parˆametro end
para evitar o pulo de linha adicional na fun¸c˜ao print, uma vez que a string da
linha lida j´a cont´em um pulo de linha em seu final.
Vale a pena salientar que o caminho de um arquivo ´e composto pelo caminho
desde a raiz da unidade de mem´oria secund´aria at´e o diret´orio onde o arquivo se
encontra, seguido do nome do arquivo. Se o programa estiver sendo executado no
sistema operacional Windows, ´e preciso substituir cada ocorrˆencia do caractere
’’ na string do caminho especificado por duas ocorrˆencias do mesmo caractere
(“”). Por exemplo, se o arquivo est´a situado no caminho abaixo:
C:UsersSidneyarquivo.txt
Ent˜ao, a string correspondente para o parˆametro de entrada seria:
“C:UsersSidneyarquivo.txt”
14 Manipula¸c˜ao de arquivos 41
Opcionalmente, o mesmo caminho poderia ser definido substituindo-se cada
ocorrˆencia do caractere ’’ pelo caractere ’/’. Desta forma, o caminho do exemplo
acima ficaria como abaixo:
“C:/Users/Sidney/arquivo.txt”
No ´ultimo exemplo, realizamos a leitura de um arquivo textual linha a linha.
Alternativamente, podemos ler o conte´udo inteiro de um arquivo textual de uma
s´o vez utilizando a fun¸c˜ao read, conforme exibido no exemplo abaixo:
1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo:
2 print(arquivo.read ())
Utilizando os conhecimentos que adquirimos nesta apostila, ´e poss´ıvel escre-
ver um script para exibir cada palavra de um arquivo textual separadamente. O
script abaixo implementa esta tarefa:
1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo:
2 for linha in arquivo:
3 for palavra in linha.split(’ ’):
4 palavra = palavra.replace(’n’, ’’)
5 palavra = palavra.replace(’,’, ’’)
6 palavra = palavra.replace(’.’, ’’)
7 palavra = palavra.replace(’;’, ’’)
8 palavra = palavra.replace(’:’, ’’)
9 palavra = palavra.replace(’?’, ’’)
10 palavra = palavra.replace(’!’, ’’)
11 if len(palavra.strip ()) > 0:
12 print(palavra)
Antes de aprendermos a gravar conte´udo em um arquivo textual, vamos falar
um pouco sobre a fun¸c˜ao open. Como dito anteriormente, ela realiza a abertura
de um arquivo existente em algum dispositivo de mem´oria secund´aria. Para tanto,
a fun¸c˜ao open recebe como parˆametro o caminho do arquivo a ser aberto.
Por´em, al´em do caminho do arquivo a ser aberto, a fun¸c˜ao open pode receber
um segundo parˆametro, referente ao modo de acesso a ser utilizado na abertura
do arquivo. O modo de acesso se refere `a forma a qual o arquivo ser´a aberto,
sendo que cada forma ´e baseada em trˆes formas principais: leitura, escrita ou
anexa¸c˜ao. A tabela 13 exibe todos os modos de abertura de arquivo da fun¸c˜ao
open.
14 Manipula¸c˜ao de arquivos 42
Modo Descri¸c˜ao
r Abre um arquivo em modo de leitura somente. O ponteiro do
arquivo ´e colocado no in´ıcio do arquivo. Este ´e o modo padr˜ao,
sendo utilizado inclusive quando um modo n˜ao ´e informado.
rb Abre um arquivo bin´ario em modo de leitura somente. O pon-
teiro do arquivo ´e colocado no in´ıcio do arquivo. Este ´e o modo
padr˜ao, sendo utilizado inclusive quando um modo n˜ao ´e infor-
mado.
r+ Abre um arquivo em modo de leitura e escrita. O ponteiro do
arquivo ´e colocado no in´ıcio do arquivo.
rb+ Abre um arquivo bin´ario em modo de leitura e escrita. O ponteiro
do arquivo ´e colocado no in´ıcio do arquivo.
w Abre um arquivo em modo de escrita somente. Se o arquivo
j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e
criado em modo de escrita.
wb Abre um arquivo bin´ario em modo de escrita somente. Se o
arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo
arquivo ´e criado em modo de escrita.
w+ Abre um arquivo em modo de leitura e escrita. Se o arquivo
j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e
criado em modo de leitura e escrita.
wb+ Abre um arquivo bin´ario em modo de leitura e escrita. Se o
arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo
arquivo ´e criado em modo de leitura e escrita.
a Abre um arquivo em modo de anexa¸c˜ao. O ponteiro do arquivo
´e colocado no final do arquivo, caso o arquivo j´a exista. Caso
ele n˜ao exista, um novo arquivo ´e criado em modo de escrita.
ab Abre um arquivo bin´ario em modo de anexa¸c˜ao. O ponteiro do
arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista.
Caso ele n˜ao exista, um novo arquivo ´e criado em modo de
escrita.
a+ Abre um arquivo em modo de leitura e anexa¸c˜ao. O ponteiro do
arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista.
Caso ele n˜ao exista, um novo arquivo ´e criado em modo de leitura
e escrita.
ab+ Abre um arquivo bin´ario em modo de leitura e anexa¸c˜ao. O
ponteiro do arquivo ´e colocado no final do arquivo, caso o arquivo
j´a exista. Caso ele n˜ao exista, um novo arquivo ´e criado em modo
de leitura e escrita.
Tab. 13: Modos de abertura de arquivos da fun¸c˜ao open.
14 Manipula¸c˜ao de arquivos 43
Veremos a seguir alguns exemplos de escrita, come¸cando com arquivos textu-
ais. O script a seguir grava uma string em um arquivo textual. Caso o arquivo do
caminho e nome especificados j´a exista, o seu conte´udo antigo ser´a descartado e
o novo conte´udo ser´a gravado. Caso ele ainda n˜ao exista, um novo arquivo ser´a
criado dentro do caminho especificado e com o nome especificado:
1 with open(’/home/sidsu/Documentos/saida.txt’, ’w’) as arquivo:
2 arquivo.write(’Este texto ser´a gravado dentro do arquivo.’)
O exemplo a seguir ´e bem parecido com o exemplo anterior. Por´em, neste
script, caso o arquivo j´a exista, o novo conte´udo ´e gravado no final do arquivo.
Caso ele ainda n˜ao exista, o comportamento ´e o mesmo ao do script anterior:
1 with open(’/home/sidsu/Documentos/saida.txt’, ’a’) as arquivo:
2 arquivo.write(’Este texto ser´a gravado no final do arquivo.’)
Agora, vamos a um exemplo mais complexo. Observe o conte´udo do arquivo
notas.txt abaixo:
1 7.8
2 9.2
3 7
4 8.45
O script a seguir abre o arquivo notas.txt, faz a leitura das quatro notas
existentes no arquivo, calcula a m´edia aritm´etica das notas e ent˜ao grava a
m´edia calculada no final do arquivo:
1 with open(’/home/sidsu/Documentos/notas.txt’, ’a+’) as arquivo:
2 soma = 0
3 contador = 0
4 arquivo.seek (0)
5 for linha in arquivo:
6 nota = float(linha)
7 soma += nota
8 contador += 1
9 media = soma / contador
10 arquivo.write(’n’ + str(media))
Vimos at´e ent˜ao como manipular arquivos textuais, ou seja, arquivos cujo
conte´udo ´e composto unicamente por caracteres textuais. Por sua vez, um
arquivo bin´ario possui uma estrutura mais complexa, podendo conter outros
tipos de dados al´em de caracteres. Exemplos de arquivos bin´arios s˜ao arquivos
de imagens (ex., JPEG, PNG), de ´audio (ex., MP3, OGG), v´ıdeo (ex., MP4,
AVI), documentos do MS Office (ex., DOC, XLS), entre outros.
Quando lemos o conte´udo de um arquivo bin´ario, n˜ao estamos lendo uma
string de caracteres, como ocorre na leitura de um arquivo textual, mas sim uma
string de bytes. Para entender do que se trata uma string de bytes, vamos
recordar um pouco sobre strings de caracteres, isto ´e, as string que j´a estamos
acostumados nessa apostila. Observe o exemplo abaixo:
14 Manipula¸c˜ao de arquivos 44
1 frase = ’Eu sou uma string.’
2 print(frase [0]) # E
No exemplo acima temos uma string de caracteres na vari´avel frase. Na
segunda linha do script, imprimimos o conte´udo do caractere do´ındice 0 da string,
respectivamente o caractere ’E’. Nada demais do que j´a estamos acostumados.
Agora, observe o exemplo abaixo:
1 frase = b’Eu sou uma string.’
2 print(frase [0]) # 69
Este ´ultimo exemplo ´e muito parecido com o exemplo anterior, por´em a
vari´avel frase est´a recebendo a string de caracteres com um prefixo b. Isto
faz com que a string de caracteres seja convertida em uma string de bytes, onde
cada elemento desta string de bytes corresponde ao respectivo caractere da string
original, convertido para o seu valor inteiro em bytes correspondente.
Voltando a falar sobre arquivos bin´arios, vimos na tabela 13 que existem
modos espec´ıficos para a abertura de arquivos bin´arios (modos com sufixo ’b’).
Como um primeiro exemplo, o script abaixo imprime na tela todos os bytes de
um arquivo de imagem:
1 with open(’/home/sidsu/Imagens/imagem.png’, ’rb’) as arquivo:
2 byte = arquivo.read (1)
3 while byte != b’’:
4 print(byte [0], end=’ ’)
5 byte = arquivo.read (1)
Pare ler cada byte do arquivo por vez, utilizamos a fun¸c˜ao embutida read,
passando como parˆametro o valor 1 sinalizando que queremos ler apenas um
byte. O la¸co while ´e utilizado para repetir a leitura dos bytes at´e o ´ultimo byte
do arquivo. Ap´os ler o ´ultimo byte do arquivo, quando a fun¸c˜ao read tenta
realizar uma nova leitura, ela retorna o valor b”, o qual simboliza que n˜ao h´a
mais bytes a serem lidos. Desta forma, o la¸co while termina sua execu¸c˜ao.
Vejamos agora um exemplo mais ´util. O script abaixo utiliza a mesma es-
trat´egia do exemplo anterior para realizar a c´opia de um arquivo de imagem.
Para realizar a grava¸c˜ao do byte lido do arquivo fonte no arquivo de destino, ele
utiliza a fun¸c˜ao embutida write:
1 with open(’/home/sidsu/Imagens/imagem.png ’, ’rb’) as fonte:
2 with open(’/home/sidsu/Imagens/imagem2.png’, ’wb’) as destino:
3 byte = fonte.read (1)
4 while byte != b’’:
5 destino.write(byte)
6 byte = fonte.read (1)
Opcionalmente, podemos ler todo o conte´udo de um arquivo de uma s´o vez.
Por´em, ´e importante ressaltar que esta estrat´egia deve ser utilizada com cautela,
haja visto que todo o conte´udo do arquivo ´e trazido para a mem´oria principal
14 Manipula¸c˜ao de arquivos 45
de uma s´o vez, o que pode ser custoso dependendo do tamanho do arquivo e
a quantidade de mem´oria principal dispon´ıvel no sistema operacional. O script
abaixo realiza a c´opia de um arquivo de imagem, utilizando esta estrat´egia:
1 with open(’/home/sidsu/Imagens/imagem.png ’, ’rb’) as fonte:
2 with open(’/home/sidsu/Imagens/imagem2.png’, ’wb’) as destino:
3 byte = fonte.read ()
4 destino.write(byte)
Nos exemplos anteriores, vimos como realizar a leitura e escrita em arquivos
textuais e bin´arios. Tais opera¸c˜oes s˜ao muito ´uteis e possuem diversas aplica¸c˜oes.
Por´em, `as vezes precisamos realizar atividades que exigem apenas a leitura dos
metadados de arquivos ou diret´orios, n˜ao precisando necessariamente realizar
opera¸c˜oes de leitura e escrita.
Metadados s˜ao basicamente ”dados sobre dados”. No contexto de arquivos
e diret´orios, temos metadados como o nome do arquivo, seu diret´orio, seu ta-
manho, se ele ´e um arquivo ou diret´orio, entre outros. A seguir, veremos alguns
exemplos b´asicos sobre manipula¸c˜ao de metadados de arquivos.
O exemplo a seguir utiliza a fun¸c˜ao isfile do m´odulo os.path para verificar
se um determinado caminho se refere a um arquivo, retornando True caso sim
ou False caso contr´ario. O exemplo tamb´em utiliza a fun¸c˜ao isdir de forma
an´aloga para verificar se o caminho se refere a um diret´orio:
1 from os.path import isfile , isdir
2
3 eh_arquivo = isfile(’/home/sidsu/Documentos/arquivo.txt ’)
4 print(eh_arquivo) # True
5 eh_pasta = isdir(’/home/sidsu/Documentos/arquivo.txt’)
6 print(eh_pasta) # False
O exemplo a seguir exibe o uso da fun¸c˜ao basename do m´odulo os.path
para pegar o nome de um arquivo a partir do caminho de seu diret´orio:
1 from os.path import basename
2
3 nome_arquivo = basename(’/home/sidsu/Documentos/arquivo.txt ’)
4 print( nome_arquivo ) # arquivo.txt
Neste pr´oximo exemplo, ´e solicitado ao usu´ario que informe o caminho de
um diret´orio. Ap´os, o script utiliza a fun¸c˜ao listdir do m´odulo os para pegar os
nomes de todos os arquivos e diret´orios existentes dentro do diret´orio informado:
1 from os import listdir
2 from os.path import isdir
3
4 diretorio_raiz = input(’Digite o caminho do diret´orio raiz: ’)
5 if isdir( diretorio_raiz ):
6 for arquivo in listdir( diretorio_raiz ):
7 print(arquivo)
8 else:
9 print(’O caminho informado n~ao se refere a um diret´orio.’)
Agora, imagine que desejamos escrever um script que lˆe do usu´ario o cami-
nho de um diret´orio e ent˜ao contabiliza a quantidade de arquivos e diret´orios
14 Manipula¸c˜ao de arquivos 46
existentes do diret´orio informado. Iremos implementar duas solu¸c˜oes para este
problema. A primeira solu¸c˜ao usa a fun¸c˜ao join do m´odulo os.path para obter
o caminho de cada item existente dentro do diret´orio informado, podendo assim
verificar se o item ´e um arquivo ou diret´orio:
1 from os import listdir
2 from os.path import isdir , join
3
4 diretorio_raiz = input(’Digite o caminho do diret´orio raiz: ’)
5 if isdir( diretorio_raiz ):
6 quantidade_arquivos = 0
7 quantidade_diretorios = 0
8 for arquivo in listdir( diretorio_raiz ):
9 arquivo = join(diretorio_raiz , arquivo)
10 if isdir(arquivo):
11 quantidade_diretorios += 1
12 else:
13 quantidade_arquivos += 1
14 print(’Nro de diret´orios: %s’% quantidade_diretorios )
15 print(’Nro de arquivos: %s’% quantidade_arquivos )
16 else:
17 print(’O caminho informado n~ao se refere a um diret´orio.’)
Como um ´ultimo exemplo sobre manipula¸c˜ao de metadados de arquivos, o
script abaixo utiliza a fun¸c˜ao getsize do m´odulo os.path para pegar o tamanho
em bytes de um arquivo:
1 from os.path import getsize
2
3 tamanho = getsize(’/home/sidsu/Documentos/arquivo.txt’)
4 print(tamanho)
Agora, como um ´ultimo exemplo geral sobre arquivos, o script a seguir realiza
a remo¸c˜ao de um arquivo e um diret´orio, utilizando as fun¸c˜oes remove e rmdir
do m´odulo os. Lembre-se de tomar muito cuidado quando implementar scripts
que realizam a remo¸c˜ao de arquivos ou diret´orios!
1 from os import remove , rmdir
2
3 remove(’/home/sidsu/Documentos/arquivo.txt’)
4 rmdir(’/home/sidsu/Documentos/diretorio ’)
Exerc´ıcios
(a) Escreva um script que leia o caminho de um diret´orio do usu´ario e ent˜ao
informe a quantidade de arquivos para cada extens˜ao de arquivo encontrada
dentro do diret´orio.
(b) Escreva um script que seja capaz de ler o arquivo entrada.txt, o qual
cont´em as notas dos alunos de uma determinada turma. O arquivo ´e
estruturado da seguinte forma:
15 Lidando com erros 47
1 NUMERO_ALUNOS NUMERO_NOTAS
2 NOTA1_ALUNO1 NOTA2_ALUNO1 NOTA3_ALUNO1 ...
3 NOTA1_ALUNO2 NOTA2_ALUNO2 NOTA3_ALUNO2 ...
4 NOTA1_ALUNO3 NOTA2_ALUNO3 NOTA3_ALUNO3 ...
Por exemplo, a vers˜ao abaixo do arquivo exemplo.txt cont´em as 4 notas
de 5 alunos:
1 5 4
2 7.6 6 8.89 10
3 5 4.2 3.37 7
4 10 9.8 8.7 9.2
5 7 6 8 7
6 2.1 2.2 3 4.1
Ap´os realizar a leitura do arquivo exemplo.txt, o programa deve realizar o
c´alculo da m´edia aritm´etica das notas de cada aluno e gravar os resultados
no arquivo saida.txt, o qual deve ser estruturado da seguinte forma:
1 NUMERO_ALUNOS
2 MEDIA_ALUNO1
3 MEDIA_ALUNO2
4 MEDIA_ALUNO3
5 ...
Por exemplo, o conte´udo do arquivo saida.txt correspondente ao arquivo
exemplo.txt do exemplo anterior seria o seguinte:
1 5
2 8.1225
3 4.8925
4 9.425
5 7
6 2.85
15 Lidando com erros
Bem, se vocˆe chegou at´e aqui, espero que vocˆe tenha lido todas as se¸c˜oes
anteriores, testado os exemplos, realizado os exerc´ıcios e aprendido os princ´ıpios
b´asicos de programa¸c˜ao de computadores utilizando a linguagem Python. Caso
sim, meus parab´ens!
Por´em, n˜ao posso deixar vocˆe sair por a´ı escrevendo scripts Python sem antes
falar de um assunto extremamente importante: tratamento de erros!
Mas antes, vamos definir o que ´e um erro. Dentro do contexto de pro-
grama¸c˜ao de computadores, existem basicamente dois tipos de erros: os sint´aticos
e os semˆanticos.
Introdução à Programação de Computadores com Python
Introdução à Programação de Computadores com Python
Introdução à Programação de Computadores com Python

Mais conteúdo relacionado

Mais procurados

Rede sem fio - Radiofrequência
Rede sem fio - RadiofrequênciaRede sem fio - Radiofrequência
Rede sem fio - RadiofrequênciaeuClaudio99
 
Modulacao em amplitude
Modulacao em amplitudeModulacao em amplitude
Modulacao em amplitudeOsmar Antonio
 
Apresentação PAPs Electrónica, Automação e Computadores
Apresentação PAPs Electrónica, Automação e ComputadoresApresentação PAPs Electrónica, Automação e Computadores
Apresentação PAPs Electrónica, Automação e Computadoreseddygrinder74
 
Qualidades Físicas - Força
Qualidades Físicas - ForçaQualidades Físicas - Força
Qualidades Físicas - ForçaFilipe Matos
 
Casos notáveis [ matemática ]
Casos notáveis [ matemática ]Casos notáveis [ matemática ]
Casos notáveis [ matemática ]Alex Faria
 
Gestão de Complexos Desportivos
Gestão de Complexos DesportivosGestão de Complexos Desportivos
Gestão de Complexos DesportivosCatarinaNeivas
 
Breve história do teatro
Breve história do teatroBreve história do teatro
Breve história do teatrobeonline5
 
Voleibol e suas novas tecnologias(1)
Voleibol e suas novas tecnologias(1)Voleibol e suas novas tecnologias(1)
Voleibol e suas novas tecnologias(1)Maysa Martins
 
Exercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralExercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralDiego Oliveira
 
Ginástica Artística
Ginástica ArtísticaGinástica Artística
Ginástica Artísticawaldeck
 
Energia potencial e conservaçao
Energia potencial e conservaçaoEnergia potencial e conservaçao
Energia potencial e conservaçaoAdrianne Mendonça
 
Derivação com logaritmo
Derivação com logaritmoDerivação com logaritmo
Derivação com logaritmoDiego Oliveira
 

Mais procurados (20)

Esgrima
EsgrimaEsgrima
Esgrima
 
Rede sem fio - Radiofrequência
Rede sem fio - RadiofrequênciaRede sem fio - Radiofrequência
Rede sem fio - Radiofrequência
 
Teoria+ +transformada+de+laplace
Teoria+ +transformada+de+laplaceTeoria+ +transformada+de+laplace
Teoria+ +transformada+de+laplace
 
Modulacao em amplitude
Modulacao em amplitudeModulacao em amplitude
Modulacao em amplitude
 
Apresentação PAPs Electrónica, Automação e Computadores
Apresentação PAPs Electrónica, Automação e ComputadoresApresentação PAPs Electrónica, Automação e Computadores
Apresentação PAPs Electrónica, Automação e Computadores
 
Sequencias e series calculo
Sequencias e series   calculoSequencias e series   calculo
Sequencias e series calculo
 
Qualidades Físicas - Força
Qualidades Físicas - ForçaQualidades Físicas - Força
Qualidades Físicas - Força
 
Flexibilidade 01
Flexibilidade 01Flexibilidade 01
Flexibilidade 01
 
Casos notáveis [ matemática ]
Casos notáveis [ matemática ]Casos notáveis [ matemática ]
Casos notáveis [ matemática ]
 
Gestão de Complexos Desportivos
Gestão de Complexos DesportivosGestão de Complexos Desportivos
Gestão de Complexos Desportivos
 
Breve história do teatro
Breve história do teatroBreve história do teatro
Breve história do teatro
 
78258936 reservas-e-recepcao
78258936 reservas-e-recepcao78258936 reservas-e-recepcao
78258936 reservas-e-recepcao
 
Capacidade física
Capacidade físicaCapacidade física
Capacidade física
 
A importância do desporto na vida dos jovens
A importância do desporto na vida dos jovensA importância do desporto na vida dos jovens
A importância do desporto na vida dos jovens
 
Voleibol e suas novas tecnologias(1)
Voleibol e suas novas tecnologias(1)Voleibol e suas novas tecnologias(1)
Voleibol e suas novas tecnologias(1)
 
Periodização
PeriodizaçãoPeriodização
Periodização
 
Exercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralExercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integral
 
Ginástica Artística
Ginástica ArtísticaGinástica Artística
Ginástica Artística
 
Energia potencial e conservaçao
Energia potencial e conservaçaoEnergia potencial e conservaçao
Energia potencial e conservaçao
 
Derivação com logaritmo
Derivação com logaritmoDerivação com logaritmo
Derivação com logaritmo
 

Semelhante a Introdução à Programação de Computadores com Python

Semelhante a Introdução à Programação de Computadores com Python (20)

Python
PythonPython
Python
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
 
Apostila - Linguagem de Programação I
Apostila - Linguagem de Programação IApostila - Linguagem de Programação I
Apostila - Linguagem de Programação I
 
Apostila latex 2010
Apostila latex 2010Apostila latex 2010
Apostila latex 2010
 
Pascal
PascalPascal
Pascal
 
Curso python
Curso pythonCurso python
Curso python
 
Devc++
Devc++Devc++
Devc++
 
Programação em Shell Script
Programação em Shell ScriptProgramação em Shell Script
Programação em Shell Script
 
Apostila C++ básico - Apostilando.com
Apostila C++ básico - Apostilando.comApostila C++ básico - Apostilando.com
Apostila C++ básico - Apostilando.com
 
Análise de Disco, I/O e Processamento
Análise de Disco, I/O e ProcessamentoAnálise de Disco, I/O e Processamento
Análise de Disco, I/O e Processamento
 
Linguagem C - Arquivos [exercícios]
Linguagem C - Arquivos [exercícios]Linguagem C - Arquivos [exercícios]
Linguagem C - Arquivos [exercícios]
 
PROJETO MODELO editado.docx
PROJETO MODELO editado.docxPROJETO MODELO editado.docx
PROJETO MODELO editado.docx
 
Fascículo1java
Fascículo1javaFascículo1java
Fascículo1java
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Java recursos avançados - streams
Java   recursos avançados - streamsJava   recursos avançados - streams
Java recursos avançados - streams
 
Slide curso metasploit
Slide curso metasploitSlide curso metasploit
Slide curso metasploit
 
Shell script
Shell script Shell script
Shell script
 
ptt
pttptt
ptt
 
Aula 1
Aula 1Aula 1
Aula 1
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 

Mais de Sidney Roberto

Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stackSidney Roberto
 
Personagens negros na cultura nerd
Personagens negros na cultura nerdPersonagens negros na cultura nerd
Personagens negros na cultura nerdSidney Roberto
 
Mantendo os dados do seu app web offline com PouchDB
Mantendo os dados do seu app web offline com PouchDBMantendo os dados do seu app web offline com PouchDB
Mantendo os dados do seu app web offline com PouchDBSidney Roberto
 
Regulamento da batalha campal do DCN IV
Regulamento da batalha campal do DCN IVRegulamento da batalha campal do DCN IV
Regulamento da batalha campal do DCN IVSidney Roberto
 
Regulamento dos concursos de cosplay e cospobre do DCN IV
Regulamento dos concursos de cosplay e cospobre do DCN IVRegulamento dos concursos de cosplay e cospobre do DCN IV
Regulamento dos concursos de cosplay e cospobre do DCN IVSidney Roberto
 
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQ
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQRegulamento Cosplay e Cospobre - DCN 3 IFMS-AQ
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQSidney Roberto
 
Tecnologias e Mercado de Trabalho
Tecnologias e Mercado de TrabalhoTecnologias e Mercado de Trabalho
Tecnologias e Mercado de TrabalhoSidney Roberto
 
Palestra de boas vindas aos estudantes do curso TSI do IFMS Aquidauana
Palestra de boas vindas aos estudantes do curso TSI do IFMS AquidauanaPalestra de boas vindas aos estudantes do curso TSI do IFMS Aquidauana
Palestra de boas vindas aos estudantes do curso TSI do IFMS AquidauanaSidney Roberto
 
Web Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaWeb Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaSidney Roberto
 
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQ
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQRegulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQ
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQSidney Roberto
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidSidney Roberto
 
Minha opinião sobre o sistema educacional de base brasileiro
Minha opinião sobre o sistema educacional de base brasileiroMinha opinião sobre o sistema educacional de base brasileiro
Minha opinião sobre o sistema educacional de base brasileiroSidney Roberto
 
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)Sidney Roberto
 
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)Sidney Roberto
 
Manipulação de Datas em Java
Manipulação de Datas em JavaManipulação de Datas em Java
Manipulação de Datas em JavaSidney Roberto
 

Mais de Sidney Roberto (20)

Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stack
 
Personagens negros na cultura nerd
Personagens negros na cultura nerdPersonagens negros na cultura nerd
Personagens negros na cultura nerd
 
Mantendo os dados do seu app web offline com PouchDB
Mantendo os dados do seu app web offline com PouchDBMantendo os dados do seu app web offline com PouchDB
Mantendo os dados do seu app web offline com PouchDB
 
Regulamento da batalha campal do DCN IV
Regulamento da batalha campal do DCN IVRegulamento da batalha campal do DCN IV
Regulamento da batalha campal do DCN IV
 
Regulamento dos concursos de cosplay e cospobre do DCN IV
Regulamento dos concursos de cosplay e cospobre do DCN IVRegulamento dos concursos de cosplay e cospobre do DCN IV
Regulamento dos concursos de cosplay e cospobre do DCN IV
 
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQ
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQRegulamento Cosplay e Cospobre - DCN 3 IFMS-AQ
Regulamento Cosplay e Cospobre - DCN 3 IFMS-AQ
 
Tecnologias e Mercado de Trabalho
Tecnologias e Mercado de TrabalhoTecnologias e Mercado de Trabalho
Tecnologias e Mercado de Trabalho
 
Palestra de boas vindas aos estudantes do curso TSI do IFMS Aquidauana
Palestra de boas vindas aos estudantes do curso TSI do IFMS AquidauanaPalestra de boas vindas aos estudantes do curso TSI do IFMS Aquidauana
Palestra de boas vindas aos estudantes do curso TSI do IFMS Aquidauana
 
Web Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciênciaWeb Scraping: aplicações nos negócios e na ciência
Web Scraping: aplicações nos negócios e na ciência
 
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQ
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQRegulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQ
Regulamento do Concurso de Cosplay - Dia da Cultura Nerd IFMS-AQ
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para Android
 
Minha opinião sobre o sistema educacional de base brasileiro
Minha opinião sobre o sistema educacional de base brasileiroMinha opinião sobre o sistema educacional de base brasileiro
Minha opinião sobre o sistema educacional de base brasileiro
 
Listas (parte 2 de 3)
Listas (parte 2 de 3)Listas (parte 2 de 3)
Listas (parte 2 de 3)
 
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)
Vamos aprender algo diferente? Introdução à linguagem Python (parte 2)
 
Listas (parte 1)
Listas (parte 1)Listas (parte 1)
Listas (parte 1)
 
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)
Vamos aprender algo diferente? Introdução à linguagem Python (aula 1)
 
Fatores Humanos
Fatores HumanosFatores Humanos
Fatores Humanos
 
Laços de Repetição
Laços de RepetiçãoLaços de Repetição
Laços de Repetição
 
Manipulação de Datas em Java
Manipulação de Datas em JavaManipulação de Datas em Java
Manipulação de Datas em Java
 
Classes e Objetos
Classes e ObjetosClasses e Objetos
Classes e Objetos
 

Introdução à Programação de Computadores com Python

  • 1. Introdu¸c˜ao `a Programa¸c˜ao de Computadores com Python∗ 1.a edi¸c˜ao Prof.o Sidney Roberto de Sousa Conte´udo 1 Criando e executando um programa em Python . . . . . . . . . . 1 2 Imprimindo texto na tela . . . . . . . . . . . . . . . . . . . . . . 3 3 Criando coment´arios . . . . . . . . . . . . . . . . . . . . . . . . 4 4 Lendo valores do usu´ario . . . . . . . . . . . . . . . . . . . . . . 5 5 Trabalhando com strings . . . . . . . . . . . . . . . . . . . . . . 6 6 Trabalhando com n´umeros inteiros . . . . . . . . . . . . . . . . 11 7 Trabalhando com n´umeros reais . . . . . . . . . . . . . . . . . . 12 8 Opera¸c˜oes matem´aticas . . . . . . . . . . . . . . . . . . . . . . 13 9 Trabalhando com booleanos e opera¸c˜oes l´ogicas . . . . . . . . . 16 10 Controlando o fluxo do programa . . . . . . . . . . . . . . . . . 18 11 Utilizando la¸cos de repeti¸c˜ao . . . . . . . . . . . . . . . . . . . 24 12 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 13 Dicion´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 14 Manipula¸c˜ao de arquivos . . . . . . . . . . . . . . . . . . . . . . 40 15 Lidando com erros . . . . . . . . . . . . . . . . . . . . . . . . . 47 1 Criando e executando um programa em Python Um programa Python b´asico ´e escrito dentro de um script Python. Um script Python ´e simplesmente um arquivo textual contendo linhas de c´odigo escritas utilizando a linguagem de programa¸c˜ao Python. Estas linhas, em conjunto, cont´em instru¸c˜oes para fazer o computador realizar alguma tarefa. Para criar um script Python, primeiramente vocˆe deve escolher um editor de texto adequado. Um editor de texto ´e um programa pelo qual ´e poss´ıvel criar, editar e salvar arquivos que cont´em basicamente texto simples – como os scripts ∗ Este material est´a baseado no Python 3≥3.4. 1
  • 2. 1 Criando e executando um programa em Python 2 Python, por exemplo. Existem diversos editores de texto dispon´ıveis na internet. Em nossas aulas, utilizaremos o editor Notepad++1 . Este editor de texto possui a capacidade de destacar as palavras reservadas da linguagem Python, o que auxiliar´a bastante na cria¸c˜ao de nossos scripts. Para criar um novo script Python, vocˆe deve abrir o Notepad++, clicar no menu Arquivo e ent˜ao na op¸c˜ao Novo. Ap´os, clique no menu Arquivo nova- mente e ent˜ao clique na op¸c˜ao Salvar como. Ao abrir a janela Salvar como, escolha uma pasta para o seu arquivo e dˆe um nome ao seu script, preferenci- almente, utilizando letras min´usculas, sem espa¸cos em branco, acentua¸c˜oes ou caracteres especiais. Ainda na nomenclatura do seu arquivo, utilize a extens˜ao .py. Esta extens˜ao ´e utilizada para se identificar scripts Python no sistema ope- racional. Uma vez que o script Python foi criado, ´e poss´ıvel executar o programa escrito nele utilizando o interpretador do Python. Para tanto, basta executar o comando python no Prompt de Comando do Windows. Por exemplo, digamos que o script exemplo.py tenha sido salvo na pasta C:Userssidney.sousaCursoPython. No Prompt de Comando, ´e preciso entrar nesta pasta utilizando o comando cd. Ap´os, utilizamos o comando python para executar o script. A figura 1 exibe este processo. Fig. 1: Abrindo a pasta onde o script est´a contido e, por fim, executando o script. Como nosso script ainda n˜ao possui nenhuma linha de c´odigo, nada ´e impresso na tela ap´os executarmos o comando python. Na pr´oxima se¸c˜ao, come¸caremos a programar o nosso script! 1 Dispon´ıvel em https://notepad-plus-plus.org/. Acessado em 4 de abril de 2016.
  • 3. 2 Imprimindo texto na tela 3 2 Imprimindo texto na tela Ainda no script exemplo.py da se¸c˜ao anterior, iremos criar um programa para imprimir na tela uma mensagem para o usu´ario. Para tanto, utilizaremos a fun¸c˜ao print, a qual recebe como parˆametro uma mensagem de texto. Esta mensagem deve estar dentro de aspas simples, aspas duplas ou aspas triplas. Nesta apostila, por padr˜ao, utilizaremos aspas simples na impress˜ao de mensagens nos exemplos. A seguir, o script exemplo.py utiliza a fun¸c˜ao print para imprimir trˆes mensagens na tela, cada qual utilizando um padr˜ao de aspas: 1 print(’Ol´a , mundo!’) 2 print("Eu tamb´em sou uma mensagem!") 3 print(’’’... e eu tamb´em sou uma mensagem!’’’) Ap´os executarmos este script, a sa´ıda ser´a a seguinte: 1 Ol´a , mundo! 2 Eu tamb´em sou uma mensagem! 3 ... e eu tamb´em sou uma mensagem! Como vocˆe pode ver, cada mensagem apareceu em uma linha diferente. Isto ocorreu porquˆe cada mensagem foi impressa utilizando uma chamada diferente `a fun¸c˜ao print. Por´em, ´e poss´ıvel imprimir mais de uma mensagem utilizando uma ´unica chamada `a fun¸c˜ao print. Para tanto, ´e preciso utilizar o caractere n˜ao imprim´ıvel n. Observe o exemplo a seguir: 1 print(’Primeira linha . nSegunda linha . nTerceira linha.’) A sa´ıda da execu¸c˜ao deste exemplo ser´a: 1 Primeira linha. 2 Segunda linha. 3 Terceira linha. No exemplo acima, o caractere n for¸cou a quebra de linha no ponto em que ele foi inserido. O resultado disso ´e que a mensagem original foi dividida em trˆes linhas. Outro efeito poss´ıvel na impress˜ao de texto na tela ´e a tabula¸c˜ao, utilizando o caractere n˜ao imprim´ıvel t. Como exemplo, considere o script abaixo: 1 print(’Esta frase n~ao possui tabula¸c~ao.’) 2 print(’tEsta frase possui tabula¸c~ao.’) Sa´ıda: 1 Esta frase n~ao possui tabula¸c~ao. 2 Esta frase possui tabula¸c~ao.
  • 4. 3 Criando coment´arios 4 No exemplo acima, o caractere t for¸cou uma tabula¸c˜ao no in´ıcio da segunda frase. Cada ocorrˆencia do caractere t for¸ca uma tabula¸c˜ao, conforme exibe o exemplo abaixo: 1 print(’Esta frase n~ao possui tabula¸c~ao.’) 2 print(’tttEsta frase possui 3 tabula¸c~oes.’) Sa´ıda: 1 Esta frase n~ao possui tabula¸c~ao. 2 Esta frase possui 3 tabula¸c~oes. Exerc´ıcios: (a) Escreva um script que imprima na tela o poema a seguir utilizando uma ou mais chamadas `a fun¸c˜ao print, sabendo que cada frase possui uma tabula¸c˜ao em seu in´ıcio. 1 BILHETE 2 3 Se tu me amas , ama -me baixinho 4 N~ao o grites de cima dos telhados 5 Deixa em paz os passarinhos 6 Deixa em paz a mim! 7 Se me queres , 8 enfim , 9 tem de ser bem devagarinho , Amada , 10 que a vida ´e breve , e o amor mais breve ainda 11 12 Mario Quintana (b) Escreva um script que imprima na tela o mesmo poema acima, por´em utilizando somente uma chamada `a fun¸c˜ao print. 3 Criando coment´arios Um coment´ario consiste em uma anota¸c˜ao ou lembrete que vocˆe deseja colocar no c´odigo do seu script. Coment´arios n˜ao s˜ao c´odigo Python e n˜ao afetam em nada a execu¸c˜ao do seu script. Observe o exemplo abaixo: 1 # A linha abaixo exibe uma mensagem pro usu´ario 2 print(’Ol´a , seja bem vindo!’) O script acima cont´em duas linhas. A primeira linha cont´em um coment´ario explicando ao leitor do c´odigo do script o que a linha de c´odigo abaixo faz. Para criar um coment´ario de uma ´unica linha, assim como o do exemplo acima, basta
  • 5. 4 Lendo valores do usu´ario 5 colocar no in´ıcio da linha o caractere #. Caso este caractere seja colocado no in´ıcio de uma linha de c´odigo v´alida, este c´odigo ´e desabilitado e, consequente- mente, n˜ao executado. No exemplo abaixo, desabilitamos a linha do script do exemplo anterior que imprime a mensagem na tela: 1 # A linha abaixo exibe uma mensagem pro usu´ario 2 #print(’Ol´a , seja bem vindo !’) ´E poss´ıvel criar coment´arios com duas ou mais linhas. Por´em, para isto ´e necess´ario inserir trˆes aspas simples antes e depois do texto de coment´ario. O exemplo abaixo exibe o uso de coment´arios de v´arias linhas: 1 ’’’ 2 ´E poss´ıvel criar coment´arios de v´arias linhas , 3 utilizando aspas triplas no in´ıcio e no final do 4 coment´ario. 5 ’’’ 6 print(’Lembre -se: coment´arios n~ao s~ao trechos de c´odigo v´alidos!’) Utilize coment´arios sempre que desejar deixar algum lembrete a si mesmo ou a outra pessoa sobre o seu c´odigo. Nesta apostila, coment´arios ser˜ao utiliza- dos esporadicamente nos scripts de exemplo para deixar alguma observa¸c˜ao ou lembrete. 4 Lendo valores do usu´ario Todos os programas dos scripts vistos at´e ent˜ao nesta apostila n˜ao s˜ao interativos. Ou seja, eles n˜ao promovem a intera¸c˜ao direta entre o usu´ario e computador. A partir de agora, vamos aprender a ler dados do usu´ario a fim de alimentar os nossos programas. Primeiramente, iremos aprender a realizar a leitura de uma mensagem de texto do usu´ario. O script abaixo pergunta ao usu´ario o seu nome e ent˜ao exibe na tela uma mensagem cordial: 1 nome = input(’Informe o seu nome:’) 2 print(’Ol´a , %s!’%nome) A primeira linha do script acima realiza as seguintes tarefas. Primeiramente, a fun¸c˜ao input exibe na tela uma mensagem solicitando o nome do usu´ario. Em seguida, o cursor do Prompt do Windows ir´a esperar que o usu´ario digite o dado solicitado. Ap´os digitar o seu nome, o usu´ario deve digitar a tecla ENTER para confirmar a leitura. Por fim, a fun¸c˜ao input retorna o nome digitado pelo usu´ario, o qual ´e arma- zenado na vari´avel nome. Isto ´e feito por meio de uma opera¸c˜ao de atribui¸c˜ao. Uma opera¸c˜ao de atribui¸c˜ao possui a seguinte estrutura: vari´avel = c´odigo que resulta em algum valor
  • 6. 5 Trabalhando com strings 6 Opera¸c˜oes de atribui¸c˜ao s˜ao divididas em duas partes, separadas pelo opera- dor de atribui¸c˜ao =. Elas devem ser analisadas da direita para a esquerda. O lado direito de uma opera¸c˜ao de atribui¸c˜ao sempre cont´em algum c´odigo que ir´a resultar em algum valor — por exemplo, uma equa¸c˜ao matem´atica, uma fun¸c˜ao que retorna algum valor, entre outros. Por sua vez, o lado esquerdo de uma opera¸c˜ao de atribui¸c˜ao, na maioria das vezes, cont´em uma vari´avel que ir´a armazenar o valor gerado no lado direito da opera¸c˜ao. Neste ponto, vocˆe deve estar se perguntando: o que ´e uma vari´avel? Uma vari´avel representa um espa¸co de mem´oria onde um determinado valor ´e armazenado. No exemplo anterior, a vari´avel nome representa o espa¸co de mem´oria onde o nome do usu´ario ´e salvo para ser utilizado durante o programa escrito no script. Quando a execu¸c˜ao do script termina, a vari´avel ´e destru´ıda e, assim, seu valor ´e perdido. Voltando ao ´ultimo exemplo, na segunda linha do script ´e impressa uma mensagem cordial ao usu´ario, utilizando a fun¸c˜ao print. Para que o valor da vari´avel nome possa ser impresso, ´e utilizado o caractere %s na mensagem dentro da fun¸c˜ao print. Ele funciona como um “coringa”, sendo substitu´ıdo em tempo de execu¸c˜ao pelo valor da vari´avel nome, a qual ´e passada na fun¸c˜ao print utilizando como prefixo o caractere %. Este prefixo informa `a fun¸c˜ao print que o valor a ser colocado no lugar do caractere %s est´a na vari´avel nome. A seguir, um exemplo de execu¸c˜ao do script do exemplo anterior: 1 Informe o seu nome:Sidney 2 Ol´a , Sidney! 5 Trabalhando com strings Uma string ´e basicamente um conjunto de caracteres. Uma palavra, uma frase ou um texto composto por v´arias frases s˜ao exemplos de strings. Na se¸c˜ao anterior, vimos um exemplo de script que lia o nome do usu´ario e o armazenava na vari´avel nome. Podemos dizer que, neste exemplo, a vari´avel nome cont´em uma string. As strings s˜ao muito importantes na programa¸c˜ao de computadores. Muitos dos dados que s˜ao processados e armazenados em sistemas de informa¸c˜ao s˜ao strings. Por exemplo, em um sistema de gest˜ao escolar, temos v´arios dados que s˜ao strings, como por exemplo o nome do estudante, seu endere¸co e o nome de seu respons´avel. Temos ainda os nomes dos cursos, disciplinas, turmas, professores e outros dados que tamb´em s˜ao strings. Em um sistema de e-commerce, v´arias strings s˜ao processadas e armazenadas, como os nomes dos produtos, suas descri¸c˜oes, opini˜oes de clientes, etc. De fato, em muitos sistemas comerciais, boa parte dos dados consiste basicamente em
  • 7. 5 Trabalhando com strings 7 strings. Al´em disso, o uso de strings n˜ao se at´em a sistemas comerciais, mas tamb´em ´e visto em softwares cient´ıficos, sistemas operacionais e muitos outros tipos de sistemas. Desta forma, saber escrever programas que processam strings ´e algo crucial para um bom programador de computadores. A boa not´ıcia ´e que a linguagem de programa¸c˜ao Python possui um suporte bem completo para o processamento de strings. Mas afinal, o que ´e processar uma string? O que isto significa? Processar uma string consiste em realizar nela alguma dentre as seguintes opera¸c˜oes: • Transform´a-la em outra string; • Selecionar de forma estrat´egica parte dela; • Particion´a-la de forma estrat´egica. Antes de aprender como realizar todas estas opera¸c˜oes, vocˆe precisa entender a defini¸c˜ao sobre strings da primeira frase desta se¸c˜ao: uma string ´e basicamente um conjunto de caracteres. Na teoria dos conjuntos, um conjunto pode ser composto por nenhum elemento, um ´unico elemento ou v´arios elementos. No caso das strings, podemos dizer que uma string pode ser composta por nenhum caractere (o que chamamos de string vazia), um ´unico caractere ou v´arios caracteres, conforme o exemplo abaixo: 1 string1 = ’’ 2 string2 = ’a’ 3 string3 = ’Eu possuo v´arios caracteres ’ No exemplo acima, cada string sendo atribu´ıda a uma vari´avel ´e cercada por aspas simples. Toda string deve ser cercada por aspas, aspas simples ou aspas triplas, conforme o exemplo abaixo: 1 string1 = ’Ol´a , mundo!’ 2 string2 = "Eu tamb´em sou uma string!" 3 string3 = ’’’... e eu tamb´em sou uma string!’’’ Vocˆe pode escolher que forma de cercamento vocˆe ir´a utilizar. Por´em, caso vocˆe cerque o in´ıcio de uma string com um tipo de aspas, o cercamento do final da string deve utilizar o mesmo tipo de aspas. Caso contr´ario, vocˆe ter´a um erro de sintaxe no seu c´odigo e ent˜ao seu script n˜ao ser´a executado. Cada caractere dentro de uma string possui um ´ındice, que funciona como um endere¸co do caractere dentro da string. O Python trabalha com dois tipos de indexa¸c˜ao de caracteres: a indexa¸c˜ao padr˜ao e a indexa¸c˜ao negativa. A tabela 1 exemplifica a indexa¸c˜ao de caracteres de uma string em Python:
  • 8. 5 Trabalhando com strings 8 O l ´a , m u n d o ! 0 1 2 3 4 5 6 7 8 9 10 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 Tab. 1: Indexa¸c˜ao de strings em Python Desta forma, podemos dizer que, na indexa¸c˜ao padr˜ao, o caractere ‘!’ est´a localizado na posi¸c˜ao de ´ındice 10, enquanto que o caractere ‘,’ est´a localizado na posi¸c˜ao de ´ındice 3. Se utilizarmos a indexa¸c˜ao negativa, podemos dizer que o caractere ‘!’ est´a localizado na posi¸c˜ao de ´ındice -1, enquanto que o caractere ‘,’ est´a localizado na posi¸c˜ao de ´ındice -8. ´E poss´ıvel pegar caracteres de uma string, utilizando o ´ındice no qual o caractere est´a localizado, conforme exibido no script a seguir: 1 frase = ’Ontem eu vi um animal.’ 2 print(frase [0]) # ’O’ 3 print(frase [6]) # ’e’ 4 print(frase [ -3]) # ’a’ 5 print(frase [ -10]) # ’u’ O uso de ´ındices tamb´em permite a extra¸c˜ao de parte de uma string, ou seja, uma substring. Para tanto, ´e preciso saber qual o ´ındice do primeiro e ´ultimos caracteres da substring a ser extra´ıda. Como exemplo, considere a string “Trˆes tigres tristes”. Agora, imagine que devemos extrair a substring “Trˆes” desta string. Para tanto, devemos encontrar os ´ındices dos caracteres ‘T’ e ‘s’, respectivamente os caracteres inicial e final desta substring: T r ˆe s 0 1 2 3 Tab. 2: Indexa¸c˜ao da string “Trˆes”. Assim, os caracteres encontram-se nos ´ındices 0 e 3 da substring. O script abaixo realiza a extra¸c˜ao da substring “Trˆes” da string “Trˆes tigres tristes”: 1 string = ’Tr^es tigres tristes ’ 2 substring = string [0:4] # extrai a substring ’Tr^es ’ 3 print(substring) A extra¸c˜ao ocorre na segunda linha do script, com a diretiva string[0:4]. Dentro dos colchetes da string, foram passados os ´ındices 0 e 4, definindo os ´ındices de in´ıcio e final do corte. Neste momento vocˆe pode estar se perguntando: “Mas o ´ındice final da substring ‘Trˆes’ n˜ao era 3?”. De fato, 3 ´e o ´ındice final da substring. Por´em, nas
  • 9. 5 Trabalhando com strings 9 diretivas de extra¸c˜ao de substrings, o ´ındice de in´ıcio do corte ´e inclusivo e o de fim ´e exclusivo. Ou seja, a substring resultante conter´a todos os caracteres (em ordem) contidos a partir do ´ındice de in´ıcio at´e o caractere contido no ´ultimo ´ındice anterior ao ´ındice de fim de corte. Para entender este mecanismo, execute e observe o script abaixo: 1 string = ’Tr^es tigres tristes ’ 2 substring = string [0:4] # extrai a substring ’Tr^es ’ 3 print(substring) 4 substring = string [5:11] # extrai a substring ’tigres ’ 5 print(substring) 6 substring = string [12:19] # extrai a substring ’tristes ’ 7 print(substring) Agora, imagine que devemos escrever um programa que leia do usu´ario uma frase e ent˜ao deva extrair desta frase o primeiro e ´ultimo caracteres. Bem, extrair o primeiro caractere de uma frase ´e simples, haja visto que ele sempre estar´a no primeiro ´ındice, ou seja, o ´ındice 0: 1 frase = input(’Digite uma frase ’) 2 primeiro = frase [0] 3 print(primeiro) Por´em, como faremos para extrair o ´ultimo caractere da frase, considerando que n˜ao sabemos de antem˜ao qual frase o usu´ario digitar´a? Bem, neste caso existem duas estrat´egias poss´ıveis: a primeira consiste em descobrir qual o tamanho da frase; em seguida, com base neste dado, calculare- mos qual ´e o ´ındice do ´ultimo caractere da frase. Considere a frase a seguir: L u a c h e i a ! 0 1 2 3 4 5 6 7 8 9 Tab. 3: Frase de exemplo. A frase acima possui exatamente 10 caracteres2 . Assim, dizemos que ela pos- sui tamanho 10. Em Python, o tamanho de uma string ´e dado pela quantidade de caracteres que ela possui. Desta forma, na string acima, os ´ındices de seus caracteres variam de 0 a 9. Ou seja, o ´ultimo caractere est´a no ´ındice 9. Assim, se uma string possui tamanho n, o ´ultimo caractere estar´a sempre no ´ındice n – 1. Voltando ao nosso problema, para encontrar o ´ultimo caractere da frase infor- mada pelo usu´ario, devemos encontrar primeiramente o tamanho da string. Para 2 Vale salientar que o espa¸co em branco, na quarta posi¸c˜ao (´ındice 3) tamb´em ´e um caractere v´alido.
  • 10. 5 Trabalhando com strings 10 tanto, utilizaremos a fun¸c˜ao len (de length, ou comprimento, em portuguˆes) do Python: 1 frase = input(’Digite uma frase: ’) 2 primeiro = frase [0] 3 tamanho = len(frase) 4 ultimo = frase[tamanho - 1] 5 print(’Primeiro: %st ´Ultimo: %s’%( primeiro , ultimo)) A segunda estrat´egia ´e bem mais simples. Ela consiste simplesmente em utilizar o sistema de indexa¸c˜ao negativa do Python, conforme exibido na tabela 1. Nela, o ´ultimo caractere de uma string sempre est´a no ´ındice -1. O script a seguir utiliza esta estrat´egia mais simples: 1 frase = input(’Digite uma frase: ’) 2 primeiro = frase [0] 3 ultimo = frase [-1] 4 print(’Primeiro: %st ´Ultimo: %s’%( primeiro , ultimo)) Ora ou outra, existe a necessidade de concatenar duas ou mais strings, de tal maneira a formar uma ´unica string resultante. Para tanto, ´e poss´ıvel utilizar o operador +, conforme exibido no script a seguir: 1 frase1 = ’Estamos ’ 2 frase2 = ’ ’ 3 frase3 = ’juntas!’ 4 frase_completa = frase1 + frase2 + frase3 5 print(frase_completa ) # Estamos juntas! Tamb´em ´e poss´ıvel converter strings para mai´usculo ou min´usculo, utilizando as fun¸c˜oes embutidas upper e lower. No script abaixo, a primeira string ´e convertida para mai´usculo, enquanto que a segunda string tem sua primeira metade convertida para mai´usculo e sua segunda metade para min´usculo: 1 frase1 = ’Eu e minha ^ansia por crescer!’ 2 print(frase1.upper ()) 3 frase2 = ’N~ao sei se quero crescer ou ficar na inf^ancia.’ 4 ’’’ 5 Nas duas linhas abaixo , para calcular o valor 6 da metade do tamanho da frase , ´e utilizado a 7 fun¸c~ao len() para calcular o tamanho da frase 8 e ent~ao utilizado o operador / para dividir o 9 tamanho por 2, a fun¸c~ao int() para converter 10 o resultado para um valor inteiro e ent~ao o 11 operador + para somar uma unidade ao resultado. 12 Fique tranquilo caso n~ao tenha entendido 13 completamente o script abaixo! Veremos mais 14 sobre opera¸c~oes matem´aticas em breve.
  • 11. 6 Trabalhando com n´umeros inteiros 11 15 ’’’ 16 tamanho = len(frase2) 17 metade = int(tamanho / 2) + 1 18 primeira = frase2 [0: metade ]. upper () 19 segunda = frase2[metade:tamanho ]. lower () 20 frase2 = primeira + segunda 21 print(frase2) Outra opera¸c˜ao muito comum quando lidamos com string ´e ter que substituir uma determinada substring de uma determinada string por outra substring. Para tanto, ´e poss´ıvel utilizar a fun¸c˜ao embutida replace, conforme o script abaixo: 1 frase = ’A Ana comeu banana ... mas que sacana!’ 2 # A Ana comeu banana ... mas que espertinha! 3 print(frase.replace(’sacana ’, ’espertinha ’)) 4 # A Ana comeu bANAna ... mas que sacANA! 5 print(frase.replace(’ana’, ’ANA’)) Por fim, uma opera¸c˜ao comum a se realizar em strings ´e remover espa¸cos em branco no in´ıcio e no final. Muitas vezes, usu´arios ao preencher formul´arios acabam deixando espa¸cos em branco indesejados nestas posi¸c˜oes. Para resolver este problema, podemos utilizar a fun¸c˜ao embutida strip, conforme o exemplo a seguir: 1 frase = ’ por favor , remova estes espa¸cos em branco ’ 2 print(frase.strip ()) Exerc´ıcios (a) Escreva um script que leia do usu´ario uma frase e ent˜ao divida esta frase em trˆes partes, exibindo todas as trˆes partes na tela ao final. (b) Escreva um script que leia do usu´ario uma frase e ent˜ao insira o caractere ‘[’ no in´ıcio da frase e o caractere ‘]’ no final desta. (c) Escreva um script que armazene cada palavra da string “Um dia eu fui uma string completa...” em uma vari´avel distinta, realizando os cortes necess´arios na string. 6 Trabalhando com n´umeros inteiros Muitos dos problemas do mundo real que necessitam de um programa de com- putador para serem resolvidos envolvem n´umeros. Considere o seguinte problema: uma pessoa possui 53 pacotes de biscoito salgado e 87 pacotes de biscoito doce em seu estoque e ela precisa saber quantos
  • 12. 7 Trabalhando com n´umeros reais 12 pacotes de biscoito ela possui no total. Note que este problema envolve apenas n´umeros inteiros, ou seja, n´umeros que n˜ao precisam de casas decimais para represent´a-los. Vamos escrever um script para resolver este problema: 1 nro_pacotes_biscoito_salgado = 53 2 nro_pacotes_biscoito_doce = 87 3 total_pacotes = nro_pacotes_biscoito_salgado + nro_pacotes_biscoito_doce 4 print(’Voc^e possui %d pacotes de biscoito.’% total_pacotes ) Para resolver este problema, precisamos utilizar trˆes vari´aveis. Como dito na se¸c˜ao 4, uma vari´avel ´e um local de armazenamento de dados. Vocˆe pode pen- sar em uma vari´avel como uma gaveta capaz de armazenar itens. Toda vari´avel possui um nome, o qual deve come¸car com uma letra e n˜ao pode conter carac- teres especiais, como espa¸cos em branco, s´ımbolos e sinais diversos. A PEP 83 recomenda que vari´aveis sejam nomeadas utilizando somente letras min´usculas, com as palavras separadas por um “underline” ( ). A primeira vari´avel utilizada no programa acima chama-se nro pacotes biscoito salgado. Ela guarda o n´umero de pacotes de biscoito salgado contidos no estoque da pessoa do nosso problema. A segunda vari´avel do nosso programa chama-se nro pacotes biscoito doce. Por sua vez, ela guarda o n´umero de pacotes de biscoito doce existentes no estoque. O n´umero total de pacotes ´e exibido na ´ultima linha do programa. A fim de facilitar o entendimento do usu´ario a respeito do que foi realizado no programa, exibimos a ele uma frase explicativa contendo o n´umero total de pacotes calcu- lado. Note que utilizamos o caractere %d como coringa para substituir o valor da vari´avel total pacotes na frase do usu´ario. Tivemos que utilizar %d ao inv´es de %s, uma vez que o valor sendo inserido n˜ao ´e uma string, mas um n´umero inteiro (‘d’ vem de decimal). O programa exibe a seguinte sa´ıda na tela: 1 Voc^e possui 140 pacotes de biscoito. 7 Trabalhando com n´umeros reais Agora, imagine que a pessoa do exemplo anterior deseje saber qual o peso total dos biscoitos que ela possui em estoque. Ela sabe que cada pacote de biscoito salgado pesa 0,350 kg e cada pacote de biscoito doce pesa 0,414 kg. Note que agora alguns n´umeros do nosso problema n˜ao s˜ao inteiros — no caso, os pesos dos pacotes. Assim, n˜ao podemos trabalhar com os valores como se fossem n´umeros inteiros. A seguir, a solu¸c˜ao para este problema: 3 Python Enhancement Proposal (em portuguˆes, Proposta de Melhoria Python). A PEP 8 est´a dispon´ıvel em https://www.python.org/dev/peps/pep-0008/. Acessado em 6 de maio de 2016.
  • 13. 8 Opera¸c˜oes matem´aticas 13 1 nro_pacotes_biscoito_salgado = 53 2 nro_pacotes_biscoito_doce = 87 3 peso_biscoitos_salgados = nro_pacotes_biscoito_salgado * 0.350 4 peso_biscoitos_doces = nro_pacotes_biscoito_doce * 0.414 5 peso_total_pacotes = peso_biscoitos_salgados + peso_biscoitos_doces 6 print(’O seu estoque de biscoitos pesa %f kg.’% peso_total_pacotes ) Al´em das duas vari´aveis para armazenar o n´umero total de pacotes de cada tipo de biscoito, o nosso programa possui mais trˆes vari´aveis para armazenar o peso total de biscoitos salgados, o peso total de biscoitos doces e o peso total de biscoitos em estoque. Diferentemente das duas vari´aveis anteriores, estas vari´aveis armazenam n´umeros reais, ou seja, n´umeros com casas decimais. Note que na mensagem de resposta na fun¸c˜ao print utilizamos o caractere %f como coringa para injetar o valor da vari´avel peso total pacotes. Neste caso, utilizamos o caractere %f pois o valor a ser injetado era um valor real (‘f’ vem de floating point, ou ponto flutuante, em portuguˆes). O script anterior imprime a mensagem na tela: 1 O seu estoque de biscoitos pesa 54.568000 kg. Note que o n´umero do resultado possui trˆes zeros nas ´ultimas casas deci- mais. ´E poss´ıvel arredondar este n´umero na impress˜ao dentro da fun¸c˜ao print, adaptando o caractere %f: 1 print(’O seu estoque de biscoitos pesa %.2f kg.’% peso_total_pacotes ) Na linha acima, modificamos o caractere %f para %.2f, o que faz com que o n´umero seja arredondado utilizando-se apenas duas casas decimais ap´os o ponto. Como resultado, a mensagem abaixo ser´a exibida: 1 O seu estoque de biscoitos pesa 54.57 kg. 8 Opera¸c˜oes matem´aticas Uma opera¸c˜ao bin´aria ´e uma opera¸c˜ao matem´atica que envolve dois valores distintos. Tais valores podem ser constantes ou oriundos de vari´aveis. Como exemplo, vamos escrever um script para realizar a soma de dois n´umeros infor- mados pelo usu´ario: 1 resposta = input(’Digite o primeiro n´umero: ’) 2 numero1 = int(resposta) 3 resposta = input(’Digite o segundo n´umero: ’) 4 numero2 = int(resposta) 5 resultado = numero1 + numero2 6 print(’%d + %d = %d’%( numero1 , numero2 , resultado)) No exemplo acima, precisamos realizar a leitura dos dois n´umeros a serem somados, os quais s˜ao informados pelo usu´ario. Por´em, a fun¸c˜ao input sempre
  • 14. 8 Opera¸c˜oes matem´aticas 14 retorna a resposta do usu´ario como string, o que impossibilitaria a realiza¸c˜ao da soma dos valores informados. Desta forma, precisamos converter a resposta do usu´ario que est´a em formato de string para um n´umero inteiro, utilizando a fun¸c˜ao int. Aplicamos a fun¸c˜ao int para obter os valores que s˜ao armazenados nas vari´aveis numero1 e numero2. Ap´os realizar a soma dos valores e armaze- nar o resultado na vari´avel resultado, exibimos a mensagem de forma objetiva ao usu´ario. Por exemplo, se o usu´ario informar os valores 67 e 88, a mensagem abaixo ser´a exibida na tela: 1 67 + 88 = 155 A tabela 4 mostra as opera¸c˜oes matem´aticas bin´arias poss´ıveis em Python. Opera¸c˜ao Operador Express˜ao Adi¸c˜ao + a = b + c Subtra¸c˜ao - a = b - c Multiplica¸c˜ao * a = b * c Divis˜ao / a = b / c Exponencia¸c˜ao ** a = b ** c M´odulo (resto) % a = b % c Tab. 4: Opera¸c˜oes matem´aticas bin´arias da linguagem Python. Opera¸c˜oes matem´aticas do tipo a = a OPERADOR b podem ser abrevia- das. A tabela 5 mostra as abrevia¸c˜oes poss´ıveis. Express˜ao Express˜ao abreviada a = a + c a += c a = a - c a -= c a = a * c a *= c a = a / c a /= c a = a ** c a **= c a = a % c a %= c Tab. 5: Abrevia¸c˜oes poss´ıveis em opera¸c˜oes matem´aticas. Podemos compor opera¸c˜oes matem´aticas mais complexas, como f´ormulas matem´aticas que envolvem n´umeros reais. O script a seguir auxilia o usu´ario a calcular a f´ormula de Bhaskara: 1 resposta = input(’Digite o valor de a: ’) 2 a = float(resposta) 3 resposta = input(’Digite o valor de b: ’)
  • 15. 8 Opera¸c˜oes matem´aticas 15 4 b = float(resposta) 5 resposta = input(’Digite o valor de c: ’) 6 c = float(resposta) 7 delta = b ** 2 - 4 * a * c 8 print(’delta = %f’%delta) No exemplo acima, os valores de a, b e c s˜ao reais. Para converter o valor lido do usu´ario para real, utilizamos a fun¸c˜ao float. Na pen´ultima linha do script, realizamos o c´alculo do valor delta. Este c´alculo envolve opera¸c˜oes de exponen- cia¸c˜ao, subtra¸c˜ao e multiplica¸c˜ao. Em Python, algumas opera¸c˜oes matem´aticas tem maior precedˆencia sobre outras, ou seja, s˜ao calculadas antes que outras. A tabela 8 mostra a ordem de precedˆencia entre as opera¸c˜oes matem´aticas: Ordem de precedˆencia Opera¸c˜ao 1o exponencia¸c˜ao e m´odulo 2o multiplica¸c˜ao e divis˜ao 3o adi¸c˜ao e subtra¸c˜ao Tab. 6: Ordem de precedˆencia dos operadores matem´aticos bin´arios. Desta forma, no c´alculo do valor delta, a opera¸c˜ao de exponencia¸c˜ao b∗∗2 ´e a primeira a ser calculada. Ap´os, a cadeia de multiplica¸c˜oes 4 ∗ a ∗ c ´e calculada. Por fim, a subtra¸c˜ao entre os dois valores resultantes ´e calculada. Caso a f´ormula precise ser calculada utilizando uma ordem de precedˆencia diferente `a ordem normal, ´e preciso utilizar parˆenteses para se definir os trechos de precedˆencia. Considere o exemplo a seguir: 1 resposta = input(’Digite o primeiro n´umero: ’) 2 numero1 = float(resposta) 3 resposta = input(’Digite o segundo n´umero: ’) 4 numero2 = float(resposta) 5 resultado = numero1 * (98 - numero2) * 4 6 print(’Resultado: %f’%resultado) Note que na f´ormula da pen´ultima linha a subtra¸c˜ao 98 – numero2 seria realizada por ´ultimo, normalmente. Por´em, como ela foi envolvida por parˆenteses, ela ser´a calculada primeiramente que as outras opera¸c˜oes. Exerc´ıcios (a) Escreva um script que leia do usu´ario dois n´umeros inteiros a e b e ent˜ao calcule o valor de ab .
  • 16. 9 Trabalhando com booleanos e opera¸c˜oes l´ogicas 16 (b) Escreva um script que leia do usu´ario o valor do raio de um c´ırculo e ent˜ao calcule o valor de sua ´area. A f´ormula da ´area do c´ırculo ´e dada por: area = Π ∗ raio2 onde Π = 3.14159265 (c) Escreva um script que leia do usu´ario o valor do montante a ser empres- tado e a taxa de juros e ent˜ao calcule o valor da parcela a ser paga pelo empr´estimo, considerando que as parcelas ter˜ao valor fixo. As f´ormulas para calcular o valor das parcelas a serem pagas pelo empr´estimo s˜ao da- das abaixo: montante = valor ∗ (1 + (taxa 100 ∗ parcelas)) prestacao = montante parcelas onde montante ´e o valor final do empr´estimo com a taxa de juros mensal aplicada, valor ´e o valor a ser emprestado, taxa ´e taxa de juros mensal, parcelas ´e a quantidade de parcelas e prestacao ´e o valor a ser pago em cada parcela. 9 Trabalhando com booleanos e opera¸c˜oes l´ogicas Na linguagem Python, um valor booleano ´e um valor que s´o pode ter um dentre dois valores: True ou False, respectivamente verdadeiro ou falso. Saber tra- balhar com valores booleanos ´e essencial para a cria¸c˜ao de programas complexos em Python, conforme veremos a partir desta se¸c˜ao. Em Python, um valor booleano pode ser armazenado em uma vari´avel. Uma opera¸c˜ao realizada entre dois valores booleanos ´e chamada de opera¸c˜ao l´ogica (ou booleana) bin´aria. O resultado de uma opera¸c˜ao l´ogica s´o pode resultar em um valor booleano, ou seja, True ou False. Existem basicamente duas opera¸c˜oes l´ogicas bin´arias: as opera¸c˜oes and e or. Uma opera¸c˜ao and s´o resulta no valor True se e somente se os dois valores da opera¸c˜ao forem iguais a True; caso contr´ario, o resultado da opera¸c˜ao ser´a False. A tabela 7 exibe os resultados para cada opera¸c˜ao and poss´ıvel entre dois valores booleanos: Por sua vez, uma opera¸c˜ao or s´o resulta no valor False se e somente se os dois valores da opera¸c˜ao forem iguais a False. A tabela 8 exibe os resultados para cada opera¸c˜ao or poss´ıvel entre dois valores booleanos: Existe tamb´em em Python uma opera¸c˜ao l´ogica un´aria, isto ´e, uma opera¸c˜ao que envolve apenas um valor: a opera¸c˜ao de nega¸c˜ao. Em Python, esta
  • 17. 9 Trabalhando com booleanos e opera¸c˜oes l´ogicas 17 a b a and b True True True True False False False True False False False False Tab. 7: Resultados poss´ıveis para a opera¸c˜ao and. a b a or b True True True True False True False True True False False False Tab. 8: Resultados poss´ıveis para a opera¸c˜ao or. opera¸c˜ao pode ser realizada por meio do operador not. A tabela 9 exibe os valores poss´ıveis para cada opera¸c˜ao de nega¸c˜ao: a not a True False False True Tab. 9: Resultados poss´ıveis para a opera¸c˜ao not. O script abaixo mostra alguns exemplos de opera¸c˜oes l´ogicas bin´arias e un´arias: 1 a = True 2 b = False 3 resultado = a and b 4 print(resultado) # False 5 resultado = a or b 6 print(resultado) # True 7 resultado = not a 8 print(resultado) # False 9 resultado = not b 10 print(resultado) # True 11 resultado = False and True or False or True 12 print(resultado) # True ´E poss´ıvel criar opera¸c˜oes l´ogicas envolvendo n´umeros inteiros ou reais. Exis- tem muitas situa¸c˜oes em que precisamos comparar dois ou mais n´umeros. As
  • 18. 10 Controlando o fluxo do programa 18 opera¸c˜oes and e or n˜ao se aplicam a n´umeros diretamente. As opera¸c˜oes l´ogicas poss´ıveis entre dois valores num´ericos s˜ao exibidas na tabela 10: Opera¸c˜ao Operador Express˜ao Igual == a == b Diferente != a != b Maior > a >b Menor < a<b Maior ou igual >= a >= b Menor ou igual <= a <= b Tab. 10: Opera¸c˜oes l´ogicas bin´arias entre n´umeros da linguagem Python. O script a seguir exemplifica as opera¸c˜oes da tabela acima: 1 numero = 67 2 outro_numero = -178.54 3 sao_iguais = numero == outro_numero 4 print(sao_iguais) # False 5 sao_diferentes = numero != outro_numero 6 print(sao_diferentes ) # True 7 primeiro_e_maior = numero > outro_numero 8 print( primeiro_e_maior ) # True 9 primeiro_e_menor = numero < outro_numero 10 print( primeiro_e_menor ) # False 11 menor_ou_igual = numero <= outro_numero 12 print(menor_ou_igual ) # False 13 maior_ou_igual = numero >= outro_numero 14 print(maior_ou_igual ) # True A opera¸c˜ao l´ogica un´aria not possui precedˆencia sobre as opera¸c˜oes bin´arias. Opera¸c˜oes l´ogicas bin´arias de compara¸c˜ao entre n´umeros (==, !=, >, <, >=, <=) possuem precedˆencia sobre as opera¸c˜oes and e or. Se vocˆe deseja for¸car a precedˆencia de uma determinada opera¸c˜ao l´ogica bin´aria, tal opera¸c˜ao deve ser escrita entre parˆenteses, como no exemplo abaixo: 1 resultado = (98 < 89) and (True and False) or True 2 print(resultado) # True 10 Controlando o fluxo do programa Cada programa visto nos exemplos desta apostila at´e ent˜ao possui um ´unico fluxo poss´ıvel de execu¸c˜ao. Isto significa que todas as linhas de c´odigo do script
  • 19. 10 Controlando o fluxo do programa 19 do programa ser˜ao executadas, a menos que ocorra algum tipo de erro durante a execu¸c˜ao do script. Por´em, existem muitos problemas em que desejamos poder controlar o fluxo de execu¸c˜ao do nosso programa, ou seja, controlar quais linhas de c´odigo ser˜ao executadas de acordo com uma ou mais condi¸c˜oes. Neste caso, o programa ter´a mais de um fluxo de execu¸c˜ao poss´ıvel. Por exemplo, considere o programa que lˆe a idade do usu´ario. Digamos que desejamos customizar a mensagem ao usu´ario de acordo com a sua idade. Se o usu´ario tiver menos de 18 anos, informamos que ele ´e menor de idade; caso contr´ario, informamos que ele j´a ´e maior de idade. Para resolver este problema, utilizaremos as instru¸c˜oes if e else da linguagem Python. A seguir, o script correspondente: 1 resposta = input(’Digite sua idade: ’) 2 idade = int(resposta) 3 if idade >= 18: 4 print(’Voc^e ´e maior de idade.’) 5 else: 6 print(’Voc^e ´e menor de idade.’) A instru¸c˜ao if recebe como argumento um valor booleano. No nosso caso, passamos como argumento uma express˜ao l´ogica, que por sua vez resultar´a em um valor booleano. Se este valor for igual a True, ent˜ao o c´odigo delimitado pela instru¸c˜ao if ser´a executado; caso contr´ario, o c´odigo delimitado pela instru¸c˜ao else ser´a executado. ´E importante “abrir parˆenteses” nesta se¸c˜ao para falar sobre um assunto muito importante na programa¸c˜ao em Python: identa¸c˜ao de c´odigo! Observe este trecho do c´odigo do script do exemplo anterior: 1 if idade >= 18: 2 print(’Voc^e ´e maior de idade.’) Como vocˆe j´a deve ter percebido, a segunda linha est´a mais `a direita em compara¸c˜ao `a primeira linha. De fato, ela possui uma tabula¸c˜ao adicional em compara¸c˜ao `a linha anterior. Isto se deve ao fato de que o c´odigo desta linha pertence ao bloco da instru¸c˜ao if. Assim, ele foi colocado exatamente uma tabula¸c˜ao `a direita (ou mais a dentro) para simbolizar tal fato. Na programa¸c˜ao Python, chamamos este alinhamento de c´odigo de identa¸c˜ao. Em Python, a identa¸c˜ao de c´odigo ´e obrigat´oria. Isto significa que, por exemplo, o c´odigo a seguir n˜ao ser´a executado: 1 resposta = input(’Digite sua idade: ’) 2 idade = int(resposta) 3 if idade >= 18: 4 print(’Voc^e ´e maior de idade.’)
  • 20. 10 Controlando o fluxo do programa 20 5 else: 6 print(’Voc^e ´e menor de idade.’) Ao executar o script acima, o interpretador do Python identificar´a a instru¸c˜ao if da terceira linha e, consequentemente, ir´a verificar que a linha abaixo do if n˜ao est´a corretamente identada. Assim, ele exibir´a na tela a mensagem abaixo: 1 IndentationError : expected an indented block Ou seja, ele informar´a que houve um erro e que, no trecho de c´odigo onde o erro foi identificado, era esperado um bloco de c´odigo identado. Fechando os parˆenteses, voltemos ao assunto principal desta se¸c˜ao. No exemplo anterior, temos apenas duas situa¸c˜oes que s˜ao mutuamente exclusivas. Por´em, existem v´arios problemas os quais necessitam de m´ultiplas condi¸c˜oes para realizar o roteamento de m´ultiplos fluxos de execu¸c˜ao poss´ıveis. Como exemplo, considere o script abaixo, o qual lˆe a idade do usu´ario e informa em que faixa de idade o usu´ario se encontra: 1 resposta = input(’Digite sua idade: ’) 2 idade = int(resposta) 3 if idade <= 10: 4 print(’Voc^e tem menos de 11 anos.’) 5 elif idade <= 20: 6 print(’Voc^e tem entre 11 e 20 anos.’) 7 elif idade <= 30: 8 print(’Voc^e tem entre 21 e 30 anos.’) 9 elif idade <= 50: 10 print(’Voc^e tem entre 31 e 50 anos.’) 11 else: 12 print(’Voc^e tem mais de 50 anos.’) No exemplo acima, temos cinco condi¸c˜oes mutuamente exclusivas, ou seja, a idade informada pelo usu´ario ir´a fazer com que apenas uma condi¸c˜ao seja satisfeita. Assim, n˜ao ´e poss´ıvel com que o programa execute os trechos de c´odigos de duas condi¸c˜oes distintas. Para garantir isto, utilizamos a instru¸c˜ao elif, a qual consiste em uma abrevia¸c˜ao das instru¸c˜oes else e if associadas. Se o usu´ario digitar uma idade maior que 50, nenhuma das quatro primeiras condi¸c˜oes ser˜ao satisfeitas. Isto far´a com que o c´odigo do bloco da instru¸c˜ao else seja executado. O bloco else sempre deve ser escrito ao final de todas as condi¸c˜oes, uma vez que ele simboliza o ´ultimo caso, ou seja, a ´ultima op¸c˜ao caso nenhuma das condi¸c˜oes anteriores tenham sido satisfeitas – ou seja, resultado em True. Agora, imagine que devemos escrever um programa que simule uma calcu- ladora simples, capaz de efetuar adi¸c˜oes, subtra¸c˜oes, multiplica¸c˜oes e divis˜oes. O nosso programa funcionar´a da seguinte forma. Ele solicitar´a ao usu´ario dois
  • 21. 10 Controlando o fluxo do programa 21 n´umeros reais. Ap´os isto, ele exibir´a ao usu´ario um menu de opera¸c˜oes ma- tem´aticas a serem realizadas sobre os n´umeros que ele informou, conforme abaixo: 1 Digite a opera¸c~ao desejada: 2 1 Soma 3 2 Subtra¸c~ao 4 3 Multiplica¸c~ao 5 4 Divis~ao Por exemplo, se o usu´ario deseja multiplicar os dois n´umeros que ele informou, ent˜ao ele escolher´a a op¸c˜ao 3, digitando assim este n´umero no teclado para que o programa possa enfim realizar a multiplica¸c˜ao dos dois valores. Vamos resolver este problema utilizando as instru¸c˜oes if, elif e else: 1 resposta = input(’Digite o primeiro n´umero: ’) 2 primeiro_numero = float(resposta) 3 resposta = input(’Digite o segundo n´umero: ’) 4 segundo_numero = float(resposta) 5 print(’Digite a o¸c~ao desejada:’) 6 print(’1 - Soma ’) 7 print(’2 - Subtra¸c~ao ’) 8 print(’3 - Multiplica¸c~ao ’) 9 print(’4 - Divis~ao ’) 10 resposta = input(’’) 11 opcao = int(resposta) 12 resultado = 0 13 resultado_calculado = True 14 if opcao == 1: 15 resultado = primeiro_numero + segundo_numero 16 elif opcao == 2: 17 resultado = primeiro_numero - segundo_numero 18 elif opcao == 3: 19 resultado = primeiro_numero * segundo_numero 20 elif opcao == 4: 21 if segundo_numero != 0: 22 resultado = primeiro_numero / segundo_numero 23 else: 24 print(’N~ao ´e poss´ıvel dividir por 0!’) 25 resultado_calculado = False 26 else: 27 print(’Op¸c~ao inv´alida!’) 28 resultado_calculado = False 29 30 if resultado_calculado : 31 print(’Resultado: %f’%resultado)
  • 22. 10 Controlando o fluxo do programa 22 O script acima possui uma estrutura de c´odigo parecida com a do exemplo anterior, com exce¸c˜ao ao bloco elif que trata a op¸c˜ao de divis˜ao (op¸c˜ao 4). Aprendemos nas aulas de matem´atica que, em uma divis˜ao, o divisor n˜ao pode ser zero. Desta forma, este bloco de c´odigo possui um tratamento para verificar se o divisor, armazenado na vari´avel segundo numero, ´e diferente de zero, para assim poder realizar o c´alculo da divis˜ao. Caso este tratamento n˜ao tivesse sido feito e o programa executasse uma divis˜ao por zero, o interpretador do Python lan¸caria o seguinte erro: 1 ZeroDivisionError : float division by zero Ou seja, ele lan¸ca uma mensagem de erro, informando que houve uma divis˜ao por zero e consequentemente o programa foi finalizado. No final do script, existe um bloco if que n˜ao faz parte da cadeia de blocos if, elif e else que faz a verifica¸c˜ao da op¸c˜ao do usu´ario. Este bloco ´e independente e verifica se o c´alculo do resultado foi realizado com sucesso. Lembrando que o c´alculo ´e realizado com sucesso quando o usu´ario digita uma op¸c˜ao v´alida e, caso tenha optado pelo c´alculo da divis˜ao, o valor do divisor informado n˜ao tenha sido igual a zero. Condi¸c˜oes mutuamente exclusivas do tipo if-else que definem o valor de uma vari´avel podem ser abreviadas, conforme o exemplo a seguir: 1 from random import randint 2 ’’’ 3 A fun¸c~ao randint faz o sorteio 4 de um valor dentre os valores 5 informados como par^ametro nela 6 (no nosso exemplo abaixo , entre 7 1 e 11). A fun¸c~ao randint precisa 8 ser importada do m´odulo 9 random. Para tanto , usamos a 10 diretiva da linha acima. 11 ’’’ 12 numero_aleatorio = randint (1, 10) 13 paridade = ’par’ if numero_aleatorio % 2 == 0 else ’´ımpar ’ 14 print(paridade) No exemplo acima, a fun¸c˜ao randint faz o sorteio de um valor entre 1 e 10 e ent˜ao armazena tal valor na vari´avel numero aleatorio. Em seguida, a vari´avel paridade recebe a string “par” caso o valor da vari´avel numero aleatorio seja par ou a string “´ımpar” caso contr´ario. Ainda no exemplo acima, a fun¸c˜ao randint precisou ser importada do m´odulo random para que ent˜ao pud´essemos us´a-la. Para tanto, usamos a diretiva de importa¸c˜ao da primeira linha do script. Ainda veremos nesta apostila outros scripts que necessitar˜ao importar fun¸c˜oes ou m´odulos para realizar atividades espec´ıficas.
  • 23. 10 Controlando o fluxo do programa 23 Exerc´ıcios: (a) Escreva um programa que leia do usu´ario um n´umero inteiro e ent˜ao in- forme na tela se o n´umero ´e divis´ıvel ou n˜ao por 7. (b) Escreva um programa que leia do usu´ario sua altura (em metros) e seu peso (em kg), calcule o seu ´ındice de massa corporal (IMC) e informe na tela o seu grau de obesidade. O IMC ´e dado pela f´ormula abaixo: IMC = peso/altura2 A tabela 11 exibe os graus de obesidade referentes a cada faixa de IMC: Valor IMC Grau de obesidade <18.5 Abaixo do peso 18.5 ≤ IMC<25 Peso normal 25 ≤ IMC<30 Sobrepeso 30 ≤ IMC<35 Obesidade de grau I 35 ≤ IMC<40 Obesidade de grau II IMC ≥ 40 Obesidade de grau III Tab. 11: Graus de obesidade de acordo com o IMC. (c) Escreva um programa que leia as notas de quatro provas do usu´ario, calcula a m´edia das notas. Se a m´edia for maior ou igual a 7, ent˜ao informe ao usu´ario que ele foi aprovado. Se a m´edia for maior que 5 e menor que 7, informe que ele est´a de recupera¸c˜ao. Por fim, se a m´edia for inferior a 5, informe que ele foi reprovado. (d) Escreva um script que leia do usu´ario o valor do montante a ser emprestado e qual o tipo de cliente e ent˜ao calcule o valor da parcela a ser paga pelo empr´estimo, considerando que as parcelas ter˜ao valor fixo e o valor da taxa para o tipo de cliente. As f´ormulas para calcular o valor das parcelas a serem pagas pelo empr´estimo s˜ao dadas abaixo: montante = valor ∗ (1 + (taxa 100 ∗ parcelas)) prestacao = montante parcelas onde montante ´e o valor final do empr´estimo com a taxa de juros mensal aplicada, valor ´e o valor a ser emprestado, taxa ´e taxa de juros mensal, parcelas ´e a quantidade de parcelas e prestacao ´e o valor a ser pago em cada parcela. A tabela 12 exibe as taxas de juros para cada tipo de cliente:
  • 24. 11 Utilizando la¸cos de repeti¸c˜ao 24 Tipo de cliente Taxa de juros a.m. (%) Standard 2.5 Platinum 1.99 Gold 1.2 Tab. 12: Taxas de juros para cada tipo de cliente. 11 Utilizando la¸cos de repeti¸c˜ao Imagine que devemos escrever um programa para imprimir na tela a sequˆencia de 1 at´e 4 em uma mesma linha. Este problema ´e extremamente simples e ´e resolvido pelo script abaixo: 1 print(’1 2 3 4’) Agora, considere que o nosso problema seja criar um programa que leia do usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia de 1 at´e n em uma mesma linha. Vamos tentar resolver este problema utilizando a mesma estrat´egia da solu¸c˜ao anterior: 1 resposta = input(’Digite um n´umero inteiro positivo ’) 2 n = int(resposta) 3 # Garantindo que o valor de n seja positivo: 4 if n < 0: 5 n *= -1 6 elif n == 0: 7 n = 1 8 # E l´a vamos n´os ... 9 if n == 1: 10 print(’1’) 11 elif n == 2: 12 print(’1 2’) 13 elif n == 3: 14 print(’1 2 3’) 15 elif n == 4: 16 print(’1 2 3 4’) 17 elif n == 5: 18 print(’1 2 3 4 5’) 19 elif n == 6: 20 print(’1 2 3 4 5 6’) 21 # ... continua ... at´e quando? Obviamente, o script acima n˜ao consegue resolver o problema de fato, uma vez que ele s´o informa a resposta correta para valores de n entre [1..6]. O grande problema do script acima ´e que ele n˜ao ´e escal´avel aos valores de n, ou seja, ele n˜ao consegue resolver o problema para qualquer valor de n. A quest˜ao ´e: como
  • 25. 11 Utilizando la¸cos de repeti¸c˜ao 25 saberemos quais os poss´ıveis valores de n que o usu´ario poder´a digitar? N˜ao h´a como saber! Assim, quantas condi¸c˜oes l´ogicas necessitar´ıamos para resolver o problema de fato? Na realidade, infinitas condi¸c˜oes! Desta forma, precisamos escrever um c´odigo que seja capaz de imprimir todos os n´umeros da sequˆencia, por´em utilizando um n´umero fixo e m´ınimo de linhas de c´odigo. Para tanto, precisamos de alguma forma escrever um c´odigo que repita a impress˜ao dos n´umeros de forma categ´orica e estrat´egica. Assim, para realmente resolver este problema, precisamos utilizar um la¸co de repeti¸c˜ao (ou loop). A linguagem Python oferece dois la¸cos de repeti¸c˜ao distintos: o la¸co while e o la¸co for. O script a seguir resolve o nosso problema utilizando um la¸co while: 1 resposta = input(’Digite um n´umero inteiro positivo: ’) 2 n = int(resposta) 3 # Garantindo que o valor de n seja positivo: 4 if n < 0: 5 n *= -1 6 elif n == 0: 7 n = 1 8 contador = 1 9 while contador <= n: 10 print(contador , end=’ ’) 11 contador += 1 O la¸co while recebe como argumento uma condi¸c˜ao l´ogica, chamada de condi¸c˜ao de manuten¸c˜ao do la¸co. No nosso exemplo, enquanto o valor da vari´avel contador for menor ou igual ao valor da vari´avel n, o la¸co while repetir´a a execu¸c˜ao do c´odigo localizado entre as chaves. No mundo da programa¸c˜ao de computadores, chamamos de itera¸c˜ao cada repeti¸c˜ao que um la¸co realiza. Note que agora, para qualquer valor de n, a mensagem correta ser´a impressa. A vari´avel contador ´e inicializada com o valor 1, que ´e o primeiro valor que o nosso programa deve imprimir. A cada itera¸c˜ao, o valor da vari´avel contador ´e impresso. Logo em seguida, o valor da vari´avel ´e incrementado em uma unidade. Assim, na pr´oxima itera¸c˜ao, o valor a ser impresso ´e uma unidade maior que o valor atual. Note tamb´em que utilizamos dentro da fun¸c˜ao print o parˆametro end com o valor ‘ ’. O parˆametro end determina o que deve ser impresso sempre ao final de cada mensagem impressa com a fun¸c˜ao print. Por padr˜ao, sempre ´e impresso o caractere n˜ao imprim´ıvel n, o que causa sempre um pulo de linha ao final da mensagem – e n˜ao necessita o uso expl´ıcito do parˆametro end. Como no nosso exemplo a fun¸c˜ao print imprime na tela um n´umero da sequˆencia por vez e a sequˆencia deve aparecer em uma ´unica linha, modificamos explicitamente o valor do parˆametro end para ‘ ’, ou seja, um espa¸co em branco. Assim, os n´umeros
  • 26. 11 Utilizando la¸cos de repeti¸c˜ao 26 da sequˆencia aparecem separados por um espa¸co em branco entre eles. O la¸co while s´o ´e executado se e somente se a sua condi¸c˜ao l´ogica de ma- nuten¸c˜ao for satisfeita. Assim, para que um la¸co while execute ao menos uma itera¸c˜ao, a sua condi¸c˜ao l´ogica de manuten¸c˜ao deve ser satisfeita ao menos uma vez. Agora, resolveremos novamente o problema, por´em utilizando o la¸co for: 1 resposta = input(’Digite um n´umero inteiro positivo: ’) 2 n = int(resposta) 3 # Garantindo que o valor de n seja positivo: 4 if n < 0: 5 n *= -1 6 elif n == 0: 7 n = 1 8 for contador in range(1, n + 1): 9 print(contador , end = ’ ’) O la¸co for cont´em dois argumentos, separados pela palavrada reservada in. No lado direito, temos um conjunto de valores, sendo que cada um dos valores deste conjunto ser´a recebido pela vari´avel contador – no lado esquerdo – a cada itera¸c˜ao. No nosso exemplo, o conjunto de valores ´e fornecido pela fun¸c˜ao range. Esta fun¸c˜ao ´e utilizada para gerar uma sequˆencia de valores. Ela recebe dois parˆametros. O primeiro parˆametro ´e o valor inicial da sequˆencia. Por sua vez, o segundo parˆametro ´e o valor imediatamente consecutivo ap´os o ´ultimo valor da sequˆencia. Por exemplo, se invocarmos a fun¸c˜ao range da seguinte forma: 1 range(1, 6) Ela retornar´a a sequˆencia abaixo: 1 [1, 2, 3, 4, 5] Ou seja, ela retornou uma sequˆencia cujo primeiro valor ´e igual ao primeiro parˆametro informado (1) e o ´ultimo valor ´e igual ao valor que antecede o segundo parˆametro (6). No exemplo anterior do la¸co for, utilizamos a fun¸c˜ao range da seguinte forma: 1 range(1, n + 1) Assim, ela retornar´a a sequˆencia abaixo: 1 [1, 2, 3, ... n] Ou seja, uma sequˆencia que inicia com o valor 1 e termina com o valor n informado pelo usu´ario.
  • 27. 11 Utilizando la¸cos de repeti¸c˜ao 27 O exemplo a seguir lˆe do usu´ario um valor positivo n e ent˜ao imprime uma sequˆencia de n at´e 1 em uma mesma linha: 1 resposta = input(’Digite um n´umero inteiro positivo: ’) 2 n = int(resposta) 3 # Garantindo que o valor de n seja positivo: 4 if n < 0: 5 n *= -1 6 elif n == 0: 7 n = 1 8 for contador in reversed(range(1, n + 1)): 9 print(contador , end = ’ ’) Como a fun¸c˜ao range ´e capaz de criar apenas sequˆencias crescentes, utiliza- mos a fun¸c˜ao reversed para inverter a sequˆencia gerada pela fun¸c˜ao range. ´E poss´ıvel utilizar um la¸co de repeti¸c˜ao para percorrer os caracteres de uma string. O exemplo abaixo insere uma barra vertical (|) entre cada caractere de uma frase: 1 frase = ’Ontem eu vi um animal ’ 2 for caractere in frase: 3 print(caractere , end = ’|’) Exerc´ıcios (a) Escreva um programa que leia do usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia: 1, 2, 3, ...n–1, n Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser impressa: 1, 2, 3, 4, 5 (b) Escreva um programa que leia do usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia: n − 1, n − 2, n − 3, ...3, 2, 1 Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser impressa:
  • 28. 11 Utilizando la¸cos de repeti¸c˜ao 28 5, 4, 3, 2, 1 (c) Escreva um programa que leia do usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia: [1|2|3|..|n − 1|n − 2] Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser impressa: [1|2|3|4|5] (d) Escreva um programa que leia do usu´ario um valor inteiro positivo n e imprima na tela a sequˆencia: 1, 2, 3, ...n, n − 1, n − 2, ..., 3, 2, 1 Por exemplo, se o valor de n for 5, ent˜ao a seguinte sequˆencia dever´a ser impressa: 1, 2, 3, 4, 5, 4, 3, 2, 1 (e) Escreva um algoritmo que leia do usu´ario um valor n entre [1..100] e ent˜ao imprima na tela a seguinte sequˆencia: 1 1 2 1, 2 3 1, 2, 3 4 ... 5 1, 2, 3, ... n 1, n 6 1, 2, 3, ... n 1 7 ... 8 1, 2, 3 9 1, 2 10 1 Por exemplo, caso o valor n seja 5, a seguinte sequˆencia abaixo deve ser impressa: 1 1 2 1, 2 3 1, 2, 3 4 1, 2, 3, 4, 5 5 1, 2, 3, 4 6 1, 2, 3 7 1, 2 8 1
  • 29. 12 Listas 29 Caso o valor de n seja 1, ent˜ao a sequˆencia abaixo deve ser impressa: 1 1 (f) Escreva um programa leia do usu´ario valores inteiros entre [0..100] at´e que o usu´ario digite o valor -1 e ent˜ao calcule a m´edia aritm´etica destes valores (P.S.: o valor -1 n˜ao deve ser inclu´ıdo no c´alculo). (g) Escreva um programa que leia do usu´ario 10 valores inteiros entre [0..100] e calcule o produto destes valores. (h) Escreva um programa que leia do usu´ario um valor n entre [0..100] e imprima na tela os primeiros n n´umeros da sequˆencia de Fibonacci. Em uma sequˆencia de Fibonacci, os dois primeiros elementos da sequˆencia s˜ao 0 e 1. A partir do terceiro elemento, cada valor ´e a soma dos dois ´ultimos valores da sequˆencia anteriores a ele. Como exemplo, a a sequˆencia de Fibonacci para n igual 8 (ou seja, os oito primeiro elementos da sequˆencia): 0, 1, 1, 2, 3, 5, 8, 13 12 Listas Todas as vari´aveis que criamos em nossos exemplos at´e ent˜ao possuem a capa- cidade de armazenamento de apenas um valor por vez. Por exemplo, considere o script abaixo: 1 numero = 1 2 numero = 2 3 numero = 4 4 numero = -9 5 print(numero) Durante a sua execu¸c˜ao, o script atribui quatro valores distintos `a vari´avel numero, por´em apenas o valor -9 ´e impresso, pois foi o ´ultimo valor associado `a vari´avel. Ou seja, n˜ao ´e poss´ıvel armazenar mais de um valor simultaneamente na vari´avel numero. O script abaixo exibe uma poss´ıvel solu¸c˜ao a este problema: 1 numero1 = 1 2 numero2 = 2 3 numero3 = 4 4 numero4 = -9 5 print(numero1) 6 print(numero2) 7 print(numero3) 8 print(numero4)
  • 30. 12 Listas 30 Neste exemplo, cada valor foi armazenado em uma vari´avel distinta e o valor de cada vari´avel foi impresso separadamente no final do programa. Note que, se tiv´essemos que armazenar mais valores, ter´ıamos que criar mais vari´aveis, al´em de mais instru¸c˜oes para exibir tais valores na tela. Desta forma, esta solu¸c˜ao deixa de ser pr´atica `a medida que o n´umero de valores aumenta. Uma solu¸c˜ao mais elegante ao problema anterior ´e utilizar uma lista para assim poder armazenar v´arios valores em uma ´unica vari´avel. Listas s˜ao estruturas de dados que representam uma cole¸c˜ao de elementos, onde cada elemento ´e representado por uma ´unica chave. O script abaixo apresenta uma poss´ıvel solu¸c˜ao ao problema anterior, utilizando uma lista para armazenar os valores: 1 numeros = [] 2 numeros.append (1) 3 numeros.append (2) 4 numeros.append (4) 5 numeros.append (-9) 6 for numero in numeros: 7 print(numero) Na primeira linha do script, foi criada uma lista vazia. Preste aten¸c˜ao na sin- taxe de cria¸c˜ao desta lista. No c´odigo anterior ao s´ımbolo de atribui¸c˜ao (=), foi declarada uma vari´avel chamada numeros. No c´odigo posterior ao s´ımbolo de atribui¸c˜ao, a vari´avel numeros recebe uma lista vazia, que em Python ´e expres- sada por uma abertura de colchetes seguida por um encerramento de colchetes ([]). A lista ´e preenchida com quatro n´umeros, onde cada n´umero ´e inserido na lista por meio da fun¸c˜ao embutida append. Por fim, os valores da lista s˜ao exibidos em um la¸co for. Vale a pena neste ponto observar a forma a qual o la¸co ´e utilizado para iterar sobre cada elemento da lista. Na parte direita da palavra reservada in, foi passada a lista numeros. Na parte esquerda da palavra in, foi criada uma vari´avel chamada numero, a qual receber´a a cada itera¸c˜ao cada um dos elementos da lista, na ordem em que foram inseridos nela. No exemplo anterior, os n´umeros preenchidos na lista numeros n˜ao s˜ao provenientes do usu´ario, mas sim colocados diretamente no c´odigo do script. Em casos como este, onde j´a se sabe previamente os valores que uma lista receber´a, ´e poss´ıvel preenchˆe-los de uma vez no momento da cria¸c˜ao da lista. O script abaixo reescreve o script do exemplo anterior, utilizando o preenchimento direto: 1 numeros = [1, 2, 4, -9] 2 for numero in numeros: 3 print(numero) Nos dois exemplos anteriores, utilizamos o la¸co for para exibir um elemento por vez da lista. Caso deseje imprimir todos os elementos de uma vez, basta
  • 31. 12 Listas 31 imprimir a lista diretamente: 1 numeros = [1, 2, 4, -9] 2 print(numeros) No script acima, a fun¸c˜ao print imprime a seguinte mensagem: 1 [1, 2, 4, -9] Os elementos de uma lista podem ser acessados da mesma forma que os ca- racteres de uma string, ou seja, utilizando o mesmo sistema de ´ındices (positivos e negativos) que utilizamos com strings. O script abaixo cont´em alguns exem- plos de acesso a valores de uma lista e extra¸c˜ao de fatias por meio de ´ındices de elementos: 1 lista = [10, 20, 30, 40, 50, 60, 70, 80 ,90] 2 print(lista [0]) # Imprime 10 3 print(lista [5]) # Imprime 60 4 print(lista [ -1]) # Imprime 90 5 print(lista [0:4]) # Imprime [10, 20, 30, 40] Os exemplos anteriores exibiram listas de inteiros. ´E poss´ıvel criar listas de todos os tipos de dados que vimos at´e ent˜ao nesta apostila. O script abaixo ilustra algumas listas de tipos variados: 1 numeros_reais = [1.5 , 4.56 , 3.7654 , -0.552] 2 print( numeros_reais ) 3 dias_da_semana = [’Segunda ’, ’Ter¸ca ’, ’Quarta ’, ’Quinta ’, ’Sexta ’, ’S´abado ’, ’Domingo ’] 4 print( dias_da_semana ) 5 valores_booleanos = [True , True , False , True , False , False] 6 print( valores_booleanos ) 7 # ´E poss´ıvel criar listas com elementos de tipos distintos 8 tudo_misturado = [1, ’Ontem ’, False , 3.56] 9 print( tudo_misturado ) O exemplo a seguir lˆe do usu´ario quatro notas de um estudante, calcula a sua m´edia, verifica se o estudante est´a aprovado (m´edia maior ou igual a 7), reprovado (m´edia menor que 5) ou de recupera¸c˜ao (m´edia maior ou igual a 5 e menor que 7). Caso ele esteja de recupera¸c˜ao, o programa informa qual dentre as quatro notas que o estudante deve tentar substituir na prova substitutiva para que ent˜ao ele seja aprovado: 1 notas = [] 2 soma = 0 3 for i in range (0, 4): 4 resposta = input(’Digite a ’ + str(i + 1) + ’.a nota do estudante: ’) 5 nota = float(resposta) 6 notas.append(nota) 7 soma += nota 8 media = soma / 4 9 if media >= 7: 10 print(’Estudante aprovado ’) 11 elif media < 5: 12 print(’Estudante reprovado ’) 13 else: 14 menor = 10 15 ordem_nota = 1 16 ordem = 1 17 for nota in notas: 18 if menor > nota: 19 menor = nota
  • 32. 12 Listas 32 20 ordem_nota = ordem 21 ordem += 1 22 print(’Estudante de recupera¸c~ao.’) 23 print(’Precisa substituir a ’ + str(ordem_nota) + ’.a nota para ser aprovado.’) Uma breve observa¸c˜ao sobre o exemplo acima: utilizamos a fun¸c˜ao str para converter os valores num´ericos em strings, de tal forma que pud´essemos inseri-los nas mensagens ao usu´ario. Execute o exemplo para entender o efeito desejado! Nos exemplos sobre listas que vimos at´e agora, vimos algumas opera¸c˜oes com listas, como acesso a elementos, extra¸c˜ao de fatias e itera¸c˜ao com la¸cos de repeti¸c˜ao. Veremos a seguir algumas outras opera¸c˜oes poss´ıveis com listas. O exemplo a seguir lˆe uma lista de n´umeros do usu´ario at´e que ele digite o valor -1 (o qual n˜ao ´e inserido na lista) e ent˜ao exibe na tela o n´umero de elementos inseridos na lista e o maior e menor valores existentes nela. Para tanto, o script utiliza as fun¸c˜oes len para calcular a quantidade de elementos da lista e as fun¸c˜oes max e min para encontrar o maior e menor valores dela: 1 numero = 0 2 numeros = [] 3 while numero != -1: 4 resposta = input(’Digite um n´umero: ’) 5 numero = int(resposta) 6 if numero != -1: 7 numeros.append(numero) 8 quantidade = len(numeros) 9 maior = max(numeros) 10 menor = min(numeros) 11 print(’Quantidade de n´umeros inseridos: %d’%quantidade) 12 print(’Maior n´umero: %d’%maior) 13 print(’Menor n´umero: %d’%menor) O script a seguir simula o sorteio da Mega-Sena. Primeiramente, s˜ao sortea- dos seis n´umeros, onde cada n´umero varia de 1 a 60. A cada n´umero sorteado, o programa verifica se ele j´a n˜ao foi sorteado anteriormente. Ap´os, o programa solicita ao usu´ario que informe os seis n´umeros da sua aposta. Por fim, o pro- grama compara os n´umeros do usu´ario com os n´umeros sorteados e informa ao usu´ario se sua aposta foi vencedora: 1 import random 2 3 numero = random.randint (1, 60) 4 numeros_sorteados = [numero] 5 for i in range(0, 5): 6 while numero in numeros_sorteados : 7 numero = random.randint (1, 60) 8 numeros_sorteados .append(numero)
  • 33. 12 Listas 33 9 10 numeros_usuario = [] 11 for i in range(0, 6): 12 resposta = input(’Digite o ’ + str(i + 1) + ’.o n´umero: ’) 13 numero = int(resposta) 14 numeros_usuario .append(numero) 15 16 numeros_sorteados .sort () 17 numeros_usuario .sort () 18 print(’N´umeros sorteados:’) 19 print( numeros_sorteados ) 20 print(’Seus n´umeros:’) 21 print( numeros_usuario ) 22 if numeros_sorteados == numeros_usuario : 23 print(’Sua aposta foi vencedora!’) 24 else: 25 print(’Infelizmente , sua aposta n~ao foi vencedora.’) Para sortear os valores, utilizamos a fun¸c˜ao randint do m´odulo random. Esta fun¸c˜ao sorteia um n´umero inteiro entre os limites inferior e superior informados – no exemplo, entre 1 e 60. No script acima, para evitar que o programa sorteasse n´umeros repetidos, in- serimos um la¸co while para repetir o sorteio caso o n´umero sorteado j´a existisse na lista de n´umeros sorteados, utilizando a palavra reservada in para tanto. ´E poss´ıvel comparar duas listas como um todo utilizando o operador ==. Para que esta compara¸c˜ao funcionasse corretamente no nosso programa, utilizamos a fun¸c˜ao embutida sort para ordenar as duas listas antes de realizarmos a com- para¸c˜ao. Existem basicamente duas formas de se remover um elemento de uma lista. A primeira forma consiste em utilizar a fun¸c˜ao embutida remove, a qual recebe como parˆametro o elemento a ser removido da lista: 1 lista = [1, 2, 3, 4, 5] 2 print(lista) # [1, 2, 3, 4, 5] 3 lista.remove (3) 4 print(lista) # [1, 2, 4, 5] A segunda e ´ultima forma consiste em utilizar a fun¸c˜ao embutida pop. Ela recebe como parˆametro o ´ındice do elemento a ser removido. Caso nenhum ´ındice seja informado, ela remove o ´ultimo elemento da lista: 1 lista = [1, 2, 3, 4, 5] 2 print(lista) # [1, 2, 3, 4, 5] 3 lista.pop()
  • 34. 12 Listas 34 4 print(lista) # [1, 2, 3, 4] 5 lista.pop (2) 6 print(lista) # [1, 2, 4] O script a seguir exibe um exemplo mais complexo de uso da fun¸c˜ao remove. O script realiza o sorteio de dez n´umeros inteiros distintos e ent˜ao os ordena sem utilizar a fun¸c˜ao embutida sort (na ra¸ca!). Vale a pena parar alguns minutos para tentar entender o funcionamento deste script! 1 import random 2 3 numeros = [] 4 numero = random.randint (1, 100) 5 numeros.append(numero) 6 for i in range (0, 9): 7 while numero in numeros: 8 numero = random.randint (1, 100) 9 numeros.append(numero) 10 print(numeros) 11 for i in range (0, 5): 12 inicio = i 13 fim = 9 - i 14 maior = max(numeros[inicio : fim + 1]) 15 menor = min(numeros[inicio : fim + 1]) 16 numeros.remove(maior) 17 numeros.remove(menor) 18 numeros = numeros [0 : inicio] + [menor] + numeros[inicio : fim - 1] + [maior] + numeros[fim - 1:] 19 print(numeros) Anteriormente, vimos como extrair uma sub lista de uma lista utilizando a estrat´egia de extra¸c˜ao de fatias. Tamb´em ´e poss´ıvel extrair sub listas de forma categ´orica. No exemplo a seguir, apenas os n´umeros ´ımpares de uma lista de n´umeros s˜ao extra´ıdos e colocados em outra lista: 1 numeros = [12, 9, 87, -13, 54, 78] 2 impares = [numero for numero in numeros if numero % 2 == 1] 3 print(impares) # [9, 87, -13] Na segunda linha do script acima, ´e realizada uma opera¸c˜ao de itera¸c˜ao inline na lista numeros, selecionando apenas os n´umeros da lista que n˜ao s˜ao divis´ıveis por 2, ou seja, os n´umeros ´ımpares. O script abaixo adiciona uma lista inteira ao final de outra lista. Para tanto, ele utiliza a fun¸c˜ao embutida extend: 1 lista1 = [’Ana’, ’Cristiane ’, ’J´ulia ’, ’Luciana ’] 2 lista2 = [’Jo~ao ’, ’Carlos ’, ’Tiago ’] 3 lista1.extend(lista2) 4 print(lista1) # [’Ana ’, ’Cristiane ’, ’J´ulia ’, ’Luciana ’, ’Jo~ao ’, ’Carlos ’, ’Tiago ’] Em exemplos anteriores, vimos como utilizar a fun¸c˜ao embutida append para inserir um novo elemento em uma lista. Ela insere o novo elemento sempre no final da lista. Caso seja necess´ario inserir um novo elemento em uma posi¸c˜ao espec´ıfica, utilize a fun¸c˜ao embutida insert, a qual recebe como parˆametro o ´ındice do novo elemento a ser inserido e o novo elemento: 1 lista = [’c~ao’, ’gato ’, ’can´ario ’] 2 lista.append(’on¸ca ’) 3 print(lista) # [’c~ao ’, ’gato ’, ’can´ario ’, ’on¸ca ’] 4 lista.insert (2, ’jaguatirica ’) 5 print(lista) # [’c~ao ’, ’gato ’, ’jaguatirica ’, ’can´ario ’, ’on¸ca ’]
  • 35. 12 Listas 35 No exemplo do sorteio da Mega-Sena, vimos o uso da palavra reservada in para verificar se um elemento j´a existe dentro de uma lista. Caso deseje, adicionalmente, pegar o´ındice no qual o elemento est´a localizado, utilize a fun¸c˜ao embutida index para tanto. Lembre-se: a fun¸c˜ao index assume que o elemento j´a existe na lista. Caso ele n˜ao exista, a fun¸c˜ao lan¸ca uma exce¸c˜ao (erro). A seguir, um exemplo de uso da fun¸c˜ao index: 1 lista = [’c~ao’, ’gato ’, ’can´ario ’, ’vaca ’, ’cavalo ’] 2 indice_vaca = lista.index(’vaca ’) 3 print(lista[indice_vaca ]) # vaca O script a seguir ordena uma lista em ordem decrescente. Para tanto, ele ordena a lista de forma crescente, utilizando a fun¸c˜ao embutida sort e depois inverte a lista utilizado a fun¸c˜ao embutida reverse: 1 lista = [’Jo~ao ’, ’Maria ’, ’Cec´ılia ’, ’Em´ılia ’, ’Fernando ’, ’Matheus ’, ’Ana ’] 2 lista.sort () 3 lista.reverse () 4 print(lista) # [’Matheus ’, ’Maria ’, ’Jo~ao ’, ’Fernando ’, ’Em´ılia ’, ’Cec´ılia ’, ’Ana ’] O script abaixo contabiliza a quantidade de ocorrˆencias da palavra “c˜ao” em uma lista. Para tanto, ele utiliza a fun¸c˜ao embutida count: 1 lista = [’c~ao’, ’gato ’, ’can´ario ’, ’vaca ’, ’cavalo ’, ’c~ao’] 2 nro_ocorrencias_cao = lista.count(’c~ao’) 3 print( nro_ocorrencias_cao ) Para fechar esta se¸c˜ao, vamos ver um exemplo envolvendo strings. Toda string em Python possui uma fun¸c˜ao embutida chamada split, a qual particiona a string de acordo com a ocorrˆencia de uma determinada sub string. O script abaixo particiona uma frase de acordo com a ocorrˆencia de cada espa¸co em branco. O resultado disso ´e que a fun¸c˜ao split quebra a frase original em palavras, onde cada palavra da frase ´e um elemento da lista resultante: 1 frase = ’Estudar programa¸c~ao estimula o racioc´ınio l´ogico ’ 2 palavras = frase.split(’ ’) 3 print(palavras) # [’Estudar ’, ’programa¸c~ao ’, ’estimula ’, ’o’, ’racioc´ınio ’, ’l´ogico ’] Exerc´ıcios (a) Escreva um script que crie uma lista de inteiros de tamanho 10, preencha a lista com valores aleat´orios entre [0..100] e exiba a lista em ordem inversa. (b) Escreva um script que leia do usu´ario 10 valores inteiros, armazene tais valores em uma lista e exiba na tela apenas os valores que sejam divis´ıveis por 3. (c) Escreva um script que leia as notas de 15 alunos e as armazene em uma lista. Ap´os, o script deve exibir as notas lidas e informar qual foi a nota m´edia, a maior nota e a menor nota.
  • 36. 13 Dicion´arios 36 (d) Escreva um script que leia uma frase do usu´ario e ent˜ao exiba na tela a quantidade de palavras que a frase tem. Considere que o usu´ario pode, erroneamente, utilizar mais de um espa¸co em branco entre cada palavra da frase. (e) Escreva um script que sorteie 20 valores inteiros, onde cada valor varia entre [1..10] e ent˜ao exiba na tela a lista dos valores e o n´umero de vezes que o n´umero 7 aparece na lista. (f) Escreva um script que leia do usu´ario o nome de 10 alunos e suas respecti- vas m´edias finais e ent˜ao exiba na tela os nomes dos alunos que obtiveram a maior e menor notas. 13 Dicion´arios No cap´ıtulo anterior, aprendemos o que ´e uma lista e todas as suas opera¸c˜oes b´asicas. Na Ciˆencia da Computa¸c˜ao, dizemos que listas s˜ao um tipo de estrutura de dados, ou seja, s˜ao estruturas utilizadas para armazenar e recuperar dados de forma organizada. Outra estrutura de dados amplamente utilizada por programadores Python s˜ao os dicion´arios. Itens de um dicion´ario s˜ao organizados como tuplas, onde cada tupla ´e composta por uma chave e um valor. Dentro deste contexto, o valor corresponde ao dado sendo armazenado e a chave ao ´ındice do valor. Para entender o funcionamento de dicion´arios, observe o exemplo abaixo: 1 copas_ganhas = {} 2 copas_ganhas [’Brasil ’] = 5 3 copas_ganhas [’It´alia ’] = 4 4 copas_ganhas [’Argentina ’] = 2 5 print( copas_ganhas ) # {’It´alia ’: 4, ’Brasil ’: 5, ’Argentina ’: 2} No exemplo acima, criamos o dicion´ario copa ganhas. Ele ´e utilizado para armazenar a quantidade de copas do mundo de futebol ganhas por cada sele¸c˜ao. Neste exemplo, ele armazena a quantidade de copas ganhas pelas sele¸c˜oes do Brasil (5), It´alia (4) e Argentina (2). Ou seja, no dicion´ario copa ganhas, os nomes das sele¸c˜oes correspondem aos ´ındices do dicion´ario e a quantidade de copas ganhas correspondem aos valores. Assim, ´e poss´ıvel recuperar a quantidade de copas ganhas por uma sele¸c˜ao informando o nome da respectiva sele¸c˜ao. O script abaixo exibe na tela a quantidade de copas ganhas pela Argentina: 1 copas_ganhas = {} 2 copas_ganhas[’Brasil ’] = 5 3 copas_ganhas[’It´alia ’] = 4 4 copas_ganhas[’Argentina ’] = 2
  • 37. 13 Dicion´arios 37 5 copas_ganhas[’Alemanha ’] = 4 6 print(copas_ganhas[’Argentina ’]) # 2 Quando j´a sabemos de antem˜ao os valores a serem armazenados em um dicion´ario, podemos inicializ´a-lo com os seus valores. O script abaixo exemplifica isto: 1 copas_ganhas = {’Brasil ’ : 5, ’It´alia ’ : 4, ’Argentina ’ : 2, ’Alemanha ’ : 4} 2 print( copas_ganhas ) Um dicion´ario tamb´em pode ser percorrido por um la¸co de repeti¸c˜ao. Para tanto, podemos utilizar a fun¸c˜ao embutida items, conforme o exemplo abaixo: 1 copas_ganhas = {’Brasil ’ : 5, ’It´alia ’ : 4, ’Argentina ’ : 2, ’Alemanha ’ : 4} 2 for selecao , quantidade in copas_ganhas .items (): 3 print(’%s: %d’%( selecao , quantidade)) Observe que no la¸co for do script acima foram utilizadas duas vari´aveis ao inv´es de uma ´unica no lado esquerdo da palavra reservada in, ou seja, como fazemos usualmente. Isto foi necess´ario pois, a cada itera¸c˜ao, a fun¸c˜ao items retorna a chave e o valor de cada item do dicion´ario. Assim como as listas, dicion´arios podem ser utilizados para diversas finalida- des. O script abaixo lˆe do usu´ario uma sequˆencia de n´umeros inteiros at´e que ele digite o n´umero -1. Ap´os, para cada n´umero distinto que o usu´ario digitou (com exce¸c˜ao do n´umero -1), ele informa quantas vezes cada n´umero foi digitado: 1 numero = 0 2 contagem = {} 3 while numero != -1: 4 resposta = input(’Digite um n´umero: ’) 5 numero = int(resposta) 6 if numero != -1: 7 if numero in contagem: 8 quantidade = contagem[numero] 9 contagem[numero] = quantidade + 1 10 else: 11 contagem[numero] = 1 12 print(contagem) No exemplo acima, no trecho mais a dentro do script, ´e verificado se o n´umero digitado pelo usu´ario j´a ´e uma chave no dicion´ario contagem, utilizando a palavra reservada in para tanto. Caso ele j´a exista, o seu valor ´e incrementado em uma unidade, ou seja, a contagem ´e incrementada; caso contr´ario, o n´umero ´e adicionado como chave no dicion´ario e seu valor inicial ´e 1, para fins de in´ıcio de contagem. Vimos no exemplo anterior como verificar se uma determinada chave j´a existe em um dicion´ario utilizando a palavra reservada in. Para verificar se uma chave ainda n˜ao existe em um dicion´ario, ´e preciso utilizar a palavra reservada not associada `a palavra reservada in, conforme o exemplo abaixo:
  • 38. 13 Dicion´arios 38 1 cores_roupas = {’cal¸ca ’ : ’azul ’, ’meias ’ : ’branco ’, ’camiseta ’ : ’verde ’} 2 if ’blusa ’ not in cores_roupas : 3 cores_roupas [’blusa ’] = ’amarelo ’ 4 print( cores_roupas ) Para remover um item de um dicion´ario, ´e preciso utilizar a palavra reservada del, conforme exibido no script abaixo: 1 matriculas = {’Jo~ao ’ : ’05467 ’, ’Maria ’ : ’05468 ’, ’Alice ’ : ’05469 ’} 2 del matriculas[’Maria ’] 3 print(matriculas) # {’Jo~ao ’: ’05467’, ’Alice ’: ’05469 ’} Observa¸c˜ao: ´E importante salientar que ´e extremamente recomend´avel que, antes de se remover um determinado item, seja verificado se a chave do item existe no dicion´ario. Caso deseje remover todos os itens de um dicion´ario, utilize a fun¸c˜ao embutida clear, conforme o exemplo abaixo: 1 matriculas = {’Jo~ao ’ : ’05467 ’, ’Maria ’ : ’05468 ’, ’Alice ’ : ’05469 ’} 2 matriculas.clear () 3 print(matriculas) # {} ´E poss´ıvel criar dicion´arios de forma dinˆamica, utilizando o conceito de dict comprehension. No exemplo abaixo, ´e criado um dicion´ario cujas chaves s˜ao n´umeros inteiros entre [1..5] e, para cada item, o seu valor ´e o quadrado de sua chave: 1 quadrados = {numero : numero ** 2 for numero in range (1, 6)} 2 print(quadrados) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} Em algumas situa¸c˜oes, ´e necess´ario extrair todas as chaves de um determi- nado dicion´ario para realizar algum tipo de processamento. Para tanto, basta utilizar a fun¸c˜ao embutida keys. O exemplo abaixo extrai as chaves de um dicion´ario para percorrer os seus itens: 1 lista_compras = {’feij~ao ’ : 2, ’arroz ’: 1, ’carne ’ : 3} 2 for chave in lista_compras.keys (): 3 print(’%s: %d’%(chave , lista_compras[chave ])) Tamb´em existem situa¸c˜oes em que ´e necess´ario extrair apenas os valores de um dicion´ario. Para tanto, ´e preciso utilizar a fun¸c˜ao embutida values, conforme exibido no exemplo abaixo: 1 ana = {’nome ’ : ’Ana’, ’idade ’ : 23, ’sexo ’ : ’f’} 2 dados_ana = ana.values () 3 print(dados_ana) # dict_values ([23, ’f’, ’Ana ’]) 4 #Convertendo os dados em uma lista com a fun¸c~ao list 5 dados_ana = list(dados_ana) 6 print(dados_ana) # [23, ’f’, ’Ana ’] Para ordenar um dicion´ario de acordo com suas chaves ou valores, ´e preciso utilizar a classe OrderedDict do m´odulo collections. O exemplo abaixo exibe
  • 39. 13 Dicion´arios 39 como ordenar um dicion´ario de forma crescente ou decrescente de acordo com suas chaves ou valores: 1 from collections import OrderedDict 2 3 alunos = {’Pedro ’ : 12, ’Juliana ’ : 10, ’Lucas ’ : 13} 4 # Ordena¸c~ao crescente pelas chaves 5 alunos_ordenados = OrderedDict(sorted(alunos.items ())) 6 # OrderedDict ([(’ Juliana ’, 16) , (’Lucas ’, 13), (’Pedro ’, 12)]) 7 print( alunos_ordenados ) 8 # Ordena¸c~ao decrescente pelas chaves 9 alunos_ordenados = OrderedDict(sorted(alunos.items (), reverse=True)) 10 # OrderedDict ([(’ Pedro ’, 12), (’Lucas ’, 13), (’Juliana ’, 16)]) 11 print( alunos_ordenados ) 12 # Ordena¸c~ao crescente pelos valores 13 alunos_ordenados = OrderedDict(sorted(alunos.items (), key=lambda item: item [1])) 14 # OrderedDict ([(’ Juliana ’, 10) , (’Pedro ’, 12), (’Lucas ’, 13)]) 15 print( alunos_ordenados ) 16 # Ordena¸c~ao decrescente pelos valores 17 alunos_ordenados = OrderedDict(sorted(alunos.items (), reverse=True , key=lambda item: item [1])) 18 # OrderedDict ([(’ Lucas ’, 13), (’Pedro ’, 12), (’Juliana ’, 10)]) 19 print( alunos_ordenados ) Em algumas situa¸c˜oes, cada item de um dicion´ario pode conter mais de um valor. Neste caso, o valor do item deve ser uma lista. O exemplo abaixo exibe este tipo de situa¸c˜ao: 1 mamiferos = [’cabra ’, ’coelho ’, ’gato ’, ’vaca ’] 2 peixes = [’pintado ’, ’dourado ’, ’tucunar´e ’] 3 aves = [’pardal ’, ’can´ario ’, ’seriema ’, ’pombo ’] 4 animais = {} 5 animais[’mamiferos ’] = mamiferos 6 animais[’peixes ’] = peixes 7 animais[’aves ’] = aves 8 ’’’ 9 { 10 ’peixes ’: [’pintado ’, ’dourado ’, ’tucunar´e ’], 11 ’mamiferos ’: [’cabra ’, ’coelho ’, ’gato ’, ’vaca ’], 12 ’aves ’: [’pardal ’, ’can´ario ’, ’seriema ’, ’pombo ’] 13 } 14 ’’’ 15 print(animais) Exerc´ıcios (a) Escreva um script que sorteie mil n´umeros entre [1..10] e ent˜ao exiba na tela quantas vezes cada um dos n´umeros foi sorteado. (b) Escreva um script que sorteie cem n´umeros entre [1..10] e ent˜ao remova apenas os n´umeros que tiveram uma quantidade ´ımpar de ocorrˆencias. (c) Escreva um script que leia do usu´ario uma lista de compras, onde para cada item da compra vocˆe deve ler a sua descri¸c˜ao, quantidade e pre¸co unit´ario. Os itens da lista devem ser armazenados em um dicion´ario, utilizando a
  • 40. 14 Manipula¸c˜ao de arquivos 40 descri¸c˜ao de cada item como chave. Ap´os, o script deve calcular o valor total da compra. 14 Manipula¸c˜ao de arquivos Todos os programas que escrevemos at´e ent˜ao por meio de nossos scripts s˜ao executados em mem´oria prim´aria — no nosso caso, mem´oria RAM (Ran- dom Access Memory, ou Mem´oria de Acesso Randˆomico). Por´em, quando ma- nipulamos arquivos programaticamente, estamos trabalhando com dispositivos de mem´oria secund´aria, uma vez que arquivos s˜ao gravados em dispositivos de mem´oria n˜ao-vol´atil — ex., HDs, pendrives, etc. Manipular arquivos programaticamente ´e uma atividade comum no dia a dia de desenvolvimento de software. Como um primeiro exemplo, vamos considerar que desejamos escrever um programa capaz de ler o conte´udo de um arquivo textual, ou seja, um arquivo composto apenas por caracteres textuais: 1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo: 2 for linha in arquivo: 3 print(linha , end=’’) O script acima utiliza a fun¸c˜ao open para abrir o arquivo arquivo.txt, o qual est´a localizado no diret´orio /home/sidsu/Documentos. Observe a sintaxe utilizada para realizar a abertura do arquivo. Utilizamos duas palavras reservadas da linguagem Python que ainda n˜ao t´ınhamos visto nesta apostila: with e as. Assim, na linha 1 do script abrimos o arquivo arquivo.txt e ent˜ao o refe- renciamos utilizando a vari´avel arquivo. No la¸co for da linha 2, as linhas do arquivo s˜ao lidas sequencialmente, uma linha a cada itera¸c˜ao. Por fim, na linha 3, imprimimos na tela o conte´udo da linha lida. Foi utilizado o parˆametro end para evitar o pulo de linha adicional na fun¸c˜ao print, uma vez que a string da linha lida j´a cont´em um pulo de linha em seu final. Vale a pena salientar que o caminho de um arquivo ´e composto pelo caminho desde a raiz da unidade de mem´oria secund´aria at´e o diret´orio onde o arquivo se encontra, seguido do nome do arquivo. Se o programa estiver sendo executado no sistema operacional Windows, ´e preciso substituir cada ocorrˆencia do caractere ’’ na string do caminho especificado por duas ocorrˆencias do mesmo caractere (“”). Por exemplo, se o arquivo est´a situado no caminho abaixo: C:UsersSidneyarquivo.txt Ent˜ao, a string correspondente para o parˆametro de entrada seria: “C:UsersSidneyarquivo.txt”
  • 41. 14 Manipula¸c˜ao de arquivos 41 Opcionalmente, o mesmo caminho poderia ser definido substituindo-se cada ocorrˆencia do caractere ’’ pelo caractere ’/’. Desta forma, o caminho do exemplo acima ficaria como abaixo: “C:/Users/Sidney/arquivo.txt” No ´ultimo exemplo, realizamos a leitura de um arquivo textual linha a linha. Alternativamente, podemos ler o conte´udo inteiro de um arquivo textual de uma s´o vez utilizando a fun¸c˜ao read, conforme exibido no exemplo abaixo: 1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo: 2 print(arquivo.read ()) Utilizando os conhecimentos que adquirimos nesta apostila, ´e poss´ıvel escre- ver um script para exibir cada palavra de um arquivo textual separadamente. O script abaixo implementa esta tarefa: 1 with open(’/home/sidsu/Documentos/arquivo.txt’) as arquivo: 2 for linha in arquivo: 3 for palavra in linha.split(’ ’): 4 palavra = palavra.replace(’n’, ’’) 5 palavra = palavra.replace(’,’, ’’) 6 palavra = palavra.replace(’.’, ’’) 7 palavra = palavra.replace(’;’, ’’) 8 palavra = palavra.replace(’:’, ’’) 9 palavra = palavra.replace(’?’, ’’) 10 palavra = palavra.replace(’!’, ’’) 11 if len(palavra.strip ()) > 0: 12 print(palavra) Antes de aprendermos a gravar conte´udo em um arquivo textual, vamos falar um pouco sobre a fun¸c˜ao open. Como dito anteriormente, ela realiza a abertura de um arquivo existente em algum dispositivo de mem´oria secund´aria. Para tanto, a fun¸c˜ao open recebe como parˆametro o caminho do arquivo a ser aberto. Por´em, al´em do caminho do arquivo a ser aberto, a fun¸c˜ao open pode receber um segundo parˆametro, referente ao modo de acesso a ser utilizado na abertura do arquivo. O modo de acesso se refere `a forma a qual o arquivo ser´a aberto, sendo que cada forma ´e baseada em trˆes formas principais: leitura, escrita ou anexa¸c˜ao. A tabela 13 exibe todos os modos de abertura de arquivo da fun¸c˜ao open.
  • 42. 14 Manipula¸c˜ao de arquivos 42 Modo Descri¸c˜ao r Abre um arquivo em modo de leitura somente. O ponteiro do arquivo ´e colocado no in´ıcio do arquivo. Este ´e o modo padr˜ao, sendo utilizado inclusive quando um modo n˜ao ´e informado. rb Abre um arquivo bin´ario em modo de leitura somente. O pon- teiro do arquivo ´e colocado no in´ıcio do arquivo. Este ´e o modo padr˜ao, sendo utilizado inclusive quando um modo n˜ao ´e infor- mado. r+ Abre um arquivo em modo de leitura e escrita. O ponteiro do arquivo ´e colocado no in´ıcio do arquivo. rb+ Abre um arquivo bin´ario em modo de leitura e escrita. O ponteiro do arquivo ´e colocado no in´ıcio do arquivo. w Abre um arquivo em modo de escrita somente. Se o arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e criado em modo de escrita. wb Abre um arquivo bin´ario em modo de escrita somente. Se o arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e criado em modo de escrita. w+ Abre um arquivo em modo de leitura e escrita. Se o arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e criado em modo de leitura e escrita. wb+ Abre um arquivo bin´ario em modo de leitura e escrita. Se o arquivo j´a existir, ele ´e sobreposto. Caso contr´ario, um novo arquivo ´e criado em modo de leitura e escrita. a Abre um arquivo em modo de anexa¸c˜ao. O ponteiro do arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista. Caso ele n˜ao exista, um novo arquivo ´e criado em modo de escrita. ab Abre um arquivo bin´ario em modo de anexa¸c˜ao. O ponteiro do arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista. Caso ele n˜ao exista, um novo arquivo ´e criado em modo de escrita. a+ Abre um arquivo em modo de leitura e anexa¸c˜ao. O ponteiro do arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista. Caso ele n˜ao exista, um novo arquivo ´e criado em modo de leitura e escrita. ab+ Abre um arquivo bin´ario em modo de leitura e anexa¸c˜ao. O ponteiro do arquivo ´e colocado no final do arquivo, caso o arquivo j´a exista. Caso ele n˜ao exista, um novo arquivo ´e criado em modo de leitura e escrita. Tab. 13: Modos de abertura de arquivos da fun¸c˜ao open.
  • 43. 14 Manipula¸c˜ao de arquivos 43 Veremos a seguir alguns exemplos de escrita, come¸cando com arquivos textu- ais. O script a seguir grava uma string em um arquivo textual. Caso o arquivo do caminho e nome especificados j´a exista, o seu conte´udo antigo ser´a descartado e o novo conte´udo ser´a gravado. Caso ele ainda n˜ao exista, um novo arquivo ser´a criado dentro do caminho especificado e com o nome especificado: 1 with open(’/home/sidsu/Documentos/saida.txt’, ’w’) as arquivo: 2 arquivo.write(’Este texto ser´a gravado dentro do arquivo.’) O exemplo a seguir ´e bem parecido com o exemplo anterior. Por´em, neste script, caso o arquivo j´a exista, o novo conte´udo ´e gravado no final do arquivo. Caso ele ainda n˜ao exista, o comportamento ´e o mesmo ao do script anterior: 1 with open(’/home/sidsu/Documentos/saida.txt’, ’a’) as arquivo: 2 arquivo.write(’Este texto ser´a gravado no final do arquivo.’) Agora, vamos a um exemplo mais complexo. Observe o conte´udo do arquivo notas.txt abaixo: 1 7.8 2 9.2 3 7 4 8.45 O script a seguir abre o arquivo notas.txt, faz a leitura das quatro notas existentes no arquivo, calcula a m´edia aritm´etica das notas e ent˜ao grava a m´edia calculada no final do arquivo: 1 with open(’/home/sidsu/Documentos/notas.txt’, ’a+’) as arquivo: 2 soma = 0 3 contador = 0 4 arquivo.seek (0) 5 for linha in arquivo: 6 nota = float(linha) 7 soma += nota 8 contador += 1 9 media = soma / contador 10 arquivo.write(’n’ + str(media)) Vimos at´e ent˜ao como manipular arquivos textuais, ou seja, arquivos cujo conte´udo ´e composto unicamente por caracteres textuais. Por sua vez, um arquivo bin´ario possui uma estrutura mais complexa, podendo conter outros tipos de dados al´em de caracteres. Exemplos de arquivos bin´arios s˜ao arquivos de imagens (ex., JPEG, PNG), de ´audio (ex., MP3, OGG), v´ıdeo (ex., MP4, AVI), documentos do MS Office (ex., DOC, XLS), entre outros. Quando lemos o conte´udo de um arquivo bin´ario, n˜ao estamos lendo uma string de caracteres, como ocorre na leitura de um arquivo textual, mas sim uma string de bytes. Para entender do que se trata uma string de bytes, vamos recordar um pouco sobre strings de caracteres, isto ´e, as string que j´a estamos acostumados nessa apostila. Observe o exemplo abaixo:
  • 44. 14 Manipula¸c˜ao de arquivos 44 1 frase = ’Eu sou uma string.’ 2 print(frase [0]) # E No exemplo acima temos uma string de caracteres na vari´avel frase. Na segunda linha do script, imprimimos o conte´udo do caractere do´ındice 0 da string, respectivamente o caractere ’E’. Nada demais do que j´a estamos acostumados. Agora, observe o exemplo abaixo: 1 frase = b’Eu sou uma string.’ 2 print(frase [0]) # 69 Este ´ultimo exemplo ´e muito parecido com o exemplo anterior, por´em a vari´avel frase est´a recebendo a string de caracteres com um prefixo b. Isto faz com que a string de caracteres seja convertida em uma string de bytes, onde cada elemento desta string de bytes corresponde ao respectivo caractere da string original, convertido para o seu valor inteiro em bytes correspondente. Voltando a falar sobre arquivos bin´arios, vimos na tabela 13 que existem modos espec´ıficos para a abertura de arquivos bin´arios (modos com sufixo ’b’). Como um primeiro exemplo, o script abaixo imprime na tela todos os bytes de um arquivo de imagem: 1 with open(’/home/sidsu/Imagens/imagem.png’, ’rb’) as arquivo: 2 byte = arquivo.read (1) 3 while byte != b’’: 4 print(byte [0], end=’ ’) 5 byte = arquivo.read (1) Pare ler cada byte do arquivo por vez, utilizamos a fun¸c˜ao embutida read, passando como parˆametro o valor 1 sinalizando que queremos ler apenas um byte. O la¸co while ´e utilizado para repetir a leitura dos bytes at´e o ´ultimo byte do arquivo. Ap´os ler o ´ultimo byte do arquivo, quando a fun¸c˜ao read tenta realizar uma nova leitura, ela retorna o valor b”, o qual simboliza que n˜ao h´a mais bytes a serem lidos. Desta forma, o la¸co while termina sua execu¸c˜ao. Vejamos agora um exemplo mais ´util. O script abaixo utiliza a mesma es- trat´egia do exemplo anterior para realizar a c´opia de um arquivo de imagem. Para realizar a grava¸c˜ao do byte lido do arquivo fonte no arquivo de destino, ele utiliza a fun¸c˜ao embutida write: 1 with open(’/home/sidsu/Imagens/imagem.png ’, ’rb’) as fonte: 2 with open(’/home/sidsu/Imagens/imagem2.png’, ’wb’) as destino: 3 byte = fonte.read (1) 4 while byte != b’’: 5 destino.write(byte) 6 byte = fonte.read (1) Opcionalmente, podemos ler todo o conte´udo de um arquivo de uma s´o vez. Por´em, ´e importante ressaltar que esta estrat´egia deve ser utilizada com cautela, haja visto que todo o conte´udo do arquivo ´e trazido para a mem´oria principal
  • 45. 14 Manipula¸c˜ao de arquivos 45 de uma s´o vez, o que pode ser custoso dependendo do tamanho do arquivo e a quantidade de mem´oria principal dispon´ıvel no sistema operacional. O script abaixo realiza a c´opia de um arquivo de imagem, utilizando esta estrat´egia: 1 with open(’/home/sidsu/Imagens/imagem.png ’, ’rb’) as fonte: 2 with open(’/home/sidsu/Imagens/imagem2.png’, ’wb’) as destino: 3 byte = fonte.read () 4 destino.write(byte) Nos exemplos anteriores, vimos como realizar a leitura e escrita em arquivos textuais e bin´arios. Tais opera¸c˜oes s˜ao muito ´uteis e possuem diversas aplica¸c˜oes. Por´em, `as vezes precisamos realizar atividades que exigem apenas a leitura dos metadados de arquivos ou diret´orios, n˜ao precisando necessariamente realizar opera¸c˜oes de leitura e escrita. Metadados s˜ao basicamente ”dados sobre dados”. No contexto de arquivos e diret´orios, temos metadados como o nome do arquivo, seu diret´orio, seu ta- manho, se ele ´e um arquivo ou diret´orio, entre outros. A seguir, veremos alguns exemplos b´asicos sobre manipula¸c˜ao de metadados de arquivos. O exemplo a seguir utiliza a fun¸c˜ao isfile do m´odulo os.path para verificar se um determinado caminho se refere a um arquivo, retornando True caso sim ou False caso contr´ario. O exemplo tamb´em utiliza a fun¸c˜ao isdir de forma an´aloga para verificar se o caminho se refere a um diret´orio: 1 from os.path import isfile , isdir 2 3 eh_arquivo = isfile(’/home/sidsu/Documentos/arquivo.txt ’) 4 print(eh_arquivo) # True 5 eh_pasta = isdir(’/home/sidsu/Documentos/arquivo.txt’) 6 print(eh_pasta) # False O exemplo a seguir exibe o uso da fun¸c˜ao basename do m´odulo os.path para pegar o nome de um arquivo a partir do caminho de seu diret´orio: 1 from os.path import basename 2 3 nome_arquivo = basename(’/home/sidsu/Documentos/arquivo.txt ’) 4 print( nome_arquivo ) # arquivo.txt Neste pr´oximo exemplo, ´e solicitado ao usu´ario que informe o caminho de um diret´orio. Ap´os, o script utiliza a fun¸c˜ao listdir do m´odulo os para pegar os nomes de todos os arquivos e diret´orios existentes dentro do diret´orio informado: 1 from os import listdir 2 from os.path import isdir 3 4 diretorio_raiz = input(’Digite o caminho do diret´orio raiz: ’) 5 if isdir( diretorio_raiz ): 6 for arquivo in listdir( diretorio_raiz ): 7 print(arquivo) 8 else: 9 print(’O caminho informado n~ao se refere a um diret´orio.’) Agora, imagine que desejamos escrever um script que lˆe do usu´ario o cami- nho de um diret´orio e ent˜ao contabiliza a quantidade de arquivos e diret´orios
  • 46. 14 Manipula¸c˜ao de arquivos 46 existentes do diret´orio informado. Iremos implementar duas solu¸c˜oes para este problema. A primeira solu¸c˜ao usa a fun¸c˜ao join do m´odulo os.path para obter o caminho de cada item existente dentro do diret´orio informado, podendo assim verificar se o item ´e um arquivo ou diret´orio: 1 from os import listdir 2 from os.path import isdir , join 3 4 diretorio_raiz = input(’Digite o caminho do diret´orio raiz: ’) 5 if isdir( diretorio_raiz ): 6 quantidade_arquivos = 0 7 quantidade_diretorios = 0 8 for arquivo in listdir( diretorio_raiz ): 9 arquivo = join(diretorio_raiz , arquivo) 10 if isdir(arquivo): 11 quantidade_diretorios += 1 12 else: 13 quantidade_arquivos += 1 14 print(’Nro de diret´orios: %s’% quantidade_diretorios ) 15 print(’Nro de arquivos: %s’% quantidade_arquivos ) 16 else: 17 print(’O caminho informado n~ao se refere a um diret´orio.’) Como um ´ultimo exemplo sobre manipula¸c˜ao de metadados de arquivos, o script abaixo utiliza a fun¸c˜ao getsize do m´odulo os.path para pegar o tamanho em bytes de um arquivo: 1 from os.path import getsize 2 3 tamanho = getsize(’/home/sidsu/Documentos/arquivo.txt’) 4 print(tamanho) Agora, como um ´ultimo exemplo geral sobre arquivos, o script a seguir realiza a remo¸c˜ao de um arquivo e um diret´orio, utilizando as fun¸c˜oes remove e rmdir do m´odulo os. Lembre-se de tomar muito cuidado quando implementar scripts que realizam a remo¸c˜ao de arquivos ou diret´orios! 1 from os import remove , rmdir 2 3 remove(’/home/sidsu/Documentos/arquivo.txt’) 4 rmdir(’/home/sidsu/Documentos/diretorio ’) Exerc´ıcios (a) Escreva um script que leia o caminho de um diret´orio do usu´ario e ent˜ao informe a quantidade de arquivos para cada extens˜ao de arquivo encontrada dentro do diret´orio. (b) Escreva um script que seja capaz de ler o arquivo entrada.txt, o qual cont´em as notas dos alunos de uma determinada turma. O arquivo ´e estruturado da seguinte forma:
  • 47. 15 Lidando com erros 47 1 NUMERO_ALUNOS NUMERO_NOTAS 2 NOTA1_ALUNO1 NOTA2_ALUNO1 NOTA3_ALUNO1 ... 3 NOTA1_ALUNO2 NOTA2_ALUNO2 NOTA3_ALUNO2 ... 4 NOTA1_ALUNO3 NOTA2_ALUNO3 NOTA3_ALUNO3 ... Por exemplo, a vers˜ao abaixo do arquivo exemplo.txt cont´em as 4 notas de 5 alunos: 1 5 4 2 7.6 6 8.89 10 3 5 4.2 3.37 7 4 10 9.8 8.7 9.2 5 7 6 8 7 6 2.1 2.2 3 4.1 Ap´os realizar a leitura do arquivo exemplo.txt, o programa deve realizar o c´alculo da m´edia aritm´etica das notas de cada aluno e gravar os resultados no arquivo saida.txt, o qual deve ser estruturado da seguinte forma: 1 NUMERO_ALUNOS 2 MEDIA_ALUNO1 3 MEDIA_ALUNO2 4 MEDIA_ALUNO3 5 ... Por exemplo, o conte´udo do arquivo saida.txt correspondente ao arquivo exemplo.txt do exemplo anterior seria o seguinte: 1 5 2 8.1225 3 4.8925 4 9.425 5 7 6 2.85 15 Lidando com erros Bem, se vocˆe chegou at´e aqui, espero que vocˆe tenha lido todas as se¸c˜oes anteriores, testado os exemplos, realizado os exerc´ıcios e aprendido os princ´ıpios b´asicos de programa¸c˜ao de computadores utilizando a linguagem Python. Caso sim, meus parab´ens! Por´em, n˜ao posso deixar vocˆe sair por a´ı escrevendo scripts Python sem antes falar de um assunto extremamente importante: tratamento de erros! Mas antes, vamos definir o que ´e um erro. Dentro do contexto de pro- grama¸c˜ao de computadores, existem basicamente dois tipos de erros: os sint´aticos e os semˆanticos.