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

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

В программировании "флагом" называют переменную булевого типа, т.е. в которой хранится либо 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

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))

Читать подробнее:


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

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

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

Хочу код-ревью