Към съдържанието
wannacode

Защо функции

Проблем

Една промяна, три места

Пишеш програмата за касата на малък магазин. Всяка бележка започва с името на магазина и телефона му. Затова си копирал тези два реда навсякъде, където се печата бележка.

Магазинът сменя телефона си. Поправяш го на две места, а третото го пропускаш:

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 €")
Стъпка по стъпка, с думи
  1. def само записва функцията. Първият ред, който прави нещо, е print_header().
  2. Извикване: изпълнението отива във функцията.
  3. Функцията печата горната част на бележката.
  4. Отместените редове свършиха, значи и функцията: изпълнението се връща точно след извикването.
  5. Програмата продължава: печата хляба.
  6. Второ извикване: същият код, без да го пишем отново.
  7. Горната част се печата пак.
  8. Обратно в програмата и следващият ред.

Вторият път не пишеш горната част наново. Викаш същата функция и тя печата същите два реда.

Идеята

Как се пише функция

Ето цялата програма, за да се види къде стои функцията:

shop.py
def print_header():
print("Квартален магазин")
print("тел. 02 123 4567")
print_header()
print("Хляб 1,20 €")
Изход
Квартален магазин
тел. 02 123 4567
Хляб 1,20 €
def„ето функция“print_headerиме()не получава нищо:тялото следва
  • 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("Ще се радваме да ви видим отново.")

Пробвай

Намери грешката

Програмата тръгва, но печата само „Поръчка №1024“, без „Благодарим ви!“. На кой ред е грешката?

Избери реда с грешката.

Упражнение

Бележката и триъгълникът

Реши задачите в редактора си. За всяка има примерен изход, с който да сравниш своя.

1. Бележка. Напиши три функции:

  • print_line() печата ред от 20 тирета с цикъл;
  • print_header() печата името на магазина, телефона и линията;
  • print_footer() печата линията и „Благодарим ви!“.

Под тях отпечатай две бележки: горна част, един ред с покупка, долна част.

Примерен изход
Квартален магазин
тел. 02 123 4567
--------------------
Хляб 1,20 €
--------------------
Благодарим ви!
Квартален магазин
тел. 02 123 4567
--------------------
Мляко 2,10 €
--------------------
Благодарим ви!

2. Триъгълник. Напиши функция print_triangle(), която с вложени цикли извежда триъгълник от звездички с височина 4:

Примерен изход
*
***
*****
*******

В следващия урок височината ще стане параметър: една функция за триъгълник с каквато височина поискаш.

Тест

Провери се

1. Кога се изпълнява кодът в тялото на функция?
2. Какво прави редът def print_thanks():?
3. Методът е извикан на три места. Колко пъти е написан кодът му?
4. Къде трябва да е def print_thanks(): спрямо print_thanks()?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·