Функције у Пајтону
Интерактивна лекција за све који нису били на часу или желе да утврде градиво: шта је функција, како се декларише и позива, позив у петљи, функција која тражи унос од корисника и функције са параметрима. Сваки корак има вежбе које пишеш и покрећеш директно на овој страници.
Свака вежба има поље за код. Дугме Покрени (или Ctrl + Enter) извршава твој код и приказује шта програм исписује. Дугме Провери тестира решење, и то не само на примеру који видиш, већ и на скривеном, па решење мора да ради за било коју вредност. Помоћ даје наговештај, а Решење показује тачан код. Пробај прво сам.
Пајтон се учитава у прегледачу при отварању странице (потребан је интернет, први пут траје неколико секунди). Напредак се чува у овом прегледачу.
Шта је функција
Функција је део кода који има своје име и обавља један задатак. Напишемо је једном, а онда је позивамо по имену кад год нам затреба, колико год пута хоћемо.
Функције већ знаш, само их ниси ти писао: print(), input(), len(), float(), range(). Неко их је написао уместо нас, а ми их само позивамо. Сада учимо да правимо своје функције.
Не понављамо код
Ако исти посао треба урадити пет пута, не пишемо исти код пет пута, већ пет пута позовемо функцију.
Измена на једном месту
Ако треба нешто да се промени, мењамо само функцију, а сва места која је позивају аутоматски добијају измену.
Прегледан програм
Програм је подељен на делове са смисленим именима (poruka, kvadrat), па се лакше чита.
Декларација и позив функције
Функција се декларише (дефинише) речју def. Први ред функције има четири обавезна дела:
Испод првог реда долази тело функције: наредбе које функција извршава. Сви редови тела су увучени 4 размака. По томе Пајтон зна шта припада функцији, исто као код for и if.
#Funkcija
def poruka():
print("Dobrodosli u ETS Nikola Tesla Pancevo")
#Algoritam
poruka()
Функцију позивамо тако што напишемо њен назив и заграде: poruka(). Тек тада се извршава код у њој.
def poruka(): само каже Пајтону: „запамти да постоји функција poruka и шта ради“. Ако функцију никад не позовеш, програм неће исписати ништа. И још нешто: функција мора да буде дефинисана пре првог позива. Ако је позовеш изнад def, добијаш грешку NameError.#Funkcija), а испод њих део програма који их позива (коментар #Algoritam). Назив функције пишемо малим латиничним словима, без размака, и бирамо га тако да каже шта функција ради.Задатак 1: порука пет пута
Позивање функције у петљи
Пет истих редова poruka() раде, али шта ако поруку треба приказати 100 пута? Ту нам помаже for петља коју смо већ радили: тело петље се понавља онолико пута колико кажемо у range().
for i in range(5):
poruka() # poziva se 5 puta: za i = 0, 1, 2, 3, 4
Позив poruka() је увучен, па припада петљи и понавља се. Променљиву i овде не користимо. Она само броји кругове петље.
Задатак 2: исто, али петљом
Функција која тражи унос: input()
У тело функције можемо да ставимо било шта што смо до сада учили: input(), рачунање, if, петље. Функција испод пита корисника за име, па га исписује.
def ime():
unos = input("Unesi svoje ime: ")
print(unos)
ime()
Променљиве унутар функције
Променљива која настане у функцији (овде unos) постоји само док се функција извршава. Кад функција заврши, та променљива нестаје, па изван функције не можемо да је користимо. Покрени код испод и погледај грешку.
Параметри и аргументи
Функција poruka() увек ради потпуно исто. Често нам треба функција која ради исти посао, али са различитим вредностима: на пример, рачуна обим и површину квадрата за било коју страницу. Зато у заграде пишемо параметар.
| Појам | Где се налази | Пример |
|---|---|---|
| Параметар | у заградама код def; име променљиве | def kvadrat(stranica): |
| Аргумент | у заградама при позиву; вредност која се шаље | kvadrat(4) |
При позиву kvadrat(4) параметар stranica добија вредност 4, као да смо на почетку функције написали stranica = 4. При позиву kvadrat(5) иста функција ради са stranica = 5.
Изабери вредности за два позива, па иди кораком „Напред“. Обрати пажњу на то где програм скаче при позиву функције и шта се дешава са променљивама кад функција заврши.
Променљиве унутар функције
Испис програма
stranica ** 2 значи „stranica на квадрат“, исто као stranica * stranica. А пошто input() увек враћа стринг, унету страницу претварамо у број са float(), који прихвата и децималне бројеве (2.5). Зато ће у испису писати 16.0, а не 16.Задатак 4: обим и површина квадрата
kvadrat(4), kvadrat(5) и kvadrat(6) стављени између """ и """. Тако постају коментар и не извршавају се. То је згодно док тестираш: пробне позиве не бришеш, само их искључиш, а програм ради са унетом вредношћу.Функција са више параметара
Функција може да има више параметара, одвојених зарезом. Правоугаонику требају две странице, па функција има два параметра:
def pravougaonik(a, b):
obim = 2 * (a + b)
povrsina = a * b
print(f"Obim je {obim}")
print(f"Povrsina je {povrsina}")
pravougaonik(3, 5) # a = 3, b = 5
- Аргументи се додељују параметрима по редоследу: први аргумент први параметар, други други.
- Број аргумената у позиву мора да буде једнак броју параметара. Позив
pravougaonik(3)даје грешкуTypeError. - У решењу са часа и променљиве изван функције зову се
aиb. То је случајност, а не правило: позив би радио исто и саpravougaonik(x, y)илиpravougaonik(3, 5).
Задатак 5: обим и површина правоугаоника
Преглед: шта смо научили
| Шта | Запис | Пример |
|---|---|---|
| Декларација функције | def naziv(): | def poruka(): |
| Тело функције | редови увучени 4 размака | print("Dobrodosli") |
| Позив функције | naziv() | poruka() |
| Позив више пута | for i in range(n): | for i in range(5): poruka() |
| Функција са параметром | def naziv(parametar): | def kvadrat(stranica): |
| Позив са аргументом | naziv(vrednost) | kvadrat(4), kvadrat(a) |
| Више параметара | def naziv(p1, p2): | pravougaonik(3, 5) |
| Степеновање | x ** n | stranica ** 2 |
| Унос децималног броја | float(input(...)) | a = float(input("Unesite stranicu:")) |
Честе грешке
| Грешка | Шта се деси | Поправка |
|---|---|---|
| Функција дефинисана, а није позвана | програм не испише ништа | испод дефиниције додај naziv() |
Позив без заграда: poruka | функција се не извршава | увек пиши заграде: poruka() |
Нема двотачке иза def poruka() | SyntaxError | def poruka(): |
| Тело није увучено | IndentationError | увуци редове тела 4 размака |
Позив изнад def | NameError | прво дефиниши, па позови |
| Погрешан број аргумената | TypeError | онолико вредности колико има параметара |
| Променљива из функције коришћена изван ње | NameError | користи је само унутар функције |
def naziv():, а тело јој је увучено.2.
def само памти функцију; код у њој се извршава тек на позив naziv().3. Функција мора бити дефинисана пре него што је позовемо.
4. Параметар је променљива у заградама код
def; аргумент је вредност коју шаљемо при позиву.5. Аргументи иду параметрима по редоследу, и мора их бити исто толико.
Провера знања
Без покретања кода: шта ће се десити?