Циклы и условия: вопросы для собеседования (часть 2)
for, while, if/elif/else, break, continue — управление потоком выполнения программы. Задачи на циклы проверяют умение итерироваться по сложным структурам, обрабатывать граничные случаи и писать читаемую логику. Часто дают задачу, где нужно обойти вложенные данные или реализовать несложный алгоритм.
Вопросы 6–10 из 20
6Считается число «успешных» статусов. Код: `cnt = 0`; цикл `for st in ['ok', 'cancelled', 'ok']:`; если `st == 'cancelled'`, выполняется `continue`, иначе `cnt += 1`. Чему равно `cnt` после цикла?
A`1`: `continue` прерывает цикл сразу, поэтому второй элемент `'ok'` не обработается счётчиком
B`3`: `continue` не влияет на счётчик, и каждый из трёх элементов увеличит `cnt` на единицу
C`0`: `continue` сбрасывает счётчик в начале каждой итерации, обнуляя `cnt` после прибавления
D`2`: `continue` пропускает только `'cancelled'`, а оба `'ok'` увеличивают `cnt` до двойки
Ответ: `continue` пропускает текущую итерацию и переходит к следующей.
На втором элементе `'cancelled'` сработает `continue`, поэтому `cnt` не увеличится. Для двух значений `'ok'` счётчик увеличится на единицу каждый раз, итоговое значение `cnt` будет 2. В отличие от `break`, `continue` не выходит из цикла полностью, а лишь пропускает оставшийся код текущей итерации.
Подробный разбор → 7В цепочке условий сверху стоит проверка `amount > 100`, а ниже — `amount > 200` и заключительная ветка. Для значения 250 нужно отдельное поведение, отличающееся от значений в диапазоне от 100 до 200. Что не так с таким порядком проверок?
AСработает первая проверка `amount > 100`, и в эту же ветку попадут значения, для которых хотели отдельный сегмент свыше 200
BСработает проверка `amount > 200`, потому что интерпретатор выбирает наиболее специфичное условие из всей цепочки
CСработает заключительная ветка `else`, потому что обе проверки конфликтуют между собой и интерпретатор пропускает их обе
DЛогика будет работать неверно: для значения 250 нужно поставить проверку `amount > 200` выше, чтобы значения свыше 200 попали в свою ветку
Ответ: Срабатывает первая истинная проверка, поэтому более узкое условие должно стоять выше более широкого.
Условия проверяются сверху вниз, и срабатывает первая истинная проверка. При значении 250 условие `amount > 100` уже истинно, поэтому управление никогда не дойдёт до проверки `amount > 200`, и обе группы значений сольются в одну ветку. Чтобы значения свыше 200 попадали в отдельный сегмент, более специфичную проверку `amount > 200` нужно ставить выше, чем `amount > 100`. Заключительная ветка в этой ситуации не срабатывает, потому что одна из верхних проверок уже истинна.
Подробный разбор → 8Чему равен `cnt` после кода: `cnt = 0`; `for ch in 'A12B3':`; если `ch.isdigit()` истинно, то `cnt += 1`?
Ответ: Цикл `for` по строке идёт по символам, а `if` помогает отфильтровать нужные символы.
В строке `'A12B3'` цифры — `1`, `2`, `3`. Для них `ch.isdigit()` вернёт истину, поэтому `cnt` увеличится 3 раза.
Подробный разбор → 9Есть списки пользователей и трат: `users = ['u1', 'u2']` и `spends = [100, 200]`. После `d = {}`, в цикле `for u, s in zip(users, spends):` выполняется `d[u] = s`. Чему равно `d['u2']`?
Ответ: `zip()` создаёт пары по позициям, поэтому `'u2'` сопоставится со значением 200.
Итерация по `zip(users, spends)` выдаёт пары (`'u1'`, 100) и (`'u2'`, 200). Эти пары записываются в словарь, поэтому по ключу `'u2'` будет лежать 200.
Подробный разбор → 10Есть словарь выручки по странам `revenue_by_country = {'RU': 100, 'KZ': 50}`. Как корректно посчитать сумму значений через цикл `for`?
A`total = 0`; `for x in revenue_by_country: total += x`
B`total = 0`; `for v in revenue_by_country.values(): total += v`
C`total = sum(revenue_by_country)` напрямую от словаря выручки
D`total = 0`; `for k, v in revenue_by_country: total += v`
Ответ: Чтобы суммировать значения словаря, итерируйтесь по `revenue_by_country.values()` или по парам из `revenue_by_country.items()`.
В `for x in revenue_by_country` переменная `x` принимает ключи (`'RU'`, `'KZ'`), поэтому попытка складывать их с числом приведёт к ошибке. Правильно проходить по значениям через `revenue_by_country.values()` (или по `(key, value)` через `revenue_by_country.items()`) и накапливать сумму.
Подробный разбор →