Час 9 - Коришћење и дефинисање функција¶
Уграђене функције¶
Појам функције¶
Функције су један од основних појмова математике и програмирања. Оне представљају пресликавања одређених улазних вредности (каже се параметара, аргумената) у једну или више излазних вредности тј. резултата. На пример, функција може да као улазни параметар добије дужину странице једнакостраничног троугла \(а\) и да као резултат врати дужину обима тог троугла \(3\cdot a\). Таква зависност би се у математици описала као \(f(a) = 3\cdot a\) што значи да функција коју смо назвали f (што је најчешће име за функцију) на основу датог параметра \(а\) одређује вредност \(3\cdot a\). Слично, функција која израчунава обим правоугаоника на основу дужине његових страница би се у математици описала као \(g(a, b) = 2\cdot a + 2 \cdot b\). У овом случају је функцији дат назив \(g\), она има два улазна параметра (\(a\) и \(b\)) и враћа резултат који је одређен формулом \(2\cdot a + 2 \cdot b\).
Касније ћемо видети како можемо дефинисати функције у језику Python, а започетак ћемо се само позабавити коришћењем неких основних уграђених функција (оне су већ дефинисане језиком и можемо их слободно користити тј. позивати у нашим програмима). У наставку ћемо детаљније описати следеће функције:
min
,max
- минимум и максимумabs
- апсолутна вредностmath.pow
,math.sqrt
- степен, квадратни коренround
,math.floor
,math.ceil
- заокругљивање реалних бројева
Минимум и максимум¶
У многим задацима потребно је одредити мањи или већи од два дата
броја. Пошто је тај задатак веома чест, програмски језик Python нуди
решење у виду функција min
и max
. На пример, вредност израза
min(2, 5)
је мањи од бројева 2 и 5 тј. број 2 (тај израз
представља позив функције min
са аргументима 2
и 5
), док
је вредност израза max(2, 5)
већи од бројева 2 и 5 тј. број 5 (тај
израз представља позив функције max
са аргументима 2
и 5
).
Вредност израза min(24, 17)
је
- 2
- Тачно!
- 3
- min означава мањи од два броја.
- 5
- min означава мањи од два броја.
Q-7: Која је вредност израза min(min(5, 2), 3)
?
Минимум и максимум неколико бројева могуће је израчунати тако што се
сви наведу као параметри функција min тј. max. На пример, вредност
израза max(3, 2, 5, 4)
је 5
.
Покажимо сада неколико задатака у чијем нам решењу ове функције могу помоћи.
Већа оцена¶
Љубица је једног дана добила оцену из биологије и географије. Која је већа оцена коју је Љубица добила тог дана?
Највећи број поена у игрици¶
Асмир, Снежа и Мица су играли игрицу на рачунару. Колики је највећи број поена (high-score) који је освоји неко од њих.
Браћа и књиге на полици¶
Аљоша и Борис су браћа која иду у трећи и шести разред и деле исту собу. У соби имају две полице за књиге, међутим, књиге су им се измешале и они желе да их раздвоје тако да на једној полици буду само Аљошине књиге за трећи, а на другој полици буду само Борисове књиге за шести разред (свеједно им је која ће полица бити чија). Колики је најмањи број књига које треба да помере?
Приметимо да постоје два начина да се књиге раздвоје. Први је да се
све Аљошине књиге са прве полице пребаце на другу, а да се све
Борисове књиге са друге полице пребаце на прву полицу. Други начин је
да се све Борисове књиге са прве полице пребаце на другу, а да се све
Аљошине књиге са друге полице пребаце на прву. У првој варијанти број
књига које се пребацују једнак је збиру броја Аљошиних књига на првој
и Борисових књига на другој полици, док је у другој варијанти тај број
једнак збиру броја Борисових књига на првој и Аљошиних књига на другој
полици. Решење је мањи од та два броја (а мањи од два броја можемо
израчунати функцијом min
).
Пресек интервала¶
Алекса и Ђорђе су два програмера који раде у истој компанији. Алекса ће у понедаљак бити на послу од 8 сати до 17 сати, а Ђорђе од 10 до 15 сати. Колико су сати тог дана могли заједно да раде на игрици коју програмирају? Напиши програм тако да ради и када се подаци промене (на пример, у уторак ће Алекса бити на послу од 15 до 20, а Ђорђе од 8 до 14).
Време које ће моћи да раде заједно је време које тече од тренутка када дође други од њих, до тренутка када оде први од њих. На пример, ако је Алекса дошао у 8 сати, а Ђорђе у 10, онда је други дошао у 10, а ако је Алекса дошао у 9, а Ђорђе у 7, онда је други дошао у 9. Слично, ако је Алекса отишао у 17, а Ђорђе у 15, онда је први отишао у 15. Могуће је да се деси да је први отишао пре него што је други дошао и тада је заједничко време 0. Иначе је време једнако разлици између времена када је први отишао и времена када је други дошао (дакле, заједничко време је већи од броја 0 и те разлике).
Апсолутна вредност¶
Још једна веома корисна функција коју си упознао/упознала у математици је апсолутна вредност. Апсолутном вредношћу се одређује одступање броја од нуле. На пример, број 4 одступа од нуле за 4, док број -5 одступа од нуле за 5 јединица. Дакле апсолутна вредност броја \(x\), која се, подсетимо се обележава са \(|x|\), једнака самом броју \(x\) ако је \(x \geq 0\) тј. броју \(-x\), ако је \(x < 0\).
У језику Python апсолутну вредност можемо израчунати помоћу функције
abs
. Тако је вредност израза abs(5)
једнака 5
, док је
вредност израза abs(-3)
једнака 3.
Вредност израза abs(-11.2)
је
Једна од најзначајнијих примена апсолутне вредности је да се израчуна удаљеност бројева, без обзира на њихов међусобни однос. Наиме, растојање између бројева \(x_1\) и \(x_2\) је једнако апсолутној вредности њихове разлике тј. вредности \(|x_1 - x_2|\), без обзира да ли је \(x_1 \geq x_2\) или је \(x_1 < x_2\). Размотримо наредни задатак.
Удаљеност спратова¶
Cпратови у једној згради су обележени са бројевима од -2 до 10 (бројеви -2 и -1 означавају два нивоа испод земље, 0 означава приземље, док остали бројеви означавају спратове изнад земље). Ако се знају спратови на којима се налазе два другара, израчунај колико су спратова удаљени.
Пошто не знамо да ли лифт иде на горе или на доле тј. да ли је полазни спрат мањи или већи од долазног, растојање између спратова можемо израчунати тако што израчунамо апсолутну вредност разлике између тих спратова. На пример, ако би први другар био на трећем спрату, а други у првом подруму, исправи програм који рачуна то растојање.
Наравно, уместо бројева 3 и -1 могуће је стављати и друге, а могуће је ове бројеве учитати приликом покретања програма. Пробај са неколико својих тест-примера, а пробај и са тест-примерима које смо ти ми припремили.
Менхетн растојање¶
Менхетн, део града Њујорка је организован у авеније у правцу север-југ и улице у правцу isток-запад. Размак између две улице је 80m, а између две авеније је 275m. Ако се Том налази на углу улице \(u_1\) и авеније \(a_1\) и жели да стигне на угао улице \(u_2\) и авеније \(a_2\), колико ће метара морати да пређе.
Том има више начина да стигне са једног на друго место (може да иде цик-цак, на разне начине), међутим, пређено растојање је исто као када би прво ишао улицом \(u_1\) све док не дође до угла са авенијом \(a_2\), а затим да се креће авенијом \(а_2\) све док не дође до угла са улицом \(u_2\). Дакле, потребно је израчунати растојање између авенија \(a_1\) и \(a_2\) (да би се оно добило у метрима потребно је помножити апсолутну разлику између њихових редних бројева размаком између суседних авенија) и на то додати растојање између улица \(u_1\) и \(u_2\) (да би се оно добило у метрима потребно је помножити апсолутну разлику између њихових редних бројева размаком између суседних улица).
Исправи наредни код тако да коректно израчуна пређени пут (наравно, програм треба да ради и када се улазни подаци промене или учитају са улаза).
Приметимо да је формула у претходном примеру била веома дугачка и
проценили смо да је прегледније да је одштампамо кроз више редова. Да
бисмо нагласили да се нека наредба наставља и у следећој линији на
крај линије стављамо симбол \
.
Краљево растојање на шаховској табли¶
Краљ се на шаховској табли налази на пољу обележеном координатама \((x_1, y_1)\). Ако се зна да се у сваком потезу краљ може кретати по једно поље у било ком од осам смерова, израчунај колики је најмањи број потеза потребних да краљ стигне на поље означено координатама \((x_2, y_2)\).
Овај задатак је донекле сличан претходном. Поново је потребно да
израчунамо хоризонтално и вертикално растојање између полазне и
долазне тачке. Размисли како се број потеза може израчунати на основу
та два растојања (у првих неколико потеза краљ може да се креће
дијагонално, а после тога, ако је потребно, наставиће да се креће
хоризонтално тј. вертикално). Допуни дефиницију функције која
израчунава број потеза краља између поља (x1, y1)
и (x2, y2)
.
Хоризонтално и вертикално растојање израчунавамо као апсолутну вредност разлике одговарајућих координата. Број дијагоналних потеза једнак је мањем од два растојања, док је број хоризонталних тј. вертикалних потеза након тога једнак разлици између већег и мањег растојања. Дакле, укупан број потеза је једнак већем од два растојања. Заиста, у почетним потезима се оба растојања умањују за по један, све док мање растојање не достигне нулу, након чега дуже растојање наставља да се умањује за један и укупан број потеза да оно достигне нулу једнак је његовој полазној вредности.
Остале математичке функције¶
Поред ових које смо видели, језик Python 3 нуди многе друге корисне
функције за рад са бројевима. На пример, функција round
заокружује
дати реални број на најближи цео број.
-
Превлачењем упари изразе са њиховим вредностима.
Покушај поново
- round(2.1)
- 2
- round(2.9)
- 3
- round(4.5)
- 5
Слично, функција math.ceil
заокружује дати реалан број навише
тј. на најмањи цео број већи или једнак њему, док math.floor
заокружује дати реалан број наниже тј. на највећи цео број мањи или
једнак њему. На пример, math.ceil(2.1)
је 3
, исто као и
math.ceil(2.9)
, док је math.floor(2.1)
једнако 2
, исто као
и math.floor(2.9)
. Приметимо да имена ових функција почињу са
math
. Оне су део такозване математичке библиотеке и да би се могле
користити у програму на његовом почетку мора бити написано import
math
.
Вредност math.ceil(7.25)
је
Вредност math.floor(7.25)
је
Функција math.sqrt
израчунава квадратни корен тј. онај ненегативан
број који када се помножи сам са собом (када се квадрира) даје полазни
број. На пример, важи да је \(2 \cdot 2 = 4\), тако да је
квадратни корен броја \(4\) број \(2\) (то се у математици
записује као \(\sqrt{4} = 2\).
Напиши програм који за дату површину квадрата израчунава дужину његове странице.
Пошто важи да је \(P = a\cdot a\), важи да је \(a = \sqrt{P}\).
Функција math.pow
врши степеновање. На пример, \(2^{8} = 256\)
се може израчунати помоћу math.pow(2, 8)
. Као што множење означава
узастопно сабирање, тако степеновање означава узастопно множење. Други
степен броја \(2\) je \(2^2 = 2 \cdot 2 = 4\), трећи степен
броја \(2\) је \(2^3 = 2 \cdot 2 \cdot 2 = 8\) и тако даље.
Поменимо и да је степен дефинисан и када аргументи нису цели бројеви,
али се тиме нећемо бавити. Степеновање се може израчунати и оператором
**
. Тако се уместо math.pow(2, 8)
може употребити израз 2 **
8
чија је вредност такође 256
.
Осим функција, у библиотеци math
дефинисане су и разне корисне
константе. На пример, број \(\pi\) који представља однос пречника
и обима круга доступан је помоћу math.PI
(вредност тог броја је
око \(3,141592\)).
Дефинисање функција¶
Видели смо колико је корисно када на располагању имамо дате функције
попут min
, max
или abs
. Сви програмски језици, па и Python
допуштају корисницима да дефинишу своје функције.
У програмима са корњача-графиком смо се срели са дефинисањем процедура, што нам је омогућило да проширимо језик који корњача разуме и да лакше пишемо програме. Једном када се дефинише процедура, практично нема разлике између њеног коришћења и коришћења неке од уграђених наредби, тако да су нам процедуре заправо дале начин да дефинишемо нове, сложеније наредбе корњачи. Функције су веома сличне процедурама, са главном разликом да функције служе да на основу улазних вредности израчунају неки резултат и врате га, док процедуре служе да промене стање програма и обично не враћају никакав резултат. На пример, abs је функција која на основу дате вредности броја одређује његову апсолутну вредност, док је kvadrat(a) процедура која не враћа никакву вредност већ наређује корњачи да нацрта квадрат на екрану. input, коју смо користили за учитавање са тастатуре је функција (јер враћа унету вредност), док је print процедура (јер не враћа никакву вредност, већ мења стање програма тј. оно што је исписано на екрану).
Јасна подела на процедуре и функције уведена је у програмском
језику Pascal. У Python-у се за обе врсте потпрограма користи иста
кључна реч def
, па се стога често не прави разлика између ова
два облика потпрограма, већ се говори о функцијама које враћају и
функцију које не враћају вредности.
Примери дефинисања функција¶
На пример, функција која израчунава обим правоугаоника се може дефинисати и онда употребити на следећи начин.
Дефиниција функције почиње речју def
након тога се наводи назив
функције, затим у заградама наведени улазни параметри функције и
симбол двотачка (:
). Након те прве линије наводи се тело
функције, које мора бити мало увучено. Код најједноставнијих функција
(као што су ове две наведене у примерима) тело функције представља
само наредба return
након које се налази израз који представља
везу између улазних параметара и резултата функције. Код
компликованијих функција у телу се налазе дужа израчунавања, али се и
даље у телу функције (најчешћње на самом крају) налази наредба
return
иза које се наводи вредност функције (то може бити и име
променљиве у којој је израчуната резултујућа вредност). Функције се
позивају тако што се наведе њихов назив и у загради вредности
аргумената.
Површина сложених облика¶
Размотримо проблем израчунавања површине наредних сложених облика.
Први облик се може разложити на два правоугаоника, један правоугли троугао и један полукруг, док се површина другог облика може добити тако што се од површине највећег полукруга одузме површина најмањег, а дода површина средњег полукруга и површина правоуглог троугла.
Ако једном дефинишемо функције за израчунавање површине сваког од тих елементарних облика, веома једноставно у главном програму можемо израчунавати површине разних сложених облика, не размишљајући више о формулама потребним за израчучнавање површине појединачних облика (површина правоугаоника страница \(a\) и \(b\) израчунава се по формули \(P=a\cdot b\), површина правоуглог троугла чије су странице које образују прав угао \(a\) и \(b\) једнака је \(\frac{a\cdot b}{2}\), јер је тај троугао половина одговарајућег правоугаоника, а површина круга полупречника \(r\) може се израчунати по формули \(P = r^2\pi\), где је \(pi = 3,1415926...\), а у језику Python се може добити помоћу math.pi).
Функције са више резултата¶
У неким ситуацијама функција треба да врати више вредности. На пример, желимо да претварање центиметара у метре и центиметре опишемо у облику посебне функције. Резултат тада можемо вратити у облику пара или торке елемената (више речи о паровима и торкама је дато у поглављу о представљају података у програмима).
Секунде у сате, минуте и секунде¶
Напиши функцију која на основу броја секунди протеклих од претходне поноћи израчуна тренутно време у сатима, минутима и секундама, водећи рачуна да број сати буде између 0 и 23.
У наредној дефиницији функције направљено је неколико грешака. Исправи је тако да наредни програм да исправне резултате.
Када програм покренеш треба да испише 0 : 16 : 40
и 2 : 0 : 0
.
Сврха дефинисања функција¶
Резимирајмо на крају неколико основних разлога за дефинисање функција.
Увођењем функција добијају се разумљивији програми (ономе ко чита главни програм много је јасније да се у неком делу израчунава обим правоугаоника ако у програму види израз
obim_pravougaonika(2, 5)
него ако види израз2 * 2 + 2 * 5)
). Када дефинишемо погодне функције, главни програм је било много лакше написати.Функције помажу да се програм скрати тако што се избегава понављање истог програмског кода (ако је тај програмски код дугачак и компликован, издвајање у функцију може значајно поједноставити и скратити програм). Ако се покаже да је тај део кода често потребно мењати (што је често случај у програмирању) то што се код јавља само једном (у склопу тела функције) чини одржавање много једноставнијим (не морамо измене да правимо на пуно места, већ само на једном).
Функције помажу и да се неки проблеми реше, тако што омогућавају разлагање комплексних проблема на једноставније потпроблеме.
Домаћи задатак¶
Уради за домаћи неколико наредних задатака.
Време чекања на станици¶
Јелена је дошла аутобусом на станицу у s1 сати и m1 минута, док је Иванин аутобус стигао у s2 сати и m2 минута. Колико је сати и минута она која је прва стигла чекала ону која је друга стигла?
И у овом задатку се тражи да се израчуна растојање између два временска тренутка за које се не зна који је први, а који други. Као што смо приказали раније, рачунање растојања се своди на рачунање апсолутне вредности разлике, а рад са сатима и минутима лакше обављамо ако прво претворимо све у минуте, затим израчунамо број минута колико су се чекале и након тога то претворимо у сате и минуте.
Месечне промене плате¶
Основна плата једног радника у првом месецу била је 48.375 динара. У наредном месецу је повећана за 10%, затим је у наредном месецу смањена за 5%, а затим је у наредном месецу опет повећана за 15%. Приликом сваке промене, плата је заокруживана на најближи цео број динара. Колико је износила плата тог радника у четвртом месецу?
Формулу за промену новчаног износа за одређени проценат смо већ раније разматрали. Ако се плата \(P\) увећава за \(p\%\) тада је нови износ једнак \(P \cdot (1 + \frac{p}{100})\). Након овога, потребно је додатно заокружити износ на најближи цео број коришћењем функције round. Пошто је формула компликована, уместо да је више пута користимо у програму, много је боље издвојити је у посебну функцију.
Допуни дефиницију те функције, и затим исправи аргументе у њеним позивима у складу са текстом задатка. Провери на крају да ли је резултат који добијеш тачан.
Плата у четвртом месецу је
Просек 3 броја¶
Димитрије, Ања, Ивона и Марко су високи редом 165, 162, 158 и 171 cm. Пријављују трочлану екипу за школски турнир у кошарци и у формулару је неопходно да наведу просечну висину своје екипе, али се још нису одлучили ко ће сачињавати екипу. Дефиниши функцију за израчунавање просека три броја, а затим испиши просечне висине за сваку од 4 могуће варијанте трочлане екипе.