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.