Оператор цикла 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:
Если вы знакомы с другими языками программирования, такими как 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 не будет выполнено.