Защо функции
Проблем
Една промяна, три места
Пишеш програмата за касата на малък магазин. Всяка бележка започва с името на магазина и телефона му. Затова си копирал тези два реда навсякъде, където се печата бележка.
Магазинът сменя телефона си. Поправяш го на две места, а третото го пропускаш:
print("Квартален магазин")print("тел. 02 123 4567")print("Хляб 1,20 €")
print("Квартален магазин")print("тел. 02 123 4567")print("Мляко 2,10 €")
print("Квартален магазин")print("тел. 02 765 4321")print("Кафе 3,50 €")Квартален магазинтел. 02 123 4567Хляб 1,20 €Квартален магазинтел. 02 123 4567Мляко 2,10 €Квартален магазинтел. 02 765 4321Кафе 3,50 €Третият клиент получава бележка със стария номер. Колкото повече копия, толкова по-лесно е да пропуснеш едно.
Идеята
Пиши го веднъж, викай го по име
Сложи повтарящото се на едно място и му дай име. Това е функция: именуван блок код, който върши една работа.
Пишеш функцията веднъж. После, където ти трябва, пишеш само името ѝ със скоби: print_header(). Това се казва извикване на функцията.
Ако магазинът пак смени телефона, поправяш един ред във функцията, и всички бележки се оправят.
Виж го
Какво става при извикване
Програмата върви ред по ред. Когато стигне до извикване, тя влиза в функцията, изпълнява тялото ѝ и се връща точно след извикването. Следи топчето: то е мястото, до което е стигнала програмата.
def print_header(): print("Квартален магазин") print("тел. 02 123 4567")
print_header()print("Хляб 1,20 €")print_header()print("Мляко 2,10 €")Стъпка по стъпка, с думи
- def само записва функцията. Първият ред, който прави нещо, е print_header().
- Извикване: изпълнението отива във функцията.
- Функцията печата горната част на бележката.
- Отместените редове свършиха, значи и функцията: изпълнението се връща точно след извикването.
- Програмата продължава: печата хляба.
- Второ извикване: същият код, без да го пишем отново.
- Горната част се печата пак.
- Обратно в програмата и следващият ред.
Вторият път не пишеш горната част наново. Викаш същата функция и тя печата същите два реда.
Идеята
Как се пише функция
Ето цялата програма, за да се види къде стои функцията:
def print_header(): print("Квартален магазин") print("тел. 02 123 4567")
print_header()print("Хляб 1,20 €")Квартален магазинтел. 02 123 4567Хляб 1,20 €def(от define, „определи“) казва, че следва функция. Редът само я записва под име, а не я изпълнява.- Името казва какво прави функцията. Затова е глагол:
print_header,print_footer. В Python имената са с малки букви, а думите се свързват с долна черта. - Празните скоби значат, че функцията не получава нищо отвън. Ще ги напълним в следващия урок.
- Тялото са отместените с 4 интервала редове след двоеточието. Първият неотместен ред вече не е част от функцията.
- Функцията стои над редовете, които я извикват. Python чете файла отгоре надолу и трябва вече да я е видял.
- Около функцията има два празни реда. Програмата работи и без тях, но така се пише Python (ръководството PEP 8).
Пробвай
В какъв ред?
Какво ще отпечата програмата?
def print_thanks(): print("Благодарим ви!")
print("Поръчка №1024")print_thanks()print("Поръчка №1025")print_thanks()Функцията се изпълнява, когато бъде извикана, а не там, където е написана. Тук е извикан два пъти, затова „Благодарим ви!“ се печата два пъти, всеки път след своята поръчка.
Пробвай
Кое липсва?
Тази функция печата долната част на бележката. Какво трябва да пише на празното място?
print_footer():
print("Ще се радваме да ви видим отново.")def: така започва всяка функция.Пробвай
Намери грешката
Избери реда с грешката.
print_thanks(). Без тях само споменаваш функцията и тя не се изпълнява. Грешка няма, затова такъв пропуск се хваща трудно: гледай изхода.Упражнение
Бележката и триъгълникът
Реши задачите в редактора си. За всяка има примерен изход, с който да сравниш своя.
1. Бележка. Напиши три функции:
print_line()печата ред от 20 тирета с цикъл;print_header()печата името на магазина, телефона и линията;print_footer()печата линията и „Благодарим ви!“.
Под тях отпечатай две бележки: горна част, един ред с покупка, долна част.
Квартален магазинтел. 02 123 4567--------------------Хляб 1,20 €--------------------Благодарим ви!Квартален магазинтел. 02 123 4567--------------------Мляко 2,10 €--------------------Благодарим ви!2. Триъгълник. Напиши функция print_triangle(), която с вложени цикли извежда триъгълник от звездички с височина 4:
* *** ************В следващия урок височината ще стане параметър: една функция за триъгълник с каквато височина поискаш.
Тест