Enviar um café pro programador

Loops Aninhados (Laço dentro de laço)

Neste tutorial de nosso Curso Completo de Python, vamos ensinar o que são loops aninhados (nested), ou seja, vamos colocar laços dentro de laços, ver como é isso, para que serve, como funciona e exemplos reais de uso.




Loops Aninhados

Já falamos aqui em nosso curso sobre Testes Condicionais IF e ELSE aninhados, inclusive demos alguns exemplos de uso.

Agora voltamos ao assunto, porém vamos usar WHILE e FOR dentro de outros WHILE e FOR, por um motivo bem direto: aninhamento é absurdamente importante e usado.




Quando você se tornar uma programador profissional (clique para saber como ganhar dinheiro programando em Python), vai usar muito isso, muito mesmo.

Se você já entendeu a lógica dos IF e ELSE aninhados, já sabe tranquilamente aninhar, em teoria, os laços.

Exemplo de loopings aninhados

O melhor exemplo de loop dentro de loop, é o nosso calendário/relógio.

O ano tem 12 meses.
Todo santo ano, começa em Janeiro, depois Fevereiro, Março...até Dezembro.
Depois conta-se tudo de novo, e de novo, e de novo...é um looping.

Porém, dentro de cada mês tem os dias do mês.
Começa no dia 1, dia 2, dia 3...até o último dia do mês (que varia).
Mas quando acaba, volta tudo de novo...looping.

E dentro do dia temos as horas!
00h...01h...02h...12h...23h...e depois repete, repete.

Dentro de cada hora?
Loop dos minutos.

Dentro de cada minuto?
Loop dos segundos.

Sim, vivemos em loops aninhados.
Vamos colocar isso em prática programando em Python ?

Criando um Tabuleiro

Faça um programa em Python que solicite um número positivo inteiro ao usuário, e depois exiba um tabuleiro na tela, com igual número de linhas e colunas.

Por exemplo, se ele digitar 3 deve aparecer na tela:
x  x  x
x  x  x
x  x  x

Se digitar 2:
x  x
x  x

Se digitar 4:
x  x  x  x
x  x  x  x
x  x  x  x
x  x  x  x

Solução:

Vamos criar um tabuleiro de tamanho N x N, onde esse N o usuário fornece e armazenamos na variável n.

Usaremos duas varáveis de controle: linha e coluna, ok?




O primeiro laço FOR vai ser responsável por percorrer as linhas.
Ele vai percorrer um intervalo de n linhas, ou seja: range(n)

Dentro de cada linha dessa, precisamos desenhar as colunas, onde cada coluna printamos um "". E quantas vezes isso é feito? n vezes.
Ou seja, vamos usar outro intervalo de valor n: range(n)

Vamos usar uma variação da função print, que não quebra a linha automaticamente. Para isso, basta adicionar o end='' na função print, pra definir que no fim dela não fala nada, não coloque nenhum caractere (por padrão ela coloca \n de quebra de linha).

Quando terminar de imprimir cada linha, o que fazemos?
Precisamos dar uma quebra de linha, para o tabuleiro ficar bonitinho, então usamos  print() (isso mesmo, sem nada dentro).

Veja como nosso código ficou:

print("Vamos criar um tabuleiro de tamanho:  N x N")
n=int(input("Valor de N: ") )

for linha in range(n):
    for coluna in range(n):
        print("x  ",end='')
    print()


Guarde esse código com carinho, vamos usar no futuro quando formos programar diversos jogos, como jogo da velha, batalha naval etc.

Exercício resolvido de Python

Crie um programa que exiba todos os segundos e minutos no intervalo de uma hora, no seguinte formato: XXmin YYs
Por exemplo:
12min59s

Vamos usar duas variáveis, a minuto e segundo.
Ambas vão de 0 até 59, ou seja, vamos usar o intervalo de 60: range(60)

O primeiro FOR é para os minutos.
Primeiro o minuto 0. Dentro dele vamos imprimir do 0s até 59s.
Depois o minuto 1. Dentro deles imprimimos de 0s até 59s.
...
Por fim, minuto 59.

O FOR que vai estar aninhado é o responsável por imprimir os segundos.
Veja como ficou o código do programa:


for minutos in range(60):
    for segundos in range(60):
        print(minutos,"min",segundos,"s")

Exercício Resolvido de Python

Faça o mesmo do exemplo acima, mas adicione as horas para ficar no formato: XXh YYmin ZZs
Aqui, basta notar que as horas vão de 0h até 23h: range(24)

for horas in range(24):
    for minutos in range(60):
        for segundos in range(60):
            print(horas,"h",minutos,"min",segundos,"s")

(se demorar muito, e vai demorar, dê um control+C que o shell do Python vai parar de rodar)

Exercício Resolvido de Laço Aninhado

Você foi contratado por uma escola para fazer o seguinte script em Python:
Primeiro, pergunta a quem vai usar o script quantos alunos tem na sala.
Depois, quantas matérias cada aluno estuda.

Em seguida o usuário vai preenchendo a nota de cada matéria, de cada aluno.
Seu programa deve fornecer a média de cada aluno e a média geral da turma.

Solução:

Vamos armazenar o número de alunos na variável alunos e o número de matérias em materias.

O primeiro laço é o que vai percorrer os alunos:
Aluno 1, depois aluno 2, o aluno 3...ou seja: range(alunos)

Depois, para cada aluno vamos dar as respectivas notas de cada matéria.
A cada nota que o usuário der, vamos somar ela na variável 'mediaAluno', e ao final basta dividirmos esse número pelo número de matérias e temos a média daquele aluno.
A cada iteração do primeiro FOR, antes de digitarmos as notas de cada matéria, devemos zerar essa variável!

Quando tivermos a 'mediaAluno', vamos somar esse valor na variável 'mediaTurma', e no final do programa dividimos essa variável pelo número de alunos, para ter a média geral da turma.

Veja como ficou o código final:


alunos=int(input("Quantos alunos tem na turma: ") )
materias=int(input("Quantas matérias eles estudam: ") )

mediaTurma=0
for aluno in range(alunos):
    print("Aluno",aluno+1,":")
    
    mediaAluno=0
    for materia in range(materias):
          print("Nota da materia",materia+1,":", end='')
          nota=int(input())
          mediaAluno += nota

    mediaAluno /= materias
    print("Media desse aluno:",mediaAluno,"\n")
    
    mediaTurma += mediaAluno

mediaTurma /= alunos
print("Media da turma:",mediaTurma)

Python na Mega-Sena

Faça um script em Python que exiba todos os possíveis palpites da Mega-Sena.
Dados:
  1. Cada palpite possui 6 dezenas
  2. As dezenas variam de 1 até 60
  3. Não pode repetir dezena

Operadores de Atribuição: += , -= , *= , /= e %= (Augmented Assignment)

Neste tutorial de nosso Curso de Python Online Grátis, vamos falar sobre os operadores de atribuição (+= , -=, *=, /= e %=), também conhecidos por Augmented Assignment Statement, e vamos te mostrar porquê programadores tem fama de preguiçosos.



Usando Variáveis de Uma Maneira Diferente

Fazer uma operação Matemática em Python é moleza, inclusive já te ensinamos nesse link aí e durante o curso estamos usando várias vezes as mais diversas operações.

Uma coisa bem simples é fazer uma soma de duas variáveis, e armazenar em outra.




Por exemplo, você armazena o valor da conta de luz na variável luz e o valor da conta de água em agua, e quer calcular a despesa total numa variável chamada total (sim, nós do Python Progressivo somos super originais com nomes de variáveis). O que fazemos?

Ué: total = agua + luz
Moleza!

Mas faltou algo tão importante quando a conta de água e luz...a netflix.
E aí, o que fazer?

Ué:
total = agua + luz + netflix

Mas peraí, a gente já tinha o valor da soma 'agua + luz', não precisamos calcular isso de novo. Somos programadores, não gastamos processamento à toa.

Então, fazemos o seguinte:
total = total + netflix

Estranho, né?
total = total... como assim algo é igual a ela mesmo mais outra coisa?

O 'total' da esquerda quer dizer:
A variável 'total' vai receber...

O 'total' depois do '=' quer dizer:
Valor anterior de 'total'

Ou seja:
x = x + y

Significa: o novo valor de x é o valor anterior de x mais y.

Incrementando Uma Variável: x = x + 1

Essa ideia de usar o valor da variável antes da nova expressão, que vai atribuir um novo valor a esta mesma variável, é muito útil.

Tão útil que vamos usar direto, a todo instante, em nosso Curso de Python.
O exemplo mais útil dela é para contadores, variáveis que vão servir só pra gerar uma contagem.




Vamos ver um exemplo real.

Exercício de Python Resolvido

Crie um programa que peça um número inteiro positivo ao usuário.
Em seguida, o script deve mostrar os números de 0 até o valor que o usuário escolheu. Use WHILE.

O valor solicitado ao usuário, vai ficar armazenado na variável n.
Em seguida, vamos usar um contador, uma variável count que vai de 0 até n, pela fórmula: count =  count + 1

Ou seja, a cada iteração do loop WHILE, ela aumenta de uma unidade e imprime o valor.

Veja o nosso código Python:

n=int(input("Digite um inteiro positivo: ") )

count=0
while count <= n:
    print(count)
    count = count + 1


Operadores de Atribuição em Python

Bill Gates tem uma frase bem interessante:
"Escolho uma pessoa preguiçosa pra fazer um trabalho pesado. Principalmente porque uma pessoa preguiçosa vai encontrar uma forma simples de resolver o problema."





Em outras palavras: programador é um bicho preguiçoso, rs.
Está sempre querendo fazer algo da maneira mais rápida e simples possível, o que é algo bom.

Vamos ensinar agora um atalho em Python.
Sabe o: count = count + 1 ?

Pois é, pode ser substituído por: count += 1 !
Teste:

Outros operadores de atribuição:
x = x - y       x -= y
x = x / y       x /= y
x = x * y       x *= y
x = x % y      x %= y

Bem simples e bem fácil.
Apenas uma maneira mais rápido, simples e fácil de escrever algo.

Nada de novo. Sigamos nosso curso.

Como calcular Fatorial em Python

Neste tutorial de nosso Curso de Python Online Grátis, vamos te ensinar o que é o número fatorial, para que serve, e como implementar ele tanto usando o laço FOR como o laço WHILE.

Já pensou em ir além de apenas aprender Python...e trabalhar com isso?
Leia:

Fatorial na Matemática

O fatorial é uma operação matemática, representada pelo símbolo de exclamação: !



A fórmula de fatorial de um número n é:
n! = n * (n-1) * (n-2) * ... * 3 * 2 * 1

Ou seja, o valor de n! (leia-se: n fatorial) é o produto de 1, por 2, por 3, ..., por (n-1) e n.

Por exemplo:
4! = 4 x 3 x 2 x 1 = 24
5! = 5 x 4 x 3 x 2 x 1 = 120 (ou: 5! = 5 x 4! = 5x24 = 120)

E por ai vai.

O fatorial é muito usado em um ramo da Matemática chamado Análise Combinatória. Muito mesmo. Se você fez ensino médio, certamente sabe o que é um fatorial.

Agora, vamos levar isso pro nosso amado Python.


Fatorial com o laço WHILE em Python

Vamos aprender agora como calcular o fatorial de número usando o laço While em Python.



Vamos lá, tente o máximo que puder:
Crie um programa em Python que pede um número inteiro ao usuário e calcule seu fatorial.


Vamos pedir um número inteiro e positivo ao usuário, e armazenar na variável numero.

Agora precisamos calcular o produto:
1*2*3*...*(numero-1) * numero

Vamos armazenar esse produto na variável resultado.
Inicialmente, vamos iniciar a variável resultado com 1:

resultado = 1

Agora vamos precisar de um contador, vamos usar a variável count para ir de 1 até numero, a cada iteração do laço WHILE, ela é incrementada.

Então, dentro do laço while, fazemos com que resultado seja multiplicado por count, pois count vai assumir os valores de 1, 2, 3, ..., até numero.

Quando chegar em numero, nosso looping while deve parar.
Logo, o teste condicional do while deve ser: count <= numero , ok?

Veja como ficou nosso script em Python:


numero = int(input("Fatorial de: ") )

resultado=1
count=1

while count <= numero:
    resultado *= count
    count += 1

print(resultado)


Lembrando que:
  • resultado *= count é o mesmo que: resultado = resultado * count
Ou seja, o novo valor de 'resultado' vai ser o valor antigo multiplicado por 'count'.

  • Já: count += 1 significa: count = count + 1
Ou seja, estamos incrementando o valor de 'count' em uma unidade, a cada iteração do laço WHILE.


Calcular fatorial usando laço FOR em Python

A lógica deve ser a mesma. Na verdade, tudo que um laço WHILE faz o FOR faz, e vice-versa.



"Ué, então pra que criar os dois?"
Porque tem situações que é melhor usar um e situações que é melhor usar outro.

Neste caso, você vai ver que é melhor usar o FOR.

Vamos repetir a ideia: Precisamos fazer várias multiplicações, do número 1 até o valor inserido pelo usuário, numero.
Do intervalo 1 até numero.

Isso te lembra algo? Intervalo?

Sim, range.
Nossa querida, amada função range do Python, que é unha e carne com o laço FOR.

Como queremos um intervalo que vai de 1 até numero, basta usarmos:
range(1, numero+1)

Veja como nosso código fica bem mais enxuto e fodástico usando o laço FOR:

numero = int(input("Fatorial de: ") )

resultado=1
for n in range(1,numero+1):
    resultado *= n

print(resultado)

Exercício de Python

Seu  professor de Matemática, cansado de ficar fazendo multiplicações para achar o fatorial, te encomendou um script em Python (obviamente pagou, pois você possui um certificado do curso de Python).

Porém, ele quer fazer vários e vários cálculos.
Nos exemplos anteriores a gente pede o número uma vez, mostra o fatorial e fecha o script.

Ele não, ele quer um looping infinito, que só acabe quando ele fornecer o número 0 como entrada.

Se garante? Faça aí e poste nos comentários.