Додатна упутства функцији¶
Поменули смо да постоји неколико начина писања функција у Пајтону, а да су функције које смо до сада писали и користили најпростијег облика. Такве су на пример функције napred(), levo(), desno() , uzmi() и ostavi() из библиотеке Карел, као и функције nazad(), uzmi_na_susednom_polju() и na_neprazno_susedno_polje(), које смо сами писали. Све ове функције обављају неки конкретан посао, увек на исти начин.
Функције могу да се пишу и тако да у различитим извршавањима не раде увек сасвим исту ствар, него да обављају мало општији задатак. За такве функције ми при њиховом позивању прецизније наводимо како тачно желимо да се задатак обави. На пример, често би могла да нам буде корисна функција која би померила Карела за неки број поља напред или назад. За ту функцију желимо да при њеном позивању прецизирамо захтев - за колико поља Карел треба да се помери и на коју страну.
Функције са параметрима¶
Додатне информације које дајемо функцији пишу се између заграда после имена функције, у првом реду њене дефиниције. Између заграда можемо да наведемо једну вредност, или више вредности раздвојених зарезима. Те вредности се називају аргументи функције, или параметри функције. Речи „аргументи” и „параметри” су у програмирању синоними и користићемо их равноправно.
Функција која помера Карела за задати број поља напред или назад, могла би да се зове idi и да има један параметар, чија вредност је цео број. Ако је тај параметар позитиван, Карел би се померио толико поља напред, а ако је негативан, Карел би ишао одговарајући (супротан) број поља назад. На пример, позив idi(5) би значио „иди 5 поља напред”, док би idi(-2) значио „иди 2 поља назад”. Ево како можемо да напишемо такву функцију:
Ова функција може да поједностави многе програме у којима Карел треба да више пута иде дуж једног ходника на једну и другу страну. Следи пример.
Обави задата премештања¶
Карел се налази на почетном пољу ходника довољне дужине, а треба да обави следећа премештања лоптица:
3 лоптице са поља 3 на поље 4
4 лоптице са поља 5 на поље 1
При решавању овог задатка користићемо описану функцију idi. Да бисмо додатно поједноставили програм, можемо да уведемо и функцију premesti, која премешта задати број лоптица за задати број поља напред или назад. Из овог описа се види да функција premesti треба да има два аргумента.
Да би било јасније чему служи који аргумент, даћемо им имена која описују њихову улогу:
Функција premesti користи при свом извршавању раније написану функцију idi. Овакви позиви функције из друге функције могу ићи у дубину колико год нам је потребно. Важно је једино да да свака функција буде дефинисана пре него што је позовемо на извршење.
Сада, када имамо на располагању ове две функције, решавање полазног задатка је врло лако:
(Karel_functions__displace_balls)
Задаци за вежбу¶
Узми задати број лоптица¶
Написати функцију uzmi_do(n), којом Карел са поља на коме се налази узима највише n лоптица. Прецизније, ако је на пољу n или више лоптица, Карел их узима n, а ако има мање лоптица, Карел узима онолико лоптица колико их има.
Потребно је да Карел, који се налази на првом пољу, узме са другог поља до 4 лоптице, са трећег до 2, а са четвртог до 3 лоптице, а затим да све прикупљене лоптице донесе на прво поље. Наравно, за то треба користити функцију uzmi_do(n), написану у првом делу задатка.
(Karel_functions__take_balls_up_to)
Вожња по упутствима¶
Дате су функције na_raskrsnici_nalevo() и skreni_levo(n).
Функција na_raskrsnici_nalevo() поставља Карела да гледа у прву улицу са леве стране на коју наиђе. При извршавању ове функције, Карел иде напред док не дође до поља на коме може да иде лево, и остаје на том пољу окренут на лево. Ако пре позива функције са Карелове леве сране постоји поље, он се током рада ове функције неће ни померати са свог поља, него ће се само окренути на лево;
Функција skreni_levo(n) уводи Карела једно поље у n-ту улицу са леве стране. Ако је Карел већ у раскрсници, улица лево од њега се броји као прва;
Написати функције na_raskrsnici_nadesno() и skreni_desno(n) по угледу на дате.
Написати програм који (помоћу датих и написаних функција) води Карела у трећу улицу лево, затим другу десно, и на крају другу лево. Карел треба да дође до краја те улице и да узме једину лоптицу на табели.
(Karel_functions__travel_instructions_1)