Você ja notou que os programas que escrevemos até agora não rodam continuamente? Ou que para repetir um comando 20 vezes precisamos escreve-lo 20 vezes também? Isto pode ser um problema quando queremos escrever um programa que funcione continuamente ou que repita x comandos N vezes. Para resolver este problema podemos utilizar os laços de repetição.
Um laço de repetição é uma estrutura que repte vários comandos enquanto uma condição é verdadeira. Assim como um if, um laço possui um bloco de código, este bloco vai repetir N vezes dada uma condição que passamos para este laço. Em python temos dois tipos de lacos de repetição: o while e o for.
o laço while funciona de maneira muito semelhante ao if. Enquanto um valor booleano passado para ele for verdadeiro ele fica repetindo o seu bloco de código. Então temos a seguinte forma: while valor_booleano:.
Uma variavel contadora serve para contar o número de iterações que um laço já executou, e podemos utiliza-la em conjunto com a condição do while. O uso comum da variável contadora será:
1- inicializar ela com algum valor antes do laço de repetição;
2- utilizar ela como condição no laço (critério de parada);
3- incrementa-la/ou decrementa-la a cada repetição dentro do bloco de código do laço;
Exemplo:
contador = 0;
while contador < 5:
print "executando! contador tem valor" + str(contador)
contador = contador + 1 #incremento do contador
O que temos no código anterior?
Bacana né? temos um código que repete 5 vezes o mesmo código. Mas e se quissemos criar valores decrescentes ? Por exemplo de 4 até 0.
contador = 4;
while contador >= 0:
print "executando! contador tem valor" + str(contador)
contador = contador - 1 #decremento do contador
Viu como é simples? Basicamente colocamos o valor de inicio do contador, mudamos a condição do while para parar quando o contador for menor que zero e agora em vez de aumentar o contador diminui.
Podemos criar outros tipos de condições para o while? Claro, lembre o while recebe um valor booleano. Portanto, podemos passar para ele uma variavel booleana ou outros tipos de condições de comparação.
Vamos fazer um exemplo onde, equanto o usuário não digitar sair, repete o laço:
repetir = True #incializamos a variavel repetir com true para repetir ao menos uma vez
#enquanto a variavel repetir for true vai repetir
while repetir:
comando = raw_input("digite um comando: ") #captura um comando do usuario
if comando == "sair": # se o comando for sair
repetir = False; # para de repetir
Viu como é versátil o uso do while? Muitas vezes vamos precisar acumular valores para calcular um somatorio ou outros tipos de calculos em sequencia. Para isso, usualmente em conjunto com uma variável contadora, utilizamos uma variavel acumuladora.
Uma variavel acumuladora é uma variavel que vai acumulando valores durante as iterações de um laço, ela pode ser utili para, por exeplo, somar todos os valores de um intervalo ou de uma lista (veremos isso mais para frente).
Exemplo calculando o somatorio de 1 à 10:
contador = 1
acumulador = 0 #iniciamos nosso acumulador em 0
while contador <= 10:
acumulador = acumulador + contador; # acumula no acumulador cada novo valor do contador
contador = contador + 1
print "a soma eh: " + str(acumulador)
A variavel aculadora vai acumulado dentro dela cada novo valor do cantador, desta forma temos o somatório ao final
Algumas vezes vai ser necessario interroper o laço de repetição sem utilizar a codição do while. Para realizar essa interrupção utilziamos o comando break, o qual interrompe o laço sempre que é encontrado.
Exemplo:
comando = 9;
while comando != 10:
comando = int(raw_input("digite o comando numerico"))
if comando == 0:
break;
Viu que agora temos duas formas de sair do laço? ou quando a condição do while deixa de ser verdade ou quando o usuario digita 0, o que executa o break.
Muitas vezes, em vez de parar de executar o laco, podemos querer que ele pare de executar a iteraçào atual e pule para a proxima. Para isso utilizamos o comando continue.
Exemplo:
cont = 0;
while cont < 10:
cont = cont + 1
if cont%2==0:
continue;
print cont
Viu que o programa a seguir só imprimiu os valores impares? Isso se da pelo uso do continue no if, ele interrompe a execução da iteração atual e vai para a proxima.
Uma grande duvida do pessoal que esta iniciando é: posso usar um laço de repetição dentro de outro?
A resposta é claro. Vamos ver um exemplo:
cont1 = 0
while cont1 < 10:
cont2 = 0
while cont2 < 5:
print cont1 + cont2
cont2 = cont2 + 2
cont1 = cont1 + 1
Bacana, não? Isso abre uma gama de possibilidades para nossos programas.
Mas e o laço for professor?
O laço for (para cada) no python segue a ideia de executar uma iteração para cada objeto passado para ele. Ele será muito util para quando quisermos iterar sobre valores ou objetos em uma lista. Entretanto podemos passar para o for um conjunto de valores para ele iterar. Desta forma com o for não é preciso criar uma variavel contadora.
Exemplo:
for i in range(1,5):
print i
Observe que o for executou valores diferentes para a variavel i (contadora) que estão no range (alcance) de 1 e à 4. Bem mais simples que o while né? Mas observe que para usarmos o for, precisamos saber o numero de iterações que vão ser executadas.
Os comandos break e continue também são validos para o for.
Mais para frente vamos ver como o for se encaixa perfeitamente com listas, por enquanto, vamos praticar os lacos de repetição com os exercícios. =).