Выражение с множествами и оператором or в Python

Выражение с множествами и оператором or в Python

@python_quiz

Разберем этот квиз

Условие (фрагмент кода):

python

Давайте разберёмся, что тут происходит и почему выражение даёт именно такой результат.

Пошаговый разбор

  1. Операции на множествах:

- & — пересечение множеест (intersection).
- - — разность множеств (elements in the left set that are not in the right).

  1. Приоритет и порядок вычисления:

- Побитовые/множестенные операторы (&, - и др.) вычисляются до логического оператора or.
- Таким образом выражение эквивалентно:
`python
(tags & blacklist) or (tags - blacklist)
`

  1. Логика оператора or в Python:

- or возвращает первый операнд, который оценивается как истинный (truthy); если первый ложный, возвращает второй.
- Для множеств: непустое множество — truthy, пустое множество — falsy.

  1. Конкретно для данных множеств:

- tags & blacklist даёт {'async'} — непустой набор → truthy.
- Поэтому or возвращает результат пересечения ({'async'}), и правая часть (tags - blacklist) даже не оценивается.

Демонстрация

Запустим код и посмотрим вывод:

python

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

python

Аналогично, если разность пуста, но пересечение есть, всё равно вернётся пересечение (потому что оно первое и truthy).

Разбор возможных вариантов ответов (логически)

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

Вывод

Ключевые моменты для запоминания:

  • Побитовые/множестенные операции выполняются до логического or.
  • or возвращает первый truthy-операнд, а непустое множество считается truthy.
  • В этой задаче пересечение непустое, поэтому итог — пересечение множеств.

Небольшая шпаргалка: если вы хотите явно предпочесть разность даже при непустом пересечении, используйте явную структуру условий или скобки и проверку пустоты, например:

python

Report Page