Обсудим использование флагов в коде на примерах.
Статья предназначена для тех кто только начинает осваивать программирование и испытывает трудности в определении флага (переменную булевого типа)
Например есть такая задача перебрать данные и определить есть ли там нужные нам для примера возьмем ситуацию из жизни: переберем мешок с картошкой, нужно узнать есть ли там гнилая мешок представим списком [] из 1 и 2, где 1 - означает гнилую картофелину.
Как бы мы это делали? сначала мы бы взяли одну картофелину и посмотрели на нее, и так делали бы до конца или пока не встретили гнилую....
А в конце основываясь на наблюдениях делали бы выводы.
На словах все понятно, но когда смотришь код тех кто только еще познает питона, то в коде они так и норовят делать вывод о присутствии(или о том что нету гнилых) сразу на первой же картошке.
Пример ошибочного поведения в коде:
bag_potatoes = [2, 2, 2, 1, 2, 1, 2, 2, 2, 2] # это наш мешок, в нем 2 гнилушки
for potato in bag_potatoes: # запустим цикл перебора картошки
if potato == 1:
print('Замечена гнилая картошка')
print('Нужно сходить выкинуть, то что нашли')
else:
print('Нет гнилой картошки')
print('Ничего выкидывать не нужно')
Вот тут в блоке else и кроется ошибка, т. е. мы еще не закончили перебирать мешок, а выводы уже делаем.
Попробуем решить с флагом:
bag_potatoes = [2, 2, 2, 1, 2, 1, 2, 2, 2, 2] # это наш мешок, в нем 2 гнилушки
rot_flag = False # это наш флаг на гниль, сейчас у него значение фолз (ложь)
for potato in bag_potatoes: # запустим цикл перебора картошки
if potato == 1:
rot_flag = True # замечена гнилая картошка, флаг мы переводим в Тру (истина)
# ниже мы смотрим на значение флага, т.е. наших наблюдений, и делаем выводы
if rot_flag:
print('есть гнилая картошка')
print('Нужно сходить выкинуть, то что нашли')
else:
print('нет гнилой картошки')
print('Ничего выкидывать не нужно')
А как же можно научиться пользоваться флагом?
Мне например помог счетчик…
Пример: посчитаем гнилую картошку:
bag_potatoes = [2, 2, 2, 1, 2, 1, 2, 2, 2, 2] # это наш мешок, в нем 2 гнилушки
count = 0 # счетчик на гниль
for potato in bag_potatoes: # запустим цикл перебора картошки
if potato == 1:
count += 1 # замечена гнилая картошка, увеличиваем счетчик
if count > 0: # смотрим что насчитали и делаем выводы
print('есть гнилая картошка')
print('Нужно сходить выкинуть, то что нашли')
else:
print('нет гнилой картошки')
print('Ничего выкидывать не нужно')
Следующий шаг на пути счетчик-флаг понимание того что нам не нужно считать, а достаточно изменить счетчик с 0 на любое число, например 1
Сделаем:
for potato in bag_potatoes: # запустим цикл перебора картошки
if potato == 1:
count = 1 # замечена гнилая картошка, меняем счетчик
if count == 1: # смотрим на счетчик и делаем выводы
print('есть гнилая картошка')
print('Нужно сходить выкинуть, то что нашли')
else:
print('нет гнилой картошки')
print('Ничего выкидывать не нужно')
Но наш счетчик уже не счетчик, у него 2 возможных значения (0, 1)
А это прям подходит для булевых переменных, которые и являются классическим флагом со значениями (True, False)
count = False
for potato in bag_potatoes: # запустим цикл перебора картошки
if potato == 1:
count = True # замечена гнилая картошка, меняем счетчик
# смотрим на "счетчик" и делаем выводы (тут можно также записать @if count:@)
if count == True:
print('есть гнилая картошка')
print('Нужно сходить выкинуть, то что нашли')
else:
print('нет гнилой картошки')
print('Ничего выкидывать не нужно')
Вот мы сменили значения 0 на False, 1 на True
Теперь если сменить имя счетчика count на rot_flag, то получится первый вариант решения, т. е. с полноценным флагом.
Это не идеальная задача.
На этой задаче я попытался показать его работу и как его понять можно с помощью счетчика, считать перебор многим дается легче на восприятии чем понятие "индикатор" или флаг.
PS. Благодарен друзьям за поддержку и идею создания статьи.