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?!

O que a gente tá fazendo é comparando as faltas, mas salvando nas variáveis mais_faltas e menos_faltas o nome do time correspondente, e não o número de faltas. Uma última ressalva, no entanto, é que as variáveis foram inicializadas já com o primeiro time. A gente não precisa comparar o primeiro time com o primeiro time, saca?! Comparar o time com ele mesmo é doideira (apesar de funcionar)... Por isso, o ideal é a gente comparar somente com todos os outros times, do segundo em diante.

Beleza, agora no fim do nosso programa todas as variáveis vão estar com os valores certinhos, prontos pra gente exibir pro usuário!

Passo 4

Agora, vamos exibir pro usuário, usando a famosa função print().

Caramba! Esse programa ficou grande, né?! Mas pelo menos tá funcionando huahahahha! Até a próxima, doido!

Resposta

Exercício Resolvido #2

FGV, 2018 - Adaptado

Ao executar o seguinte programa, o que será exibido?

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí! A gente precisa dar uma analisada no código pra qual vai ser o resultado. O importante a se notar nessa questão é o uso do range() de uma forma que talvez você não tenha notado. O range funciona exatamente como os intervalos em listas e strings. No primeiro parâmetro, recebe um valor inicial, no segundo, um valor final. Já no terceiro, recebe o passo que deve ser dado a cada loop pra chegar no valor final. Só pra você sacar bem, vou te mostrar na prática como intervalos são gerados com a função range().

Não costumamos usar essa notação em programas reais, mas é útil pra gente visualizar. Se executar esse código, será exibida a lista [0,1,2,3,4]. Isso porque nós só passamos um parâmetro. Quando passamos 2, são considerados como intervalos.

Porém, os intervalos são inclusivos na esquerda e exclusivos na direita. Isso significa que o último digito do intervalo não será incluído no resultado (nesse caso, o 5 não foi pra lista final).

Já no ultimo caso, quando passamos três parâmetros, também podemos escolher o passo no qual o intervalo vai aumentar ou diminuir. No exemplo (mesmo números do enunciado), a lista retornada foi -1 e -3.

De forma análoga, o for do enunciado vai repetir o código print(frutas[k]) com k sendo -1 e depois sendo -3. Com isso, o programa exibirá “uva” e “laranja”.

Resposta

“uva” e “laranja”.

Exercício Resolvido #3

PUC-Rio

Dado uma string com uma frase informada pelo usuário (incluindo espaços em branco), conte: a) quantos espaços em branco existem na frase.

b) quantas vezes aparecem as vogais a, e, i, o, u.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, doido! Pra começar, a gente precisa perguntar pro usuário uma frase. E pra isso a gente usa a função input().

A frase digitada pelo usuário vai ficar salva na variável que a gente chamou de “frase” (bem criativo haha). Agora, precisamos contar quantos dos caracteres dessa string são vogais ou espaço. Primeiro, vamos criar nossas variáveis que vão servir de contadores.

Show! Com tudo preparado, vamos por a mão na massa!

Passo 2

Agora a gente precisa checar, letra por letra, se é vogal ou espaço. Pra isso, podemos usar um laço de repetição for.

Essa estrutura vai repetir o código em seu corpo uma vez a cada letra da frase, atualizando a variável “letra” a cada loop. Então, a gente só precisa checar se a variável guarda uma vogal ou um espaço. Vamos começar com o espaço, que é mais fácil.

Pronto! Agora, sempre que a letra for um espaço, vai ser acrescentado uma unidade na variável “espacos”. Também precisamos checar se é uma vogal, e vamos usar o operador in pra isso.

Caso você não recorde bem, esse operador checa se uma letra está dentro de uma string. Malandramente eu criei uma string com todas as vogais, e o operador diz de a letra está dentro da string. Nesse caso, se estiver, é uma vogal. Mas se liga que o operador não é comutativo, isso significa que a letra tem que ficar à esquerda e a string à direita do “in”, ok?!

Passo 3

Beleza! Agora a gente já tem os dados necessários, a gente só precisa exibir pro usuário. Pra exibir, vamos usar a função print().

Pronto! Finalizamos o exercício! =)

Resposta

Exercício Resolvido #4

PUC-Rio, Lista 8

Faça um programa que inicialmente leia a quantidade de candidatos do Rio de Janeiro de um concurso. A seguir, para cada candidato, o programa deverá ler seu nome e sua nota, exibindo se o candidato foi aprovado ou reprovado. Para ser aprovado, o candidato deverá ter nota superior a 80. Ao final o programa deverá exibir a quantidade de aprovados e a quantidade de reprovados e a nota média dos candidatos.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aíi! Mano, tu conseguiu sacar que a gente só precisa escrever o código pra ler o nome e a nota do candidato uma vez e dizer se ele foi aprovado, e depois a gente fica repetindo esse código um montão de vezes? É isso que a gente vai fazer!

Mas vamos começar lendo a quantidade de repetições que a gente tem que fazer. E, com certeza, esse é um número inteiro, né?!

O que é SUPER importante tu notar é que o número de vezes que o código precisa se repetir é justamente o número de candidatos no concurso! Bora escrever esse código aí!

Passo 2

Cara, o ideal é a gente usar o for só quando estiver usando listas, e usar o while quando não. Nesse caso, bora usar o while! Nossa estrutura fica assim:

Se liga que, a cada loop, a gente tá diminuindo uma unidade na variável “contador” E o while fica repetindo enquanto “contador” for maior que 0. Ou seja, só vai parar quando for 0. E aí vai ter repetido exatamente a quantidade de vezes que a gente quer!

Beleza, agora que temos a estrutura, bora preparar nosso código!

Passo 3

O código que a gente quer que repita é perguntar o nome candidato e a nota dele. Pra isso, vamos usar dois inputs.

Pronto! Mas ainda não acabou. Precisamos verificar e dizer se esse candidato passou ou não. Pra isso, vamos usar uma condicional (if).

Beleza! Até aqui deu pra chegar. Mas o enunciado também tá pedindo pra gente calcular a quantidade de aprovados, de reprovados e a nota média de todos os candidatos!

A lágrima quase desceu, mas calma! A gente vai conseguir!

Passo 4

Se liga, tudo que tá dentro do while vai ser repetido a cada loop. Se a gente quer salvar algum dado que não seja reiniciado a cada loop, precisamos definir fora do while. Então, vamos criar algumas variáveis fora do loop.

Pronto! No início do programa a gente definiu as variáveis “aprovados”, “reprovados” e “media” como zero. A cada loop a gente vai atualizando elas, e aí no final do programa a gente vai ter o total, sacou?

Então, a cada candidato que for aprovado, a gente acrescenta um na variavel “aprovados”. Vamos fazer a mesma coisa também pros reprovados.