Nós aprendemos a fazer repetições, ou laços, loops, no nosso programa Python então usando o comando while. Os laços, ou esses whiles, são bons quando a gente quer seguir linearmente determinado conjunto de valores, por exemplo, se a gente tem uma variável que a gente quer somar a cada passo do while, a gente vai linearmente seguindo aquele conjunto de valores. Mas tem casos que a gente quer seguir algo pouquinho mais sofisticado. Por exemplo, a gente quer percorrer os pontos de plano ou, a gente numa tabela quer percorrer as linhas e as colunas dessa tabela. Aí, a gente já tem conjunto de dados duas dimensões. Uma tabela tem as linhas e as colunas. E daí, while só não é suficiente. Nesse caso, a gente usa novo conceito ai de computação que, é o que a gente chama de repetições encaixadas. Então, repetições encaixadas a gente pode construir esse tipo de coisa utilizando dois whiles encaixados, dentro do outro. Então, se a gente lembrar bem o formato do while, a gente vai ter while aqui, uma condição, daí, dois pontos. Aqui baixo a gente coloca o nosso comando. Isso é bom então pra seguir linearmente conjunto de valores, mas se a gente quer percorrer algo de duas dimensões, daí, o que que a gente vai fazer? A gente vai colocar while dentro do outro. Como que a gente faz isso? Este próprio comando aqui, ele pode ser qualquer comando Python, inclusive pode ser while. Então, a gente vai colocar while como sendo o comando de outro while. Então, aqui vai ser outro while, com uma condição diferente, normalmente, e, dentro desse segundo while, aí sim vai ter determinado comando, e esse comando vai ser executado muitas vezes, porque para cada vez que o comando aqui de cima o while for executado, para cada interação do while mais externo, a gente vai fazer todas as repetições do while mais interno. E depois, quando termina as repetições do while mais interno, a gente volta para o while externo para fazer a segunda interação desse while externo, e assim por diante. Então, particular se o while externo, ele executa dez vezes e o while interno cinco vezes, você vai ter dez vezes cinco execuções desse comando aqui. Mas vamos para caso concreto. Caso concreto de uso de repetições encaixadas, ou que a gente chama também de laços aninhados. Loop, nested loop, é laço dentro de outro laço. Quando eu era criança eu tinha muita dificuldade de decorar a tabuada. Eu sofria nas minhas aulas de matemática porque eu não conseguia decorar, tinha dificuldade de decorar a tabuada. Eu era bom outras coisas da matemática mas na tabuada era difícil. Infelizmente, eu não sabia Python naquela época mas, se eu soubesse, eu poderia fazer programinha Python para imprimir a tabuada pra mim. Então, vamos tentar fazer isso? Programa Python que imprime a tabuada da multiplicação dos numeros de a dez? Vejamos, vamos abrir novo arquivo. Como a gente poderia fazer programa para fazer isso? Então, a tabuada tem as linhas e as colunas. Então, primeiro a gente vai precisar de while para percorrer as linhas. Então, vou declarar uma variável chamada linha, eu vou começar na linha. Então, eu vou fazer, vou começar pela tabuada do. E daí, eu faço o seguinte, enquanto, a linha é menor ou igual a dez, eu vou fazer igual a tabuada do dez, dois pontos, então, esse while aqui, que vai se o meu while mais externo ele vai percorrer todas as linhas da minha tabuada. Agora, para cada linha eu quero percorrer as dez colunas da tabuada, então, eu vou precisar de while encaixado aqui, outro while aqui dentro, que ele vai percorrer as colunas, então, eu vou começar também a coluna. Uma outra variável chamada coluna que vai começar no e, eu vou indo, repetindo até que a coluna seja menor ou igual a dez. E aí sim, aqui dentro eu posso imprimir o valor que vai ser o valor da célula da tabuada, que é a linha vezes a coluna. Então, na linha três, coluna três, imprime nove ali. Então, vou fazer print. Aqui, eu vou colocar print, linha vezes coluna. Agora, uma vez, note que esse while, ele vai repetir aqui, mas depois de cada interação, depois que imprimir, eu tenho que ir para a próxima coluna. Como que eu vou para a próxima coluna? Somando na variável coluna. Então, aqui eu faço coluna recebe coluna mais. Então, uma hora, quando o coluna chegar no dez, ele vai executar pela ultima vez aqui, vai imprimir a tabuada do dez, e daí, o coluna vai receber o coluna mais. Então, coluna vai para 11, quando ele for para 11 ele cai fora desse while mais interno e vem aqui para o próximo comando. Daí, nesse momento o que que eu tenho que fazer? Eu tenho que ir para a linha de baixo, então, para eu ir para a linha de baixo eu vou fazer linha recebe linha mais vai para próxima linha da minha tabuada. E a coluna, a coluna estava lá no final, eu tenho que voltar para a primeira coluna. Então, eu vou fazer: coluna recebe. E daí, eu acho que está tudo pronto, tudo bem. Vamos ver, eu vou executar isso aqui. Ele quer salvar, sim, vamos salvar. Tem que digitar o nome do arquivo, eu vou chamar de Tabuada. E eu vou guardar aqui nossa tabuada. Executou, e aqui, ele está mostrando e está calculando todos os valores e imprimindo todos os valores. Parece até que está certo mas, tem problema. Ele está imprimindo tudo numa única coluna. Eu gostaria que, de dez dez ele fosse imprimindo as várias linhas. Qual que é o problema? O problema é que o comando print aqui, se a gente olhar o comando print por padrão, o que é que ele faz? Depois que você imprime cada coisa, ele muda de linha. E por que é que ele faz isso? Se você olhar aqui no IDLE, ele ajuda a gente. Ele mostra quais são as coisas que você pode passar como parâmetro para o comando print. Está vendo, tem esse, parametro que chama End aqui. O End diz o que dever ser impresso logo depois que o print terminou de imprimir que ele tem que imprimir. E por padrão, ele imprime esse \n. \n é caractere que significa nova linha, New Line, portanto, por padrão, o print, sempre quando imprime alguma coisa ele passa para a linha de baixo, mas eu gostaria, nesse caso, que ele não passasse para a linha de baixo, que ele simplesmente, por exemplo, escrevesse espaço branco para separar e continuasse imprimindo ali na mesma linha. Então o que eu vou fazer? Eu vou vez de deixar esse end padrão, eu vou falar para ele imprimir o end no final desse print com o espaço branco. Como que eu faço isso? Primeiro, o que eu quero imprimir? Eu quero imprimir o linha vezes coluna. Daí, eu faço o seguinte: end igual a espaço branco aqui. Então, se eu fizer isso, vamos tentar executar de novo e ver como que ficou dessa vez? Daí, pronto, ele não está mais mudando de linha, mas ele não mudou de linha nunca. Que a gente gostaria que de dez dez ele mudasse de linha. Então, para fazer isso, quando terminha esse while mais interno aqui, que eu faço esse, linha recebe linha mais para mudar de linha, eu gostaria de fazer print e aqui pode ser print vazio, abre e fecha parêntesis, simplesmente para mudar de linha. Não quero que imprima nada a não ser o próprio caractere new line, aquele que faz aquela mudança de linha. Então, vamos ver agora. Agora, a nossa tabuada já está ficando com cara de tabuada. Uma tabela de duas dimensões. Está quase perfeita, eu sou pouco perfeccionista, eu acho que a estética é uma coisa importante, e aqui tem uma coisa que está me incomodando. Que alguns números tem dígito outros têm dois e o 100 tem três dígitos e, isso está deixando essa tabela meio desconjuntada. Não muito bem organizada. Tem uma forma simples de a gente resolver isso, que é o seguinte: aqui eu estou separando com o espaço branco. Se a gente vez de separar com o espaço branco aqui, separar com o caractere TAB. Tem aquela tecla TAB no computador, que ele faz o cursor avançar para a próxima coluna de tabulação. Normalmente, é de oito oito. Então, se a gente vez de pedir para colocar espaço branco, colocar \T ele vai inserir caractere TAB, que vai fazer independente de quantos já imprimiu, ele vai pular para o próximo múltiplo de oito. A coluna próxima ao múltiplo de oito, dessa forma vai ficar mais bem organizada. Então coloquei o \T, vamos agora executar, vamos ver se a nossa tabela ficou mais bonita. Agora sim, a nossa tabuada ali ficou muito bem organizada. Então, por exemplo, oito vezes nove é 72. Agora, você já tem agora sua tabuada aqui. Mas o que a gente queria ilustrar, então, é os whiles encaixados. repetições encaixadas, esses laços alinhados que nesse caso a gente tem o while dentro de while. Então, o que que está acontecendo aqui? Nesse while mais externo, que ele percorre as linhas ele faz, linha recebe e dai a variável linha fica fazendo e dai ele executa esse while aqui mais interno dez vezes, não é? Porquê dez vezes? Porque o while interno faz a coluna de uma a dez. Então, executa dez vezes. Daí, quando termina essas dez vezes, ele volta pra o while mais externo, volta para esse while mais externo com o linha valendo dois e daí, com o linha valendo dois, ele executa novamente, tudo o que está aqui dentro do while mais interno, repetindo isso dez vezes. Então, como cada dos whiles aqui vai repetir dez vezes, na verdade, os comandos que vão dentro do while aqui, são repetidos 100 vezes nesse caso, não é? Dez vezes dez. Então, esse ai foi primeiro exemplo. Eu gostaria que vocês fizessem exercicios para praticar o uso de while encaixado que, isso vocês só vão aprender realmente praticando. [MÚSICA] [MÚSICA] [MÚSICA]