Почему этот код печатает 'B'

Почему этот код печатает 'B'

@python_quiz

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

Исходный фрагмент:

python

Кратко: программа выведет B. Ниже — подробный разбор почему и какие подводные камни стоит учитывать.

Шаг за шагом

  1. config.get('retries') возвращает 0. В Python целое 0 считается ложным (falsy).
  2. Оператор and реализует короткое замыкание: если левый операнд ложен, правый не вычисляется и всё выражение целиком считается ложным.
  3. Поэтому проверка внутри if не проходит, выполняется ветка else и печатается 'B'.

Важно: выражение читается так, что левый операнд проверяется первым, и при его ложности правая часть не выполняется — именно это и решает исход результата.

Анализ вариантов (коротко)

  • "Выведет 'A'": неверно, потому что левый операнд (0) — ложь, выражение не может быть истинным.
  • "Выведет 'B'": верно — выполняется else.
  • "Ничего не выведет": неверно — есть печать в else, так что вывод будет.
  • "Будет исключение TypeError": неверно — здесь нет операций, которые вызвали бы TypeError.

Демонстрация разных сценариев

Покажем, как меняется поведение при других значениях:

python

Ожидаемые результаты:

  • Первый вызов — B (как в исходном примере).
  • Второй — B (правый операнд дает False).
  • Третий — A (оба условия истинны).

Частые ошибки и лучшие практики

  • Не полагайтесь на неявную проверку "is not None" вместе с truthy-проверкой, если хотите явно проверить наличие значения. Выражение с and может вести себя неожиданно, если одно значение равно 0, пустой строке, пустому списку и т.д.
  • Для явной проверки "не None" используйте сравнение для каждого параметра:
python
  • Если цель — проверить, что retries положительное число, пишите это явно:
python

Вывод

Короткое замыкание оператора and и ложное значение 0 приводят к тому, что в примере выполняется ветка else и печатается 'B'. Чтобы избежать двусмысленности и ошибок, делайте проверки явными — особенно когда нулевые или пустые значения имеют особое значение в логике программы.

Report Page