Форматирование и оператор or в Python

Форматирование и оператор or в Python

@python_quiz

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

Кратко: в представленном фрагменте оба вызова печати подставляют строку "нет данных". Разберём, почему так происходит, и покажем похожие примеры, которые ведут себя иначе из‑за приоритета операторов.

Условие (код)

python

Оба выражения используют конструкцию value or 'нет данных' — при value равном None результатом будет правая часть, то есть строка 'нет данных'. Но важно понять, как это сочетается с форматированием.

Почему оба варианта дают одинаковый результат

  1. f-строка: в выражении f"{...}" содержимое внутри фигурных скобок сначала вычисляется как обычное Python-выражение. Значит, value or 'нет данных' вычисляется до вставки, и туда подставляется строка 'нет данных'.
  1. Оператор форматирования через %: в приведённом коде используется явные скобки вокруг (value or 'нет данных'), поэтому тоже сначала вычисляется or, и затем получившаяся строка передаётся как аргумент для "%s" % ... — итоговая подстановка даёт 'нет данных'.

Пример выполнения:

python

Результат в консоли:

text

Где можно получить другой результат (важность приоритета операторов)

Если убрать скобки во втором выражении, поведение изменится из‑за приоритета операторов:

python

Здесь выражение читается как (" %s" % value) or 'нет данных' — сначала выполняется форматирование "%s" % value, которое даёт строку "None" (строка "None" — непустая, значит truthy), затем оператор or возвращает левую часть ("None"). В результате будет напечатано:

text

Таким образом, скобки имеют решающее значение в выражениях с % и or.

Анализ вариантов ответов

  • "Обе строки выведут: None" — не соответствует приведённому коду: в оригинале both строки используют (value or 'нет данных'), поэтому печатается строка 'нет данных', а не 'None'.
  • "Обе строки выведут: нет данных" — соответствует поведению кода, где оба выражения вычисляют or прежде чем форматировать.
  • "Первая: None, вторая: нет данных" — возможна только если первая строка как‑то форматировала value без учёта or, но в коде первая — f-строка с выражением value or 'нет данных', значит не верно.
  • "Первая: нет данных, вторая: None" — такой результат также не возникает в указанном фрагменте; он мог бы появиться в сильно изменённой форме выражений (например, при неправильном расставлении скобок), но не в данном коде.

Выводы и рекомендации

  • Оператор or возвращает первый truthy-операнд или последний, если все ложны; при value = None он вернёт правую часть.
  • В f-строках выражения внутри {} вычисляются до форматирования — поэтому там безопасно использовать логические выражения.
  • При использовании оператора форматирования % внимательно следите за скобками: "%s" % value or default будет интерпретироваться как ("%s" % value) or default, а "%s" % (value or default) — как нужно вам (сначала or, затем форматирование).
  • Современная рекомендация: использовать f-строки или str.format, чтобы уменьшить вероятность ошибок, связанных с приоритетом операторов.

Небольшая шпаргалка:

python

Report Page