Instrução while else do Python

Resumo: neste tutorial, você aprenderá sobre a instrução while else do Python e como usá-la efetivamente.

Introdução à instrução while else do Python

Em Python, a instrução while pode ter uma cláusula else opcional:

while condition:
    # code block to run
else:
    # else clause code block

Nesta sintaxe, a condition é verificado no início de cada iteração. O bloco de código dentro da instrução while será executado enquanto condition for True.

Quando a condition torna-se False e o loop é executado normalmente, a cláusula else será executada. No entanto, se o loop for encerrado prematuramente por uma instrução break ou return, a cláusula else não será executada.

O fluxograma a seguir ilustra a cláusula while...else:


Se você estiver familiarizado com outras linguagens de programação, como JavaScript, Java ou C#, descobrirá que a cláusula else é bastante estranha no contexto de um loop.

No entanto, a cláusula while else acaba por ser muito útil em alguns casos. Vamos dar uma olhada em um exemplo de uso da instrução while else.

Exemplo de instrução while else do Python

Suponha que temos a seguinte lista de frutas onde cada fruta é um dicionário que consiste nas chaves com os nomes fruit e qty:

basket = [
    {'fruit': 'apple', 'qty': 20},
    {'fruit': 'banana', 'qty': 30},
    {'fruit': 'orange', 'qty': 10}
]

Queremos fazer um programa que permita aos usuários inserir um nome de fruta. Com base no nome de entrada, vamos procurá-lo na lista basket e mostrar sua quantidade se a fruta estiver na lista.

Caso a fruta não seja encontrada, permitiremos que os usuários insiram a quantidade dessa fruta e a adicionem à lista.

O seguinte programa é a primeira tentativa:

basket = [
    {'fruit': 'apple', 'qty': 20},
    {'fruit': 'banana', 'qty': 30},
    {'fruit': 'orange', 'qty': 10}
]

fruit = input('Enter a fruit:')

index = 0
found_it = False

while index < len(basket):
    item = basket[index]
    # check the fruit name
    if item['fruit'] == fruit:
        found_it = True
        print(f"The basket has {item['qty']} {item['fruit']}(s)")
        break

    index += 1

if not found_it:
    qty = int(input(f'Enter the qty for {fruit}:'))
    basket.append({'fruit': fruit, 'qty': qty})
    print(basket)

Observe que há uma maneira melhor de desenvolver este programa. O programa neste exemplo é apenas para fins de demonstração.

Como funciona:

  • Primeiro, solicite uma entrada do usuário usando a função input().
  • Em segundo lugar, inicialize o index como zero e marque found_it como False. O index será usado para acessar a lista por índice. E o sinalizador found_it será definido como True se o nome da fruta for encontrado.
  • Em terceiro lugar, repita a lista e verifique se o nome da fruta corresponde ao nome de entrada. Se sim, defina o sinalizador found_it como True, mostre a quantidade da fruta e saia do loop usando a instrução break.
  • Por fim, verifique o sinalizador found_it após o loop e adicione a nova fruta à lista se found_it for False.

O seguinte executa o programa quando apple é a entrada:

Enter a fruit:apple
The basket has 20 apple(s)

E o seguinte executa o programa quando limão é a entrada:

Enter a fruit:lemon
Enter the qty for lemon:15
[{'fruit': 'apple', 'qty': 20}, {'fruit': 'banana', 'qty': 30}, {'fruit': 'orange', 'qty': 10}, {'fruit': 'lemon', 'qty': 15}]

O programa funciona como esperado.

No entanto, será mais conciso se você usar a instrução while else.

Veja a seguir a nova versão do programa que usa a instrução while else:

basket = [
    {'fruit': 'apple', 'qty': 20},
    {'fruit': 'banana', 'qty': 30},
    {'fruit': 'orange', 'qty': 10}
]

fruit = input('Enter a fruit:')

index = 0

while index < len(basket):
    item = basket[index]
    # check the fruit name
    if item['fruit'] == fruit:
        print(f"The basket has {item['qty']} {item['fruit']}(s)")
        found_it = True
        break

    index += 1
else:
    qty = int(input(f'Enter the qty for {fruit}:'))
    basket.append({'fruit': fruit, 'qty': qty})
    print(basket)

Neste programa, a cláusula else substitui a necessidade de ter o sinalizador found_it e a instrução if após o loop.

Se a fruta não for encontrada, o loop while é encerrado normalmente e a cláusula else será executada para adicionar uma nova fruta à lista.

No entanto, se o fruto for encontrado, o loop while será encontrado na instrução break e encerrado prematuramente. Neste caso, a cláusula else não será executada.

Resumo

  • A cláusula else na instrução while else será executada quando a condition do loop while for False e o loop for executado normalmente sem encontrar a instrução break ou return.
  • Experimente a instrução Python while else sempre que precisar de um sinalizador em um loop while.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *