Использование флага (переменная булевого типа) для начинающих
Например есть такая задача перебрать данные и определить есть ли там нужные нам для примера возьмем ситуацию из жизни: переберем мешок с картошкой, нужно узнать есть ли там гнилая мешок представим списком [] из 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. Благодарен друзьям за поддержку и идею создания статьи.
- флаг
- булевы переменные
Флаги — Регулярные выражения (Regexp)
В этом уроке мы познакомимся с так называемыми флагами, которые позволяют изменить поведение регулярных выражений и правила поиска совпадений в строке.
Обратите внимание на этот пример:
Регулярному выражению aa почему-то соответствует только одна подстрока в этой строке, хотя их должно быть три. Это происходит, потому что по умолчанию регулярные выражения ищут только первое соответствие. Чтобы изменить это поведение, используются флаги.
Если в течение этого курса вы уже пользовались редактором регулярных выражений или просто смотрели видео курса, то обратили внимание на поле, расположенное справа от шаблонной строки.
Чаще всего в нем стоит глобальный флаг /g (global). Он включает поиск всех сопоставлений в строке и не останавливает поиск после первого совпадения.
Давайте поставим флаг g . Теперь сопоставились все подстроки:
В этом курсе мы по умолчанию используем флаг g в наших примерах и не указываем его дополнительно. Однако вы можете встретить его в составе регулярных выражений в тестах и практических заданиях. Если увидите /g в конце регулярного выражения, то знайте — это флаг глобального поиска.
Глобальный флаг часто используется, когда нужно не просто найти сопоставление регулярному выражению в строке, но и извлечь или использовать результаты поиска.
В зависимости от языка программирования флаги могут включаться непосредственно в сами регулярные выражения, или задаваться иными способами. Как именно это реализовано в конкретном языке, нужно смотреть в документации языка.
Напоследок рассмотрим еще несколько флагов.
Например, есть флаг /i , который включает режим игнорирования регистра:
Еще один флаг — /s . Он включает соответствие метасимвола . переводу строки. Другими словами, с ним строка, в которой мы ищем совпадения, представляется как одна строчка. Иногда это может пригодиться.
Не напоминают ли вам флаги что-то, пройденное нами ранее? Верно, по сути — это более могущественные версии модификаторов, которые мы рассмотрели в восьмом уроке.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Флаги преобразования
При форматировании строк доступны 3 флага преобразования объекта в строку: !r, !s и !a.
>>> x = "дом" >>> f'' 'дом' >>> f'' "'дом'" >>> f'' 'дом' >>> f'' "'\\u0434\\u043e\\u043c'"
Для фанатов format:
>>> ''.format(x) "'дом'" >>> ''.format(x) "'дом'"
Флаг !r вызывает repr(x), а флаг !s вызывает str(x). Флаг !a вызывает ascii(repr(x)). Функция ascii превращает все символы за пределами набора ASCII (включая русские буквы в юникоде) в их коды. Если флаг не указан, то по умолчанию считается, что он !s.
Для классов __repr__ и __str__ могут иметь различное определение:
class Foo: def __repr__(self): return "репр" def __str__(self): return "строка" x = Foo() print(f'') # репр print(f'') # строка
Если __str__ нет, то будет вызван __repr__.
Рекомендации: __str__ должен давать нам человеко-читаемое описание объекта, а __repr__ – уникальное представление объекта, по которому можно частично или полностью восстановить состояние этого объекта или хотя бы помочь с отладкой. __str__ – для пользователей, __repr__ — для питонистов.
Отличный пример для наглядности – datetime:
>>> import datetime >>> dt = datetime.datetime(2019, 7, 27) >>> repr(dt) 'datetime.datetime(2019, 7, 27, 0, 0)' >>> str(dt) '2019-07-27 00:00:00' >>> eval(repr(dt)) == dt True
str от datetime просто покажет нам дату и время в удобном формате; repr от datetime вернет строку, в которой будет вызов описан конструктора конкретно этого объекта, да так, что при исполнении этой строки как кода на Python функцией eval – мы получим объект datetime для той же даты. Впрочем, никто нас не обязывает делать этот трюк для каждого объекта.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
Урок 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).