Тест самоперевірки

Кортежі й розпакування

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Що лежить у x після рядка x = (50.45) ?

Чому так. Кортеж робить кома, а не дужки. У (50.45) дужки просто групують вираз, як у математиці, — тому там лишається звичайний float. Щоб отримати кортеж з одного елемента, кома обовʼязкова: (50.45,) або навіть просто 50.45, без дужок.
Питання 2 / 8

Виконується рядок a, b = (10, 20, 30). Що станеться?

Чому так. Кількості мусять збігтися точно: Python не вирішує за тебе, що викинути, а зупиняє програму з ValueError: too many values to unpack (expected 2). Спокуслива відповідь про «a вже встигло» хибна: перевірка кількості відбувається до будь-якого присвоєння, тому після невдалого розпакування наполовину заповнених імен не буває.
Питання 3 / 8

Що опиниться в rest після a, *rest = (10,) ?

Чому так. Імена без зірочки розбираються першими, тож a забирає 10, а зірочці лишається нуль елементів — і це цілком законний випадок, а не помилка. Зірочка завжди складає зібране у список, навіть коли праворуч був кортеж і навіть коли збирати нема чого: результат — [].
Питання 4 / 8

Чому a, b = b, a міняє значення місцями, а два окремі рядки a = b і b = a — ні?

Чому так. Присвоєння йде у два етапи: спершу обчислюється вся права частина (з неї пакується кортеж (2, 1)), і лише потім імена роздаються зліва направо. Старі значення вже лежать усередині кортежа, тому перезапис імені їх не губить. У наївному варіанті проміжного сховища немає: після a = b на одиницю не дивиться вже ніхто. Присвоєння при цьому не «одночасні» — вони строго послідовні, просто відбуваються після обчислення.
Питання 5 / 8

дані = ([1, 2], "текст"). Що зробить рядок дані[0].append(3) ?

Чому так. Незмінність кортежа діє лише на один рівень: зафіксовано набір посилань, а не обʼєкти на іншому кінці стрілок. дані[0].append(3) стрілку не чіпає взагалі — воно змінює сам список, тому id(дані[0]) лишається тим самим. А ось дані[0] = [9] — це вже спроба перевести стрілку, і саме вона дає TypeError.
Питання 6 / 8

Чому hash(([1],)) падає, хоч зовні це звичайний незмінний кортеж?

Чому так. Python бере відбиток кожного елемента й перемішує їх в одне число. Якщо хоч один елемент відбитка не має, рахувати нема з чого — тому кортеж хешований тоді й лише тоді, коли хешовані всі його елементи, на будь-якій глибині. Показово, що повідомлення каже unhashable type: ʼlistʼ, а не ʼtupleʼ: Python прямо називає винуватця всередині.
Питання 7 / 8

У програмі є пара координат, яку треба зробити ключем словника. Що з наведеного — справжня причина взяти саме кортеж, а не список?

Чому так. Це не питання зручності, а питання можливого й неможливого: hash([50.45, 30.52]) дає TypeError, і жодним трюком список ключем не стане. Решта варіантів — міфи: обхід у них однаковий (0.139 проти 0.153 с у замірах лекції), на тисячі елементів памʼять майже збігається (8056 проти 8040 байтів), а сортувати на місці кортеж якраз не вміє.
Питання 8 / 8

Точка = namedtuple("Точка", "широта довгота"); київ = Точка(50.45, 30.52). Що з цього НЕправда?

Чому так. namedtuple не створює новий тип даних — він робить різновид кортежа. Тому isinstance(київ, tuple) дає True, індексація, розпакування, порівняння й хеш працюють точно як у звичайного кортежа. Змінилося одне: до індексів додалися імена полів, і київ.широта читається краще за київ[0].