Перейти к содержанию

True и False. break и continue

Логический тип данных

Если a и b — числа (допустим, действительные), то у выражения a + b есть какое-то значение (зависящее от значений a и b) и тип — тоже действительное число. Как вы думаете, можно ли сказать, что у выражения a == b есть значение и тип? Или это просто конструкция, которая всегда должна стоять в условии if или while?

На самом деле такое выражение имеет и тип под названием bool, и значение: True (истина) или False (ложь). По-русски bool — это булев тип, или булево значение (в честь математика Джорджа Буля), иногда его еще называют логический тип. Логический тип может иметь только два значения, а над переменными логического типа можно выполнять логические операции not, and, or.

Также для приведения к логическому типу можно использовать функцию bool, которая для ненулевого значения вернет истину.

k = True
print(k) # выведет True
print(not k) # выведет False
k = 5 > 2
print(k) # выведет True
k = bool(0)
print(k) # выведет False
k = bool("")
print(k) # выведет False
k = bool(13)
print(k) # выведет True, т.к. число не 0
k = bool("q")
print(k) # выведет True, т.к. строка не пустая
k = bool("False")
print(k) # выведет True, т.к. строка не пустая

Или вот еще пример:

if True:
    print('Эта строка будет выведена на экран.')
else:
    print('Эта строка никогда не будет выведена на экран.')
    print(2 * 2 == 4)  # выведет True
a = input()
b = input()
# Теперь переменная equal равна True, если строки a и b равны,и False
# в противном случае
equal = (a == b)
if equal and len(a) < 6:
    print('Вы ввели два коротких одинаковых слова.')

Использование флагов

Обычно переменные с булевым значением используются в качестве флагов. Изначально флаг устанавливается в 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.

for i in range(10):
    print('Итерация номер', i, 'начинается...')
    if i == 3:
        print('Ха! Внезапный выход из цикла!')
        break
    print('Итерация номер', i, 'успешно завершена.')
print('Цикл завершён.')
while True:
    word = input()
    if word == 'стоп':
        break
    print('Вы ввели:', word)
print('Конец.')

Впрочем злоупотреблять этой конструкцией и вообще оператором break не стоит. Когда программист читает ваш код, он обычно предполагает, что после окончания цикла while условие в заголовке этого цикла ложно. Если же из цикла можно выйти по команде break, то это уже не так. Логика кода становится менее ясной.

Оператор continue немедленно завершает текущую итерацию цикла и переходит к следующей.

1
2
3
4
5
6
7
for i in range(10):
    print('Итерация номер', i, 'начинается...')
    if i == 3:
        print('...но её окончание таинственно пропадает.')
        continue
    print('Итерация номер', i, 'успешно завершена.')
print('Цикл завершён.')

Часто использовать break и continue не рекомендуют, поскольку они приводят к произвольному перемещению точки выполнения программы по всему коду, что усложняет понимание и следование логике. Тем не менее разумное использование этих операторов может улучшить читабельность циклов в программе, уменьшив при этом количество вложенных блоков и необходимость в сложной логике выполнения цикла. Выход из цикла с помощью оператора break не является штатным завершением цикла, поэтому else-часть в этом случае не выполнится


Задачи

Задача 1

Напишите программу, которая считывает n строк. Выведите МЯУ, если хотя бы одна строка содержит слово кот или Кот. Иначе — НЕТ.

Тест 1:

Ввод:

3
у меня есть кот
собака во дворе
черепаха дома
Вывод:
МЯУ

Тест 2:

Ввод:

2
собака во дворе
черепаха дома
Вывод:
НЕТ


Задача 2

Напишите программу из задачи 1, но используйте break для выхода из цикла сразу после нахождения кота.

Тест 1:

Ввод:

4
раз
Кот сидит
два
три
Вывод:
МЯУ


Задача 3

Считывайте строки до тех пор, пока не будет введено СТОП. Выведите номер первой строки, содержащей кот или Кот (нумерация с 1). Если кот не найден — выведите -1.

Тест 1:

Ввод:

первая строка
вторая строка
у меня Кот
четвёртая
СТОП
Вывод:
3

Тест 2:

Ввод:

раз
два
СТОП
Вывод:
-1


Задача 4

Считывайте строки до СТОП. Выведите количество строк, содержащих кот/Кот, и номер первой такой строки (или -1).

Тест 1:

Ввод:

первая
кот здесь
снова кот
СТОП
Вывод:
2
2

Тест 2:

Ввод:

раз
два
СТОП
Вывод:
0
-1


Задача 5

Напишите программу FizzBuzz. Считайте два числа a и b. Для каждого числа от a до b включительно выведите:

  • FizzBuzz — если делится и на 3, и на 5
  • Fizz — если делится только на 3
  • Buzz — если делится только на 5
  • само число — в остальных случаях

Все значения на одной строке через пробел.

Тест 1:

Ввод:

10
15
Вывод:
Buzz 11 Fizz 13 14 FizzBuzz


Задача 6

Считывайте целые числа до 0. Выведите, после скольких введённых чисел их сумма впервые стала равна 10. Если этого не произошло — выведите -1.

Тест 1:

Ввод:

2
7
-2
1
6
6
6
0
Вывод:
4


Задача 7

Напишите программу, которая считывает n строк и выводит только те, которые не содержат слово плохо. Используйте continue.

Тест 1:

Ввод:

4
это хорошо
это плохо
нейтрально
совсем плохо
Вывод:
это хорошо
нейтрально


Задача 8

Считывайте строки до СТОП. Найдите кота (кот/Кот), но если встречается пёс (пёс/Пёс) — кот теряется (даже если был найден ранее). Если после последнего пса снова появился кот — он найден. Выведите МЯУ или НЕТ.

Тест 1:

Ввод:

тут кот
тут пёс
снова кот
СТОП
Вывод:
МЯУ

Тест 2:

Ввод:

тут кот
тут пёс
СТОП
Вывод:
НЕТ


Задача 9

Напишите программу, которая считывает n чисел. Выведите сумму только положительных чисел (используйте continue для пропуска неположительных).

Тест 1:

Ввод:

5
3
-1
4
0
2
Вывод:
9


Задача 10

Считывайте числа до 0. Если сумма введённых чисел превысила 100 — немедленно прекратите ввод (break) и выведите СТОП и количество введённых чисел. Если ввели 0 и не превысили — выведите ОК.

Тест 1:

Ввод:

40
30
50
0
Вывод:
СТОП
3

Тест 2:

Ввод:

10
20
0
Вывод:
ОК