Laços de repetição

Teoria Completa

Cara, imagina que você precisa exibir na tela uma sequência de 100 números. Já pensou se você tivesse que escrever a função print 100 vezes?! Ia ser mó doideira. Pra isso, existem os laços de repetição. São estruturas que permitem que um bloco de código fique se repetindo várias vezes, e alterando seu comportamento durante cada repetição. As duas estruturas de repetição em Python são o While, e For.

Laço While

Se você se lembrar bem, na estrutura condicional, usando o if, somos capazes de executar ou não um bloco de código dependendo de uma condição booleana.

A estrutura while tem um formato muito parecido.

Você só precisa colocar uma expressão booleana na estrutura e o bloco de código dentro da estrutura vai ser executado repetidamente até que a condição seja falsa. Repara que é muito possível que essa condição nunca fique falsa, caracterizando um loop infinito.

Se você executar esse código, vai ver que seu programa vai exibir o texto “é verdade” pra sempre. Literalmente, eu não tô zoando. Você vai ter que finalizar o programa manualmente, porque a condição 1

Olha, nesse caso o laço não vai se repetir pra sempre. A cada vez que o código se repetir, a variável “contador” vai ter um valor diferente. Esse código resolve o problema que a gente tinha falado no início! Ao executar esse programa, será exibida uma sequência de 1 a 100. Quando o valor da variável “contador” for maior que 100, a repetição vai terminar, sacou?! Agora vamos falar do for.

Laço For

Diferentemente do laço while, que é baseado em condições booleanas e pode até ser um loop infinito, o laço “for” tem um número determinado de passos. Você pode dizer, antes mesmo da repetição começar, quais vão ser o valor de uma determinada variável a cada loop. Ficou confuso? Calma que eu te mostro, mano!

Ao executar esse código, o resultado é esse aqui:

Viu? O mesmo código se repetiu, mas a cada repetição o valor da variável foi alterado na sequência da lista que é passada na estrutura. Mas você não tem que fazer a lista manualmente sempre. Existem algumas funções que criam listas pra gente ali de forma automática!

Esse código faz a mesma coisa que a gente fez com o while, ele exibe todos os números de 1 a 100. Repara que na função range() a gente passou 1 e 101. Isso é porque o segundo intervalo não tá incluso, blz? Se fizer range(1, 100), só vai exibir até o 99!

Mas também não é obrigatório usar a variável da estrutura. Olha:

Viu? A variável muda a cada loop, mas a gente cagou pra ela e não usou.

Mas se liga que eu usei a função range() de outra forma. Se você passar só um valor, ele faz no intervalo de 0 até o valor que você passar -1, beleza?!

Laço For com string

Doido, lembra daquele papo de strings serem bem parecidas com listas??! Então… As strings também funcionam no laço for, e a gente consegue iterar pelas letras de uma string. Se liga nesse exemplo prático:

A gente colocou a string no lugar da lista, e o resultado é que, a cada repetição, a variável que a gente criou vai ter uma das letras da string dentro. Se a gente executar esse programa, o resultado vai ser esse:

Ou seja, executamos um print() pra cada letra, sacou??! Também, queria enfatizar que o nome da variável do for é arbitrário, você que escolhe. Reparou que eu tava usando “variável” e depois mudei pra “letra”?? Então! Qualquer nome funciona, ok? E por enquanto é só isso.

Te vejo nos exercícios!!!

Expandir

Exercício Resolvido #1

PUC-Rio

Faça um programa que percorre uma lista com o seguinte formato: [['Brasil', 'Italia', [10, 9]], ['Brasil', 'Espanha', [5, 7]], ['Italia', 'Espanha', [7,8]]]. Essa lista indica o número de faltas que cada time fez em cada jogo. Na lista acima, no jogo entre Brasil e Itália, o Brasil fez 10 faltas e a Itália fez 9.

O programa deve imprimir na tela:

a) o total de faltas do campeonato

b) o time que fez mais faltas

c) o time que fez menos faltas

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Ok, aqui a gente tem um aninhado de listas (uma dentro da outra). Bom, o que vamos fazer é iterar sobre cada uma delas. Vamos começar criando nossas variáveis e copiando a lista do enunciado e salvando com um nome que a gente vai escolher, e eu vou chamar de “jogos”.

Agora, a primeira coisa a fazer é contar quantas faltas cada time cometeu, levando em consideração que os times jogaram mais de uma vez. Antes de começar a resolução de fato, eu queria te lembrar que, em programação, existem várias respostas possíveis. Se você pensar em outra forma de fazer a mesma coisa e funcionar de boas, então também é uma resposta certa, ok?!

Beleza, vamos continuar! Vamos criar duas variáveis de listas, onde a gente vai armazenar separadamente todos os times do campeonato e seu respectivo número de faltas. Além disso, vamos criar também uma variável onde a gente possa guardar todas as faltas cometidas no campeonato, que é pedido na letra a.

Se liga que eu comecei colocando o número de faltas igual a zero. Isso porque a gente não sabe quantas faltas vão ter no total, mas a gente vai somando nesse número todas as faltas de todos os jogos. No fim, o resultado vai ser o total, beleza?!

Passo 2

Agora que já criamos as variáveis que vamos usar, bora fazer um for pela lista de jogos pra gente conseguir analisar cada jogo individualmente.

A gente precisa colocar dentro da variável “lista_times” o nome de todos os times do campeonato, sem repetir. Pra isso, primeiro a gente precisa checar se o time já está na lista. Se não estiver, a gente adiciona ele lá! Vamos pensar, por enquanto, só no primeiro time de cada jogo.

O que a gente fez foi checar se o primeiro time do jogo (jogo[0]) está dentro da lista que a gente criou (lista_times). Se NÃO estiver, a gente coloca ele lá, e coloca também o número de faltas cometidas por aquele time na lista “lista_faltas”. A ideia é que a gente separe em duas listas, mas na mesma ordem, o número de faltas e o nome do time. Mas e caso já tenha? Bom. Se o time já estiver na lista de times, a gente pode só acrescentar o número de faltas na lista de faltas.

Se liga que eu usei a função lista.index() ali na penúltima linha. Isso é porque eu quero saber em qual ordem o time tá na lista_times. Já que o número de faltas tá na mesma ordem da lista_times, eu posso usar o mesmo índice. Beleza! Agora, a gente só precisa fazer a mesma coisa pro segundo time!

Eu copiei e colei o código que tava tratando os times da esquerda de cada jogo e mudei tudo de 0 pra 1, assim o código funciona também consideranto os times da direita. Mas, cara... Ficou bem repetitivo, né?! A gente executou um mesmo código e a única coisa que a gente mudou foi um número de 0 pra 1. Isso me lembra o laço de repetição for-range!

O laço for-range repete o código dentro dele, mas a cada loop a variável que a gente criou (nesse caso “i”) é um número diferente. Como usando range(2), o código vai se repetir com i = 0 e depois com i = 1. No fim, é exatamente a mesma coisa que a gente tinha feito antes, mas a gente escreveu bem menos!

Show! Até aqui a gente conseguiu separar todos os dados em duas listas. No fim, desse código, terminamos com as variáveis assim:

Se liga bem na ideia das listas lista_faltas e lista_times estarem na mesma ordem. Significa que o Brasil cometeu 15 faltas, a Italia 16 e a Espanha 15 também. Parece tudo ok, mas a gente não mexeu na faltas_totais. Era pra faltas_totais ser igual a 15+15+16 = 46, mas a gente não mexeu nela no código. Precisamos corrigir isso!

Se liga na linha de número 11 (coloquei o número das linhas pra você não precisar contar

Beleza! Agora que nossos dados estão todos prontos, vamos usar eles pra fazer as verificações necessárias nos itens b e c.

Passo 3

A gente precisa saber qual time tem mais faltas e qual tem menos. Bom, a gente tá ligado que o que tem mais falta é a Itália, mas precisamos verificar com códigos. Outra coisa é que o Brasil e a Espanha estão empatados. Nesse caso, tanto faz qual dos dois o nosso programa devolva, ok?! Mãos a obra! Vamos começar criando as variáveis que vão guardar o time de mais faltas e o de menos faltas.

E pra começar, eu coloquei os dois sendo igual ao primeiro dos times na lista lista_times. Isso pode parecer meio confuso, mas eu te explico. A ideia é que a gente tem que comparar todos os elementos das listas, mas pra isso a gente precisa de alguma referência. A ideia é que a gente pode fazer um for e a cada loop, checar se o time atual tem mais faltas que o mais_faltas, ou se tem menos faltas que o menos_faltas. Mas como a gente tem as informações separadas em duas listas, a gente tem que fazer o for em duas listas simultaneamente. Faremos isso com o laço for-zip.

Dentro desse for, na primeira vez as variáveis vão ser time = “Brasil” e faltas = 15. Depois, “Itália” e 16. Por fim, “Espanha” e 15. Só pra enfatizar, as duas listas são percorridas simultaneamente, ok?!