Булева логика и фильтры: вопросы для собеседования (часть 2)
AND, OR, NOT, законы де Моргана, приоритет операторов — булева логика лежит в основе фильтрации данных в SQL и Python. На собеседовании дают сложное условие с вложенными AND/OR и просят определить, какие строки пройдут фильтр. Ошибки в логических выражениях — одна из самых частых причин неправильных результатов.
Вопросы 6–10 из 20
6В форме регистрации есть два флага: `has_email = 1` и `has_phone = 1`. Что означает фильтр `NOT (has_email = 1) AND NOT (has_phone = 1)`?
AУ пользователя есть `at least one` контакт: `has_email = 1 OR has_phone = 1`.
BУ пользователя есть `оба` контакта: `has_email = 1 AND has_phone = 1`.
CУ пользователя не указан ни один контакт: не выполнено ни `has_email = 1`, ни `has_phone = 1`.
DУ пользователя указан `exactly one` контакт.
Ответ: Связка `NOT (has_email = 1) AND NOT (has_phone = 1)` означает: не выполнен ни один из двух признаков.
Чтобы строка прошла фильтр, должны быть ложными оба условия: и `has_email = 1`, и `has_phone = 1`. Это соответствует случаю, когда не указан ни один контакт. Частая ошибка — перепутать это с `NOT (A AND B)`, которое исключает только одновременное выполнение и допускает заполнение одного контакта.
7Какому выражению со скобками эквивалентно условие `is_new = 1 OR is_paying = 1 AND has_coupon = 1`, если `AND` выполняется раньше `OR`?
A`is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`
B`(is_new = 1 OR is_paying = 1) AND has_coupon = 1`
C`(is_new = 1 AND is_paying = 1) OR has_coupon = 1`
D`is_new = 1 AND (is_paying = 1 OR has_coupon = 1)`
Ответ: `AND` имеет более высокий приоритет, поэтому сначала вычисляется `is_paying = 1 AND has_coupon = 1`.
В выражениях фильтрации `AND` обычно выполняется раньше `OR`. Поэтому запись без скобок читается как `is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`. Если вы хотели сгруппировать иначе, добавьте скобки и не полагайтесь на приоритет операторов.
8Вы хотите выбрать строки, которые не относятся к `country = 'RU' OR country = 'KZ'`. Какое выражение соответствует `NOT (country = 'RU' OR country = 'KZ')` по правилу `De Morgan`?
A`NOT (country = 'RU') OR NOT (country = 'KZ')`
B`country <> 'RU' OR country <> 'KZ'`
C`country = 'RU' AND country = 'KZ'`
D`NOT (country = 'RU') AND NOT (country = 'KZ')`
Ответ: По `De Morgan` `NOT (A OR B)` эквивалентно `NOT A AND NOT B`.
Условие `country = 'RU' OR country = 'KZ'` означает «RU или KZ» (хотя бы одно из двух). Его отрицание — это «ни RU, ни KZ», то есть `NOT (country = 'RU') AND NOT (country = 'KZ')`. Частая ошибка — написать `NOT (country = 'RU') OR NOT (country = 'KZ')`, что почти всегда истинно и пропускает лишние строки.
9Флаг `is_active` принимает только 0 или 1. Какое условие является `always true` и не отфильтрует ни одной строки?
A`is_active = 1 AND is_active = 0`
B`NOT (is_active = 1)`
C`is_active = 1 OR is_active = 0`
D`is_active = 1`
Ответ: Если флаг может быть только 0 или 1, то `is_active = 1 OR is_active = 0` истинно для любой строки и является `always true`.
Это пример тавтологии: вы перечислили все возможные значения флага и соединили их `OR`. Такой фильтр часто появляется случайно, например при ошибочном объединении условий. В интервью полезно уметь быстро распознавать `always true`, потому что он маскирует ошибки сегментации.
10Поле `country` содержит ровно одно значение на пользователя. Какое условие является `always false`?
A`country = 'RU' OR country = 'KZ'`
B`country = 'RU' AND country = 'KZ'`
C`NOT (country = 'RU')`
D`(country = 'RU' OR country = 'KZ') AND NOT (country = 'BY')`
Ответ: Требование `country = 'RU' AND country = 'KZ'` невозможно для одного поля и поэтому `always false`.
Противоречия часто появляются, когда по ошибке объединяют взаимоисключающие значения через `AND`. В результате фильтр возвращает пустой набор, и аналитик начинает искать проблему в данных, а не в логике. В интервью важно быстро распознать такие невозможные условия и объяснить, почему они не могут выполниться.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram