Использование флага (переменная булевого типа) для начинающих
Например есть такая задача перебрать данные и определить есть ли там нужные нам для примера возьмем ситуацию из жизни: переберем мешок с картошкой, нужно узнать есть ли там гнилая мешок представим списком [] из 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. Благодарен друзьям за поддержку и идею создания статьи.
- флаг
- булевы переменные
Урок 3.2. Взмах флажком
В рамках данного урока вы научитесь работать со счетчиками и сумматорами в программе, которая ведет подсчет и отображает общее количество введенных чисел. Также вы научитесь определять среднее значение чисел.
Вы научитесь:
- Обращаться с оператором-счетчиком
- Использовать сумматор
- Программировать цикл и задавать «флаговое» значение
- Вычислять среднее значение
Ваша задача — написать программу, которая будет вести счет и суммировать наборы чисел. Заранее их общее количество вам неизвестно. В данном уроке будет рассмотрено использование оператора-счетчика, выражения сумматора, «флагового» значения, на котором должен прекратиться цикл, а также вычисление среднего значения всех введенных чисел.
Примечание для учителя: Сокращенные записи выражений в Python:
Выражение c=c+1 можно записать как c+=1 (не c++)
Выражение t=t+n можно записать как t+=n
count=total=0 допустимо такое написание, в том числе для
count, total = 0,0
1. Начните работу с создания нового файла Python. Назовите его count_ttl_avg.py.
Выберите две переменные и задайте им значение 0:
count = 0
total = 0
Переменная count будет вести подсчет чисел, которые вводит пользователь, а переменная total будет выдавать общую сумму введенных чисел. Третья переменная, num, будет по очереди сохранять каждое введенное число. Вместо того чтобы задавать переменной значение 0, используйте выражение input, чтобы пользователь мог сам ввести первое число:
num=float(input(«Enter a number: «))

2. Теперь необходимо запустить цикл с оператором while, который прекратит работу, как только пользователь введет определенное число. В качестве такого значения можно ввести, например, 0, -999 или -1. Помните, что это значение не может входить в набор чисел, с которыми вы планируете работать. В примере в качестве «флагового» значения мы используем -999. Таким образом, даем системе знак, что мы закончили ввод чисел.
Выберите структуру while через меню: menu > Built-ins > Control.
Знак неравенства ( != ) можно найти в меню ctrl+=. Мы его используем потому, что нам нужно условие, чтобы цикл продолжался до тех пор, пока переменная num не равна -999.
Не забудьте поставить двоеточие (:) в конце строки!
Далее приступайте к заполнению области блока (block).

Примечание для учителя: Флаги (или сигнальные метки), счетчики и сумматоры — это стандартные термины в программировании.
3. Что будет происходить в блоке цикла:
- Подсчет количества введенных чисел
- Их сложение
- Запрос на введение другого числа
Подсчет ведется с помощью следующего выражения:
count = count + 1
благодаря которому каждый раз к переменной count добавляется единица.
Сложение (или нахождение общего числа) происходит благодаря следующему выражению:
total = total + num
Для запроса на ввод следующего числа используйте выражение input, как в первом случае:
num=float(input(«Enter a number (-999 to end):»))
но здесь нужно дописать сообщение, в котором дается подсказка, как завершить цикл.

Примечание для учителя: На рисунке выше шрифт немного уменьшен, чтобы учащиеся увидели длинное выражение input на дисплее целиком. Чтобы изменять размер шрифта в работе с языком Python используйте следующий пункт меню: menu > Actions > Settings. В настройках будет доступен только пункт размера шрифта, который используется во всех редакторах Python и приложениях Shell в документах TI-Nspire. Размер шрифта сохраняется при сохранении самого документа.
4. На этом работа с циклом завершена. Пропустите одну-две строки и сотрите (с помощью кнопки backspace) структурные пробелы.
Теперь вам нужно обработать введенные числа. Вы уже нашли количество введенных чисел и их общее число с помощью переменных count и total, поэтому можно приступить к нахождению среднего значения.
Перед тем, как переходить к следующему шагу, попробуйте сделать это самостоятельно.

avg = total / count
вычисляет среднее значение и сохраняет результат в переменную avg.
Поразмышляйте: Почему здесь мы используем одиночный знак деления /, а не двойной // как в предыдущем уроке?
И, наконец, напишите выражение print (или несколько выражений), которое отобразит результаты подсчета чисел, их общее количество и среднее значение. Возможно, вам будет удобнее записать не одно, а несколько выражений print. Пример того, как с этим шагом справились мы, вы увидите в следующем пункте.

Примечание для учителя: Почему здесь мы используем одиночный знак деления /, а не двойной // как в предыдущем уроке?
Знак / означает деление с отображением числа с «блуждающей» десятичной запятой, и результат будет в виде десятичного числа.
Знак // означает деление целого числа, следовательно, результат будет отображен только в виде целого числа.
6. Мы будем использовать три выражения print для отображения результата:
print(«Count Total Average фишка» (особенность) языка программирования Python.
Не забудьте сохранить свою работу.

Примечание для учителя: Метод хранения и обработки чисел с десятичной запятой в языке Python в некоторых вычислениях приводит к отображению блуждающей запятой. Это особенность языка Python, которая не имеет ничего общего с языком TI-Nspire.
Задача: В качестве программы ввода (input) отобразите количество введенных чисел.
Функция ввода input не похожа на выражение print, с помощью которого вы можете одновременно отображать текст и переменные, разделив их запятыми. Функция input может отобразить только строку (подсказку).
Что произойдет, если первым числом сразу ввести -999 (до начала ввода любых других чисел)?
Ответ: Вы увидите сообщение об ошибке «Деление на ноль» (Divide by zero).
Флаги — Регулярные выражения (Regexp)
В этом уроке мы познакомимся с так называемыми флагами, которые позволяют изменить поведение регулярных выражений и правила поиска совпадений в строке.
Обратите внимание на этот пример:
Регулярному выражению aa почему-то соответствует только одна подстрока в этой строке, хотя их должно быть три. Это происходит, потому что по умолчанию регулярные выражения ищут только первое соответствие. Чтобы изменить это поведение, используются флаги.
Если в течение этого курса вы уже пользовались редактором регулярных выражений или просто смотрели видео курса, то обратили внимание на поле, расположенное справа от шаблонной строки.
Чаще всего в нем стоит глобальный флаг /g (global). Он включает поиск всех сопоставлений в строке и не останавливает поиск после первого совпадения.
Давайте поставим флаг g . Теперь сопоставились все подстроки:
В этом курсе мы по умолчанию используем флаг g в наших примерах и не указываем его дополнительно. Однако вы можете встретить его в составе регулярных выражений в тестах и практических заданиях. Если увидите /g в конце регулярного выражения, то знайте — это флаг глобального поиска.
Глобальный флаг часто используется, когда нужно не просто найти сопоставление регулярному выражению в строке, но и извлечь или использовать результаты поиска.
В зависимости от языка программирования флаги могут включаться непосредственно в сами регулярные выражения, или задаваться иными способами. Как именно это реализовано в конкретном языке, нужно смотреть в документации языка.
Напоследок рассмотрим еще несколько флагов.
Например, есть флаг /i , который включает режим игнорирования регистра:
Еще один флаг — /s . Он включает соответствие метасимвола . переводу строки. Другими словами, с ним строка, в которой мы ищем совпадения, представляется как одна строчка. Иногда это может пригодиться.
Не напоминают ли вам флаги что-то, пройденное нами ранее? Верно, по сути — это более могущественные версии модификаторов, которые мы рассмотрели в восьмом уроке.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
События
Еще одним способом коммуникации между объектами являются события. Экземпляры класса threading.Event могут быть использованы для передачи информации о наступлении некоторого события от одного потока одному или нескольким другим потокам. Объекты–события имеют внутренний флаг, который может находиться в установленном или сброшенном состоянии. При своем создании флаг события находится в сброшенном состоянии. Если флаг в установленном состоянии, ожидания не происходит: поток, вызвавший метод wait() для ожидания события, просто продолжает свою работу. Ниже приведены методы экземпляров класса threading.Event:
• set() Устанавливает внутренний флаг, сигнализирующий о наступлении события. Все ждущие данного события потоки выходят из состояния ожидания.
• clear() Сбрасывает флаг. Все события, которые вызывают метод wait() этого объекта–события, будут находиться в состоянии ожидания до тех пор, пока флаг сброшен, или по истечении заданного таймаута.
• isSet() Возвращает состояние флага.
• wait([timeout]) Переводит поток в состояние ожидания, если флаг сброшен, и сразу возвращается, если флаг установлен. Аргумент timeout задает таймаут в секундах, по истечении которого ожидание прекращается, даже если событие не наступило.
Составить пример работы с событиями предлагается в качестве упражнения.