Olá, vamos então agora aprender como a gente faz uma repetição numa linguagem de programação, o que a gente chama de laço, ou loop. E uma das formas de fazer isso é por meio do comando while da linguagem Python. Várias linguagens de programação têm esse comando while. Qual é o o formato? A gente vê daqui a pouco, vamos primeiro ver exemplo. Vamos supor que eu quero imprimir as potências de 2, software, programação. As potências de 2, computação geral, são muito importantes porque os computadores internamente usam todos números binários e toda a arquitetura do computador é baseada potências de 2. Então, vamos supor que eu quero imprimir as 10 ou as 16 primeiras potências de 2. Por exemplo, como eu poderia fazer isso? Posso fazer algo do tipo print 2 elevado a 0 e isso vai imprimir a primeira potência de 2, depois 2 elevado a 1, depois, 2 elevado a 2, e assim por diante, repetindo aqui várias vezes. Coloco 2 elevado a 1, elevado a 2, elevado a 3, elevado a 4, 5, 6, 7, 8, 9, 10, não, 0 não, 10, 11, 12, 13, acho que está bom por aqui. Então, gravei programa assim, eu vou chamar esse programa de potências ponto py, e vou salvar aqui as potências.py. E daí, se eu quiser executar esse programa, eu venho aqui e falo, python3, potências.py. E ele imprime ali as potências de 2: 1, 2, 4, 8, 16, 32, 64, etc, né. Aqui até 8192. Vocês podem perceber que isso aqui não é uma coisa muito elegante, então particular tem muita repetição ali, comando quase idêntico repetido, repetição linguagem de programação sempre é uma má ideia. Como a gente pode fazer jeito mais elegante, mais inteligente e muito mais enxuto para fazer a mesma coisa? É aí que entra o comando while, que é esse comando que permite à gente fazer os laços. Como é que funciona esse comando? Então, a gente escreve aqui while, daí uma expressão booleana, algo que vale verdadeiro ou falso, então uma condição aqui, dois pontos, e daí uma indentação e aqui, ou mais comandos que você quer que seja executado, por exemplo, comando 1 e comando 2. Pode ser mais comandos também, o importante é a indentação aqui definir o tamanho, onde começa e onde termina o bloco. O que vai acontecer? Enquanto essa condição for verdadeira, o computador vai continuar executando esse laço aqui. Quando essa condição se tornar falsa pela primeira vez, ele deixa de executar e vai aqui para o comando seguinte, para o comando 3. Então, como ele funciona? Ele entra no while, se a condição é falsa de cara, ele já não executa nenhuma vez e vem para o comando 3 direto. Se a primeira vez é verdadeiro, o que ele faz? Executa o comando 1, executa o comando 2 e daí testa de novo a condição. Executa o comando 1, comando 2, testa a condição, comando 1, comando 2, testa a condição. Então, enquanto a condição é verdadeira, sempre depois do comando 2 aqui ele vai testar a condição, se for verdadeira vai, volta para o comando 1, comando 2. Se for falsa, ele pula ali para o comando 3. Então, como a gente podia reescrever isso aqui de uma forma mais inteligente? Então, primeiro, a gente tem que identificar aqui o que é a parte constante e o que é a parte variável. Constante é tudo daqui do daqui para "iii", dessa exponenciação para cá, tudo constante, o que está variando é só este valor. Se esse valor está variando, a gente precisa de uma variável para guardar esse valor, então, por exemplo, uma variável i, que eu vou começar, o valor inicial é zero. E a gente vai precisar aqui, esse comando, a gente vai usar o i, vez de usar valores fixos, então, a variável é o i. Só que agora eu preciso colocar isso dentro do while, então, eu vou falar, enquanto daí eu preciso aqui de uma determinada condição. Enquanto essa condição for verdadeira, daí você imprime 2 elevado a i. Agora eu preciso de critério de parada, quando é que eu vou fazer disparar falso nessa condição? Daí eu preciso decidir, ou posso fazer programa que imprime, por exemplo, as dez primeiras potências, se eu quiser fazer programa que imprime as dez primeiras potências, daí eu posso fazer: enquanto o i for menor ou igual a 10, aí, eu vou repetindo isso aqui. Só que daí eu preciso ir variando o valor do i, então, depois que eu imprimir aqui o 2 elevado a i, daí eu preciso o que a gente chama de incrementar o valor de i, somar no valor de i, como eu faço isso? Eu faço: i recebe, quanto, i mais 1. Então, o novo valor de i vai ser o valor antigo de i mais 1. Então, fazendo isso ele vai repetido aqui até que o i fique valendo 11, e daí quando o i valer 11, isso aqui vai valer falso e daí ele para de executar. Vamos testar, vamos ver se tá funcionando isso aqui, esse é o potências. Deu certo. Então programa muito mais enxuto, imprimiu ali, se eu quiser mudar o valor aqui, eu posso mandar, imprimir as primeiras vinte potências de 2, as vinte primeiras potências de 2 estão aqui. Se eu quisesse, eu poderia alterar isso para vez de vinte ser valor fixo, você lê o valor do teclado, o usuário vai dizer qual é o valor. Mas essa é a ideia do comando while. Vamos ver outras coisas que podemos fazer com o while. Por exemplo, vamos supor que você quer fazer a soma de uma sequência de números, então você quer que o usuário vá digitando vários números e você vai calculando a soma e, no final, você fala a soma completa de todos esses números. Como é que a gente poderia fazer isso? Eu vou criar novo aqui. Então a gente vai querer ter uma variável soma ali, que vai lendo vários números e a gente vai somando esses números na soma. Então vejamos, para ler no teclado a gente vai precisar pegar valor aqui, a gente vai usar o input. Digite valor a ser somado. É. E, agora eu vou querer colocar isso dentro de while, dentro de laço de repetição de forma que eu vou poder digitar vários valores. Então, vou fazer o while, e aqui de novo eu vou precisar de uma condição. De novo, qual vai ser o critério de parada? Ou eu posso, por exemplo, posso perguntar para o usuário inicialmente quantos valores tem nessa minha sequência. E daí ele digita e eu faço laço que vai executar exatamente aquele número de interações, de repetições, ou então eu posso falar, por exemplo, digite uma sequência de valores terminada por zero, e quando ele digitar zero, daí, eu posso parar. Vamos usar esse valor inicial, aqui assim, dessa forma. Então, eu vou falar: print digite uma sequência de valores terminada por zero, pelo número zero. Vou pedir para ele digitar isso, e daí eu vou fazer aqui while, minha condição vai ser o quê? While o valor é diferente de zero, então, enquanto o valor não for zero, daí digite valor a ser somado e daí, para cada desses valores eu vou fazer aqui soma recebe o valor antigo da soma mais o que acabou de ser digitado pelo usuário. Então, soma recebe soma mais valor, ele vai pegar na soma e ele vai cumulativamente calculando essa soma. Mas note que eu preciso definir o valor inicial aqui. Como? Vou fazer uma sequência de somas e vou começar com o elemento neutro da soma que é igual a zero, e então, começo com a soma zerada e daí eu vou repetindo, sempre tendo o valor da soma. Agora eu tenho outro problema. Note que a primeira vez que eu entro nesse while, e eu estou falando enquanto o valor diferente de zero, só que a primeira vez que eu entro no while o valor não tem nenhum valor, não foi definida a variável aí, então, isso vai me dar erro, porque isso só é definido aqui. Daí tem duas formas de resolver isso: uma forma é digitar valor qualquer que não seja, que seja diferente de zero, de forma que ele entre aí dentro, então por exemplo. Se eu fizer: valor é igual a simplesmente é suficiente para ele já entrar no while. Na primeira vez ele já vai ler valor correto aqui. E daí finalmente, depois que eu calculei a soma, eu preciso dizer o valor da soma final. Então, a soma dos valores digitados é e daí, eu coloco aqui a soma. Vamos ver se eu acertei ou se eu me esqueci de alguma coisa. Eu vou chamar esse programa aqui de soma.py. Vamos ver se dá certo. Python3 soma.py. O que é que eu fiz? Gravei num outro diretório, gravei sem querer no desktop, tudo bem, vamos para o desktop. Cd desktop, e daí posso repetir aquele python3 soma. Soma.py, eu errei alguma coisa. Que é que ele falou aqui? Nessa linha oito, na soma igual a soma mais valor ele falou, 'unindent does not match any outer indentation level'. Eu errei alguma coisa no nível de indentação. Vamos ver nessa linha aqui. Eu acho que o problema foi que, aqui eu coloquei espaços e aqui eu coloquei tab, eu misturei. Isso é uma coisa que você nunca deve fazer. Aqui eu coloquei tab e aqui eu coloquei vários espaços e, ele ficou muito confuso. Você precisa sempre ser consistente, então se usou tab, use sempre tab. Agora deve dar certo. Repetindo. Agora deu certo. Digite uma sequência de valores terminados por zero. Digite valor a ser somado, dez, e errei de novo, que é que eu errei? Ele falou de novo, soma.py, na linha oito aqui, soma recebe soma mais valor deu tipo de operação não suportada. Eu tentei somar inteiro a string. Como você pode ver, isso tentou somar inteiro a string é porque provavelmente você esqueceu aqui no input que o input sempre devolve string e você precisa converter para inteiro. Não se esquecer disso. Agora eu acho que vai dar certo. Dez, 20, 30, três, -345, 1399, posso digitar vários números, lembra que ele vai terminar quando eu digitar zero. Legítima sequência de valores terminados por zero. Vamos digitar zero. Pronto. Daí terminou e ele falou: a soma dos valores digitados é 1449. Essa é uma forma de usar o comando while para ler vários valores e ir fazendo alguma computação com esses valores. Fica de lição de casa aí para você, tentar vez de fazer uma soma terminada por zero, primeiro, você pergunta para o usuário quantos números tem essa sequência e daí você faz uma repetição exatamente daquele número de números que o usuário digitou, vez de ser terminado por zero, fica uma variante para você experimentar. Uma variante que eu quero mostrar aqui, por exemplo, se vez das somas a gente quisesse a multiplicação dos números, o produto dos números, como que a gente faria? Primeiro, obviamente mudar o nome da variável para produto, porque é importante que os nomes das variáveis indiquem o que a variável significa, então, mais importante mudar o nome da variável para produto, nunca ter nome de variável errado. E aqui, simplesmente vez de ser soma, multiplicação. Agora, tem outra coisa importante, lembra que eu falei que a gente inicializou a variável com o elemento neutro da soma. Agora o elemento neutro do produto não é o zero, se eu colocar zero, vai dar sempre zero. Eu preciso inicializar com o elemento neutro do, da multiplicação que é o. Então, se eu falar: digite uma sequência de valores terminados por zero, digite valor a ser multiplicado. O produto. O produto dos valores digitados é: produto. E agora vou dar save as, salvar como, salvar como produto.py. [ÁUDIO_EM_BRANCO] E aqui eu posso executar o meu produto.py, então, digite valor a ser multiplicado, dois, três, quatro, cinco, seis, terminado por zero, o produto dos valores digitados é zero. Já deve dar para desconfiar o que é que está errado. Esse último zero que eu digitei aqui também foi multiplicado, então a gente vai precisar organizar esse código de jeito diferente. Esse valor, quando ele chega zero não pode ser multiplicado. Tem várias formas de corrigir isso, vou corrigir, aproveitar para ilustrar como é que a gente faria isso se, vez de digitar uma sequência de valores terminados por zero a gente quisesse que o usuário definisse quantos números vão ter de ser digitados. Por exemplo, vou guardar nessa variável i. Então eu vou falar que i recebe, vai ser inteiro, input, digite o tamanho da sequência de números. O tamanho da sequência de números vai estar no i, e se o while vez de ser valor diferente de zero a gente vai basear esse while no i. Vou fazer, enquanto, i é o valor máximo o tamanho da sequência, vamos chamar de tamanho e daí, eu vou usar i aqui. Enquanto i é menor que o tamanho daí sim repete e eu vou inicializar esse i com zero. Então i começa zero e eu vou contando de até no tamanho. Uma outra coisa que eu não posso esquecer é de somar no i a cada interação do meu while. A cada interação o i vai receber o valor do i anterior somado de. Vamos ver se deu certo agora. Mais errinho aqui, uma sintaxe inválida. Produto recebe na linha quatro, eu esqueci alguma coisa. Vejamos que é que. Alguma coisa que eu esqueci, o produto ali, tamanho recebe, abri o parêntesis e esqueci de fechar o parêntesis. Então pronto. Digite o tamanho da sequência de números. Vão ser cinco números, a serem multiplicados, vão ser o dois, o três, o quatro, o cinco, seis, pronto, são cinco números, dois, três, quatro, cinco. A multiplicação desses números deu 720, então, esta é uma forma de resolver o problema, tem outras formas de resolver esse problema. Agora, vou deixar desafio para vocês aqui, para vocês fazerem aí casa, que é o seguinte: vamos supor que eu tenho número inteiro grande, com muitos dígitos, e eu quero que você faça programa que vai calcular a soma dos dígitos desse número. Então, se o número é 6532, ele vai somar seis mais cinco mais três mais dois. E ele vai dizer: seis mais cinco é onze, com cinco, 16. Então, dado isso aqui ele tem que dar a soma dos dígitos que nesse caso aqui seria 16. Como que você vai conseguir fazer isso? Primeira coisa, você vai ter que, de alguma forma descascar os números, pegar número a número, cada dígito separadamente, então você precisa while que vai tirando cada número disso. Como é que a gente pode fazer isso? É muto fácil se a gente lembrar da divisão inteira. Por exemplo, esse meu número 6532, vou guardar isso aqui numa variável X, X recebe 6532. Se eu pegar o resto da divisão por dez desse número, ele dá dois, então, o resto da divisão por dez sempre devolve o último dígito, o dígito ali menos significativo daquele número. Então, num while, cada vez pegando o último dígito, fazendo o porcento dez, você pega o último dígito, então precisa de uma forma de jogar fora esse último dígito para, numa próxima interação pegar aqui o três depois pegar o cinco e depois pegar o seis. Como é que faço isso? Faço isso usando divisão inteira. Se eu fizer o X, a divisão inteira de X por dez, quanto dá? Dá 653, note então, é jeito de eu jogar fora o último dígito e pegar os dígitos seguintes. Então vou precisar fazer laço, onde eu vou sempre pegando o último dígito e somando numa soma. E, depois que eu somei o último dígito eu tenho que jogar fora aquele último dígito e aqui você tem os dois elementos para fazer isso, pegar o último dígito e jogar fora o último dígito. então fica aí, para vocês fazerem esse desafio casa. [MÚSICA] [MÚSICA] [MÚSICA]