Académique Documents
Professionnel Documents
Culture Documents
Conteúdo
1 Criando e executando um programa em Python . . . . . . . . . . 1
2 Imprimindo texto na tela . . . . . . . . . . . . . . . . . . . . . . 3
3 Criando comentários . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Lendo valores do usuário . . . . . . . . . . . . . . . . . . . . . . 5
5 Trabalhando com strings . . . . . . . . . . . . . . . . . . . . . . 6
6 Trabalhando com números inteiros . . . . . . . . . . . . . . . . 11
7 Trabalhando com números reais . . . . . . . . . . . . . . . . . . 12
8 Operações matemáticas . . . . . . . . . . . . . . . . . . . . . . 13
9 Trabalhando com booleanos e operações lógicas . . . . . . . . . 16
10 Controlando o fluxo do programa . . . . . . . . . . . . . . . . . 18
11 Utilizando laços de repetição . . . . . . . . . . . . . . . . . . . 24
12 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
13 Dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
14 Manipulação de arquivos . . . . . . . . . . . . . . . . . . . . . . 40
15 Lidando com erros . . . . . . . . . . . . . . . . . . . . . . . . . 47
1
1 Criando e executando um programa em Python 2
Fig. 1: Abrindo a pasta onde o script está contido e, por fim, executando o script.
Como nosso script ainda não possui nenhuma linha de código, nada é impresso
na tela após executarmos o comando python. Na próxima seção, começaremos
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
Exercı́cios:
(a) Escreva um script que imprima na tela o poema a seguir utilizando uma
ou mais chamadas à função print, sabendo que cada frase possui uma
tabulação em seu inı́cio.
1 BILHETE
2
3 Se tu me amas , ama - me baixinho
4 N~
a o 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 é breve , e o amor mais breve ainda
11
12 Mario Quintana
(b) Escreva um script que imprima na tela o mesmo poema acima, porém
utilizando somente uma chamada à função print.
3 Criando comentários
Um comentário consiste em uma anotação ou lembrete que você deseja colocar
no código do seu script. Comentários não são código Python e não afetam em
nada a execução do seu script. Observe o exemplo abaixo:
1 # A linha abaixo exibe uma mensagem pro usuário
2 print ( ’Olá , seja bem vindo ! ’)
O script acima contém duas linhas. A primeira linha contém um comentário
explicando ao leitor do código do script o que a linha de código abaixo faz. Para
criar um comentário de uma única linha, assim como o do exemplo acima, basta
4 Lendo valores do usuário 5
strings. Além disso, o uso de strings não se atém a sistemas comerciais, mas
também é visto em softwares cientı́ficos, sistemas operacionais e muitos outros
tipos de sistemas.
Desta forma, saber escrever programas que processam strings é algo crucial
para um bom programador de computadores. A boa notı́cia é que a linguagem
de programação Python possui um suporte bem completo para o processamento
de strings.
Mas afinal, o que é processar uma string? O que isto significa?
Processar uma string consiste em realizar nela alguma dentre as seguintes
operações:
Antes de aprender como realizar todas estas operações, você precisa entender
a definição sobre strings da primeira frase desta seção: uma string é basicamente
um conjunto de caracteres. Na teoria dos conjuntos, um conjunto pode ser
composto por nenhum elemento, um único elemento ou vários elementos. No
caso das strings, podemos dizer que uma string pode ser composta por nenhum
caractere (o que chamamos de string vazia), um único caractere ou vários
caracteres, conforme o exemplo abaixo:
1 string1 = ’ ’
2 string2 = ’a ’
3 string3 = ’ Eu possuo vários caracteres ’
No exemplo acima, cada string sendo atribuı́da a uma variável é cercada por
aspas simples. Toda string deve ser cercada por aspas, aspas simples ou aspas
triplas, conforme o exemplo abaixo:
1 string1 = ’Olá , mundo ! ’
2 string2 = " Eu também sou uma string ! "
3 string3 = ’’’ ... e eu também sou uma string ! ’’’
Você pode escolher que forma de cercamento você irá utilizar. Porém, caso
você 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ário, você terá um erro
de sintaxe no seu código e então seu script não será executado.
Cada caractere dentro de uma string possui um ı́ndice, que funciona como
um endereço do caractere dentro da string. O Python trabalha com dois tipos
de indexação de caracteres: a indexação padrão e a indexação negativa. A
tabela 1 exemplifica a indexação de caracteres de uma string em Python:
5 Trabalhando com strings 8
O l á , 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
Desta forma, podemos dizer que, na indexação padrão, o caractere ‘!’ está
localizado na posição de ı́ndice 10, enquanto que o caractere ‘,’ está localizado
na posição de ı́ndice 3. Se utilizarmos a indexação negativa, podemos dizer que
o caractere ‘!’ está localizado na posição de ı́ndice -1, enquanto que o caractere
‘,’ está localizado na posição de ı́ndice -8.
É possı́vel pegar caracteres de uma string, utilizando o ı́ndice no qual o
caractere está 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ém permite a extração de parte de uma string, ou seja,
uma substring. Para tanto, é preciso saber qual o ı́ndice do primeiro e últimos
caracteres da substring a ser extraı́da.
Como exemplo, considere a string “Três tigres tristes”. Agora, imagine que
devemos extrair a substring “Três” desta string. Para tanto, devemos encontrar
os ı́ndices dos caracteres ‘T’ e ‘s’, respectivamente os caracteres inicial e final
desta substring:
T r ê s
0 1 2 3
L u a c h e i a !
0 1 2 3 4 5 6 7 8 9
A frase acima possui exatamente 10 caracteres2 . Assim, dizemos que ela pos-
sui tamanho 10. Em Python, o tamanho de uma string é 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 último caractere está no ı́ndice 9. Assim, se uma string possui
tamanho n, o último caractere estará sempre no ı́ndice n – 1.
Voltando ao nosso problema, para encontrar o último caractere da frase infor-
mada pelo usuário, devemos encontrar primeiramente o tamanho da string. Para
2
Vale salientar que o espaço em branco, na quarta posição (ı́ndice 3) também é um caractere
válido.
5 Trabalhando com strings 10
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ção muito comum quando lidamos com string é ter que substituir
uma determinada substring de uma determinada string por outra substring. Para
tanto, é possı́vel utilizar a função 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ção comum a se realizar em strings é remover espaços
em branco no inı́cio e no final. Muitas vezes, usuários ao preencher formulários
acabam deixando espaços em branco indesejados nestas posições. Para resolver
este problema, podemos utilizar a função embutida strip, conforme o exemplo a
seguir:
1 frase = ’ por favor , remova estes espaços em branco ’
2 print ( frase . strip () )
Exercı́cios
(a) Escreva um script que leia do usuário uma frase e então divida esta frase
em três partes, exibindo todas as três partes na tela ao final.
(b) Escreva um script que leia do usuário uma frase e então 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ável distinta, realizando os cortes
necessários na string.
pacotes de biscoito ela possui no total. Note que este problema envolve apenas
números inteiros, ou seja, números que não precisam de casas decimais para
representá-los. Vamos escrever um script para resolver este problema:
1 n r o _ p a c o t e s _ b i s c o i t o _ s a l g a d o = 53
2 n r o _ p a c o t e s _ b i s c o i t o _ d o c e = 87
3 total_pacotes = n r o _ p a c o t e s _ b i s c o i t o _ s a l g a d o + n r o _ p a c o t e s _ b i s c o i t o _ d o c e
4 print ( ’ Voc^ e possui % d pacotes de biscoito . ’% total_pacotes )
Para resolver este problema, precisamos utilizar três variáveis. Como dito na
seção 4, uma variável é um local de armazenamento de dados. Você pode pen-
sar em uma variável como uma gaveta capaz de armazenar itens. Toda variável
possui um nome, o qual deve começar com uma letra e não pode conter carac-
teres especiais, como espaços em branco, sı́mbolos e sinais diversos. A PEP 83
recomenda que variáveis sejam nomeadas utilizando somente letras minúsculas,
com as palavras separadas por um “underline” ( ).
A primeira variável utilizada no programa acima chama-se
nro pacotes biscoito salgado. Ela guarda o número de pacotes de biscoito
salgado contidos no estoque da pessoa do nosso problema. A segunda variável
do nosso programa chama-se nro pacotes biscoito doce. Por sua vez, ela
guarda o número de pacotes de biscoito doce existentes no estoque.
O número total de pacotes é exibido na última linha do programa. A fim de
facilitar o entendimento do usuário a respeito do que foi realizado no programa,
exibimos a ele uma frase explicativa contendo o número total de pacotes calcu-
lado. Note que utilizamos o caractere %d como coringa para substituir o valor
da variável total pacotes na frase do usuário. Tivemos que utilizar %d ao invés
de %s, uma vez que o valor sendo inserido não é uma string, mas um número
inteiro (‘d’ vem de decimal). O programa exibe a seguinte saı́da na tela:
1 Voc^
e possui 140 pacotes de biscoito .
1 n r o _ p a c o t e s _ b i s c o i t o _ s a l g a d o = 53
2 n r o _ p a c o t e s _ b i s c o i t o _ d o c e = 87
3 p e s o _ b i s c o i t o s _ s a l g a d o s = n r o _ p a c o t e s _ b i s c o i t o _ s a l g a d o * 0.350
4 p e s o _ b i s c o i t o s _ d o c e s = n r o _ p a c o t e s _ b i s c o i t o _ d o c e * 0.414
5 peso_total_pacotes = peso_biscoitos_salgados + peso_biscoitos_doces
6 print ( ’O seu estoque de biscoitos pesa % f kg . ’% p e s o _ t o t a l _ p a c o t e s )
Além das duas variáveis para armazenar o número total de pacotes de cada
tipo de biscoito, o nosso programa possui mais três variáveis 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áveis anteriores, estas
variáveis armazenam números reais, ou seja, números com casas decimais.
Note que na mensagem de resposta na função print utilizamos o caractere %f
como coringa para injetar o valor da variável 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ês). O script anterior imprime
a mensagem na tela:
1 O seu estoque de biscoitos pesa 54.568000 kg .
Note que o número do resultado possui três zeros nas últimas casas deci-
mais. É possı́vel arredondar este número na impressão dentro da função print,
adaptando o caractere %f:
1 print ( ’O seu estoque de biscoitos pesa %.2 f kg . ’% p e s o _ t o t a l _ p a c o t e s )
Na linha acima, modificamos o caractere %f para %.2f, o que faz com que o
número seja arredondado utilizando-se apenas duas casas decimais após o ponto.
Como resultado, a mensagem abaixo será exibida:
1 O seu estoque de biscoitos pesa 54.57 kg .
8 Operações matemáticas
Uma operação binária é uma operação matemática que envolve dois valores
distintos. Tais valores podem ser constantes ou oriundos de variáveis. Como
exemplo, vamos escrever um script para realizar a soma de dois números infor-
mados pelo usuário:
1 resposta = input ( ’ Digite o primeiro número : ’)
2 numero1 = int ( resposta )
3 resposta = input ( ’ Digite o segundo número : ’)
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úmeros a serem
somados, os quais são informados pelo usuário. Porém, a função input sempre
8 Operações matemáticas 14
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ão reais. Para converter o valor
lido do usuário para real, utilizamos a função float. Na penúltima linha do script,
realizamos o cálculo do valor delta. Este cálculo envolve operações de exponen-
ciação, subtração e multiplicação. Em Python, algumas operações matemáticas
tem maior precedência sobre outras, ou seja, são calculadas antes que outras. A
tabela 8 mostra a ordem de precedência entre as operações matemáticas:
Exercı́cios
(a) Escreva um script que leia do usuário dois números inteiros a e b e então
calcule o valor de ab .
9 Trabalhando com booleanos e operações lógicas 16
(b) Escreva um script que leia do usuário o valor do raio de um cı́rculo e então
calcule o valor de sua área. A fórmula da área do cı́rculo é dada por:
area = Π ∗ raio2
onde Π = 3.14159265
(c) Escreva um script que leia do usuário o valor do montante a ser empres-
tado e a taxa de juros e então calcule o valor da parcela a ser paga pelo
empréstimo, considerando que as parcelas terão valor fixo. As fórmulas
para calcular o valor das parcelas a serem pagas pelo empréstimo são da-
das abaixo:
a b a and b
True True True
True False False
False True False
False False False
a b a or b
True True True
True False True
False True True
False False False
operação pode ser realizada por meio do operador not. A tabela 9 exibe os
valores possı́veis para cada operação de negação:
a not a
True False
False True
do programa serão executadas, a menos que ocorra algum tipo de erro durante
a execução do script.
Porém, existem muitos problemas em que desejamos poder controlar o fluxo
de execução do nosso programa, ou seja, controlar quais linhas de código serão
executadas de acordo com uma ou mais condições. Neste caso, o programa terá
mais de um fluxo de execução possı́vel.
Por exemplo, considere o programa que lê a idade do usuário. Digamos que
desejamos customizar a mensagem ao usuário de acordo com a sua idade. Se
o usuário tiver menos de 18 anos, informamos que ele é menor de idade; caso
contrário, informamos que ele já é maior de idade.
Para resolver este problema, utilizaremos as instruções 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 é maior de idade . ’)
5 else :
6 print ( ’ Voc^
e é menor de idade . ’)
A instrução if recebe como argumento um valor booleano. No nosso caso,
passamos como argumento uma expressão lógica, que por sua vez resultará em
um valor booleano. Se este valor for igual a True, então o código delimitado pela
instrução if será executado; caso contrário, o código delimitado pela instrução
else será executado.
É importante “abrir parênteses” nesta seção para falar sobre um assunto
muito importante na programação em Python: identação de código! Observe
este trecho do código do script do exemplo anterior:
1 if idade >= 18:
2 print ( ’ Voc^
e é maior de idade . ’)
Como você já deve ter percebido, a segunda linha está mais à direita em
comparação à primeira linha. De fato, ela possui uma tabulação adicional em
comparação à linha anterior. Isto se deve ao fato de que o código desta linha
pertence ao bloco da instrução if. Assim, ele foi colocado exatamente uma
tabulação à direita (ou mais a dentro) para simbolizar tal fato. Na programação
Python, chamamos este alinhamento de código de identação.
Em Python, a identação de código é obrigatória. Isto significa que, por
exemplo, o código a seguir não será executado:
1 resposta = input ( ’ Digite sua idade : ’)
2 idade = int ( resposta )
3 if idade >= 18:
4 print ( ’ Voc^
e é maior de idade . ’)
10 Controlando o fluxo do programa 20
5 else :
6 print ( ’ Voc^
e é menor de idade . ’)
Ao executar o script acima, o interpretador do Python identificará a instrução
if da terceira linha e, consequentemente, irá verificar que a linha abaixo do if
não está corretamente identada. Assim, ele exibirá na tela a mensagem abaixo:
1 IndentationError : expected an indented block
Ou seja, ele informará que houve um erro e que, no trecho de código onde o
erro foi identificado, era esperado um bloco de código identado.
Fechando os parênteses, voltemos ao assunto principal desta seção. No
exemplo anterior, temos apenas duas situações que são mutuamente exclusivas.
Porém, existem vários problemas os quais necessitam de múltiplas condições para
realizar o roteamento de múltiplos fluxos de execução possı́veis. Como exemplo,
considere o script abaixo, o qual lê a idade do usuário e informa em que faixa de
idade o usuário 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ções mutuamente exclusivas, ou seja,
a idade informada pelo usuário irá fazer com que apenas uma condição seja
satisfeita. Assim, não é possı́vel com que o programa execute os trechos de
códigos de duas condições distintas. Para garantir isto, utilizamos a instrução
elif, a qual consiste em uma abreviação das instruções else e if associadas.
Se o usuário digitar uma idade maior que 50, nenhuma das quatro primeiras
condições serão satisfeitas. Isto fará com que o código do bloco da instrução
else seja executado. O bloco else sempre deve ser escrito ao final de todas as
condições, uma vez que ele simboliza o último caso, ou seja, a última opção caso
nenhuma das condições 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ções, subtrações, multiplicações e divisões.
O nosso programa funcionará da seguinte forma. Ele solicitará ao usuário dois
10 Controlando o fluxo do programa 21
números reais. Após isto, ele exibirá ao usuário um menu de operações ma-
temáticas a serem realizadas sobre os números que ele informou, conforme abaixo:
1 Digite a operaç~
a o desejada :
2 1 Soma
3 2 Subtraç~ao
4 3 Multiplicaç~
ao
5 4 Divis~ao
Por exemplo, se o usuário deseja multiplicar os dois números que ele informou,
então ele escolherá a opção 3, digitando assim este número no teclado para que
o programa possa enfim realizar a multiplicação dos dois valores. Vamos resolver
este problema utilizando as instruções if, elif e else:
1 resposta = input ( ’ Digite o primeiro número : ’)
2 primeiro_numero = float ( resposta )
3 resposta = input ( ’ Digite o segundo número : ’)
4 segundo_numero = float ( resposta )
5 print ( ’ Digite a oç~ a o desejada : ’)
6 print ( ’1 - Soma ’)
7 print ( ’2 - Subtraç~ a o ’)
8 print ( ’3 - Multiplicaç~ a o ’)
9 print ( ’4 - Divis~ a o ’)
10 resposta = input ( ’ ’)
11 opcao = int ( resposta )
12 resultado = 0
13 resu l t ad o _ ca l c ul a d o = 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~ a o é possı́vel dividir por 0! ’)
25 r e su l t ad o _ ca l c ul a d o = False
26 else :
27 print ( ’ Opç~ a o inválida ! ’)
28 r e su l t ad o _ ca l c ul a d o = False
29
30 if re s u lt a d o _c a l cu l a do :
31 print ( ’ Resultado : % f ’% resultado )
10 Controlando o fluxo do programa 22
Exercı́cios:
(a) Escreva um programa que leia do usuário um número inteiro e então in-
forme na tela se o número é divisı́vel ou não por 7.
(b) Escreva um programa que leia do usuário 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 é dado pela fórmula abaixo:
IM C = peso/altura2
(c) Escreva um programa que leia as notas de quatro provas do usuário, calcula
a média das notas. Se a média for maior ou igual a 7, então informe ao
usuário que ele foi aprovado. Se a média for maior que 5 e menor que 7,
informe que ele está de recuperação. Por fim, se a média for inferior a 5,
informe que ele foi reprovado.
(d) Escreva um script que leia do usuário o valor do montante a ser emprestado
e qual o tipo de cliente e então calcule o valor da parcela a ser paga pelo
empréstimo, considerando que as parcelas terão valor fixo e o valor da taxa
para o tipo de cliente. As fórmulas para calcular o valor das parcelas a
serem pagas pelo empréstimo são dadas abaixo:
Tipo Taxa
de cliente de juros a.m. (%)
Standard 2.5
Platinum 1.99
Gold 1.2
saberemos quais os possı́veis valores de n que o usuário poderá digitar? Não há
como saber! Assim, quantas condições lógicas necessitarı́amos para resolver o
problema de fato? Na realidade, infinitas condições!
Desta forma, precisamos escrever um código que seja capaz de imprimir todos
os números da sequência, porém utilizando um número fixo e mı́nimo de linhas
de código. Para tanto, precisamos de alguma forma escrever um código que
repita a impressão dos números de forma categórica e estratégica.
Assim, para realmente resolver este problema, precisamos utilizar um laço
de repetição (ou loop). A linguagem Python oferece dois laços de repetição
distintos: o laço while e o laço for. O script a seguir resolve o nosso problema
utilizando um laço while:
1 resposta = input ( ’ Digite um número 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ço while recebe como argumento uma condição lógica, chamada de
condição de manutenção do laço. No nosso exemplo, enquanto o valor da
variável contador for menor ou igual ao valor da variável n, o laço while repetirá
a execução do código localizado entre as chaves. No mundo da programação de
computadores, chamamos de iteração cada repetição que um laço realiza.
Note que agora, para qualquer valor de n, a mensagem correta será impressa.
A variável contador é inicializada com o valor 1, que é o primeiro valor que o
nosso programa deve imprimir. A cada iteração, o valor da variável contador é
impresso. Logo em seguida, o valor da variável é incrementado em uma unidade.
Assim, na próxima iteração, o valor a ser impresso é uma unidade maior que o
valor atual.
Note também que utilizamos dentro da função print o parâmetro end com
o valor ‘ ’. O parâmetro end determina o que deve ser impresso sempre ao final
de cada mensagem impressa com a função print. Por padrão, sempre é impresso
o caractere não imprimı́vel \n, o que causa sempre um pulo de linha ao final da
mensagem – e não necessita o uso explı́cito do parâmetro end. Como no nosso
exemplo a função print imprime na tela um número da sequência por vez e a
sequência deve aparecer em uma única linha, modificamos explicitamente o valor
do parâmetro end para ‘ ’, ou seja, um espaço em branco. Assim, os números
11 Utilizando laços de repetição 26
Exercı́cios
(a) Escreva um programa que leia do usuário um valor inteiro positivo n e
imprima na tela a sequência:
1, 2, 3, ...n–1, n
1, 2, 3, 4, 5
n − 1, n − 2, n − 3, ...3, 2, 1
5, 4, 3, 2, 1
[1|2|3|..|n − 1|n − 2]
[1|2|3|4|5]
1, 2, 3, ...n, n − 1, n − 2, ..., 3, 2, 1
1, 2, 3, 4, 5, 4, 3, 2, 1
(e) Escreva um algoritmo que leia do usuário um valor n entre [1..100] e então
imprima na tela a seguinte sequência:
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ência 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
(f) Escreva um programa leia do usuário valores inteiros entre [0..100] até que
o usuário digite o valor -1 e então calcule a média aritmética destes valores
(P.S.: o valor -1 não deve ser incluı́do no cálculo).
(g) Escreva um programa que leia do usuário 10 valores inteiros entre [0..100]
e calcule o produto destes valores.
(h) Escreva um programa que leia do usuário um valor n entre [0..100] e
imprima na tela os primeiros n números da sequência de Fibonacci. Em
uma sequência de Fibonacci, os dois primeiros elementos da sequência são
0 e 1. A partir do terceiro elemento, cada valor é a soma dos dois últimos
valores da sequência anteriores a ele. Como exemplo, a a sequência de
Fibonacci para n igual 8 (ou seja, os oito primeiro elementos da sequência):
0, 1, 1, 2, 3, 5, 8, 13
12 Listas
Todas as variáveis que criamos em nossos exemplos até então 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ção, o script atribui quatro valores distintos à variável
numero, porém apenas o valor -9 é impresso, pois foi o último valor associado
à variável. Ou seja, não é possı́vel armazenar mais de um valor simultaneamente
na variável numero. O script abaixo exibe uma possı́vel solução 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ável distinta e o valor
de cada variável foi impresso separadamente no final do programa. Note que, se
tivéssemos que armazenar mais valores, terı́amos que criar mais variáveis, além
de mais instruções para exibir tais valores na tela. Desta forma, esta solução
deixa de ser prática à medida que o número de valores aumenta.
Uma solução mais elegante ao problema anterior é utilizar uma lista para
assim poder armazenar vários valores em uma única variável. Listas são estruturas
de dados que representam uma coleção de elementos, onde cada elemento é
representado por uma única chave. O script abaixo apresenta uma possı́vel
solução 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ção na sin-
taxe de criação desta lista. No código anterior ao sı́mbolo de atribuição (=), foi
declarada uma variável chamada numeros. No código posterior ao sı́mbolo de
atribuição, a variável numeros recebe uma lista vazia, que em Python é expres-
sada por uma abertura de colchetes seguida por um encerramento de colchetes
([]).
A lista é preenchida com quatro números, onde cada número é inserido na
lista por meio da função embutida append. Por fim, os valores da lista são
exibidos em um laço for. Vale a pena neste ponto observar a forma a qual o laço
é 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ável chamada numero, a qual receberá a cada iteração cada um
dos elementos da lista, na ordem em que foram inseridos nela.
No exemplo anterior, os números preenchidos na lista numeros não são
provenientes do usuário, mas sim colocados diretamente no código do script. Em
casos como este, onde já se sabe previamente os valores que uma lista receberá,
é possı́vel preenchê-los de uma vez no momento da criação 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ço for para exibir um elemento
por vez da lista. Caso deseje imprimir todos os elementos de uma vez, basta
12 Listas 31
20 ordem_nota = ordem
21 ordem += 1
22 print ( ’ Estudante de recuperaç~
a o . ’)
23 print ( ’ Precisa substituir a ’ + str ( ordem_nota ) + ’. a nota para ser aprovado . ’)
Uma breve observação sobre o exemplo acima: utilizamos a função str para
converter os valores numéricos em strings, de tal forma que pudéssemos inseri-los
nas mensagens ao usuário. Execute o exemplo para entender o efeito desejado!
Nos exemplos sobre listas que vimos até agora, vimos algumas operações
com listas, como acesso a elementos, extração de fatias e iteração com laços de
repetição. Veremos a seguir algumas outras operações possı́veis com listas.
O exemplo a seguir lê uma lista de números do usuário até que ele digite
o valor -1 (o qual não é inserido na lista) e então exibe na tela o número de
elementos inseridos na lista e o maior e menor valores existentes nela. Para
tanto, o script utiliza as funções len para calcular a quantidade de elementos da
lista e as funções 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úmero : ’)
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úmeros inseridos : % d ’% quantidade )
12 print ( ’ Maior número : % d ’% maior )
13 print ( ’ Menor número : % d ’% menor )
O script a seguir simula o sorteio da Mega-Sena. Primeiramente, são sortea-
dos seis números, onde cada número varia de 1 a 60. A cada número sorteado,
o programa verifica se ele já não foi sorteado anteriormente. Após, o programa
solicita ao usuário que informe os seis números da sua aposta. Por fim, o pro-
grama compara os números do usuário com os números sorteados e informa ao
usuário se sua aposta foi vencedora:
1 import random
2
10 numeros_usuario = []
11 for i in range (0 , 6) :
12 resposta = input ( ’ Digite o ’ + str ( i + 1) + ’. o
número : ’)
13 numero = int ( resposta )
14 numeros_usuario . append ( numero )
15
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ção remove.
O script realiza o sorteio de dez números inteiros distintos e então os ordena sem
utilizar a função embutida sort (na raça!). 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égia de extração de fatias. Também é possı́vel extrair sub listas de forma
categórica. No exemplo a seguir, apenas os números ı́mpares de uma lista de
números são 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]
Exercı́cios
(a) Escreva um script que crie uma lista de inteiros de tamanho 10, preencha a
lista com valores aleatórios entre [0..100] e exiba a lista em ordem inversa.
(b) Escreva um script que leia do usuário 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ós, o script deve exibir as notas lidas e informar qual foi a nota
média, a maior nota e a menor nota.
13 Dicionários 36
(d) Escreva um script que leia uma frase do usuário e então exiba na tela a
quantidade de palavras que a frase tem. Considere que o usuário pode,
erroneamente, utilizar mais de um espaço 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ão exiba na tela a lista dos valores e o número de vezes
que o número 7 aparece na lista.
(f) Escreva um script que leia do usuário o nome de 10 alunos e suas respecti-
vas médias finais e então exiba na tela os nomes dos alunos que obtiveram
a maior e menor notas.
13 Dicionários
No capı́tulo anterior, aprendemos o que é uma lista e todas as suas operações
básicas. Na Ciência da Computação, dizemos que listas são um tipo de estrutura
de dados, ou seja, são estruturas utilizadas para armazenar e recuperar dados
de forma organizada.
Outra estrutura de dados amplamente utilizada por programadores Python
são os dicionários. Itens de um dicionário são organizados como tuplas, onde
cada tupla é 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ários, observe o exemplo abaixo:
1 copas_ganhas = {}
2 copas_ganhas [ ’ Brasil ’] = 5
3 copas_ganhas [ ’ Itália ’] = 4
4 copas_ganhas [ ’ Argentina ’] = 2
5 print ( copas_ganhas ) # { ’ Itália ’: 4 , ’ Brasil ’: 5 , ’ Argentina ’: 2}
5 copas_ganhas [ ’ Alemanha ’] = 4
6 print ( copas_ganhas [ ’ Argentina ’ ]) # 2
Quando já sabemos de antemão os valores a serem armazenados em um
dicionário, podemos inicializá-lo com os seus valores. O script abaixo exemplifica
isto:
1 copas_ganhas = { ’ Brasil ’ : 5 , ’ Itália ’ : 4 , ’ Argentina ’ : 2 , ’ Alemanha ’ : 4}
2 print ( copas_ganhas )
Observe que no laço for do script acima foram utilizadas duas variáveis ao
invés de uma única no lado esquerdo da palavra reservada in, ou seja, como
fazemos usualmente. Isto foi necessário pois, a cada iteração, a função items
retorna a chave e o valor de cada item do dicionário.
Assim como as listas, dicionários podem ser utilizados para diversas finalida-
des. O script abaixo lê do usuário uma sequência de números inteiros até que ele
digite o número -1. Após, para cada número distinto que o usuário digitou (com
exceção do número -1), ele informa quantas vezes cada número foi digitado:
1 numero = 0
2 contagem = {}
3 while numero != -1:
4 resposta = input ( ’ Digite um número : ’)
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 )
Exercı́cios
(a) Escreva um script que sorteie mil números entre [1..10] e então exiba na
tela quantas vezes cada um dos números foi sorteado.
(b) Escreva um script que sorteie cem números entre [1..10] e então remova
apenas os números que tiveram uma quantidade ı́mpar de ocorrências.
(c) Escreva um script que leia do usuário uma lista de compras, onde para cada
item da compra você deve ler a sua descrição, quantidade e preço unitário.
Os itens da lista devem ser armazenados em um dicionário, utilizando a
14 Manipulação de arquivos 40
descrição de cada item como chave. Após, o script deve calcular o valor
total da compra.
14 Manipulação de arquivos
Todos os programas que escrevemos até então por meio de nossos scripts são
executados em memória primária — no nosso caso, memória RAM (Ran-
dom Access Memory, ou Memória de Acesso Randômico). Porém, quando ma-
nipulamos arquivos programaticamente, estamos trabalhando com dispositivos
de memória secundária, uma vez que arquivos são gravados em dispositivos de
memória não-volátil — ex., HDs, pendrives, etc.
Manipular arquivos programaticamente é 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údo 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ção open para abrir o arquivo arquivo.txt, o qual
está localizado no diretório /home/sidsu/Documentos. Observe a sintaxe
utilizada para realizar a abertura do arquivo. Utilizamos duas palavras reservadas
da linguagem Python que ainda não tı́nhamos visto nesta apostila: with e as.
Assim, na linha 1 do script abrimos o arquivo arquivo.txt e então o refe-
renciamos utilizando a variável arquivo. No laço for da linha 2, as linhas do
arquivo são lidas sequencialmente, uma linha a cada iteração. Por fim, na linha
3, imprimimos na tela o conteúdo da linha lida. Foi utilizado o parâmetro end
para evitar o pulo de linha adicional na função print, uma vez que a string da
linha lida já contém um pulo de linha em seu final.
Vale a pena salientar que o caminho de um arquivo é composto pelo caminho
desde a raiz da unidade de memória secundária até o diretório onde o arquivo se
encontra, seguido do nome do arquivo. Se o programa estiver sendo executado no
sistema operacional Windows, é preciso substituir cada ocorrência do caractere
’\’ na string do caminho especificado por duas ocorrências do mesmo caractere
(“\\”). Por exemplo, se o arquivo está situado no caminho abaixo:
C:\Users\Sidney\arquivo.txt
“C:\\Users\\Sidney\\arquivo.txt”
14 Manipulação de arquivos 41
“C:/Users/Sidney/arquivo.txt”
Modo Descrição
r Abre um arquivo em modo de leitura somente. O ponteiro do
arquivo é colocado no inı́cio do arquivo. Este é o modo padrão,
sendo utilizado inclusive quando um modo não é informado.
rb Abre um arquivo binário em modo de leitura somente. O pon-
teiro do arquivo é colocado no inı́cio do arquivo. Este é o modo
padrão, sendo utilizado inclusive quando um modo não é infor-
mado.
r+ Abre um arquivo em modo de leitura e escrita. O ponteiro do
arquivo é colocado no inı́cio do arquivo.
rb+ Abre um arquivo binário em modo de leitura e escrita. O ponteiro
do arquivo é colocado no inı́cio do arquivo.
w Abre um arquivo em modo de escrita somente. Se o arquivo
já existir, ele é sobreposto. Caso contrário, um novo arquivo é
criado em modo de escrita.
wb Abre um arquivo binário em modo de escrita somente. Se o
arquivo já existir, ele é sobreposto. Caso contrário, um novo
arquivo é criado em modo de escrita.
w+ Abre um arquivo em modo de leitura e escrita. Se o arquivo
já existir, ele é sobreposto. Caso contrário, um novo arquivo é
criado em modo de leitura e escrita.
wb+ Abre um arquivo binário em modo de leitura e escrita. Se o
arquivo já existir, ele é sobreposto. Caso contrário, um novo
arquivo é criado em modo de leitura e escrita.
a Abre um arquivo em modo de anexação. O ponteiro do arquivo
é colocado no final do arquivo, caso o arquivo já exista. Caso
ele não exista, um novo arquivo é criado em modo de escrita.
ab Abre um arquivo binário em modo de anexação. O ponteiro do
arquivo é colocado no final do arquivo, caso o arquivo já exista.
Caso ele não exista, um novo arquivo é criado em modo de
escrita.
a+ Abre um arquivo em modo de leitura e anexação. O ponteiro do
arquivo é colocado no final do arquivo, caso o arquivo já exista.
Caso ele não exista, um novo arquivo é criado em modo de leitura
e escrita.
ab+ Abre um arquivo binário em modo de leitura e anexação. O
ponteiro do arquivo é colocado no final do arquivo, caso o arquivo
já exista. Caso ele não exista, um novo arquivo é criado em modo
de leitura e escrita.
Vimos até então como manipular arquivos textuais, ou seja, arquivos cujo
conteúdo é composto unicamente por caracteres textuais. Por sua vez, um
arquivo binário possui uma estrutura mais complexa, podendo conter outros
tipos de dados além de caracteres. Exemplos de arquivos binários são arquivos
de imagens (ex., JPEG, PNG), de áudio (ex., MP3, OGG), vı́deo (ex., MP4,
AVI), documentos do MS Office (ex., DOC, XLS), entre outros.
Quando lemos o conteúdo de um arquivo binário, não 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 é, as string que já estamos
acostumados nessa apostila. Observe o exemplo abaixo:
14 Manipulação de arquivos 44
Pare ler cada byte do arquivo por vez, utilizamos a função embutida read,
passando como parâmetro o valor 1 sinalizando que queremos ler apenas um
byte. O laço while é utilizado para repetir a leitura dos bytes até o último byte
do arquivo. Após ler o último byte do arquivo, quando a função read tenta
realizar uma nova leitura, ela retorna o valor b”, o qual simboliza que não há
mais bytes a serem lidos. Desta forma, o laço while termina sua execução.
Vejamos agora um exemplo mais útil. O script abaixo utiliza a mesma es-
tratégia do exemplo anterior para realizar a cópia de um arquivo de imagem.
Para realizar a gravação do byte lido do arquivo fonte no arquivo de destino, ele
utiliza a função 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)
de uma só vez, o que pode ser custoso dependendo do tamanho do arquivo e
a quantidade de memória principal disponı́vel no sistema operacional. O script
abaixo realiza a cópia de um arquivo de imagem, utilizando esta estratégia:
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 )
Agora, imagine que desejamos escrever um script que lê do usuário o cami-
nho de um diretório e então contabiliza a quantidade de arquivos e diretórios
14 Manipulação de arquivos 46
Exercı́cios
(a) Escreva um script que leia o caminho de um diretório do usuário e então
informe a quantidade de arquivos para cada extensão de arquivo encontrada
dentro do diretório.
(b) Escreva um script que seja capaz de ler o arquivo entrada.txt, o qual
contém as notas dos alunos de uma determinada turma. O arquivo é
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 ...
Na saı́da acima, o usuário digitou o valor 1.2 para o primeiro número. Ime-
diatamente, o interpretador do Python lançou um erro chamado ValueError,
informando que o valor 1.2 é inválido para a conversão pela função int.
Toda vez que o interpretador do Python detecta um erro semântico deste
tipo, ele interrompe a execução do script. Isto é uma situação muito embaraçosa
para o usuário, uma vez que ele não espera que este tipo de erro aconteça.
Mas a questão é: como tratar um erro inesperado deste tipo? Bem, basta
tratar o erro colocando o código passı́vel de erro dentro de um bloco try, captu-
rando o tipo de erro possı́vel com a instrução except. Abaixo, alteramos o script
do exemplo anterior para tratar o possı́vel erro de entrada inválida do usuário:
1 numero1 = 0
2 numero_lido = False
3 while not numero_lido :
4 try :
5 resposta = input ( ’ Digite um número : ’)
6 numero1 = int ( resposta )
7 numero_lido = True
8 except ValueError :
9 pass
10 numero2 = 0
11 numero_lido = False
12 while not numero_lido :
13 try :
14 resposta = input ( ’ Digite outro número : ’)
15 numero2 = int ( resposta )
16 numero_lido = True
15 Lidando com erros 50
17 except ValueError :
18 pass
19 resultado = numero1 + numero2
20 print ( ’% d + % d = % d ’ %( numero1 , numero2 , resultado ) )
No exemplo acima, quando o usuário digitar um valor inválido, o interpre-
tador lançará o erro ValueError. Porém, desta vez, o erro será interceptado
pelo código do script, graças à instrução except. No caso, toda vez que esta
interceptação ocorrer, a instrução pass fará com que o erro seja ignorado e o
código continue a sua execução, repetindo a leitura do número até que o usuário
digite um número inteiro.
Referências
[1] BEAZLEY, D.; JONES, B. K. Python Cookbook. O’Reilly Novatec, 2013.