True и false, break и continue
Логический тип данных
Если a
и b
— числа (допустим, действительные), то у выражения a + b
есть какое-то значение (зависящее от значений a
и b
) и тип — тоже действительное число. Как вы думаете, можно ли сказать, что у выражения a == b
есть значение и тип? Или это просто конструкция, которая всегда должна стоять в условии if
или while
?
На самом деле такое выражение имеет и тип под названием bool
, и значение: True
(истина) или False
(ложь). По-русски bool
— это булев тип, или булево значение (в честь математика Джорджа Буля), иногда его еще называют логический тип. Логический тип может иметь только два значения, а над переменными логического типа можно выполнять логические операции not
, and
, or
.
Также для приведения к логическому типу можно использовать функцию bool
, которая для ненулевого значения вернет истину.
Или вот еще пример:
Использование флагов
Обычно переменные с булевым значением используются в качестве флагов. Изначально флаг устанавливается в False
, потом программа как-то работает, а при наступлении определенного события флаг устанавливается в True
. После идет проверка, поднят ли флаг. В зависимости от ее результата выполняется то или иное действие. Иными словами, флаг — это переменная с булевым значением, которая показывает, наступило ли некое событие.
В программе имеется флаг said_forbidden_word
, который означает «сказал ли пользователь запретное слово „синхрофазотрон“». Флаг равен True
, если сказал, и False
, если нет. В самом начале пользователь еще ничего не успел сказать, поэтому флаг установлен в False
. Далее на каждой итерации цикла, если пользователь сказал запретное слово, флаг устанавливается в True
и остается в таком состоянии (при необходимости флаг можно и «опустить»). Как только флаг оказывается равен True
, поведение программы меняется: перед каждым вводом выдается предупреждение, а в конце выдается другое сообщение.
Переменным-флагам особенно важно давать осмысленные имена (обычно — утверждения вроде said_forbidden_word
, found_value
, mission_accomplished
, mission_failed
), ведь флагов в программе бывает много. Стоит пресекать попытки подобно if found == True
. Это демонстрирует непонимание того, что любое условие обычного вида «что-то == чему-то» само по себе равняется либо True
, либо False
, и дополнительное сравнение избыточно. Решать эти задачи вообще без использования флагов — нормально и допустимо.
Операторы break и continue. Бесконечные циклы
Если нужно прекратить работу цикла, как только случится некое событие, то, кроме флага, есть и другой способ — оператор разрыва цикла break
(он работает и для цикла for
). Это не функция и не заголовок блока, а оператор, который состоит из одного слова. Он немедленно прерывает выполнение цикла for
или while
.
Впрочем злоупотреблять этой конструкцией и вообще оператором break
не стоит. Когда программист читает ваш код, он обычно предполагает, что после окончания цикла while
условие в заголовке этого цикла ложно. Если же из цикла можно выйти по команде break
, то это уже не так. Логика кода становится менее ясной.
Оператор continue
немедленно завершает текущую итерацию цикла и переходит к следующей.
Часто использовать break
и continue
не рекомендуют, поскольку они приводят к произвольному перемещению точки выполнения программы по всему коду, что усложняет понимание и следование логике. Тем не менее разумное использование этих операторов может улучшить читабельность циклов в программе, уменьшив при этом количество вложенных блоков и необходимость в сложной логике выполнения цикла. Выход из цикла с помощью оператора break не является штатным завершением цикла, поэтому else
-часть в этом случае не выполнится