Циклы и условия: вопросы для собеседования (часть 3)
for, while, if/elif/else, break, continue — управление потоком выполнения программы. Задачи на циклы проверяют умение итерироваться по сложным структурам, обрабатывать граничные случаи и писать читаемую логику. Часто дают задачу, где нужно обойти вложенные данные или реализовать несложный алгоритм.
Вопросы 11–15 из 20
11Нужно сегментировать пользователей по `orders_cnt`: 0 → `'new'`, 1–4 → `'low'`, 5+ → `'high'`. Какой порядок условий в цепочке `if`/`elif`/`else` корректный?
AСначала `if orders_cnt == 0`, затем `elif orders_cnt < 5`, иначе `else`
BСначала `if orders_cnt < 5`, затем `elif orders_cnt == 0`, иначе `else`
CСначала `if orders_cnt > 0`, затем `elif orders_cnt >= 5`, иначе `else`
DСначала `if orders_cnt == 0`, затем ещё один `if orders_cnt < 5`, иначе `else`
Ответ: Более специфичное условие (0 заказов) проверяйте раньше более общего (`orders_cnt < 5`).
Если начать с `orders_cnt < 5`, то значение 0 попадёт в этот сегмент и ветка для 0 заказов уже не сработает. Правильно: сначала выделить частный случай `orders_cnt == 0`, затем проверить диапазон 1–4 через `orders_cnt < 5`, а всё остальное отдать в `else` как 5+.
12Какой фрагмент `while` вероятнее всего приведёт к бесконечному циклу (если `events` — непустой список)?
A`i = 0; while i < len(events): i += 1`
B`i = 0; while i < len(events): pass`
C`i = 0; while i < len(events): i = i + 1`
D`i = 0; while i < len(events): break`
Ответ: В `while` состояние, влияющее на условие, должно меняться; иначе условие останется истинным.
В варианте с `pass` переменная `i` не меняется, значит при непустом `events` условие `i < len(events)` останется истинным навсегда. Это частая ошибка в задачах обработки событий: забыли увеличить счётчик или обновить данные внутри `while`.
13Чему равен `steps` после выполнения кода: `n = 5`; `steps = 0`; затем цикл `while n > 0:`; внутри выполняется `n -= 2` и `steps += 1`?
Ответ: В `while` число итераций зависит от того, как меняется переменная в условии.
Значения `n` по итерациям: 5 → 3 → 1 → -1. Условие `n > 0` станет ложным после третьего уменьшения, поэтому `steps` увеличится 3 раза.
14Вы обходите список `users` и хотите, чтобы `i` был индексом, а `u` — значением, без использования `range(len(users))`. Какой вариант подходит лучше всего?
A`for u in users: i = users.index(u)`
B`for i in range(len(users)): u = users[i]`
C`for i, u in enumerate(users): print(i, u)`
D`for i, u in zip(users, range(len(users))): print(i, u)`
Ответ: `enumerate()` даёт индекс и элемент в одной итерации и не требует ручной работы с индексами.
`enumerate(users)` читабельнее и безопаснее, чем `range(len(users))`. Вариант с `users.index(u)` может давать неверные индексы при повторяющихся значениях и работает медленнее. Вариант с `zip(users, range(len(users)))` перепутает местами индекс и значение.
15Списки разной длины: `a = ['u1', 'u2', 'u3']` и `b = [10, 20]`. Код: `pairs = []`; затем `for x in zip(a, b):`; внутри `pairs.append(x)`. Сколько элементов будет в `pairs`?
Ответ: `zip()` останавливается на самой короткой последовательности.
`zip(a, b)` сформирует пары только для первых двух элементов: (`'u1'`, 10) и (`'u2'`, 20). Элемент `'u3'` не попадёт в результат, потому что в `b` нет третьего значения.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram