Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 63 de 103

Páginas do PDF

Introdução à programação e aos algoritmos

5.3 Processando uma Lista

Digamos que você tenha uma lista e queira imprimir seus valores duplicados. Para isso você deve usar comandos para percorrê-la, tomando cada elemento individualmente e, após multiplicar por 2, imprimir o valor calculado. Uma solução seria o Programa 5.8:

lista = [1, 2, 3, 5, 7]

for i in lista:

print(i * 2)

 

■ Programa 5.8: Programa que duplica valores de uma lista.

 

O resultado será como esperado:

 

2

4

6

10

14

 

Se você quiser imprimir os valores na mesma linha, deve usar a opção de print que modifica seu comportamento. Para tanto, basta substituí-lo por

print (i*2, end=’ ‘)

Este comando diz a print para imprimir o valor e depois terminar a impressão com um caractere de espaço em branco. Quanto essa opção não é usada, o comando print irá usar o caractere de nova linha como padrão, fazendo com que cada valor seja impresso em uma nova linha. Usando a opção end=’ ‘, você obterá a impressão

2 4 6 10 14

Neste ponto, digamos que você queira modificar a lista, substituindo os valores antigos pelo seu dobro. Neste caso, será necessário um pouco mais de processamento. Você deve pegar o valor, duplicar e devolver à lista. Para isto vamos precisar do comando range() que gera uma lista de índices. O problema agora é saber quantos índices gerar.

Para saber o tamanho de qualquer lista, basta usar o comando

len(nome_da_lista). Dessa maneira, usando o resultado de len() como entrada de range(), obtemos uma lista com valores que vão de zero até o tamanho da lista que queremos processar, menos 1. No Programa 5.9, o comando len(lista) tem como resultado 5 e range(len(lista)) irá gerar a sequência 0, 1, 2, 3, 4.

lista = [1, 2, 3, 5, 7]

for i in range(len(lista)):

lista[i] *= 2

print(lista)

 

■ Programa 5.9: Programa que duplica valores de uma lista e a

atualiza.

 

Existe ainda uma forma de percorrer a lista, obtendo a cada

passo tanto o índice quanto o elemento. Para isso usamos o comando enumerate(), como no Programa 5.10:

lista = [1, 2, 3, 5, 7]

for i, item in enumerate(lista):

lista[i] = item * 2

print(lista)

 

■ Programa 5.10: Programa que duplica valores de uma lista

com enumerate.

 

O comando enumerate() vai gerar a cada passo um par com os

valores para i e item. No caso do programa apresentado, os pares gerados são (0,1), (1,2), (2,3), (3,5) e (4,7), ou seja, i será o índice do elemento item na lista sendo processada por enumerate().

O processamento da informação em uma lista geralmente é feito com o comando for. Assim, cada elemento pode ser acessado e processado sequencialmente, sem erros e de forma simples.

Outra forma seria usar o comando while, porém isso exigiria a manipulação de uma variável de controle, enquanto o comando for já poderia se ocupar de tudo. Veja como o programa fica mais extenso na versão while.

lista = [1, 2, 3, 5, 7]

i = 0

while i < len(lista):

lista[i] *= 2

i += 1

print (lista)

 

■ Programa 5.11: Programa que duplica valores de uma lista

com while.

 

Vamos agora escrever um programa mais útil.

Digamos que você precise escrever um programa que receba uma lista de temperaturas em graus Fahrenheit e escreva na tela o resultado da conversão dessas temperaturas para graus Celsius. As temperaturas em Fahrenheit começam em 0 e vão de 20 em 20 graus até 300. Para automatizar o processo, vamos utilizar o comando range() para gerar as temperaturas. Uma solução seria o Programa 5.12.

for fahr in range(0,301,20):

celsius = (5/9)*(fahr - 32)

print (fahr, int(celsius))

 

■ Programa 5.12: Programa de conversão de Fahrenheit para

Celsius.

 

No programa, o comando range(0,301,20) vai gerar a lista 0, 20, 40, 60, ..., 300. Para gerar corretamente o valor final de 300 é necessário colocar 1 a mais, pois range() gera valores até o segundo parâmetro menos 1. Também, na hora de imprimir, o resultado foi convertido para inteiro com o comando int(Celsius).

O resultado da execução é:

0 -17

20 -6

40 4

60 15

80 26

100 37

120 48

140 60

160 71

180 82

200 93

220 104

240 115

260 126

280 137

300 148

Para alinhar os números, precisamos utilizar a função format().

Ainda não vou falar sobre essa função da linguagem Python. O objetivo é que você aprenda a programar, e o comando format teria uma série de detalhes de sintaxe que iriam desviar o nosso objetivo.

A saída sem o format fica feia mesmo. Mas o programa é

correto. Um uso do format para obter uma saída mais “apresentável” seria como no Programa 5.13. Resumidamente, no programa este comando indica o uso de fahr e celsius para preencher o que estiver entre chaves na string imediatamente anterior. O formato diz para alinhar os valores pela direita (>) e usar 5 casas decimais para farh e celsius, todavia celsius usa uma casa decimal. O valor de fahr deve ser um número decimal inteiro (d), e celsius, ponto flutuante (f).

print (‘Tabela de conversão de Fahrenheit para Celsi

us’)

for fahr in range(0,301,20):

celsius = (5/9)*(fahr - 32)

print (‘{:>5d} -

> {:>5.1f}’.format(fahr, celsius))

 

■ Programa 5.13: Programa de conversão de Fahrenheit para

Celsius formatado.

 

E o resultado fica:

Tabela de conversão de Fahrenheit para Celsius 0 -> -17.8

20 -> -6.7

40 -> 4.4

60 -> 15.6

80 -> 26.7

100 -> 37.8

120 -> 48.9

140 -> 60.0

160 -> 71.1

180 -> 82.2

200 -> 93.3

220 -> 104.4

240 -> 115.6

260 -> 126.7

280 -> 137.8

300 -> 148.9

Resolvido o problema, o resultado não foi armazenado e, se precisássemos dos valores, teríamos de refazer os cálculos. Mas podemos guardar os resultados em uma lista. Vou reescrever um programa mais modular e desta vez utilizando funções. Também vamos pedir ao usuário os limites de conversão e o passo entre as temperaturas. Veja o Programa 5.14, neste momento mais organizado e com docstrings para as funções.

1 def fahr_para_celsius(f):

2 “””Converte temperaturas Fahrenheit para Celsi us.”””

3 return (5 / 9) * (f - 32)

4

5 def cria_tabela_celsius(fahr):

6 “””Cria tabela Celsius a partir de tab Fahr”””

7 celsius = [None] * len(fahr)

8 for i, temp in enumerate(fahr):

9 celsius[i] = fahr_para_celsius(fahr[i])

10 return celsius

11

12 def main():

13 “””Programa principal.”””

14 inicio = int(

15 input(

16 ‘Qual o início das temperaturas Fahren

heit? ‘))

17 fim = int(

18 input(‘Qual o final das temperaturas Fahre

nheit? ‘))

19 passo = int(

20 input(‘Qual o passo das temperaturas Fahre

nheit? ‘))

21 fahr = range(inicio, fim + 1, passo)

22 celsius = cria_tabela_celsius(fahr)

23 print (‘Tabela de conversão de Fahrenheit para

Celsius’)

24 for i, temp in enumerate(fahr):

25 print(‘{:>5d} -> {:>5.1f}’.format(temp,

26 celsius[

i]))

27

28 main()

 

■ Programa 5.14: Programa de conversão de Fahrenheit para

Celsius com listas.

 

A novidade aqui é a linha 7:

celsius = [None] * len(fahr)

Esta linha solicita que Python crie uma lista com o tamanho da lista fahr, mas sem valores nas posições. O valor “None” quer dizer que não existe nada ali. As referências são para “nada”, ou seja, inexistem, apesar de lhes termos reservado um espaço. Em seguida podemos preencher cada posição com os valores do cálculo. Fica um alerta: esta não é a melhor maneira de trabalhar com listas em Python. O correto aqui seria usar a função append() na lista, conforme fosse necessário. Isso será visto mais adiante neste capítulo.

 

EXERCÍCIO 5.1

 

Escreva um programa que receba uma lista de temperaturas em Celsius e escreva

na tela o resultado da conversão dessas temperaturas em Fahrenheit. (Não se

esqueça de usar a fórmula correta!)

 

EXERCÍCIO 5.2

 

Reescreva o programa 5.13 de modo a imprimir o resultado a partir do último

elemento (de 300 para 0).

 

EXERCÍCIO 5.3

 

Reescreva o programa 5.14 validando a entrada de dados do usuário, usando a

estrutura try...except.

 

EXERCÍCIO 5.4

 

Reescreva o Programa 5.13 usando o comando while.

 

EXERCÍCIO 5.5