Exemplos práticos de loops while no Python

Neste texto, vou procurar mostrar, em detalhes, o funcionamento dos loops (ou laços) com while na linguagem de programação Python.
Espero que as explicações, acompanhadas de exemplos, ajudem, não só a tirar suas dúvidas, mas a te tornar um “expert no uso do while” — enquanto o assunto for Python, claro.
Para não ser repetitivo, abordei de maneira genérica o uso do For e do While no texto Como usar for e while no Python. Dê uma olhada lá, se preferir uma explanação mais básica.
While loops executarão blocos de código enquanto uma expressão booleana (o meu corretor diz que o certo é “booliana”… ) for verdadeira.


Leia mais sobre as diferenças entre for e while.
Os while loops (ou “laços enquanto”, em uma tradução livre e kind of literal), são usados para testar declarações if — para saber quando devem parar ou continuar a repetir um bloco de código.
Enquanto a expressão for verdadeira o laço while irá continuar rodando.

Diferente dos laços for, o while não irá rodar n vezes; mas até o momento em que uma determinada condição não seja mais verdadeira.
Se a condição já for falsa, inicialmente, o código do loop sequer será lido.

Testei os exemplos sob o Python 3. Em alguns casos, usei a shell do interpretador Python; em outros digitei o código em um editor de textos e o executei na linha de comando com o interpretador.
Para ficar mais claro, quando o código tiver marcações ‘>>>’, é por que foi digitado dentro da Python Shell. Se não tiver esta marcação e ainda tiver ‘#’ (comentários), eu optei por usar um editor de textos normal, fora da shell do Python.
No primeiro caso, tenha o cuidado (acho que você já sabe) de remover as marcações ‘>>>’ e ‘…’, ao digitar o código e fazer adequadamente a indentação.


>>> cumprimento = ""
>>> while cumprimento.strip() != 'alô':
...     cumprimento = input("Por favor, me dá um 'alô': ")
... 

Por favor, me dá um 'alô': alo
Por favor, me dá um 'alô': hello
Por favor, me dá um 'alô': alô!
Por favor, me dá um 'alô': alô
>>> 

De acordo com alguns autores, o for loop é tão poderoso no Python que acaba sendo mais usado do que o while.
Não é uma regra, mas o while é recomendado sempre que o código requisita a interação do usuário, por exemplo.

Uma forma mais comum (e eficiente) de se conseguir o mesmo resultado acima, é a seguinte:


>>> while True:
...     meucumprimento=input("Por favor, me dá um 'alô': ")
...     if meucumprimento.strip() == "alô":
...             break
... 

Por favor, me dá um 'alô': alo
Por favor, me dá um 'alô': alô
>>> 

Desta forma, é possível compactar todo o código que interessa em um único bloco.
A expressão ‘while True’ garante que o código seja executado indefinidamente — ou até que a condição seja satisfeita.
diagrama while loop
O exemplo, abaixo, poderia ser mais eficiente se usássemos um for — mas vale experimentar com um while:


# programa para adicionar
# números naturais
# de um em um... até dez.

limite = 10

# inicializa as variáveis soma e contador

soma = 0
contador = 1

while contador <= limite:
        soma = soma + contador
        contador = contador + 1 # atualiza o contador

# Fora do loop exibe o valor final da soma
print("O valor total da soma é: ", soma)

Podemos melhor o resultado final do programa, com uma alteração no código que permita ao usuário fornecer o limite.
Para isto, substitua a seguinte linha:


limite = 10


por


limite = int(input("Qual é o limite? "))

Ao executar o programa, obtive o seguinte resultado:


python3 while.py

Qual é o limite? 60
O valor total da soma é:  1830

Como usar else dentro do while

Tal como nos loops for, podemos inserir blocos de código opcionais (com novas possibilidades) dentro do nosso laço.
A parte do else será executada no caso de a condição dentro do while dar resultado falso.
Neste caso, o laço pode ser terminado com uma declaração break — ou você pode, até mesmo, recriar as condições atuais do laço.


>>> contador = 0
>>> while contador <= 3:
...     print("Estamos dentro de um loop while!")
...     contador = contador + 1
... else:
...     print("Ei! Entramos em um else!")
... 

Estamos dentro de um loop while!
Estamos dentro de um loop while!
Estamos dentro de um loop while!
Estamos dentro de um loop while!
Ei! Entramos em um else!

Quando o valor da variável contador chegou a 4, o nosso programinha entrou no else e executou o bloco de código que se encontrava lá dentro.
Depois disto, saiu do loop e finalizou.
Não precisava de um else para isto. A última linha de código, por si só, já bastava, neste contexto (com um pequeno ajuste na indentação, claro).
Mas seria possível, por exemplo, resetar a variável contador, dentro do else e manter este loop rodando indefinidamente.


>>> contador = 0
>>> while contador <= 3:
...     print("Estamos dentro de um loop while!")
...     contador = contador + 1
... else:
...     print("Ei! Entramos em um else!")
...     contador = 0
... 

Consegue imaginar o que irá acontecer, antes de executar o código acima?

Como usar if dentro do while

Você pode usar vários else e if dentro dos seus laços while.
O if ajuda a criar testes lógicos adicionais dentro do loop.
Veja um exemplo, que testa a senha ("segredo"), com o uso do else e do if:


>>> senha = " "
>>> while senha != "segredo":
...     senha = input("Por favor, forneça a senha de acesso > ")
...     if senha == "segredo":
...             print("Acesso concedido aos documentos confidenciais da área 51.")
...     else:
...             print("Acesso negado!")
... 
Por favor, forneça a senha de acesso > não sei
Acesso negado!
Por favor, forneça a senha de acesso > Çegrêdo
Acesso negado!
Por favor, forneça a senha de acesso > segredo
Acesso concedido aos documentos confidenciais da área 51.

captura de tela python 3 while loop

Como usar elif dentro do while

O elif é uma junção ou miscelânea das funções do else e do if.
No exemplo, a seguir, ele é usado em um pequeno jogo de adivinhação:


# carrega a biblioteca que
# trabalha com números aleatórios
import random

# estabelece o valor limite
limite = 20
# cria um número secreto aleatório
numero_secreto = int(limite * random.random()) + 1
# inicia a variável adivinha
adivinha = 0
# Enquanto adivinha não for igual 
# a numero_secreto...
while adivinha != numero_secreto:
	adivinha = int(input("Digite um número: "))
	if adivinha > 0:
		if adivinha > numero_secreto:
			print("Este número é MAIOR que o número secreto. Tente de novo.")
		elif adivinha < numero_secreto:
			print("Este número é MENOR que o número secreto. Tente de novo.")
	else:
		print("Esta entrada é inválida. Que pena que você desistiu... ")
		break
else:
	print("Parabéns! Você descobriu o número secreto!")


O código acima, eu preferi digitar dentro de um editor de textos, para compilar normalmente na linha de comando. Desta forma, fica fácil alterar depois, para incrementar o joguinho. 😉
Como exercício, você consegue alterar o código para o programa mostrar quantas tentativas foram feitas ao final?

Laços while aninhados no Python

O exemplo anterior mostrou um if aninhado em outro if.
De acordo com as suas necessidades, você também pode aninhar vários while dentro um.


>>> site = ""
>>> dominio = ""
>>> while site != "pythonbay":
...     site = input("digite o nome deste site, sem o domínio \'.com\': ")
...     while site == "pythonbay":
...             dominio = input("agora forneça o dominio do site: ")
...             if dominio == ".com":
...                     print("Correto!")
...                     print(site+dominio)
...                     break
... 
digite o nome deste site, sem o domínio '.com': pitomba
digite o nome deste site, sem o domínio '.com': python
digite o nome deste site, sem o domínio '.com': pythonbay
agora forneça o dominio do site: .net
agora forneça o dominio do site: .com.br
agora forneça o dominio do site: .com
Correto!
pythonbay.com

Espero que, depois de seguir estes exemplos, você já consiga dominar o uso do while nos seus próximos scripts.


Leia também: Com 2 while e alguns if, dá para construir um pequeno editor de textos em Python.

Referências

https://wiki.python.org/moin/WhileLoop.
https://pythonschool.net/basics/while-loops/.
http://www.python-course.eu/python3_loops.php.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 49 outros assinantes