Оператор цикла while else в Python

В этом уроке вы узнаете об операторе Python while else и о том, как его эффективно использовать.

Знакомство с оператором while else в Python

В Python оператор while может иметь необязательное предложение else:

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

В этом синтаксисе условие проверяется в начале каждой итерации. Блок кода внутри оператора while будет выполняться, пока условие истинно.

Когда условие становится ложным и цикл выполняется нормально, выполняется предложение else. Однако если цикл преждевременно завершается оператором Break или Return, предложение else не будет выполнено вообще.

Следующая блок-схема иллюстрирует оператор while…else:

Работа оператора цикла while...else в Python

Если вы знакомы с другими языками программирования, такими как JavaScript, Java или C#, вы обнаружите, что предложение else выглядит довольно странно в контексте цикла.

Однако в некоторых случаях конструкция while else оказывается очень полезной. Давайте рассмотрим пример использования оператора while else.

Пример оператора while else в Python

Предположим, что у нас есть следующий список фруктов, где каждый фрукт представляет собой словарь, состоящий из названия фрукта и ключей количества:

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

Мы хотим создать программу, которая позволит пользователям вводить название фрукта. На основании входного имени мы найдем его в списке корзины и покажем его количество, если фрукт есть в списке.

Если фрукт не найден, мы разрешим пользователям ввести количество этого фрукта и добавить его в список.

Следующая программа является первой попыткой:

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)

Обратите внимание, что есть лучший способ разработать эту программу. Программа в этом примере предназначена исключительно для демонстрационных целей.

Как это работает:

  • Сначала запросите ввод пользователя с помощью функции input().
  • Во-вторых, инициализируйте индекс равным нулю, а для флага Found_it установите значение False. Индекс будет использоваться для доступа к списку по индексу. И флаг Found_it будет установлен в значение True, если название фрукта будет найдено.
  • В-третьих, переберите список и проверьте, соответствует ли название фрукта введенному имени. Если да, установите для флага Found_it значение True, отобразите количество фруктов и выйдите из цикла с помощью оператора Break.
  • Наконец, проверьте флаг Found_it после цикла и добавьте новый фрукт в список, если Found_it имеет значение False.

Следующий код запускает программу, когда входными данными является яблоко:

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

И следующий код запускает программу, когда на входе указан лимон:

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}]

Программа работает как положено.

Однако она будет более лаконична, если вы воспользуетесь оператором while else.

Ниже показана новая версия программы, использующая оператор 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)

В этой программе предложение else заменяет необходимость наличия флага Found_it и оператора if после цикла.

Если фрукт не найден, цикл while завершается обычным образом и выполняется предложение else для добавления нового фрукта в список.

Однако, если плод найден, цикл while встретит оператор прерывания и преждевременно завершится. В этом случае предложение else не будет выполнено.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *