Pull to refresh

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

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

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.