Introdução

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.

laço while (enquanto)

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:.

Variáveis contadoras.

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:

In [1]:
contador = 0;
while contador < 5:
    print "executando!  contador tem valor" + str(contador)
    contador = contador + 1 #incremento do contador
executando!  contador tem valor0
executando!  contador tem valor1
executando!  contador tem valor2
executando!  contador tem valor3
executando!  contador tem valor4

O que temos no código anterior?

  1. inicializamos a variavel contadora com um valor, no caso vamos começar a contar de 0
  2. while(enquanto) a variavel contadora for menor que cinco vai repetir o bloco de código do while
  3. print que mostra uma mensagem e o valor do contador antes de incrementar
  4. incrementa o contador
  5. volta a linha 2, realiza novamente o teste, se verdade, repete mais uma vez o bloco, se não para.

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.

In [2]:
contador = 4;
while contador >= 0:
    print "executando!  contador tem valor" + str(contador)
    contador = contador - 1 #decremento do contador
executando!  contador tem valor4
executando!  contador tem valor3
executando!  contador tem valor2
executando!  contador tem valor1
executando!  contador tem valor0

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:

In [3]:
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
    
    
    
digite um comando: oi
digite um comando: teste
digite um comando: sair

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.

Variáveis acumuladoras

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:

In [4]:
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 soma eh: 55

A variavel aculadora vai acumulado dentro dela cada novo valor do cantador, desta forma temos o somatório ao final

comando de interrupção

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:

In [5]:
comando = 9;

while comando != 10:
    comando = int(raw_input("digite o comando numerico"))
    if comando == 0:
        break;
digite o comando numerico5
digite o comando numerico5
digite o comando numerico4
digite o comando numerico2
digite o comando numerico1
digite o comando numerico0

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.

comando de ir para proxima iteração

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:

In [6]:
cont = 0;

while cont < 10:
    
    cont = cont + 1
    
    if cont%2==0:
        continue;
        
    print cont
   
1
3
5
7
9

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.

laços de repetição aninhados:

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:

In [7]:
cont1 = 0
while cont1 < 10:
    cont2 = 0
    while cont2 < 5:
        print cont1 + cont2
        cont2 = cont2 + 2
    cont1 = cont1 + 1
0
2
4
1
3
5
2
4
6
3
5
7
4
6
8
5
7
9
6
8
10
7
9
11
8
10
12
9
11
13

Bacana, não? Isso abre uma gama de possibilidades para nossos programas.

Mas e o laço for professor?

O laço for (para)

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:

In [8]:
for i in range(1,5):
    print i
1
2
3
4

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. =).

In [ ]: