Переменные-флаги
В старые времена с помощью флагов командовали войсками. Например, если флаг поднят — нужно атаковать, опущен — отступать.
В программировании “флагом” называют переменную булевого типа, т.е. в которой хранится либо 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)
Читать подробнее:
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.