O comando while
¶
Há outro comando em Python que também pode ser usado para construir uma repetição: o comando while
.
O comando while
permite um mecanismo muito mais genérico de repetição. De forma similar ao comando if
, ele usa uma expressão booleana para controlar o fluxo de execução. O corpo do comando será repetido enquanto a expressão booleana for True
.
A figura abaixo mostra o fluxo de controle.

Podemos usar o comando while
para criar qualquer tipo de repetição, incluindo qualquer uma que já tenhamos feito com o comando for
. Ou seja, qualquer um dos programas da aula anterior poderia ser reescrito usando while
.
Por exemplo, para realizar o somátorio: ao invés de utilizar a função range
para produzir os números da sequência, será necessário gerarmos eles manualmente. Para isso, criaremos uma variável denominada cont
(contador) e inicializaremos ela com 1, o primeiro número no somatório.
Cada iteração irá adicionar cont
ao acumulador soma
até que todos os valores tenham sido usados. Para controlar a iteração, será necessário criar uma expressão booleana que resulta em True
enquanto desejamos continuar adicionando valores ao total. Neste caso, enquanto cont
for menor ou igual ao valor de entrada (n
), devemos continuar.
Aqui está uma versão do programa do somatório usando o comando while
:
Você quase pode ler o comando while
como se fosse em Português. Ele significa: enquanto cont
for menor ou igual a n
, continue executando o corpo da repetição. O qual, por sua vez, consiste em somar o contador à soma
e incrementar em um o valor de cont
. Depois do corpo da repetição, voltamos à condição do while
e novamente avaliamos elea: quando cont
for maior que n
, a condição falhará e o fluxo de controle continuará após o bloco do while
.
Mais formalmente, aqui está o fluxo de execução de um comando while
:
Avalia a expressão booleana, o que resulta em
False
ouTrue
.Se a expressão for
False
, sai do comandowhile
e continua a execução no comando seguinte.Se a expressão for
True
, executa o bloco do comando e volta ao passo 1.
Este tipo de fluxo de execução é comumente denominado loop porque o terceiro passo volta ao início. Observe que se a condição for False
no início, o bloco de comandos nunca será executado.
O bloco do loop deve obrigatoriamente alterar uma ou mais variáveis de forma que a condição eventualmente se torne False
e o loop termine. Caso contrário, ele irá se repetir para sempre. Se isso acontecer, chamamos de loop infinito.
Uma piada antiga para cientistas de computação é a observação que as instruções geralmente encontradas num vidro de xampu (“ensaboe, enxágue e repita”) criam um loop infinito.
Nota
Podemos pensar um pouco sobre os tipos de iteração (repetição) que já vimos até agora… O comando for
irá sempre iterar por uma sequência de valores, como os números gerados pela função range
. Uma vez que sabemos que ele irá passar por cada valor na sequência, geralmente se diz que o comando for
cria uma iteração determinada, porque nós definitivamente sabemos quantas vezes ele irá executar o bloco. Em contrapartida, o comando while
é dependente de uma condição que precisa ser False
para que o loop termine. E como não sabemos necessariamente quando isso acontecerá, ele crie o que se chama iteração indeterminada. Isso significa que nós não sabemos quantas vezes o bloco irá executar, mas eventuamente a condição controlando a repetição irá falhar e o loop terminará (a menos que se tenha um loop infinito - o que obviamente é um problema).
O que certamente você notou é que dá mais trabalho usar o comando while
do que um for
equivalente. Ou seja, quando você usa um comando while
, você precisa controlar diretamente a variável do loop (contador).
Então porque ter dois tipos de loop, se o comando for
é mais simples? O próximo exemplo tentará exemplificar essa necessidade, com uma iteração indeterminada.
Veja se você entendeu
- Verdadeiro
- Apesar do comando while usar uma sintaxe diferente, ele é tão poderoso quanto o comando for, e algumas vezes ainda mais flexível.
- Falso
- Geralmente um comando for é mais natural e conveniente para determinado algoritmo, mas o mesmo algoritmo pode sempre ser expresso através de um comando while.
iter-3-1: Verdadeiro ou falso? Você pode reescrever qualquer comando for com um comando while.
- n começa em 10 e é incrementada em 1 ao longo do loop, portanto será sempre positiva
- O loop irá executar enquanto n for positiva. Neste caso, n nunca se tornará negativa.
- resposta começa em 1 e é incrementado em n a cada vez, portanto sempre será positiva
- Apesar do fato que resposta sempre será positiva, essa variável não é usada na condição do loop.
- Você não pode comparar n com zero no comando while. Você precisa compará-la com outra variável.
- É perfeitamente aceitável comparar n com zero. Porém, é justamente isso que indiretamente cria o loop infinito.
- No corpo do comando while, precisamos fazer com que n seja False - e esse programa não faz isso.
- A condição do loop precisa ser False para o loop terminar, mas n não é a condição neste caso.
iter-3-2: O código abaixo contém um loop infinito. Qual é a melhor explicação para o porquê de ele nunca terminar?
n = 10
resposta = 1
while n > 0:
resposta = resposta + n
n = n + 1
print(resposta)