Listagem 3
1 # somadora2.py - somadora infinita - versao 2
2
3 print 'Digite os valores a somar seguidos de .'
4 print 'Para encerrar digite zero: 0'
5 total = 0
6 while 1:
7 n = float(raw_input(':'))
8 if n == 0: break
9 total = total + n
10 print 'TOTAL: %s' % total
|
Aqui a lógica é um pouco diferente: na linha 6 o loop while tem como condição o número 1. Como o número 1 é constante, e é considerado "verdadeiro" pelo interpretador Python, o loop das linhas 6 a 9 seria repetido infinitas vezes, em tese. Na prática, a linha 8 verifica se o valor de n é zero. Em caso afirmativo, o comando "break" é acionado. Isso faz com que o loop while seja interrompido imediatamente, e a execução do programa passa diretamente para a próxima linha após o bloco (linha 10 em nosso exemplo).
Essa forma de codificar, usando loops infinitos com breaks, não está de acordo com a Programação Estruturada, a filosofia dominante entre os programadores nos anos 70. O problema é que não fica imediatamente aparente qual é a condição de terminação do loop e alguns professores de computação podem descontar pontos por isso. Mas em se tratando de um bloco de apenas três linhas, não acho que isso seja um grande problema. A vantagem é que agora a função de leitura de dados ocorre em apenas um lugar no programa (na linha 7) e não em dois, como na versão anterior (linhas 5 e 8 de somadora1.py). Isso simplificará nossa próxima alteração. Além disso, não acontece mais a totalização inútil da linha 9, somando zero ao total na saída, porque o comando break da linha 8 faz o programa passar direto para a linha 10.
Uma forma mais natural de codificar esse loop seria usar comandos com o do/while ou repeat/until existentes em linguagens como C/C++/Java e Pascal/Delphi; nessas estruturas de controle, o teste é feito no fim do loop, garantindo a execução do bloco ao menos uma vez. É o que precisamos fazer aqui, mas Python não possui um comando de loop especial para essa situação. Vejamos outro exemplo.
Suponha que você queira, por algum motivo estranho, somar os números naturais (1, 2, 3 etc.) até obter um total maior ou igual a 100. Observe na listagem 4 como ficaria o loop central para fazer isso em Pascal, Java e Python.
Listagem 4
Delphi |
REPEAT
n := n + 1;
total := total + n;
UNTIL (total >= 100);
|
Java |
do {
n = n + 1;
total = total + n;
} while (total < 100);
|
Python |
while 1:
n = n + 1
total = total + n
if total >= 100: break
|
Note que os três programas acima estão incompletos; reproduzimos apenas o loop principal. Generalizando, qualquer loop com teste no final pode ser codificado em Python usando-se uma combinação de while 1 e if/break, assim:
while 1:
comando1
comando2
# etc.
if condicao_final: break
| |
» Um programa mais tolerante »