Поведение оператора % с отрицательными числами в Python
@python_quizРазберем этот квиз
Коротко: у нас есть список чисел и мы берём поэлементно остаток от деления на 2, затем считаем, сколько раз встречаются 1 и -1.
Исходный код:

Вывод программы:

Пояснение (правило для % в Python)
В Python результат операции a % b имеет тот же знак, что и делитель b. Для положительного делителя остаток всегда неотрицателен и лежит в диапазоне [0, b-1]. Поскольку делитель здесь равен 2 (>0), все остатки будут либо 0, либо 1.
Поэлементно:
- -3 % 2 == 1 (потому что -3 = (-2)*2 + 1)
- -2 % 2 == 0
- 0 % 2 == 0
- 2 % 2 == 0
- 3 % 2 == 1
Итого res = [1, 0, 0, 0, 1]. Соответственно:
- res.count(1) == 2
- res.count(-1) == 0
Анализ предложенных вариантов
- "Вывод: 2 0" — совпадает с реальным выводом программы (см. расчёт выше).
- "Вывод: 2 1" — неверно, в результате нет элементов равных -1, поэтому второй счётчик не может быть 1.
- "Вывод: 3 0" — неверно, единиц ровно две, а не три.
- "Исключение
ZeroDivisionError" — невозможно в этом коде, делитель равен 2, деления на ноль нет.
Быстрые дополнения и сравнение с другими языками
- В Python остаток при положительном делителе всегда неотрицателен. Но если делитель отрицателен, остаток будет иметь знак делителя:

- В некоторых языках (например, C) знак остатка может следовать за знаком делимого, поэтому поведение на отрицательных числах отличается. Это важно учитывать при переносе логики между языками.
Альтернативный подсчёт (с использованием Counter)
Для наглядности можно использовать collections.Counter:

Вывод
Оператор % в Python возвращает остаток с тем же знаком, что и делитель. В данном примере остатки при делении на 2 дают лист [1, 0, 0, 0, 1], поэтому вывод программы — "2 0".