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

Функції

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

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

Файл починається з рядка print("старт"), далі йде def привітати(): print("привіт"), а потім рядок print("кінець"). Виклику функції в файлі немає. Що зʼявиться на екрані?

Чому так. Рядок def не виконує тіло: він лише створює обʼєкт-функцію й чіпляє на нього ярлик. Тіло чекає першого виклику, а виклику немає — тому «привіт» не зʼявиться ніколи. Варіант із трьома рядками — найпоширеніша помилка: здається, що def «запускає» функцію.
Питання 2 / 8

Функція сума_B(a, b) містить єдиний рядок print(a + b). Що буде в імені y після рядка y = сума_B(2, 3)?

Чому так. print малює текст на екрані для людини, а програмі не віддає нічого. Функція без return повертає None — конкретний обʼєкт типу NoneType. Число 5 на екрані ти побачиш, але воно вже пішло у вивід: у y лежить None, і y * 2 впаде з TypeError.
Питання 3 / 8

У лекції функція знижка(сума) має три рядки return: 0.0 при сумі менше 200, 0.05 при сумі менше 500 і 0.10 останнім рядком. Скільки рядків тіла НЕ виконається при виклику знижка(100)?

Чому так. Перша умова істинна, спрацював перший return — і функція завершилась негайно. Три рядки нижче (друга перевірка, її return і останній return) не виконаються взагалі. Саме це й означає «return виходить одразу», а не «наприкінці».
Питання 4 / 8

З функції знижка(сума) прибрали останній рядок return 0.10, решту лишили без змін. Що поверне виклик знижка(700)?

Чому так. Обидві умови хибні, до жодного return виконання не дійшло — і функція мовчки повертає None. Помилки не буде: вона вилізе значно пізніше, коли хтось спробує це None помножити. Тому гілка без return — тиха, а не голосна поломка.
Питання 5 / 8

Функція підсумок(ціна, кількість) щойно викликала всередині себе функцію вартість(ціна, кількість), і та ще не завершилась. Що зараз на стеку викликів?

Чому так. Кадр — це коробочка з параметрами й локальними іменами одного виклику. Кадр підсумок нікуди не дівається: він заморожений на середині свого рядка, а зверху лягає кадр вартість. Разом із кадром самої програми (<module>) виходить три. Коли верхній поверне значення, він зникне, і виконання продовжиться рівно з того місця, де перервалось.
Питання 6 / 8

Функцію оформити переписали з вкладених if на ранню відмову: кожну умову перевернули й одразу вийшли через return. Що зміниться в поведінці?

Чому так. Рання відмова — це зміна форми, а не сенсу: на всіх восьми комбінаціях трьох умов обидві версії дають однакову відповідь (в інтерактиві 6 це видно на кожній). Виграш в іншому: замість чотирьох рівнів відступу лишається два, кожна перевірка стоїть поруч зі своєю відмовою, а «щасливий шлях» — останнім рядком без відступу.
Питання 7 / 8

Після рядка порахувати = вартість (без дужок!) виконали del вартість. Що станеться при виклику порахувати(28.5, 2)?

Чому так. Функція — звичайний обʼєкт, а імʼя — ярлик на нього, точно як у темі 03. Присвоєння без дужок додало другий ярлик, а del зняв перший. Обʼєкт живий, доки на нього вказує хоч одне імʼя, тому виклик через порахувати працює як працював. NameError дасть звертання до вартість — саме імені більше немає.
Питання 8 / 8

Чому чисту функцію легше перевірити, ніж функцію, яка друкує чек?

Чому так. Чиста функція на однакових аргументах завжди повертає однакове й нічого не змінює поза собою — тому перевірка зводиться до assert підсумок(28.5, 2) == 51.3. Щоб перевірити функцію, яка тільки друкує, довелось би перехоплювати вивід: повертає вона None, і порівнювати нема з чим. Звідси й правило «розрахунок окремо, друк окремо».