15: Дефинисање функција (def)


У овој лекцији ћемо научити да, осим уграђених функција, можемо и сами да дефинишемо функције! Функције помажу да програм буде краћи, боље организован, користе се обично када се у програму више пута треба написати један те исти код, па је много боље нашисати га једном, у функцији, и онда је позивати по потреби.



Дефинисање функције:

Почећемо са примером: сећате ли се уграђене функције abs? Она има један аргумент (број x), и враћа његову апсолутну вредност (која је x када је x ≥ 0, и -x када је x < 0). Начин дефинисања такве функције у Python-у је следећи:

def abs(x):     #definisanje funkcije po imenu 'abs' sa jednim argumentom 'x'

if x >= 0:    #telo funkcije pocinje ovde
  return x

else:
  return -x   #telo funkcije se zavrsava ovde


Прва линија дефинисане функције садржи име функције и аргументе функције. Синтакса је следећа:
def «ime-funkcije»(«lista-argumenata»):

У малопређашњем примеру, abs је било име функције, а листа аргумената је садржала један аргумент, х. То се зове листа аргумената зато што ту може бити и више параметара, не мора да буде само један. Такође, функција може бити и без параметара. Аргументи су улаз функције.

Све после прве линије дефинисања функције је тело функције. Тело је увучени блок кода. Кад год се позове функција, њејно тело се изврши (са одговарајућим аргументима). Када у телу функције наиђемо на ред:

return «vrednost»,

функција престаје са радом и враћа «vrednost» као излаз. return (повратна) вредност је излаз функције. Као што видимо у abs примеру, тело може да садржи и више return команди, али ће само прва таква команда на коју програм наиђе бити извршена, пошто ће одмах после тога функција да престане са радом.

Пример: дефинисање и позивање функције
Следећи програм садржи дефиницију функције као и још неке команде.

Видимо да je име функцијe kvadrat, да постоји само један аргумент х, и да се тело функције састоји од само једне линије, return  k * k. Затим ван функције имамо две команде, које позивају функцију укупно три пута.
Имајте на уму да се додељује посебан део радног простора (меморије)  сваки пут када се функција позива. Једном када функција врати повратну вредност, више није потребан тај радни простор, тако да се  он брише.


Овде је објашњење свих корака:

1. Када се  прва линија кода у главном програму изврши, Python  позива kvadrat (10). Python прослеђује улазне аргументе (у овом случају један аргумент, 10) у функцију, и функција креће са извршавањем. Изврши се линија кода return x*x, а х је једнако 10, пошто је х улазни параметар. Функција враћа број 100 као повратну вредност, и она се у главном програму одштампа.

2. Када се изврши друга линија кода, Python  извршава kvadrat(kvadrat(2)). Прво се извршава унутрашњи део, kvadrat(2). Функција креће са извршавањем узимајући да је х=2, пошто је то прослеђени параметар из главног програма, и функција враћа 4. Затим се извршава спољни део линије. Пошто kvadrat(2) даје 4, сада се позива kvadrat(4). Сада функција враћа 16, и то се одштампа.

Четири најчешће грешке

Једна честа грешка која се прави када се дефинише функција је да се заборави да се напише return команда.

Пример: Грешка 1: заборављање return команде

Kao што видимо, ако у телу не постоји return команда, онда функција не враћа ништа (None). Тако да, ако вам програм не ради зато што функција враћа None, проблем је често у томе што у функцији није извршена return команда.

Може да се деси да намерно  изоставите команду return. То има смисла радити ако желите да ваша функција треба да има неки учинак који нема везе са return командом, нпр. ако само штампамо нешто.

Пример: без return команде.

 

Још једна честа грешка је да се заборави да се увлачи код када је то потребно. Што изазива грешку увлачења (IndentationError).

Пример: грешка 2: заборављање увлачења

 

Позивањем функције са премало или превише аргумената се добија грешка.

Пример: грешка 3: позив са превише аргумената

 

Такође, неретко се дешава и грешка у куцању.

Пример: грешка 4: погрешно име функције


Вежба кодирања: Куб
Дефинисати функцију kub(n), која као улаз има број n, а излаз је куб тог броја (n × n × n).
Унесите код за тестирање као што је print(myfunction("test argument")) испод.

 

Два или више аргумената

1

Функције које смо помињали малопре су имале само један аргумент, али функција може да има било који број аргумената. На пример, функцију input() позивамо са 0 аргумената.
Ево примера са два аргумента, из области геометрије. Треба дефинисати функцију која рачуна површину троугла, за дату дужину основице и њену висину. Образац за површину је:
povrsina = osnovica × visina / 2

 

Да поновимо да је различита ствар кад се функција дефинише и кад се функција извршава. Тело функције се не извршава све док се не позове функција.

Сада ћемо написати функцију која има два аргумента(параметра) која представљају дужине страница правоугаоника, и рачуна обим правоугаоника. Образац за обим правоугаоника је:

obim = 2  × visina + 2 × duzina

Вежба кодирања: Обим правоугаоника
Дефинисати функцију obimPravougaonika(sirina, visina) која израчунава обим правоугаоника.
Унесите код за тестирање као што је print(myfunction("test argument")) испод.

 


Функција позива функцију

Функције су градивни блокови добро написаних великих програма, јер се помоћу њих исти задатак може урадити више пута без писања истог кода више пута. Исти код се може користити више пута. Следи пример у којем се креира једна функција, и користи се у другој некој функцији.

 

Сада ћемо објаснити концепт опсега променљиве. Могуће је да имамо две променљиве које су различите, али које имају исто име,  ако имају различит опсег (scope).

 

Kад год се извршава код у функцији, не може се утицати на променљиве дефинисане ван функције, оне се не мењају. Уместо тога, свака команда које додељује вредност променљивама утиче само на "локалну" променљиву  која је "унутар" функције. Разлог због којег Python и већина других језика, ради овако је то што чини да је много једноставније да се пишу дуги програми са мноштвом функција. Дакле, када  дефинишемо нову функцију, увек нам је дозвољено да користимо  било која имена променљивих унутар функције, чак и ако већ постоји негде другде променљива са тим именом.

Вежба вишеструког избора: Унутрашњи и спољашњи
Који је излаз следећег програма?

x = "spoljasnji"
def xZamena(vrednost):
x = vrednost
xZamena("unutrasnji")
print(x)
Тачно!

Постоје ситуације у којима желимо да користимо исту променљиву и у главном програму и у функцији. Таква променљива се назива глобална променљива. То се ради на начин као у следећем примеру: променљива се дефинише на почетку програма, да би функција могла да је "види".

Пример: коришћење глобалне променљиве



Функција у себи не садржи променљиву са именом omiljenaPica, али опет није дошло до грешке у програму. Зато што у том случају, Python гледа да ли променљива са таквим именом постоји у главном програму (локалном опсегу).