Садржај
Пре него што почнемо
Подсетник Пајтон
Низови података
Сортирање
Филтрирање и претраживање
Представљање низова података
Рад са текстуалним подацима
Рад са табелама
Обрада и приказ табеларних података
Џупитер и Ексел
Пример скупа података за пројекто учење
Подсетник - Пајтон¶
У овој свесци вам дајемо кратак подсетник на основне елементе и правила рада у Пајтону. Ако сте заборавили како се програмира у овом програмском језику или сте, из неког разлога, раније пропустили те лекције, овај подсетник би требало да вам помогне. Као и код било ког другог програмског језика, најтеже је памтити синтаксу, односно називе инструкција и правила како се оне комбинују. Овде имате примере неких основних комбинација.
Препоручујемо да примере из ове лекције покренеш на свом рачунару тако што ћеш у пакету фајлова за вежбу покренути Џупитер свеску 02_podsetnik.ipynb, или тако што ћеш отићи на овај линк и тамо радити задатке. За детаљније инструкције погледај поглавље Фајлови за вежбу и коришћење Џупитер окружења.
Типови података¶
Пајтон у свом стандардном окружењу, без библиотека, има три основна типа, односно групе типова података: нумеричке, знаковне и логичке, али у оквиру њих постоји и финија подела.
Нумерички подаци¶
Пајтон познаје три типа нумеричких, односно бројчаних података:
целобројне вредности (integer), децималне бројеве (float) и
комплексне бројеве (complex). Ког је типа променљива, увек можемо да
проверимо помоћу функције type().
Број 10 је свакако цео број, али такође припада и скупу рационалних,
реалних, комплексних бројева итд. Разлог због ког је Пајтон тип ове променљиве
препознао баш као int је то што бира најекономичнију варијанту. Број
10 ће имати најмањи запис и трошити најмање меморије ако га чувамо као
„синтиџер“. Уколико број има децимални запис (макар из децималне тачке
стајала и нула), тип тог податка ће бити препознат као float.
Пајтон ради и са комплексним бројевима. Имагинарни део комплексног броја се записује као број иза кога иде слово ј, без размака.
Без обзира на то што Пајтон разликује целе бројеве, реалне и комплексне, он рачуна са њима заједно.
Знаковни подаци¶
Знаковне податке обично називамо стринговима или нискама. Одатле ознака
str. То су низови алфа-нумеричких карактера записани као текст. Када
променљивој додељујемо вредност која је типа стринг, онда тај податак
стављамо под једноструке или двоструке знаке навода. Битно је да на
почетку и на крају буде иста врста наводника.
Рачунске операције са стринговима нису исте као са бројевима. Сабирање стрингова постоји и значи додавање једног низа карактера на други. Множење два стринга није могуће, али стринг и интиџер могу да се помноже. Остале комбинације нису могуће. Погледајте примере.
Логичке вредности¶
Тип променљиве која садржи вредност логичког исказа називамо „булеан“ (boolean). Булеани имају своје вредности које могу да буду или тачно (True) или нетачно (False). Свако поређење вредности променљивих (било ког типа) помоћу оператора једнако (==), није једнако (!=), мање (<), веће (>) резултује логичком вредношћу.
Операције за рад са логичким вредностима су логичко и (and или
&), логичко или (or или |) и не (not). Резултати ових
логичких операција су такође логичке вредности.
Осим резултата поређења вредности променљивих, Пајтон „тривијалним“ вредностима нумеричких и знаковних променљивих (нпр. 0, ’’), као и празним листама, скуповима или речницима придружује логичку вредност False, док свим осталим даје True.
Претварање вредности у други тип податка¶
У неким случајевима, тип податка је могуће претворити у други. На пример стринг „2.75“ лако може да се претвори у реалан број 2.75. Обрнуто такође важи.
Претварање интиџера у децимални број је једнозначно, само се промени формат, а вредност остаје иста. У супротном смеру морамо да занемаримо цифре иза децималне тачке због чега се вредност променљиве мења.
Булеане је такође могуће претворити у нумеричке вредности или стрингове. У супротном смеру, то значи губитак информације и свођење на бинарну вредност која говори да ли је почетна вредност нетривијална.
Колекције¶
Пајтон различите типове скупова података назива колекцијама. Постоје
четири основне колекције које имамо на располагању чим покренемо
Пајтон. То су листе, речници, торке и скупови. Ако бисте учитали модул
collections, добили бисте још неке, али су нам ове четири које се
подразумевају више него довољне за почетак.
Листе (list)¶
Листу правимо тако што унутар угластих заграда наводимо различите податке раздвајајући их зарезом. Елементи листе могу бити подаци свих типова па чак и саме листе. Подаци могу да се понављају. Важна карактеристика листа је да су елементи нумерисани. Сваки елемент има свој индекс који почиње од нуле. Елементи из листе се позивају преко имена листе и индекса у угластим заградама.
Речници (dict)¶
Друга важна колекција су речници. Ту су елементи уређени парови који увек имају кључ (key) и вредност (value). Кључ и вредност су раздвојени двотачком, док су парови раздвојени зарезом унутар витичастих заграда. Елементи не могу да се понављају и сваки кључ може да има само једну вредност. Елементи речника нису нумерисани. Уместо индекса овде користимо кључ за референцирање.
Торке (tuple)¶
Торке су врло сличне листама. Елементи се углавном набрајају унутар обичних заграда, али може и без њих. Једина важна разлика у односу на листе је што вредности елемената, кад су једном дефинисане, не могу више да се мењају. Ако хоћете другачију торку, направите нову.
Врло важно својство колекција је да дозвољавају да колекције једне врсте
претварамо у другу. На пример, ако од торке хоћемо да направимо листу,
довољно је да је трансформишемо помоћу функције list().
Торке имају могућност да већем броју променљивих у једној линији доделе вредности. Потребно је само да наведемо имена променљивих одвојених зарезом, онда знак једнако и потом низ вредности које придружујемо променљивим. Веома је корисна могућност да помоћу торки двема променљивим заменимо вредности. У другим програмским језицима је за замену вредности потребно увести и трећу, помоћну променљиву. У Пајтону је то крајње једноставно: само им заменимо места. Погледајте пример.
Скупови (set)¶
Скупови су, као и математички скупови, колекције различитих елемената који не могу да се понављају. Ове колекције нису нумерисане и не могу се индексирати. Над скуповима су дефинисане операције које су нам познате из математике: пресек, унија и разлика.
Важна особина скупова је то што скупу не можете поново да придружите елемент који се већ налази у скупу. Нема дупликата. Кад год нам је потребно да нађемо јединствене елементе неке друге колекције, можемо помоћу скупа да уклонимо дупликате. На пример, ако узмемо листу у којој има дупликата, претворимо је у скуп, а потом поново у листу. У тој другој листи ће остати само јединствене вредности. Погледајте пример.
Петље¶
Када део програма треба да поновимо више пута, пожељно је да тај кôд ставимо у петљу. Петља је програмска структура која нам омогућава да контролишемо колико ће се пута блок инструкција извршавати. Свако извршавање кôда у петљи назива се итерација. Променљива која броји колико пута је блок инструкција извршен назива се итератор или бројач.
Најчешће коришћена петља у Пајтону је for петља. Ова петља почиње
инструкцијом for, иза које иде услов да се бројач (итератор) налази у
колекцији која следи. Оператор in између бројача и колекције
означава услов да вредност бројача припада том скупу вредности. Прва
линија петље завршава се две тачке. Следи блок инструкција
који је увучен.
Петља у наредној ћелији је пример једноставног програма који исписује бројеве од 0 до 9.
Скуп вредности које узима променљива током итерирања овде је био
дефинисан са range(10), што је распон бројева од 0 до 9. Како у
Пајтону индексирање увек почиње од нуле, вредности ове „итерабле“ иду од
0 до 9. Реч итерабла се односи на све колекције кроз које Пајтон може да
пролази секвенцијално, односно тачно утврђеним редоследом од прве до
последње вредности. Листе су такође итерабле па и њих можемо да
користимо за конструисање петљи. Када итерирамо по колекцији типа
range, итератори су бројеви. Ако користимо листу као итераблу, онда су
вредности итератора вредности из листе које редом узимамо.
Итерабле такође могу да буду и скупови, стрингови, торке итд. Стринг није ништа друго до листа карактера. Зато можемо да итерирамо кроз стринг, односно да правимо петљу у којој ће итератор узимати вредности из стринга. Ево једноставног примера:
Осим for петље, Пајтон има и while петљу. Код ње није битно да
итератор буде у одређеном скупу. while петља се извршава док год је
припадајући услов испуњен, односно док је логички исказ тачан. Ево како пример са for петљом можемо да напишемо користећи
инструкцију while.
Приметите да овде „ручно“ морамо да мењамо вредност индекса i. Израз
i+=1 је скраћени запис од i=i+1. То значи да у свакој итерацији
вредност индекса i повећавамо за 1.
Угњеждене петље¶
Унутар једне петље лако можете да ставите другу. Пазите само да итератори буду различити. Типичан пример проблема који можете да решите петљом у петљи је да направите табелу где рачунате резултате неке операције између свака два елемента низа. Конкретно, можемо да направимо таблицу множења. Потребно је само сваки елемент једног низа помножити са сваким елементом другог. Следи пример једноставног програма који то рачуна и исписује на екрану.
Ако занемарите мало чудан начин исписа, програм је крајње једноставан. Узимамо све бројеве од 1 до 5, множимо сваки са сваким и приказујемо то на екрану. Оно што је необично код исписа је што смо ставили да се испис завршава „табом“, а не новим редом. То нам омогућава да испишемо пет резултата у једном реду. Ред завршавамо тек када унутрашња петља стигне до краја. Контролни знак за таб је „\t“, а за нови ред „\n“.
Условно гранање¶
Да би програм могао да одлучи који део кôда треба да изврши, потребно је
да провери испуњеност траженог критеријума, односно да евалуира
(вреднује) одговарајући логички исказ. У зависности од тога да ли је
услов испуњен или не, програм ће извршавати различите делове кôда. У
Пајтону се најчешће користи if ... then ... else конструкција. Прво
проверавамо да ли је испуњен услов наведен иза if, ако јесте, онда
програм извршава оно што иде после then, а ако није испуњен, извршава
оно што следи после else. Погледајте пример.
У овом примеру прво тражимо да неко помоћу тастатуре укуца број, онда
тај унос претворимо у интиџер и придружимо га променљивој a. У
следећој линији проверавамо да ли је тај број дељив са 2, односно да ли
је остатак при дељењу са 2 једнак нули. Потом иде оно што треба извршити
ако је услов испуњен, тј. да програм испише да је унети број паран. У
противном исписује да је непаран.
Обратите пажњу на синтаксу. У Пајтону се инструкција then уопште не
користи. Уместо тога користи се двотачка и увучени блокови
инструкција. Видите како се после реда који се завршава са двотачком
појављује увучени део кôда. Први блок инструкција (који може да има
произвољно много линија кôда) извршава се ако је услов испуњен, а други
блок (после else:) ако услов није испуњен.
Уколико гранање на две могућности није довољно, можемо да уведемо и нове
блокове помоћу elif инструкције. Нема ограничења колико ових услова
може да буде. Када први услов није испуњен, онда можемо да испитамо да
ли је неки други услов испуњен помоћу elif. Погледајте пример.
Други начин да проверимо више услова је да у if-then-else блоковима уведемо нове услове и ново гранање. Ако то радите, обратите пажњу да ти нови блокови морају да буду још више увучени. Уколико је у случају првих то било по четири размака, онда ови угњеждени морају да буду увучени по осам. Едитор у коме радите обично води рачуна о увлачењу блокова, али није лоше да проверите да ли је све увучено како треба. За разлику од неких других програмских језика, Пајтон неће да ради и пријављује грешку ако блокови нису правилно увучени. Ево опције примера како смо претходни пример могли да урадимо са угњежденим условима.
Гранање због грешке¶
Постоји могућност да направимо гранање које би нас штитило од ненамерне грешке у извршавању програма. У идеалном случају, то нам није потребно, али пракса говори да се грешке дешавају и да програми због тога престају да раде. Ако можемо да претпоставимо каква је могућа грешка, онда можемо да је контролишемо. Примера ради, пробајте да унесете децимални број у горе приказани програм који исписује да ли је број паран или непаран. Шта се дешава? Програм приказује информацију о “ValueError” грешци и престаје да ради. Било би добро када бисмо могли реагујемо на грешку тако што се онда изврши део програма предвиђен за такве случајеве.
Инструкције try и except омогућавају да се програм регуларно
заврши и онда када дође до грешке. Програм покушава да уради оно што је
у блоку try. Уколико дође до грешке, онда извршава оно у блоку
except.
Демонстрираћемо како try-except ради на примеру који смо већ помињали.
Гранање try-except има сложенију структуру него што је приказано у
примеру. Два додатна блока else и finally дају додатне
могућности за управљање грешкама, али их овде нећемо објашњавати. Ако
вас интересује, пронађите упутство и прочитајте сами како раде.
Функције¶
Пајтон има неке уграђене функције као што су sum() или min(),
али за конкретну намену сами можемо да напишемо нову функцију. Функције
се једноставно дефинишу: у првој линији пишемо
def <име функције>(<име променљиве у коју се смешта аргумент>):,
онда следи блок инструкција којима обрађујемо и рачунамо нешто са
улазном променљивом, и на крају, у последњој линији, пишемо
return <име излазне променљиве>. Свака функција може да има више
улазних променљивих, као што може да врати и више излазних.
Први пример функције који ћемо овде приказати је рачунање производа свих вредности у листи. Оваква функција не постоји у стандардној Пајтоновој библиотеци. Зато је добро да знамо да је напишемо.
Задатак: Можете ли, по угледу на претходни пример, сами да напишете функцију zbir() која би сабрала све елементе листе?
Како бисте написали функцију чији је улаз листа, а излаз најмања
вредност из те листе? Та функција треба да пронађе најмању вредност у
листи и да је врати. Оваква функција већ постоји у Пајтону и зове се
min(), али ћемо искористи прилику да напишемо своју верзију.
Име ове нове функције ће бити minimum(). Ево једне могућности како то може
да се напише.
Библиотеке¶
Пајтон без додатних библиотека има само основне типове података, структуре и функције. У тој стандардној библиотеци нема структура у којима бисмо чували табеле, нема функција које би цртале графиконе или чак рачунале једноставне математичке функције. За све то је потребно да учитамо библиотеке, модуле из библиотека или њихове појединачне функције. Срећом, Пајтон има огроман број врло квалитетних библиотека до којих се лако долази.
Библиотеке се састоје из модула који у себи садрже разне типове
података, објекте, функције и методе за те објекте итд. Стандардна
библиотека има неколико модула које не учитава аутоматски. То значи да
су модули инсталирани, али да треба да их учитамо. Међу њима су модули
који су нам често потребни као што су math (математичке функције),
random (генерисање случајних бројева) или statistics
(статистичке функције).
Када учитамо целу библиотеку или модул помоћу инструкције import,
можемо да користимо све њене функције и објекте, само морамо да наведемо
одакле су преузети. На пример, када учитамо библиотеку math, добићемо
и функције и константе које уз њу иду. Кад их позивамо, прво куцамо име
библиотеке са тачком на крају, тј. math. па онда име функције или
константе. Ево примера где програм прво исписује вредност константе
\(\pi\), а затим и косинус од тог броја:
Има библиотека које имају непрактично дуга имена па би било тешко стално
укуцавати њихова имена кад хоћемо да позивамо њихове функције. У тим
случајевима већ при учитавању библиотеке кажемо Пајтону да ћемо је
убудуће позивати по „надимку“, тј. скраћеној верзији имена коју можемо
сами да смислимо. У следећој ћелији је пример како учитавамо библиотеку
matploylib.pyplot одређујући да ћемо је убудуће звати само plt.
import matplotlib.pyplot as plt
plt.plot([4,2,3,4,3])
[<matplotlib.lines.Line2D at 0x26d58a0b160>]
Ако нас интересује само једна функција из библиотеке, можемо њу посебно
да учитамо помоћу линије
from <назив библиотеке> import <назив функције>. Тада при употреби
не морамо да наводимо из које је библиотеке. На пример, ако из целог
модула statistics хоћемо само функцију mean() која рачуна средњу
вредност низа, то можемо да урадимо на следећи начин:
from statistics import mean
mean([3,4,4,6])
4.25
Многе важне екстерне библиотеке су већ инсталиране у Џупитер окружењу.
Оне које се најчешће користе су pandas, за рад са табелама и
фајловима, matplotlib.pyplot, за цртање графикона, и numpy, за рад
са вишедимензионалним подацима. Уколико тражене библиотеке нема у
окружењу, потребно је да је инсталирате. У већини случајева нема потребе
да библиотеку тражите на интернету и да је преузимате. Довољно је да
укуцате pip install <назив библиотеке> и Пајтон ће библиотеку сам
пронаћи, преузети и инсталирати.