Что такое флаг в программировании python
Перейти к содержимому

Что такое флаг в программировании python

  • автор:

Переменные-флаги

В старые времена с помощью флагов командовали войсками. Например, если флаг поднят — нужно атаковать, опущен — отступать.

В программировании “флагом” называют переменную булевого типа, т.е. в которой хранится либо True , либо False . Их так называют потому, что управление с их помощью похоже на флаги: есть всего 2 варианта, флаг или поднят, или опущен.

Например, вам интересно, есть ли человек на видео. Вы пишете функцию, которая проходит по кадрам видео и проверяет каждый из них. Если найдёт человека, то сообщит об этом:

def check_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True print(human_found) 

Обратите внимание, что True и False написаны без кавычек! Так и задумано — это не строки, а отдельный тип данных.

По умолчанию считаем, что человека нет, поэтому создаём флаг human_found = False . Далее для каждого кадра в видео проверяем, есть ли на нём человек — вызываем метод объекта frame.has_human() . Если человек найден, то меняем флаг на True . В конце выводим флаг с помощью print .

Если ни на одном кадре человек не найдётся, то флаг так и останется False , потому что условие if frame.has_human() ни разу не сработает.

Если хоть на одном кадре есть человек, то при обработке этого кадра сработает условие if frame.has_human() и флаг станет True .

Как улучшить код

Теперь усовершенствуем код. Функция станет удобнее, если откажется от вывода на экран в пользу return .

def is_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True return human_found print(is_human_in_video(video)) 

Следующим шагом ускорим работу функции. Сейчас код продолжит проверку, даже если встретит человека на самом первом кадре видео. Если кадров в video будет много, то проверка займёт время. Это даёт возможность для оптимизации. Прервём проверку сразу, как только станет ясен результат:

def is_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True return human_found return human_found print(is_human_in_video(video)) 

Теперь заметно, что от переменной human_found можно избавиться, сделав код немного лаконичнее:

def is_human_in_video(video): for frame in video: if frame.has_human(): return True return False print(is_human_in_video(video)) 

Но и это ещё не всё. Флаги являются таким частым приёмом, что они попали в стандартную библиотеку Python. Код выше можно записать в одну строку:

def is_human_in_video(video): return any(frame.has_human() for frame in video) 
  • Про функцию any
  • Что такое list comprehension?

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Флаги

В предыдущем примере программа выполняла некоторые операции, пока заданное условие оставалось истинным. А что если вы пишете более сложную программу, выполнение которой может прерываться по нескольким разным условиям?

Например, компьютерная игра может завершаться по разным причинам: у игрока кончились все «жизни»; прошло отведенное время; все города, которые он должен был защищать, были уничтожены и т.д. Игра должна завершаться при выполнении любого из этих условий. Попытки проверять все возможные условия в одной команде while быстро усложняются и становятся слишком громоздкими.

Если программа должна выполняться только при истинности нескольких условий, определите одну переменную-флаг. Эта переменная сообщает, должна ли программа выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии True, и завершалась, если любое из нескольких событий перевело флаг в состояние False. В результате в команде while достаточно проверить всего одно условие: находится ли флаг в состоянии True. Все остальные проверки (которые должны определить, произошло ли событие, переводящее флаг в состояние False) удобно организуются в остальном коде.

Добавим флаг в программу parrot.py из предыдущего раздела. Этот флаг, который мы назовем active (хотя переменная может называться как угодно), управляет тем, должно ли продолжаться выполнение программы:

prompt = » Tell me something, and I will repeat it back to you:»

prompt += » Enter ‘quit’ to end the program. «

(3) . .if message == ‘quit’:

В точке (1) переменной active присваивается True, чтобы программа начинала работу в активном состоянии. Это присваивание упрощает команду while, потому что в самой команде while никакие сравнения не выполняются; вся логика реализуется в других частях программы. Пока переменная active остается равной True, цикл выполняется.

В команде if внутри цикла while значение message проверяется после того, как пользователь введет данные. Если пользователь ввел строку ‘quit’ (3), флаг active переходит в состояние False, а цикл while останавливается. Если пользователь ввел любой текст, кроме ‘quit’ (4), то введенные им данные выводятся как сообщение.

Результаты работы этой программы ничем не отличаются от предыдущего примера, в котором условная проверка выполняется прямо в команде while. Но теперь в программе имеется флаг, указывающий, находится ли она в активном состоянии, и вы сможете легко добавить новые проверки (в форме команд elif) для событий, с которыми переменная active может перейти в состояние False. Это может быть удобно в сложных программах — например, в компьютерных играх с многочисленными событиями, каждое из которых может привести к завершению программы. Когда по любому из этих событий флаг active переходит в состояние False, основной игровой цикл прервется, выводится сообщение о завершении игры, и у игрока появляется возможность сыграть еще раз.

Урок 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. Что будет происходить в блоке цикла:

  1. Подсчет количества введенных чисел
  2. Их сложение
  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).

Флаги преобразования

При форматировании строк доступны 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 ��

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *