Циклы и условия: вопросы для собеседования (часть 4)
for, while, if/elif/else, break, continue — управление потоком выполнения программы. Задачи на циклы проверяют умение итерироваться по сложным структурам, обрабатывать граничные случаи и писать читаемую логику. Часто дают задачу, где нужно обойти вложенные данные или реализовать несложный алгоритм.
Вопросы 16–20 из 20
16Поле `country` может быть `None` или пустой строкой. Нужно заменить его на `'unknown'` через `if`. Какое условие покрывает оба случая?
A`if country is None: country = 'unknown'`
B`if not country: country = 'unknown'`
C`if country: country = 'unknown'`
D`if len(country) == 0 and country is None: country = 'unknown'`
Ответ: `not country` истинно для `None`, пустой строки и других «пустых» значений.
Проверка `if not country:` сработает и для `None`, и для `''`. Проверка `== None` не поймает пустую строку. А выражение с `len(country)` упадёт с ошибкой, если `country` окажется `None`.
17В каком случае обычно уместнее выбрать цикл `while`, а не `for`?
AКогда нужно пройти по всем элементам списка `users`.
BКогда количество итераций заранее неизвестно и цикл должен завершиться по условию, которое обновляется внутри `while`.
CКогда нужно параллельно пройти по двум спискам — для этого используют `zip()` в `for`.
DКогда нужно пропустить текущую итерацию — для этого используют `continue`.
Ответ: `for` удобен для перебора последовательностей, а `while` — для повторения «пока условие истинно».
Если вы перебираете известную коллекцию (список, словарь, строку), обычно выбирают `for`. Если же цикл должен завершаться по условию, которое меняется внутри цикла (например, «пока не встретили sentinel» или «пока счётчик не достиг порога»), то логичнее `while`.
18Нужно задать `discount` без лишней вложенности: если `country == 'RU'` и `is_premium` истина → 10%; если `country == 'RU'` и не premium → 0; иначе → 5%. Какой вариант логики `if`/`elif`/`else` корректен?
A`if country == 'RU' and is_premium` → 10%; `elif country == 'RU'` → 0; `else` → 5%
B`if country == 'RU'` → 0; `elif country == 'RU' and is_premium` → 10%; `else` → 5%
C`if country != 'RU'` → 5%; `elif is_premium` → 0; `else` → 10%
D`if country == 'RU' or is_premium` → 10%; `else` → 5%
Ответ: Сначала ставьте более специфичное условие (`country` и `is_premium` вместе), затем более общее (`country == 'RU'`).
Если начать с `if country == 'RU'`, то премиальные пользователи из RU попадут в эту ветку и до проверки `is_premium` дело не дойдёт. Поэтому комбинированное условие `country == 'RU' and is_premium` должно идти первым, а затем можно отдельно обработать оставшийся случай `country == 'RU'`.
19Нужно найти индекс первого отрицательного значения в списке `amounts = [10, 0, -5, 7]`. Выполняется `idx = None`, затем цикл `for i, a in enumerate(amounts):`, и при `if a < 0:` выполняются `idx = i` и `break`. Чему будет равно `idx` после выполнения?
Ответ: `enumerate()` даёт индекс и значение, а `break` останавливает цикл на первом совпадении.
Пары из `enumerate(amounts)` идут так: (0, 10), (1, 0), (2, -5), (3, 7). На значении -5 условие `a < 0` истинно, поэтому `idx` станет 2 и сразу сработает `break`. Дальше цикл не продолжится.
20Что будет в `out` после кода: `out = []`; внешний цикл `for u in ['u1', 'u2']:`; внутренний `for e in ['a', 'b', 'c']:`; при `if e == 'b': break`, иначе выполняется `out.append(u + e)`?
A`['u1a', 'u2a', 'u2b']`
B`['u1a', 'u1b', 'u2a', 'u2b']`
C`['u1a']`
D`['u1a', 'u2a']`
Ответ: `break` завершает только ближайший (внутренний) цикл, внешний цикл продолжается.
Для `u = 'u1'` добавится `'u1a'`, затем при `e == 'b'` сработает `break` и внутренний цикл остановится. Внешний цикл перейдёт к `u = 'u2'` и аналогично добавит `'u2a'`. Итог: `['u1a', 'u2a']`.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram