У списку ціни = [28.5, 32.0, 19.9] ти пишеш цикл, який має порахувати суму. Куди поставити рядок «разом = 0» і чому?
Чому так. Тіло циклу виконується один раз на кожен елемент. Якщо разом = 0 опиниться всередині, воно теж виконається тричі — і кожен новий елемент почне з нуля: наприкінці лишиться 19.9 замість 80.4. Накопичувач завжди створюють до циклу; відступ у Python — не оформлення, а синтаксис.
Питання 2 / 8
Скільки значень видасть range(2, 12, 3) і яке з них останнє?
Чому так. Кількість — це ⌈(стоп − старт) / крок⌉ = ⌈10/3⌉ = 4, а стоп не входить у діапазон ніколи. Тому останнє значення 11: воно не доходить до 12 менш ніж на крок. Варіант «2, 5, 8» плутає «не включаючи стоп» із «не доходячи до попереднього значення».
Питання 3 / 8
Список покупки має 5 елементів, список кількості — 4. Що зробить for назва, скільки in zip(покупки, кількості)?
Чому так.zip зупиняється на найкоротшому наборі. Пʼята покупка просто ніколи не потрапить у цикл — і саме мовчання робить цю пастку небезпечною. Помилку доведеться попросити явно: zip(a, b, strict=True) у Python 3.10+ кине ValueError.
Питання 4 / 8
Цикл рахує суму цін [28.5, 32.0, 19.9, 145.0, 12.0], пропускаючи позиції дорожчі за 100. Скільки вийде з continue, а скільки з break — і звідки різниця?
Чому так.continue обриває поточний крок і йде до наступного елемента, тому сіль на 12 грн додалась: 80.4 + 12.0 = 92.4. break виходить із циклу назовсім, тому після меду не розглядалось нічого: 80.4. Ця різниця в одну позицію — типовий мовчазний баг.
Питання 5 / 8
Цикл шукає товар і має гілку else. Список, який він обходить, порожній. Що станеться?
Чому так.else у циклі означає «якщо не перервали через break». На порожньому списку тіло не виконалось жодного разу, але й break не спрацював — отже, цикл завершився природно, і гілка виконується. Саме через прочитання «інакше» цю конструкцію й розуміють неправильно.
Питання 6 / 8
Ти пишеш while гаманець > 0, а в тілі — гаманець -= крок, де крок дорівнює нулю. Що станеться?
Чому так. Помилка тут не в умові, а в тілі: там немає нічого, що рухало б умову до хибності. Python не аналізує цикли на завершуваність і жодної помилки не кине — програма просто перестане відповідати. Відʼємний крок ще гірший: гаманець росте, і кожне повторення віддаляє від виходу.
Питання 7 / 8
кошик = ["хліб", "сир", "сир", "мед"]. Виконуємо цикл: for назва in кошик — і якщо назва дорівнює "сир", робимо кошик.remove(назва). Що буде в кошику наприкінці?
Чому так. Ітератор списку тримає позицію, а не копію. Після видалення першого сиру другий переїхав на індекс 1, але лічильник уже дорівнював 2 — і взяв «мед». Позицію 1 більше ніхто не перевірив. Помилки при цьому немає, і в цьому найгірше: відповідь тихо неправильна. Зі словником було б інакше — там саме RuntimeError.
Питання 8 / 8
Ти написав пари = zip(покупки, кількості) і обійшов пари двома циклами підряд. Другий цикл нічого не надрукував. Чому?
Чому так.zip, як і enumerate, — ітератор, а не список: він памʼятає позицію й повертатись на початок не вміє. Другий обхід не падає, а просто не робить жодного кроку — тому баг мовчазний. Якщо результат потрібен двічі, зафіксуй його: пари = list(zip(...)).