Как стать автором
Обновить

Использование флага (переменная булевого типа) для начинающих

Обсудим использование флагов в коде на примерах.

Статья предназначена для тех кто только начинает осваивать программирование и испытывает трудности в определении флага (переменную булевого типа)

Например есть такая задача перебрать данные и определить есть ли там нужные нам для примера возьмем ситуацию из жизни: переберем мешок с картошкой, нужно узнать есть ли там гнилая мешок представим списком [] из 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. Благодарен друзьям за поддержку и идею создания статьи.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.