Дефинисање функција¶
У делу посвећеном управљању Карелом смо поменули да групу наредби можемо да издвојимо у засебну целину, која се зове функција. Подсетимо се како у општем случају изгледа функција написана на Пајтону:
За писање функција на Пајтону важе следећа правила:
Правила писања функције:
Дефнииција функције почиње речју
def
, иза које следи име функције, листа аргумената у заградама и знак:
(двотачка) на крају реда.Као ime_funkcije може да се појави било које правилно написано име (правила су иста као за имена променљивих).
Као lista_argumenata може да се појави празна листа (ништа) ако функција не користи аргументе, или један или више аргумената раздвојених зарезима.
У телу функције (naredba_1, … naredba_k) могу да се појаве било које наредбе језика Пајтон. Ове наредбе се пишу увучено у односу на ред који садржи име и аргументе функције.
Функције могу а не морају да врате неку вредност. До сада смо имали прилике да видимо и једну и другу врсту функција. На пример, функције помоћу којих се робот Карел помера напред, окреће, узима и оставља лоптице су све функције које не враћају вредност. Са друге стране, математичке функције попут abs или round, као и функције помоћу којих проверавамо да ли Карел има лоптица код себе, да ли има лоптица на пољу и да ли Карел може да иде напред су функције које враћају вредност.
Писање функција које враћају вредност¶
Да би нека функција вратила вредност, потребно је да се у телу функције бар једном наведе наредба return
. Наредба return
се састоји од речи return иза које следи израз чију вредност функција треба да врати.
Наредба return може да се појави на више места у функцији (обично са различитим вредностима), а обавезно се наводи на крају тела функције. Функција abs, да није уграђена, могла је бити дефинисана овако:
Функција може да врати и више од једне вредности. Таква је, на пример, уграђена функција divmod, која враћа два броја - резултат целобројног дељења и остатак. Функцију divmod користимо исто као и функције које враћају једну вредност, само враћене вредности смештамо у више променљивих:
Када пишемо функције које враћају више вредности, довољно је да после речи return наведемо вредности које враћамо, раздвојене зарезима. Када би требало да сами дефинишемо функцију divmod, могли бисмо да је напишемо овако:
Пример¶
Пример - кречење:
За кречење \(1м^{2}\) зида потребно је око \(0.5кг\) боје. Написати функцију која као аргументе прихвата следећа 4 аргумента:
дужину собе
ширину собе
висину собе
дужину која се не кречи (збирна ширина врата, прозора, плакара и слично)
Функција треба да врати количину боје (у килограмима), потребне за кречење зидова и плафона.
После фунцкције написати и програм који учитава податке за 5 различитих просторија, а затим користећи написану функцију израчунава и исписује укупну количину потребне боје за кречење свих пет просторија.
Задаци за вежбу:¶
Задатак - Географске координате у облику за GPS
Нашли сте стару мапу закопаног блага и са ње очитали координате блага у степенима, минутима и секундама, али ваш GPS уређај подржава само географске координате као реалне бројеве степени.
Напишите програм који за дату координату у степенима, минутима и секундама исписује реалан број степени.
Програм је скоро сасвим написан. Потребно је још додати израз за рачунање реалног броја степени. Да бисмо (угловне) минуте претворили у степене, делимо их са \(60\), а секунде претварамо у степене дељењем са \(60 \cdot 60 = 3600\).
Задатак - Географске координате у облику за стару мапу
Пошто сте схватили да је стара мапа из претходног задатка била нечија шала, решили сте да и ви некоме приредите сличну шалу. Изабрали сте место у близини и очитали координате са вашег GPS уређаја. Сада вам је потребно да координате са уређаја у реалним степенима претворите у целе степене, минуте и секунде, да бисте направили одговарајућу „стару” мапу.
Довршите започети програм који обавља ово претварање.
Задатак - Водоинсталатер:
Петар је водоинсталатер и за данас има планиране три интервенције. Петар ће за сваку интервенцију забележити када је почела и када се завршила, а на основу тих података треба израчунати колико времена је Петар укупно провео у интервенцијама.
Дат је делимично написан програм који учитава време почетка и завршетка у сатима и минутима за сваку Петрову интервенцију, а затим одређује и исписује укупно време трајања свих интервенција.
Допуните програм тако што ћете написати функцију trajanje(h1, m1, h2, m2), која израчунава колико укупно минута протекне од h1 сати и m1 минута до h2 сати и m2 минута;
Функције које не враћају вредност¶
Функције које не враћају вредност само обављају неки посао и користимо их као наредбе. Такве су на пример биле функције nazad() или uzmi_na_susednom_polju(), које смо писали у делу посвећеном Карелу. Следе примери таквих функција у програму са текстуалним интерфејсом.
Пример - превоз:
Члановима четворочлане породице је потребно редом 55, 35, 40 и 20 минута да стигну кући са места на којима се налазе, под условом да крену кући пре 16 часова. У противном им треба 15 минута више.
Написати програм који учитава време поласка у сатима и минутима за сваког члана породице и исписује време стизања кући.
Функција obradi_clana_porodice обавља све потребне радње за једног члана породице: учитава време поласка, на основу тог времена продужава трајање пута ако је потребно, израчунава и исписује време стизања кући. У главном програму је преостало само да се ова функција позове за сваког члана породице.
Задаци за вежбу:¶
Задатак - попуст:
Један произвођач нуди робу по цени од 100 динара за комад, а за поруџбине од 50 и више комада одобрава попуст од 10%. Неколико купаца се најавило да долазе да купе одређени број комада. Имена купаца и тражене количине су дати на почетку програма.
Написати функцију која за дато име купца и количину робе исписује колико тај купац треба да плати.
Име купца се овде прослеђује функцији само ради исписивања. Цена робе се рачуна на основу количине, која се прослеђује фукнцији као други аргумент.
Задатак - подвлачење текста:
Написати функцију podvuci(tekst), која задати текст приказује подвучено.
Помоћ: Функција podvuci треба да се састоји од само две print наредбе. У првој се исписује дати текст, а у другој линија. Стринг који садржи линију можете да добијете множењем стринга '-'
дужином датог стринга.
Поменимо на крају неке од користи које имамо од писања функција, које овде због краткоће наших примера и задатака нису могле да дођу до изражаја:
Функције се у дугачким програмима често користе да растерете главни део програма и учине га краћим и лакшим за разумевање. Наши програми нису толико дугачки да би било потребно растерећивати главни део прорама, али показују како би то могло да се уради и са дужим програмима.
Функције могу да нам помогну да избегнемо понављање истог или сличног кода у програмима. Понављање кода треба избегавати јер се такав код теже одржава - сваку измену треба унети на више места, што је заморно и подложно грешкама и пропустима.
Када пишемо функције, омогућавамо другима да лакше употребе делове нашег кода. Написане функције се могу издвојити у посебан модул, који други програмери лако укључују у своје програме.
Код веома великих програма, формирањем функција омогућавамо да се програм распореди у више фајлова, уместо једног огромног и непрегледног фајла.