Какой фрагмент while вероятнее всего приведёт к бесконечному циклу, если список events непустой?
for, while, if/elif/else, break, continue — управление потоком выполнения программы. Задачи на циклы проверяют умение итерироваться по сложным структурам, обрабатывать граничные случаи и писать читаемую логику. Часто дают задачу, где нужно обойти вложенные данные или реализовать несложный алгоритм.
Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.
1Нужно пройти по дням 1..7 включительно. Какой вызов `range()` даст именно эти значения?
A`range(1, 8)`: даёт значения 1..7, верхняя граница `8` не включается
B`range(0, 7)`: даёт значения 0..6, нижняя граница `0` включена, верхняя `7` нет
C`range(7)`: даёт значения 0..6, счёт начинается с нуля, а нужны 1..7
D`range(1, 7)`: даёт значения 1..6, верхняя граница `7` не включается
Ответ: В `range(start, stop)` верхняя граница не включается, поэтому `stop` берут на 1 больше нужного.
Чтобы получить значения 1..7, нужно задать верхнюю границу равной 8: `range(1, 8)`. Вызов `range(1, 7)` даст 1..6, `range(7)` и `range(0, 7)` дадут 0..6. Это типичная ошибка «на 1» при циклах и окнах: правую границу часто забывают увеличить.
2Чему будет равно `s` после выполнения кода: `s = 0`; цикл `for x in [1, 2, 3, 4]:`; внутри при `if x == 3: break`, иначе выполняется `s += x`?
AЗначение `0`: цикл прервётся ещё до первой итерации, элементы списка добавиться не успеют
BЗначение `1`: после прибавления первого элемента сработает выход из цикла, остановка `s` на единице
CЗначение `6`: оператор `break` не остановит цикл, поэтому в `s` войдут все элементы списка целиком
DЗначение `3`: `s` успеет получить два первых элемента, а на тройке цикл прервётся через `break`
Ответ: `break` завершает весь цикл целиком, поэтому элементы после срабатывания условия не обрабатываются.
Сначала `s` увеличится на 1, затем на 2 — получится 3. Когда `x` станет равным 3, сработает `break`, и цикл завершится, не добавив 3 и 4. Итог: `s` равно 3. Если бы вместо `break` стоял `continue`, то 3 был бы пропущен, но 4 успел бы добавиться, и `s` стал бы равен 7.
3Что будет в списке после кода: `nums = []`; затем цикл `for i in range(3):`; внутри выполняется `nums.append(i)`?
A`[1, 2, 3]`: три значения, начиная с единицы и до тройки включительно
B`[2, 1, 0]`: обратный порядок от двойки до нуля без сортировки
C`[0, 1, 2]`: три значения от нуля до двух, верхняя граница `3` не включается
D`[0, 1, 2, 3]`: четыре значения от нуля до тройки включительно
Ответ: `range(3)` генерирует значения 0, 1, 2 — именно они попадут в список.
Цикл `for i in range(3):` пройдёт по трём значениям: 0, 1, 2 — это полуинтервал `[0, 3)`, верхняя граница не включается. На каждой итерации выполняется `nums.append(i)`, поэтому итоговый список — `[0, 1, 2]`. Чтобы получить `[1, 2, 3]`, нужен `range(1, 4)`.
5В цикле по списку заказов вы хотите пропустить невалидную запись и продолжить обработку остальных. Какую инструкцию использовать внутри цикла?
AИспользовать `break`: цикл завершится и оставшиеся записи обработаны не будут совсем
BИспользовать `return`: немедленный выход из текущей функции вместе со всем циклом сразу
CИспользовать `continue`: пропускает текущую итерацию и переходит к следующей записи цикла
DИспользовать `pass`: инструкция бездействует, и выполнение продолжится по телу той же итерации
Ответ: `continue` пропускает текущую итерацию и переходит к следующей, не завершая весь цикл.
`break` завершит цикл целиком, и оставшиеся записи не будут обработаны. `return` выйдет из функции и тоже прервёт цикл. `pass` сам по себе ничего не делает: если после него в теле цикла идёт другой код, он продолжит выполняться для текущей итерации. Для сценария «пропустить и идти дальше» подходит именно `continue`, который завершает текущую итерацию и переходит к следующей.