Lesson 6
Enquanto loop
1. Enquanto loop
while
loop repete a seqüência de ações várias vezes até que alguma condição seja avaliada como False
. A condição é dada antes do corpo do loop e é verificada antes de cada execução do corpo do loop. Tipicamente, o while
de loop é utilizado quando é impossível determinar o número exacto de iterações de ansa com antecedência.
A sintaxe da while
loop no caso mais simples parece com isso:
while some condition: a block of statements
Em primeiro lugar, o Python verifica a condição. Se for falsa, então o loop é encerrado e controle é passado para a próxima instrução após o while
corpo do laço. Se a condição for True, o corpo do loop será executado e, em seguida, a condição será verificada novamente. Isso continua enquanto a condição é verdadeira. Quando a condição se torna False, o loop é finalizado e o controle é passado para a próxima instrução após o loop.
Por exemplo, o fragmento de programa a seguir imprime os quadrados de todos os inteiros de 1 a 10. Aqui, um pode substituir o loop "while" pelo loop for ... in range(...)
:
i = 1 while i <= 10: print(i ** 2) i += 1
Neste exemplo, a variável i
dentro do loop itera de 1 a 10. Essa variável, cujo valor muda com cada nova iteração de loop, é chamada de contador. Note que depois de executar este fragmento o valor da variável i
é definido e é igual a 11
, porque quando i == 11
a condição i <= 10
é False pela primeira vez.
Aqui é outro exemplo de utilização o while
loop para determinar o número de dígitos de um número inteiro n
:
n = int(input()) length = 0 while n > 0: n //= 10 # isso é equivalente a n = n // 10 length += 1 print(length) # 4
Em cada iteração, cortamos o último dígito do número usando a divisão de inteiros por 10 ( n //= 10
). No length
variável, contamos quantas vezes fizemos isso.
No Python existe outra maneira mais fácil de resolver este problema:
.
2. Fluxo de controle de loop: else
Pode-se escrever uma instrução else:
depois de um corpo de loop que é executado uma vez após o final do loop:
i = 1 while i <= 10: print(i) i += 1 else: print('Loop ended, i =', i)
À primeira vista, essa afirmação parece não ter sentido, porque o corpo da instrução else:
pode ser colocado após o final do loop. A instrução "else" depois de um loop só tem sentido quando usada em combinação com a break
instrução. Se durante a execução do loop o interpretador Python encontrar break
, ele imediatamente interrompe a execução do loop e sai dele. Nesse caso, o else:
branch não é executado. Então, break
é usado para abortar a execução do loop durante o meio de qualquer iteração.
Aqui está um exemplo do tipo Black Jack: um programa que lê números e soma até que o total fique maior ou igual a 21. A seqüência de entrada termina com 0 para que o programa possa parar mesmo que a soma total de todos os números seja menos de 21.
Vamos ver como ele se comporta nas diferentes entradas.
Versão 1. O loop é encerrado normalmente após a verificação da condição, portanto a ramificação "else" é executada.
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
Versão 2. O loop é interrompido por break
, então a ramificação "else" é ignorada.
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
A ramificação "Else" também pode ser usada com o loop "for". Vejamos o exemplo quando um programa lê 5 inteiros, mas pára à direita quando o primeiro inteiro negativo é atingido.
Versão 1. O loop é encerrado normalmente, portanto, a ramificação "else" é executada.
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
Versão 2. O loop é abortado, portanto a ramificação "else" não é executada.
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
3. Fluxo de controle de loop: continue
Outra instrução usada para controlar a execução do loop é continue
. Se Python intérprete encontra continue
em algum lugar no meio da iteração do loop, ele ignora todas as instruções restantes e passa para a próxima iteração.
for num in range(2, 10): if num % 2 == 0: print("Found an even number", num) continue print("Found a number", num)
Se o break
e continue
forem colocados dentro de vários loops aninhados, eles afetarão apenas a execução do mais interno. Vamos olhar um exemplo bastante bobo para demonstrar isso:
for i in range(3): for j in range(5): if j > i: # quebra apenas o para na linha 2 break print(i, j)
As instruções break
e continue
são desencorajadas, se você puder implementar sua ideia sem usá-las. Aqui está um exemplo típico de um mau uso da break
: esse código conta o número de dígitos em um inteiro.
n = int(input()) length = 0 while True: length += 1 n //= 10 if n == 0: break print('Length is', length)
É mais limpo e mais fácil de ler para reescrever esse loop com uma condição de loop significativa:
n = int(input()) length = 0 while n != 0: length += 1 n //= 10 print('Length is', length)
4. Múltipla atribuição
Em Python, é possível que uma única instrução de atribuição altere o valor de várias variáveis. Vamos ver:
a, b = 0, 1
O efeito demonstrado acima do código pode ser escrito como:
a = 0 b = 1
A diferença entre as duas versões é que a atribuição múltipla altera os valores de duas variáveis simultaneamente.
A atribuição múltipla é útil quando você precisa trocar os valores de duas variáveis. Em linguagens de programação antigas, sem o suporte de múltiplas atribuições, isso pode ser feito usando a variável auxiliar:
a = 1 b = 2 tmp = a a = b b = tmp print(a, b) # 2 1
No Python, a mesma troca pode ser escrita em uma linha:
a = 1 b = 2 a, b = b, a print(a, b) # 2 1
O lado esquerdo de "=" deve ter uma lista separada por vírgulas de nomes de variáveis. O lado direito pode ser qualquer expressão, separado por vírgulas. O lado esquerdo e as listas do lado direito devem ter o mesmo comprimento.