Файл починається з рядка print("старт"), далі йде def привітати(): print("привіт"), а потім рядок print("кінець"). Виклику функції в файлі немає. Що зʼявиться на екрані?
def не виконує тіло: він лише створює обʼєкт-функцію й чіпляє на нього ярлик. Тіло чекає першого виклику, а виклику немає — тому «привіт» не зʼявиться ніколи. Варіант із трьома рядками — найпоширеніша помилка: здається, що def «запускає» функцію.Функція сума_B(a, b) містить єдиний рядок print(a + b). Що буде в імені y після рядка y = сума_B(2, 3)?
print малює текст на екрані для людини, а програмі не віддає нічого. Функція без return повертає None — конкретний обʼєкт типу NoneType. Число 5 на екрані ти побачиш, але воно вже пішло у вивід: у y лежить None, і y * 2 впаде з TypeError.У лекції функція знижка(сума) має три рядки return: 0.0 при сумі менше 200, 0.05 при сумі менше 500 і 0.10 останнім рядком. Скільки рядків тіла НЕ виконається при виклику знижка(100)?
return — і функція завершилась негайно. Три рядки нижче (друга перевірка, її return і останній return) не виконаються взагалі. Саме це й означає «return виходить одразу», а не «наприкінці».З функції знижка(сума) прибрали останній рядок return 0.10, решту лишили без змін. Що поверне виклик знижка(700)?
return виконання не дійшло — і функція мовчки повертає None. Помилки не буде: вона вилізе значно пізніше, коли хтось спробує це None помножити. Тому гілка без return — тиха, а не голосна поломка.Функція підсумок(ціна, кількість) щойно викликала всередині себе функцію вартість(ціна, кількість), і та ще не завершилась. Що зараз на стеку викликів?
підсумок нікуди не дівається: він заморожений на середині свого рядка, а зверху лягає кадр вартість. Разом із кадром самої програми (<module>) виходить три. Коли верхній поверне значення, він зникне, і виконання продовжиться рівно з того місця, де перервалось.Функцію оформити переписали з вкладених if на ранню відмову: кожну умову перевернули й одразу вийшли через return. Що зміниться в поведінці?
Після рядка порахувати = вартість (без дужок!) виконали del вартість. Що станеться при виклику порахувати(28.5, 2)?
del зняв перший. Обʼєкт живий, доки на нього вказує хоч одне імʼя, тому виклик через порахувати працює як працював. NameError дасть звертання до вартість — саме імені більше немає.Чому чисту функцію легше перевірити, ніж функцію, яка друкує чек?
assert підсумок(28.5, 2) == 51.3. Щоб перевірити функцію, яка тільки друкує, довелось би перехоплювати вивід: повертає вона None, і порівнювати нема з чим. Звідси й правило «розрахунок окремо, друк окремо».