Выражение с множествами и оператором or в Python
@python_quizРазберем этот квиз
Условие (фрагмент кода):

Давайте разберёмся, что тут происходит и почему выражение даёт именно такой результат.
Пошаговый разбор
- Операции на множествах:
- & — пересечение множеест (intersection).
- - — разность множеств (elements in the left set that are not in the right).
- Приоритет и порядок вычисления:
- Побитовые/множестенные операторы (&, - и др.) вычисляются до логического оператора or.
- Таким образом выражение эквивалентно:
`python
(tags & blacklist) or (tags - blacklist)
`
- Логика оператора
orв Python:
- or возвращает первый операнд, который оценивается как истинный (truthy); если первый ложный, возвращает второй.
- Для множеств: непустое множество — truthy, пустое множество — falsy.
- Конкретно для данных множеств:
- tags & blacklist даёт {'async'} — непустой набор → truthy.
- Поэтому or возвращает результат пересечения ({'async'}), и правая часть (tags - blacklist) даже не оценивается.
Демонстрация
Запустим код и посмотрим вывод:

Если бы пересечение было пустым, то первая часть была бы falsy, и результатом стал бы результат разности. Пример:

Аналогично, если разность пуста, но пересечение есть, всё равно вернётся пересечение (потому что оно первое и truthy).
Разбор возможных вариантов ответов (логически)
- Вариант "исходный набор tags": соответствует случаю, когда пересечение пусто и разность равна исходному набору (например, blacklist не содержит общих элементов). В данном конкретном коде это не так, потому что есть общий элемент.
- Вариант "tags без элемента 'async'": это результат выражения
tags - blacklist, то есть разность — набор тегов после удаления общих с blacklist. Такой результат вернулся бы, если бы пересечение было пустым. - Вариант "{'async'}": это результат пересечения
tags & blacklist. Поскольку пересечение непустое, операторorвозвращает именно его. - Вариант "пустое множество": получился бы только если и пересечение было пустым, и разность — пустым (маловероятно в этом примере), либо в других комбинациях множеств.
Вывод
Ключевые моменты для запоминания:
- Побитовые/множестенные операции выполняются до логического
or. orвозвращает первый truthy-операнд, а непустое множество считается truthy.- В этой задаче пересечение непустое, поэтому итог — пересечение множеств.
Небольшая шпаргалка: если вы хотите явно предпочесть разность даже при непустом пересечении, используйте явную структуру условий или скобки и проверку пустоты, например:
