divmod и фильтр в list comprehension (Python)

divmod и фильтр в list comprehension (Python)

@python_quiz

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

Код задачи

python

Что делает код — пошагово

  1. Итерация: для каждого n в списке nums перебираются значения 5, 2, 0.
  2. Условие-фильтр: if n // 2

- Оператор // — целочисленное деление (floor division).
- В условии проверяется целочисленный результат n // 2 на булеву истинность: ноль трактуется как False, любое ненулевое целое — как True.
- Для 5: 5 // 2 == 2 → True (включается).
- Для 2: 2 // 2 == 1 → True (включается).
- Для 0: 0 // 2 == 0 → False (исключается).

  1. Выражение в списковом включении: divmod(n, 2)

- divmod(a, b) возвращает кортеж (a // b, a % b) — частное и остаток от деления.
- Для 5: divmod(5, 2) -> (2, 1).
- Для 2: divmod(2, 2) -> (1, 0).

Итоговый результат, который напечатает программа:

python

Разбор вариантов ответов (пояснения)

  • Вариант с тремя кортежами, включая (0, 0) — неверен, потому что ноль был отфильтрован условием if n // 2.
  • Вариант с только (2, 1) — неверен, потому что 2 тоже проходит фильтр (2 // 2 == 1), так что для 2 также будет результат.
  • Вариант, где предполагается исключение ZeroDivisionError — неверен в данном коде: делитель в вызове divmod(n, 2) равен 2, ноль как делитель не используется. Исключение ZeroDivisionError возникло бы только при попытке деления на 0 (например, divmod(1, 0)).
  • Правильный вывод — два кортежа: результат для 5 и для 2, как показано выше.

Полезные замечания и тонкости

  • Условие в list comprehension (if n // 2) использует не булево выражение явно, а целое число, которое автоматически приводится к булевому: 0 → False, любое другое → True. Такой приём часто встречается, но менее явен, чем if n != 0 или if n // 2 != 0.
  • divmod удобен, когда нужно получить одновременно частное и остаток; эквивалентный код через оператор выглядел бы так:
python
  • Если нужно, чтобы ноль тоже обработался, фильтр нужно убрать или изменить. Например, чтобы явно включать все числа:
python

Вывод

Код фильтрует элементы по значению n // 2 (где ноль отбрасывается) и применяет divmod к оставшимся элементам. В данном случае результат — список кортежей для 5 и 2: [(2, 1), (1, 0)].

Report Page