Upload
others
View
35
Download
5
Embed Size (px)
Citation preview
OSNOVE PROGRAMIRANJA
PROGRAMSKI JEZIK PYTHON [osnovni kurs]
Sačuvajmo drveće.
Ako nije neophodno, nemojte štampati ovaj dokument.
Čitajte u digitalnoj formi!
Datum poslednje promene: 12.04.2020. [verzija: 1 (revizija 0)] [kurs je na srpskom jeziku]
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 2
SADRŽAJ
NASLOV POGLAVLJA STRANA 1. UVOD 3 2. PRVI KORAK – INSTALACIJA RAZVOJNOG OKRUŽENJA ZA PYTHON 5 3. SINTAKSA PROGRAMSKOG JEZIKA PYTHON 7 4. TIPOVI PODATAKA, OPERATORI I FUNKCIJE 8 5. KONTROLA TOKA PROGRAMA 16 6. STRUKTURE PODATAKA 18 7. FUNKCIJE 25 8. KLASE 27 LITERATURA 32
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 3
1. UVOD
Python se danas smatra idealnim programskim jezikom za učenje programiranja jer predstavlja jedan
od najjednostavnijih programskih jezika, pre svega zbog svoje jednostavne sintakse, interaktivnosti,
fleksibilnosti i skalabilnosti.
Python spada u grupe interpreterskih i objektno-orijentisanih programskih jezika visokog nivoa, što
znači da se kod direktno izvršava uz pomoć interpretatora bez potrebe za kompajliranjem odnosno
prevođenjem u izvršni oblik i da dozvoljava korisnicima da manipulišu objektima kao entitetima.
Stvorio ga je Guido van Rossum, nizozemski programer, krajem osamdesetih, odnosno početkom
devedesetih godina prošlog veka. Gospodin van Rossum kao da je samim izborom njegovog imena hteo
da nam stavi do znanja da programiranje može da bude zabavno koliko i istoimena britanska serija
Monty Python’s Flying Circus. Neki teoretičari zavere misle, sa druge strane, da je ovaj programski jezik
poneo naziv koji ima po zmiji (pitonu), na šta asocira i njegov zaštitni znak. Bez obzira na poreklo imena,
možemo slobodno konstatovati da je jedna od njegovih glavnih odlika je izuzetna čitljivost koda što
olakšava dokumentovanje koda i njegovo lakše održavanje. Ovaj programski jezik dosledno podržava
modularnost programa, odnosno mogućnost da se delovi koda ponovo koriste. Podržan je od strane
najvažnijih operativnih sistema na tržištu i jedan je od najpopularnijih programskih jezika u svetu.
Python se danas koristi, pored za učenje programiranja i izradu osnovnih rešenja onih koji ulaze u svet
programiranja, i za razvoj profesionalnih softverskih rešenja, samostalnih aplikacija i veb usluga. Ovaj
programski jezik se koristi i u sofisticiranoj analizi podataka i u procesu mašinskog učenja.
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 4
Ukoliko ste početnik u svetu programiranja, bitno je da izaberete onaj programski jezik koji zadovoljava
neke (ili većinu) od ovih kriterijuma:
- Da spada u grupu mainstream programskih jezika koji su čvrsto etablirani u industriji razvoja
softverskih rešenja
- Da je dobro rangiran na listama najpopularnijih programskih jezika i da je ta popularnost
stabilna unazad nekoliko godina
- Da ima veliki broj razvijenih biblioteka, odličnu podršku i široku zajednicu korisnika
- Da su programeri koji ga koriste u svom radu traženi na tržištu rada i da njegovo poznavanje u
perspektivi donosi odličnu zaradu
Python zadovoljava sve ove kriterijume i mnogo više. Prema indeksu trendova pretraživanja materijala
za učenje programskih jezika PYPL (PopularitY of Programming Language Index) programski jezik
Python je izuzetno popularan. Takođe, prema veoma cenjenom TIOBE indeksu koji rangira programske
jezike prema broju stručnjaka obučenih za rad, broju dostupnih kurseva i primenjenih rešenja, Python
zauzima jednu od pozicija na vrhu.
Trenutno stanje na listama možete pogledati na veb lokacijama http://pypl.github.io/PYPL.html,
odnosno https://www.tiobe.com/tiobe-index/.
Kao i u svakom programskom jeziku, svaka nova verzija nosi sa sobom poboljšanja, brže izvršavanje
koda i otklanjanje uočenih nedostataka prethodne verzije. Pravo mesto na kome možete obezbediti
aktuelnu verziju je matična stranica Python projekta https://www.python.org/. Na ovoj veb lokaciji
možete naći i uputstvo namenjeno početnicima Beginner’s Guide, dokumentaciju vezanu za
standardne biblioteke ovog programskog jezika, brojne tutorijale ali i berzu poslova koji se nude vrsnim
poznavaocima zanata zvanog programiranje u Pythonu! Ovaj kreativni kurs je pre svega namenjen
onima koji žele da uđu u svet programiranja i obezbede snažnu osnovu za dalje napredovanje u ovoj
oblasti. Kada ovim kreativnim kursom budete savladali osnove programiranja u programskom jeziku
Python, bićete spremni da krenete dalje. Prvi korak u ovom osnovnom kursu u kome ćete naučiti svoje
prve programerske korake biće, kao i u svakoj programerskoj priči, instalacija razvojnog okruženja za
Python. Preporuka je da ga formirate pomoću Microsoft Visual Studio Code (VS Code).
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 5
2. PRVI KORAK – INSTALACIJA RAZVOJNOG OKRUŽENJA ZA PYTHON
Pre početka naše Python avanture potrebno je instalirati razvojno okruženje. Dakle, potreban nam je
editor u kome ćemo unositi kod i interpreter za programski jezik Python koji će izvršavati kod. Na adresi
https://code.visualstudio.com nalazi se sjajno besplatno rešenje iz Microsoft kuhinje, Visual Studio
Code (VS Code). Ovo je u osnovi višenamenski editor namenjen pisanju koda na Windows, macOS i
Linux platformama. VS Code dolazi sa podrškom za brojne napredne tehnologije kada je u pitanju
programiranje, IntelliSense (automatsko popunjavanje), debugging, formatiranje koda i drugo, tako da
predstavlja pravi temelj za ono što sledi – pisanje koda. U editor je ugrađena native podrška za neke
programske jezike dok je za druge (među kojima je i Python) podrška definisana na nivou ekstenzija
koje je potrebno aktivirati.
Pošto smo instalirali VS Code možemo ga privremeno isključiti i pristupiti instalaciji samog Python
interpretera. Instalaciju poslednje stabilne verzije Python interpretera možemo izvršiti sa veb lokacije
https://www.python.org/downloads/ ili preuzeti sa lokacije www.anaconda.com. Preporuka je da to
uradite sa lokacije Anaconda. Uz ovo dobijate i samu Anacondu (trebaće vam). Nijedna zmija ne ide
sama!
U sledećem koraku ponovo ćemo pokrenuti VS Code i instalirati ekstenziju za Python sa VS Code
Marketplace. Najpre treba kliknuti na odgovarajuću ikonu (nalazi se na toolbaru sa leve strane) koja će
nas odvesti na ekstenziju koja nam je potrebna.
Kada u polju za pretraživanje ekstenzija ukucamo python dobićemo više mogućnosti. Treba izabrati
ekstenziju pod nazivom Python (ms-python.python) i pokrenuti njenu instalaciju.
Sada je red na aktiviranje Python interpretera koji ćemo prethodno instalirati pristupom lokaciji
Anaconda. Nakon instalacije Anaconda pakovanja koji sadrži i Python interpreter, krećemo na samo
aktiviranje u VS Code. To ćemo učiniti preko opcije Command Palette (View > Command Palette) ili
kombinacijom tastera CTRL+SHIFT+P, tako što ćemo ukucati python, a potom izabrati ponuđenu
komadu Python: Select Interpreter. Sistem će nam ponuditi mogućnost da izaberemo instaliranu
verziju interpretera. Ukoliko je sve u redu u donjem levom uglu ekrana VS Code trebali bi da vidite
nešto ovako:
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 6
Sve je spremno za početak!
Krećemo na realizaciju Hello World projekta. Najpre treba otvoriti radno okruženje (workspace) tako
što ćemo „otvoriti“ folderu koji smo izabrali za ovaj i druge primere koji ćemo raditi (File > Open
Folder). Otvaramo potom novu datoteku, izborom opcije New File iz File menija (File > New File).
Projektu odmah treba dodeliti ime uz iniciranje snimanja datoteke izborom opcije Save iz File menija
(File > Save), uz obavezan izbor tipa Python u Save as Type polju. Projekat ćemo nazvati hello.py
(zapamtite da se ekstenzija .py se koristi za programe pisane u Pythonu). Projektni folder bi nakon
ovoga morao da ima podfolder .vscode i formiranu datoteku hello.py:
Krećemo sa pravim programiranjem! U editoru kucamo naredbu koja će ispisati pozdrav Hello World:
Snimićemo program (CTRL + S) i pokrenuti direktno klikom na ikonu Play u gornjem desnom uglu:
Ubrzo ćemo na ekranu (ili preciznije rečeno na delu ekrana koji se naziva terminal) dobiti i rezultat
izvršenja koda, odnosno željeni natpis Hello World.
Ovaj način izvršavanja podrazumeva da se ne vrši provera koda – debagovanje. Debagovanje programa
je proces identifikovanja izvora grešaka i njihovog otklanjanja. Debagovanje ne treba mešati sa
testiranjem koje predstavlja proces detektovanja grešaka. Hajde da onda isprobamo i debagovanje…
Kliknite na poslednju (u našem slučaju i jedinu) liniju koda. Sa leve strane će se prikazati tačka koja
označava Breakpoint. Kliknite na nju, pritisnite taster F9 da to potvrdite a zatim i taster F5 (ovo je
ekvivalent izbora opcije Start Debugging iz menija Run). Krenuće proces debagovanja, uz prethodni klik
na ponuđenu opciju Python File (Debug the currently active Python file). Debagovanje se vrši
upotrebom opcija iz kutije sa alatkama (toolbar) koje nas vode kroz sam proces (continue - step over -
step into - step out - restart - stop):
NAPOMENA: Manje primere programa možete pisati i isprobati i u samom Python GUI okruženju koje
dobijate čistom instalacijom Pythona (sa lokacije https://www.python.org/). U tom slučaju nema
potrebe da instalirate VS Code editor. Programe pišete na taj način što, nakon startovanja Pythona, u
meniju File izaberete opciju New File (File > New File) čime vam se otvara novi ekran u kome možete
napisati program. Pre nego što ga isprobate datoteku ćete morati da snimite (sa File > Save).
Pokrenućete ga izborom opcije Run Module iz menija Run (Run > Run Module) ili klikom na taster F5.
Rezultat izvršavanja dobijate u Python Shellu.
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 7
3. SINTAKSA PROGRAMSKOG JEZIKA PYTHON
Svaki jezik, kako prirodni, tako i veštački ima svoju sintaksu i semantiku. Sintaksa programskog jezika
predstavlja niz pravila koja definišu kombinaciju simbola za koje se smatra da daju ispravno struktuiran
izvorni kod u traženom programskom jeziku. Sintaksa, dakle, određuje šta su ispravne konstrukcije
(rečenice) u tom jeziku, dok im semantika pridružuje značenje. Osnovni sintaksni elementi koji se
koriste pri izgradnji programa su izrazi (numerički i logički) i naredbe. Programski jezik Python ima
jednostavnu sintaksu što programerima omogućava da brže dođu do rešenja. Važno je napomenuti da
je sintaksa i semantika (proces izvršavanja programa) ovog programskog jezika definisana tako da
odgovara više načinu na koji mi razmišljamo i rešavamo probleme nego načinu na koji funkcionišu
mašine. Takođe, što je i najbitnije, Python je živ programski jezik koji se stalno razvija. To garantuje da
će još dugo biti veoma važna alatka u razvoju aplikacija, pogotovo što je sve u vezi Pythona besplatno.
Filozofija pisanja programa u Pythonu počiva na tako zvanoj PEP specifikaciji. Ukoliko ste Python
interpreter instalirali na „Anaconda način“ već imate ugrađen PyLint (linter za Python) alat koji će
pratiti način na koji formatirate vaše programe. Gledajte na njega kao na anđela čuvara koji će voditi
računa o svemu (u Pythonu se ta pravila vode pod pomenutim nazivom PEP).
Python je organizovan je tako da ima relativno jednostavno jezgro a da se sve „komplikovanije“ stvari
rešavaju preko modula. U tome je i lepota programiranja u ovom jeziku jer postoji ogroman broj
modula koji rešavaju određene stvari (većina njih potiče iz same open source zajednice programera i
odlično su dokumentovani tako da znate šta možete očekivati od njih). Znači, bitno je da zapamtite dve
činjenice: verovatno nećete biti u prilici da ponovo „izmišljate točak“ i sigurno nećete morati da jurite
te module po Internetu jer veliku većinu njih već imate preinstalirane zahvaljujući tome što ste izabrali
da Python interpreter instalirate preko Anaconde. Modulima upravljate preko programa Anaconda
Navigator koji ste instalirali pri potrazi za Python interpreterom. Ukoliko kliknete na Environments sa
leve strane otvoriće vam se lista na kojoj ćete videti sve module koje imate instalirane (naziv, opis i
verziju). Ukoliko pored broja verzije vidite i strelicu to znači da je dostupna novija verzija tog modula i
da je možete automatski preuzeti. U programskom kodu module uvozimo upotrebom naredbe import.
Bitno je da se svi potrebni moduli uvezu na početku koda kako bi bili dostupni za korišćenje kasnije u
kodu.
import naziv_modula as naziv_koji_ćemo_koristiti
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 8
4. TIPOVI PODATAKA, OPERATORI I FUNKCIJE
Počećemo sa jednim vrlo važnim pravilom: uvek dodajte u kod koji pišete komentare! Oni će vam
pomoći da se kasnije setite šta ste uradili u nekom delu koda a ukoliko radite u timu mogu da budu od
koristi i onima koji zajedno sa vama učestvuju u pisanju koda. Na ovaj način ćete doprineti boljem
dokumentovanju posla na kome radite. Komentari se u Pythonu pišu upotrebom znaka # iza kog sledi
prazan karakter i sam komentar. Bitno je napomenuti da se su komentari delovi koda koji se ne
izvršavaju. Primer: # Ovo je komentar
Napomena: Postoji mogućnost pisanja i dužih komentara (u više redova koda). Ovakvi komentari
počinju i završavaju se specijalnom oznakom """ (tri dvostruka navodnika).
Pre nego što krenemo sa tipovima podataka i operatorima, nekoliko reči o jednoj vrlo važnoj
komponenti svih programskih jezika. U pitanju su promenljivame (variables). Promenljive služe za
čuvanje vrednosti koje se menjaju (ili ne menjaju, u kom slučaju kažemo da se radi o konstantama).
Postoje određena pravila pri davanju naziva promenljivama. Nazivi mogu početi malim slovom abecede
ili specijalnim znakom donja crta (_). Nazivi promenljivih ne mogu da sadrže jednostruke ili dvostruke
navodnike. Pravila „lepog“ pisanja koda u Pythonu (PEP) kažu da u nazivima promenljivih treba
upotrebljavati samo mala slova abecede i da se reči trebaju odvajati donjom crtom (primer:
moj_naziv). Međutim, često se koristi i tako zvana Camel caps konvencija u kojoj svaka nova reč u
nazivu promenljive počinje velikim slovom (primer: mojNaziv). Važi i pravilo da su imena case-sensitive,
odnosno da je recimo x različito od X u nazivu. Promenljiva se definiše svojom vrednošću koja joj se
dodeljuje korišćenjem znaka jednakosti (primer: x = 5). Vrednost može biti bilo koji tip podataka o
kojima priča počinje upravo sada…
TIPOVI PODATAKA
Brojevi
Brojevi u Pythonu mogu da počnu ciframa od 0 do 9, decimalnom tačkom ili znakom – (za negativne
brojeve). Postoje sledeći tipovi:
▪ Integer (pozitivni i negativni celi brojevi koji ne sadrže decimalnu tačku u zapisu)
▪ Floats (pozitivni i negativni decimalni brojevi koji sadrže decimalnu tačku u zapisu, kao i
brojevi bez decimalne tačke koji u zapisu sadrže slovo e kojim se označava stepenovanje,
kao na primer 123e1000 – ovaj broj je u stvari 123000)
▪ Complex Numbers (kompleksni brojevi namenjeni matematičkim geekovima koji se
obavezno završavaju slovom j u zapisu)
Nizovi karaktera (stringovi)
String predstavlja niz karaktera (slova, brojeva i specijalnih znakova, uključujući i prazne karaktere).
Stringovi počinju i završavaju se znacima navoda (jednostrukim ili dvostrukim). Ukoliko u stringu
moramo da navedemo dvostruki znak navoda (na primer ukoliko uključujemo neki citat), onda se
ispred ovog unutrašnjeg znaka navoda obavezno piše znak \. Još jedna važna napomena… Ako tekst
moramo prikazati u više redova koristimo oznaku \n.
Primeri: "Ovo je string. " "Ovo je citat: \"Da, jeste\"." "Prvi red stringa,\nDrugi red stringa. "
Logički tip podataka (boolean)
Logički tip podataka može imati dve vrednosti: tačno (True) i netačno (False), primer: x = True
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 9
OPERATORI
Pomoću operatora se u Pythonu, kao i u drugim programskim jezicima, obavljaju određene operacije
nad podacima. Postoji više tipova operatora:
- Aritmetički operatori
- Operatori poređenja
- Logički operatori
Aritmetički operatori
Aritmetički operatori se koriste za obavljanje aritmetičkih operacija nad podacima. U ovaj tip operatora
spadaju sledeći:
operator opis primer
+ Sabiranje. 1 + 1 = 2
- Oduzimanje. 3 – 2 = 1
* Množenje. 4 * 5 = 20
/ Deljenje. 10 / 5 = 2
% Ostatak pri deljenju. 14 / 5 = 4 (14 – 5 x 2 = 4)
** Eksponent. 2 ** 3 = 8 (2 x 2 x 2 = 23 = 8)
// Celobrojno deljenje. 14 / 5 = 2 (5 x 2 = 10, 5 x 3 = 15)
Operatori poređenja
Operatori poređenja se koriste kada u programskom kodu želimo napraviti neko poređenje (vrednosti
promenljivih ili rezultata izvršavanja nekih funkcija). U ovaj tip operatora spadaju sledeći (nisu
navedeni operatori koji se koriste za objekte: is i is not):
operator opis
< Manje od.
<= Manje ili jednako od.
> Veće od.
>= Veće ili jednako od.
== Jednako.
!= Različito.
Logički operatori
Logički operatori služe za poređivanje logičkih vrednosti (True/False). U ovaj tip operatora spadaju
sledeći:
operator opis primer
and Logičko i (tačno ako su oba operanda tačna). a and b
or Logičko ili (tačno ako je prvi ili drugi operand tačan). a or b
not Logičko ne (negacija logičke vrednosti operanda). not a
FUNKCIJE
Ugrađene funkcije u Pythonu imaju sledeću sintaksu: nazivpromenljive = nazivfunkcije (spisak
parametara). Primer matematičke funkcije abs koja vraća apsolutnu vrednost nekog broja:
x = -4
y = abs(x)
# rezultat je y = 4
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 10
Primer matematičke funkcije round koja ima dva parametra (promenljivu i broj decimala na koliko je
treba zaokružiti) i vraća zaokruženu vrednost nekog broja:
x = 5.14327
y = round(x,3)
# rezultat je y = 5.143
Python ima veliki broj ugrađenih funkcija koje služe za rad sa brojevima. Treba napomenuti da je
moguće i definisanje funkcija unutar funkcija. Pregled svih ugrađenih funkcija možete naći na:
https://docs.python.org/3/library/functions.html.
Pored ugrađenih funkcija mogu se koristiti i funkcije koje su deo nekog spoljnjeg modula. Pre korišćenja
takvih funkcija potrebno je izvršiti uvoz modula u programski kod.
Primer:
# uvoz modula math sa dodatnim matematičkim funkcijama
import math
x = 9
# funkcija iz spoljnjeg modula se koristi tako što se navede naziv modula, tačka i onda naziv funkcije
y = math.sqrt(x)
# rezultat je 3.0 (kvadratni koren broja 9)
Napomena: pregled svih funkcija ovog korisnog modula https://docs.python.org/3/library/math.html
F-string (funkcija za rad sa stringovima)
Posebnu grupu funkcija čini tako zvana f-string funkcija. Ona se koriste za formatiranje i izuzetno je
korisna u mnogim slučajevima (kada treba inkorporirati vrednost neke promenljive u ispis). Koristi se
u okviru print naredbe, pri čemu u zagradi prvo navodimo slovo f, potom string koji želimo da ispišemo
unutar dvostrukih navodnika. U okviru stringa se ubacuje naziv promenljive unutar vitičastih zagrada.
F-string funkcija se može zgodno iskoristiti i za formatiranje ispisa novčanih iznosa, na primer.
Primer (sa iskorišćenom f-string funkcijom i ispisom naredbi jedna pored druge uz specijalni znak ;):
x = 5; y = 4
# ispis stringa i promenljive, odnosno rezultata (primenom operatora nad promenljivom)
# mogu se koristiti svi tipovi podataka
print(f"Zbir x i y je: {x + y}")
Primer (za novčane iznose):
osnovna_cena = 300
nova_cena = 330
količina = 5
ukupna_cena = osnovna_cena * količina
# ispis ukupne cene sa separatorom hiljada i dve decimale (uz dodatak… :,.2f)
# ovde u oznaci :,.2f slovo f je iskorišćeno da označi broj (fixed number)
# ukoliko želimo procentualni ispis iskoristićemo znak % umesto f i nećemo koristiti separator hiljada
print(f"Ukupna cena je: {ukupna_cena:,.2f} RSD")
print(f"Odnos nove i stare cene: {nova_cena/osnovna_cena:.2%}")
# dobićemo ispis… Ukupna cena je: 1,500.00 RSD
# a potom… Odnos nove i stare cene: 110.00%
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 11
Ukoliko želimo da u jednom koraku definišemo izlazne podatke to možemo uraditi sledećom
modifikacijom programa (obratite pažnju na trostruko korišćenje dvostrukih navoda):
osnovna_cena = 300
nova_cena = 330
količina = 5
ukupna_cena = osnovna_cena * količina
odnos = nova_cena / osnovna_cena
izlazni_podatak = f"""
Ukupna cena je: {ukupna_cena:,.2f} RSD
Odnos nove i stare cene: {odnos:.2%}
"""
print(izlazni_podatak)
Ispis će biti:
Ukupna cena je: 1,500.00 RSD
Odnos nove i stare cene: 110.00%
Sledeći korak je malo naprednije formatiranje, odnosno usklađivanje izlaznog podatka tako da u našem
slučaju brojevi budu jedan ispod drugog. Za formatiranje se inače koriste sledeći znaci: ^ (centriranje),
< (poravnanje ulevo) i > (poravnanje udesno) uz obično navođenje broja karaktera. Broj karaktera se
ovde odnosi na sadržaj koji se nalazi samo unutar vitičastih zagrada. Definisaćemo u novom primeru
deo koda vezan za formiranje izlaznog podatka (poravnanje udesno za 10 karaktera):
podatak1 = 125
podatak2 = 1234.567
podatak3 = 9
izlazni_podatak = f"""
Prva stavka: {podatak1:>10,.2f}
Druga stavka: {podatak2:>10,.2f}
Treća stavka: {podatak3:>10,.2f}
"""
print(izlazni_podatak)
Ispis će biti:
Prva stavka: 125.00
Druga stavka: 1,234.57
Treća stavka: 9.00
Ukoliko se radi o podacima koji se odnose na novac trebali bi uključiti i oznaku novčane jedinice. U tom
slučaju izmenićemo string koji se treba ispisati:
# za oznake koje idu ispred iznosa
podatak1 = 125; podatak2 = 1234.567
s_podatak1 = "$" + f"{podatak1:,.2f}"
s_podatak2 = "$" + f"{podatak2:,.2f}"
izlazni_podatak = f"""
Prva stavka: {s_podatak1:>10}
Druga stavka: {s_podatak2:>10}
"""
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 12
# za oznake koje idu iza iznosa
podatak1 = 125
podatak2 = 1234.567
s_podatak1 = f"{podatak1:,.2f}"
s_podatak2 = f"{podatak2:,.2f}"
izlazni_podatak = f"""
Prva stavka: {s_podatak1:>10} RSD
Druga stavka: {s_podatak2:>10} RSD
"""
Manipulacije sa stringovima
Postoje brojni scenariji manipulacije sa stringovima, odnosno nizovima karaktera. Možemo ih spajati,
odrediti njihovu dužinu, pretraživati (utvrditi da li neki karakter ili niz karaktera nalazi u stringu)…
Spajanje stringova se vrši upotrebom operatora +. Primer:
ime = "Srdjan"
prezime = "Ilic"
prazan_string = " "
autor_kursa = ime + prazan_string + prezime
Dužina stringa (broj karaktera u stringu pri čemu se i prazan karakter računa) se određuje upotrebom
ugrađene funkcije len. Karakteri u nizu imaju redne brojeve 0, 1, 2 itd. Primer:
print(len(prazan_string))
print(len(autor_kursa))
Dobićemo ispis:
0
11
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 13
Pregled ostalih korisnih operacija sa stringovima:
operator rezultat izvršene operacije
a[p:q] Isečak stringa a od pozicije p do pozicije q.
a * n Ponavljanje stringa a n-puta.
b in a Vraća True ukoliko se string b sadrži u stringu a (alternativno: b not in a).
Nad stringovima se mogu primenjivati i metode pri čemu se string u ovom slučaju posmatra kao objekt.
Sintaksa je: string.nazivmetoda(parametri). Pregled ugrađenih metoda za rad sa stringovima:
metoda rezultat izvršene operacije
a.count(b,p.q) Broj ponavljanja stringa b u stringu a (b je kraći string od a) sa opcionim
parametrima p i q (početna i krajnja pozicija).
a.find(b, p, q)
Redni broj pozicije prvog pojavljivanja stringa b u stringu a (p i q su opcioni parametri i koriste se ukoliko želimo da ograničimo pretraživanje,
od pozicije p do pozicije q); vraća vrednost -1 ukoliko stringa b nema u stringu a.
a.replace(b,c) Vraća string a u kome su svi karakteri b zamenjeni karakterima c.
a.isupper() Vraća True ukoliko su sva slova u stringu a velika.
a.islower() Vraća True ukoliko su sva slova u stringu a mala.
a.upper() Sva mala slova u stringu a zamenjuje velikim slovima.
a.lower() Sva velika slova u stringu a zamenjuje malim slovima.
a.strip() Uklanja sve prazne karaktere iz stringa a.
a.lstrip() Uklanja vodeće prazne karaktere iz stringa a.
a.capitalize() Prvi karakter u stringu postaje veliko slovo a ostala mala.
a.isalpha() Vraća True ukoliko u stringu a postoje slova.
a.isnumeric() Vraća True ukoliko u stringu a postoje brojevi.
Levo i desno poravnanje stringova možemo izvršiti korišćenjem metoda .ljust() i .rjust():
iznos = 5.355; ukupna_sirina = 10
s = f"${iznos:,.2f}"; s = s.rjust(ukupna_sirina)
Manipulacije sa podacima vezanim za datum i vreme
Python nema ugrađen tip podataka vezan za datum i vreme pa su ovi tipovi, kao i mogućnost
manipulacije nad njima definisani preko spoljnog modula datetime. Zbog toga je potrebno, ukoliko
planiramo da radimo sa bilo kakvim podacima vezanim za datum i vreme, izvršiti uvoz ovog modula na
početku programskog koda (uz opciono dodavanje aliasa zbog lakšeg pozivanja):
import datetime as dv
U okviru ovog modula, odnosno apstraktne klase, definisani su sledeći tipovi podataka koji se koriste
za datum i vreme:
datetime.date (ili dv.time ako je upotrebljen alias), .time i .datetime
Za operacije sa isključivo datumskim podacima koristi se tip podataka .date. Upotrebom metoda
.today() nad ovim tipom podataka dobijamo današnji datum a postoji mogućnost zadavanja i
proizvoljnog datuma kao osnove za dalju manipulaciju tim podatkom.
Primer:
import datetime as dv
danasnji_dan = dv.date.today()
datum_rodjenja = dv.date(1972, 4, 16) # ispis bi bio: … 1972-04-16 (godina-mesec-dan)
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 14
Ukoliko želimo možemo preuzeti (ili direktno ispisati) delove datuma – godinu, mesec i dan.
U postojećem primeru to možemo učiniti na sledeći način:
print (datum_rodjenja.month) # ekvivalentno za godinu bi koristili year a za dan day
Format datuma možemo promeniti da bi ga prilagodili lokalnom načinu pisanja. U tu svrhu se koristi
ranije pomenuta f-string funkcija. Pregled najvažnijih dostupnih opcija (direktiva):
opcija značenje i primer
%a Skraćeni naziv dana u nedelji (Mon, Tue, Wed, Thu, Fri, Sat, Sun).
%A Pun naziv dana (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday).
%d Dan (numerička vrednost).
%m Mesec (numerička vrednost).
%Y Godina (numerička vrednost). Ukoliko umesto %Y napišemo %y dobićemo u ispisu samo poslednje dve cifre za svaku godinu.
%w Broj koji odgovara danu u nedelji (po standardu da sednica počinje od nedelje, 0).
%b Skraćeni naziv meseca (Jan … Dec).
%j Redni broj dana u godini (0-366).
%B Pun naziv meseca (January … December).
%H Prikaz sati u formatu 0-24.
%I Prikaz sati u formatu 0-12.
%M Prikaz minuta.
%S Prikaz sekundi.
%p Ubacivanje oznake AM/PM u prikaz (ide uz %I).
Primer: Prikaz datuma u našem formatu dan.mesec.godina.
import datetime as dv
danasnji_datum = dv.date.today(); danasnji_datum = f"{danasnji_datum:%d.%m.%Y.}"
print(danasnji_datum)
Primer: Prikaz trenutnog vremena
import datetime as dv
trenutno_vreme = dv.time.now()
# vreme se ispisuje u formatu 00:00:00 (sati:minuti:sekundi ukoliko f-string funkcijom ne promenimo)
Za određivanje perioda između dva datuma ili vremena koristi se klasa timedelta iz timedate modula.
Njena sintaksa je: datetime.timedelta(days=…). Možemo navesti i argumente weeks, hours, seconds,…
pri čemu ih odvajamo zarezom ukoliko ih kombinujemo.
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 15
Primer: Određivanje starosti neke osobe (preko broja proteklih dana)
import datetime as dv
danasnji_dan = dv.date.today()
datum_rodjenja = dv.date(1972, 4, 16)
starost = danasnji_dan - datum_rodjenja
# ukoliko želimo da izbegnemo da se za starost ispiše i vreme (0:00:00) napisaćemo:
# starost_samo_dana = starost.days, ili u godinama starost_godina = starost_samo_dana // 365
# ako znamo i čas rođenja, recimo 22:55 možemo napisati:
# danasnji_dan = dv.datetime.now(), ovde uzimamo pored datuma i trenutno vreme
# datum_rodjenja = dv.datetime(1972, 4, 16, 22, 55), 16.04.1972 u 22:55
# u slučaju da smo upisali i vreme dobićemo vrlo precizan podatak o starosti :)
Primer: Dodavanje i oduzimanje broja dana
import datetime as dv
danasnji_dan = dv.date.today(); trajanje = dv.timedelta(days=100)
# možemo sada definisati zbir danasnji_dan + trajanje ili razliku danasnji_dan - trajanje
# kao vrednost dobijamo datum
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 16
5. KONTROLA TOKA PROGRAMA
Kontrola toka programa je važan segment svakog programskog jezika, pa i Pythona. Kontrola toka se u
osnovi oslanja na donošenju određenih odluka, odnosno izvršavanju određenih blokova programskog
koda na osnovu poređenja nekih vrednosti ili proveri ispunjenosti postavljenih uslova. U tu svrhu
koristimo operatore poređenja i logičke operatore koji su ranije pomenuti.
Uslovno grananje
Naredba If omogućuje da se određeni blok koda izvrši ukoliko je neki uslov ispunjen, a drugi ako nije
(ovaj deo nije obavezan i ide iza else). Postoji i mogućnost višestrukog provera uslova. U tu svrhu se
koristi naredba elif (skraćeno od else if). Najbolje je sve sagledati na primerima, jednom uz upotrebu
operatora poređenja i drugom uz upotrebu logičkog operatora.
Primer: upotreba operatora poređenja
x = 4
y = 6
if y > x:
print("y je veće od x")
elif y == x:
print("y je jednako x")
else:
print("x je veće od y")
print("nastavak")
Primer: upotreba logičkog operatora
a = 5
b = 0.2
popust = True
# sledeću liniju koda možemo napisati i kao if popust == True
if popust:
a = (1 - b) * a
print(f"cena sa popustom: {a}")
else:
print(f"cena: {a}")
print("nastavak")
Primer: upotreba operatora poređenja i logičkog operatora
starost = 15
if starost >= 13 and starost < 20:
print("tinejdžer")
elif starost < 13:
print("dete")
else:
print("omladinac")
print("nastavak")
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 17
For petlja
Naredba For omogućava ponavljanje određenog bloka programskog koda dogod je zadati uslov
ispunjen. Upotrebom ove naredbe dakle formiramo programsku petlju, što se najbolje može sagledati
na primerima koji slede. Ne zaboravite samo na oznaku dvotačka (:). Ja (skoro) uvek zaboravim…
Primer: ispis jednocifrenih brojeva (1..9)
for x in range(1, 10):
print(x)
print("nastavak")
# privi broj u uslovu koji se zadaje unutar službene reči range (opseg) je broj od kog počinje provera
# drugi broj je izlazni uslov (za x od x=1 do x<10)
Primer: ispis svih slova u reči (stringu)
moja_rec = "hello"
for x in moja_rec:
print(x)
print("nastavak")
# obratite pažnju na „nazubljivanje“ koda jer to povećava njegovu čitljivost (razmak je 4 karaktera)
# u slučaju položaja print(x) ovo utiče i na tačnost izvršavanja koda jer je to deo petlje
Upotrebom službenih reči continue i break unutar for petlje forsiramo
nastavak (ponovni ulazak u petlju) odnosno prekid izvršavanja koda. Još
jedna interesantna mogućnost vezana za mnoge programske jezike, pa i
Python, je ugnježdavanje petlji (nesting). Petlja unutar petlje (uz obavezno
vođenje računa o pomenutom „nazubljivanju“ koda) je čest slučaj u
realizaciji programerskih ideja. Mogućnosti su neograničene, samo vodite
računa da se ne „upetljate“!
While petlja
Za razliku od for petlje kod koje imamo, generalno gledano, unapred utvrđeni broj prolazaka kroz
petlju, kod while petlje se blok naredbi unutar petlje izvršava sve dok je određeni uslov ispunjen.
Teoretski, može se desiti da se blok naredbi unutar While petlje i ne izvrši. Treba voditi računa da uslov
bude „realan“ kako ne bismo dobili beskonačnu petlju. Unutar while petlje takođe možemo koristiti i
naredbe continue i break da bismo dodatno uticali na tok izvršavanja, uz upotrebu uslovnog grananja.
Primer: ispis jednocifrenih brojeva
brojac = 1
while brojac < 10:
print(brojac)
brojac = brojac + 1
# ili brojac += 1
print("nastavak")
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 18
6. STRUKTURE PODATAKA
Liste
Lista je najjednostavniji tip strukture podataka u Pythonu. Članovi liste se odvajaju zarezom a lista se
otvara i zatvara uglastim zagradama. Primeri listi… [1, 2, 5], ["januar", "maj", "oktobar]. Listi se može
pristupiti kao celini ali se može pristupiti i pojedinačnim članovima (elementima). Svaki član liste se
referencira svojim rednim brojem (počinju od 0).
Primer: ispis članova liste
dani = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
for x in dani:
print(x)
print("nastavak")
Videli smo da upotrebom službene reči break možemo forsirati izlazak iz petlje. Za prethodni primer bi
recimo mogli da modifikujemo listu i odvojimo radne dane od vikenda praznim stringom a onda
napravimo for petlju koja bi ispisala samo dane koji ne pripadaju vikendu:
dani = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", " ", "subota", "nedelja"]
for x in dani:
if x == " ":
print("izlazak iz petlje")
break
print(x)
print("nastavak")
primer: utvrđivanje da li se neki član nalazi u listi i kolika je dužina liste (koliko ima članova)
dani = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
postoji = "sreda" in dani
# promenljiva postoji u ovom slučaju dobija vrednost True
broj_clanova = len(dani)
# promenljiva broj_clanova u ovom slučaju dobija vrednost 7
Primer: pristup pojedinačnom članu liste, dodavanje novog člana na kraj liste i promena člana
lista = [1, 2, 5]
posledni_clan = lista[2]
# rezultat je 5
lista.append(9)
# dodavanje člana 9 na kraj liste
print(lista)
# ispis je [1, 2, 5, 9]
lista.insert(2, 4)
# dodavanje člana 4 na poziciji 2, dakle ispred člana 5
print(lista)
# ispis je [1, 2, 4, 5, 9]
lista[1] = 3 # član na rednoj poziciji 1 (radi se o članu 2) je zamenjen članom 3
print(lista)
# ispis je [1, 3, 4, 5, 9]
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 19
Primer: proširenje liste spajanjem sa članovima druge liste
lista1 = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak"]
lista2 = ["subota", "nedelja"]
lista1.extend(lista2)
# lista1 je sada ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
Primer: izbacivanje određenog člana iz liste (izbacuje se samo na poziciji prvog pojavljivanja)
dani = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
dani.remove("subota")
Upotrebom while petlje se iz liste gde imamo više pojavljivanja nekog člana mogu izbaciti svi. Ukoliko
želimo da izbacimo člana liste samo sa određene pozicije koristimo metod .pop(pozicija) umesto
.remove(). Na primer dani.pop(5) izbaciće takođe član "subota" (jer se nalazi na poziciji 5). Izbacivanje
poslednjeg člana liste vrši se metodom .pop(), bez navođenja pozicije. Alternativno, možemo koristiti i
naredbu del koja ima intuitivniji naziv od metoda .pop() ali i sa njom ide i drugačija sintaksa.
Primer: brisanje člana liste na određenoj poziciji i brisanje liste
dani = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
del dani[5]
del dani
Brisanjem liste u ovom slučaju dobijamo praznu listu, pri čemu se pri pokušaju njenog ispisa dobija
poruka o greški a nemoguće je i pristupiti članovima liste jer ih nema. Zbog toga je u nekim slučajevima
bolje koristiti metod .clear() čime se lista prazni ali i dalje ostaje da postoji. U datom primeru to bi
uradili sa dani.clear().
Primer: određivanje broja pojavljivanja nekog člana u listi
lista = ["A", "B", "A", "C", "A", "D"]
broj = lista.count("A")
# pošto je broj numerički podatak da bi ga prikazali moramo ga pretvoriti u string
print("Slovo A se " + str(broj) + " puta pojavljuje u listi. ")
Poziciju prvog pojavljivanja nekog člana liste možemo saznati upotrebom metoda .index(). Pri tome
treba obezbediti odgovarajući deo koda koji će proveriti da li se naznačeni član uopšte nalazi u listi
kako bi izbegli da pri izvršavanju programa dobijemo poruku o greški.
Primer: provera da li se u toku nedelje pojavila temperatura od 19 stepeni
temperature = [25, 14, 18, 10, 16, 19, 20]
t = 19
if t in temperature:
print("Temperatura " + str(t) + " step. bila je " + str(temperature.index(t)+1) + ". dana.")
else:
print("Ne, nije bila.")
Za sortiranje članova liste koristi se metod .sort(). Moguće je sortirati numeričke i podatke koji
predstavljaju stringove. U datom primeru upotrebićemo temperature.sort() pri čemu ćemo dobiti ispis
[10, 14, 16, 18, 19, 20, 25] upotrebom naredbe print(temperature).
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 20
Za sortiranje datuma najprikladnije je napraviti prvo praznu listu a potom izvršiti dodavanje datuma,
jednog po jednog, kako bi ceo postupak bio čitljiviji.
Primer: sortiranje datuma
import datetime as dv
lista_datuma = []
lista_datuma.append(dv.date(2020, 6, 18))
lista_datuma.append(dv.date(2020, 4, 16))
lista_datuma.append(dv.date(2019, 12, 30))
lista_datuma.append(dv.date(2020, 7, 14))
lista_datuma.sort()
for datum in lista_datuma:
print(f"{datum:%d.%m.%Y.}")
# ovde je korišten prilagođeni ispis datuma
# ukoliko želimo da sortiranje ide od najskorijeg datuma napisaćemo lista_datuma.sort(reverse = True)
Članove liste možemo poređati u obrnutom redosledu a možemo i celu listu iskopirati u drugu.
Primer:
dani1 = ["ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"]
dani2 = dani.copy()
dani2.reverse()
# lista dani2 bila bi ["nedelja", "subota", … , "ponedeljak"]
Tupuli
Tupul (tuple) je sledeći tip strukture podataka u Pythonu. U pitanju je, poput liste, niz vrednosti koje
su povezane u neku logičku celinu, s tom razlikom da se ovde radi o nepromenljivim podacima. To je
između ostalog i jedna od najbitnijih razlika tupula u odnosu na listu. Zbog te činjenice mnoge
operativne akcije i metodi koji su se mogli primeniti nad listama i njenim članovima ne važe za tupule.
Za razliku od članova liste koji se navode unutar srednjih zagrada, članovi tupula se navode unutar
običnih zagrada. Primer: (25, 19, 63). Nad tupulima se mogu primeniti sledeće akcije i metodi:
▪ Određivanje dužine len(naziv_tupula)
▪ Određivanje broja pojavljivanja određenog člana .count(član)
▪ Provera da li se neki član pojavljuje u tupulu (član in naziv_tupula);
vrednost može biti True ili False
▪ Pozicija pojavljivanja nekog člana u tupulu .index(član)
▪ Kretanje kroz članove tupula i njihov ispis
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 21
Skupovi
Skup takođe spada u strukture podataka. Za razliku od listi gde je redosled članova bitan kod skupova
to nije slučaj - član skupa se ne može identifikovati svojom pozicijom, odnosno na njega se ne može
primeniti metod .index(). Članovi skupova, poput članova tupula, predstavljaju takođe nepromenljive
vrednosti pa tako važe ista (ili slična) ograničenja kada je u pitanju mogućnost primene određenih
operativnih akcija i metoda. Članovi skupova se navode unutar vitičastih zagrada i odvajaju se zarezima.
Primer: {5.00, 4.35, 18.95}.
Nad skupovima se mogu primeniti sledeće akcije i metodi:
▪ Određivanje dužine len(naziv_skupa)
▪ Dodavanje pojedinačnog člana skupu .add(član) i
dodavanje više članova odjednom .update([član1, …])
▪ Provera da li se neki član pojavljuje u skupu (član in naziv_skupa);
vrednost može biti True ili False
▪ Kopiranje skupa upotrebom metoda .copy(), uz napomenu da redosled članova pri ovome
može promeniti
▪ Kretanje kroz članove skupa i njihov ispis
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 22
Rečnici podataka
Za razliku struktura podataka pomenutih u prethodnim odeljcima, rečnik podataka sadrži podatke koji
se identifikuju isključivo preko ključa koji može biti broj ili string i mora biti jedinstven za svaki podatak
u rečniku. Podaci u rečniku mogu biti brojevi, stringovi, liste, tupoli ili skupovi.
Primeri organizacije rečnika podataka:
> tip 1: rečnik podataka za sve zaposlene
Ključ (ID broj zaposlenog)
Podatak (lista sa podacima: ime i prezime, godina rođenja, stalni radni odnos)
"z15805" ["Petar Petrović", 1976, True]
"z23052" ["Ivana Jovanović", 1990, False]
> tip 2: poseban rečnik podataka za svakog zaposlenog
'z15805' = 'ime_prezime' = 'Petar Petrović'
'god_rodjenja' = 1976
'radni_odnos' = True
'z23052' = 'ime_prezime' = 'Ivana Jovanović'
'god_rodjenja' = 1990
'radni_odnos' = False
Pristup podacima se vrši kombinacijom objekat.ključ:
z15805.ime_prezime = 'Petar Petrović'
z15805.god_rodjenja = 1976
z15805.radni_odnos = True
Primer: formiranje i ispis jednostavnog rečnika podataka
Ključ (ID broj zaposlenog)
Podatak (ime i prezime)
"z15805" "Petar Petrović"
"z23052" "Ivana Jovanović"
zaposleni = {
'z15805' : 'Petar Petrović',
'z23052' : 'Ivana Jovanović'
}
broj_podataka = len(zaposleni)
licnost = 'z15805'
prisutan = licnost in zaposleni
# promenljiva prisutan dobija vrednost True
print(zaposleni.get(licnost))
# Petar Petrović; ukoliko navedenog podatka nema u rečniku dobićemo ispis None
# alternativno možemo upotrebiti i print(zaposleni[licnost]) ali i grešku ako ga nema
zaposleni.update({'z23052': 'Ivana Jovanović-Simić'})
# promena podatka u rečniku; alternativno zaposleni['z23052'] = "Ivana Jovanović-Simić"
zaposleni.update({'z78046': 'Marko Marković'})
del zaposleni["z78046"]
# dodavanje novog podatka u rečnik jer ključ z78046 nije postojao, a potom i njegovo brisanje
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 23
Kroz rečnik podataka se možemo kretati, recimo da bi ispisali sve podatke. U tom slučaju dodali bi
sledeći deo koda:
for podatak in zaposleni.keys():
print(podatak + " : " + zaposleni[podatak])
# alternativno možemo upotrebiti i metod .items() koji povlači i ključeve i vrednosti:
# for kljuc, vrednost in zaposleni.items(): print(kljuc, " : ", vrednost)
# za ispis samo imena možemo upotrebiti:
# for podatak in zaposleni: print(zaposleni[podatak]) ili
# for podatak in zaposleni.values(): print(podatak)
# za ispis samo ključeva možemo upotrebiti: for podatak in zaposleni: print(podatak)
Pregled svih metoda koji se koriste u rečnicima podataka:
Metod Opis metode Način korišćenja (primer)
copy() Vraća kopiju rečnika. zaposleni2 = zaposleni.copy()
fromkeys() Vraća kopiju rečnika (samo zadatih ključeva i vrednosti).
pop() Izbacuje vrednost opisanu ključem iz rečnika i smešta je u promenljivu ukoliko je tako naznačeno.
otpusten = zaposleni.pop("z15805")
popitem() Izbacuje poslednji par ključ-vrednost iz rečnika. U ranijim verzijama Pythona izbacivan je par po nasumičnom izboru pa treba biti obazriv pri primeni ovog metoda.
otpusten = zaposleni.popitem()
clear() Prazni rečnik podataka. zaposleni.clear()
keys() Vraća listu svih ključeva u rečniku podataka.
values() Vraća listu svih vrednosti u rečniku podataka.
get() Vraća vrednost zadatog ključa.
items() Vraća listu svih stavki (u formi tupla), odnosno parova ključ-vrednost.
update() Menja vrednost povezanu sa zadatim ključem ili ubacuje novu ukoliko zadati ključ ne postoji.
setdefault() Vraća vrednost povezanu sa zadatim ključem, a ako taj ključ ne postoji ubacuje ga zajedno sa definisanom vrednošću.
Primer: formiranje i ispis kompleksnog rečnika podataka
proizvod = {
'kategorija' : 'racunar',
'tip' : 'laptop',
'proizvodjac' : 'Lenovo',
'model' : 'ThinkPad',
'oznaka' : 'L590',
'cena' : 650,
'boja' : ['crna', 'siva', 'crvena'],
}
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 24
# ispis podataka iz rečnika podataka
print("Kategorija:", proizvod['kategorija'])
print("Tip:", proizvod['tip'])
print("Proizvođač:", proizvod['proizvodjac'])
print("Model:", proizvod['model'])
print("Oznaka:", proizvod['oznaka'])
print("Cena:", f"{proizvod['cena']:.2f} EUR")
print("Dostupne boje:")
for boja_proizvoda in proizvod['boja']:
print(boja_proizvoda)
Skup više kompleksnih rečnika podataka, u ovom slučaju proizvoda, čini ukupno stanje podataka koje
pratimo. Da bi se definisali takvi skupovi podataka koriste se ugnježdeni rečnici. Identifikaciju
pojedinačnih proizvoda možemo izvršiti preko njihovih bar-kodova ili internih ID brojeva, na primer.
Primer:
proizvodi = {
'RL256' : {'kategorija': 'racunar', 'tip': 'laptop', 'proizvodjac': 'Lenovo', 'model': 'ThinkPad',
'oznaka':'L590', 'cena':650, 'boja': ['crna', 'siva', 'crvena']},
'RL114' : {'kategorija': 'racunar', 'tip': 'laptop', 'proizvodjac': 'HP', 'model': 'ProBook',
'oznaka':'650G1', 'cena':420, 'boja': ['siva']},
}
# ispis u vidu formatirane tabele korišćenjem f-string funkcija zbog poravnanja podataka
print(f"{'ID':<6} {'Kat':<17} {'Tip':<8} {'Proiz.':<10} {'Model':<10} {'Oznaka':<6} {'Cena':>12}")
print("-" * 100)
for proizvod in proizvodi.keys():
idp = proizvod
kat = proizvodi[proizvod]['kategorija']
tip = proizvodi[proizvod]['tip']
pro = proizvodi[proizvod]['proizvodjac']
mod = proizvodi[proizvod]['oznaka']
ozn = proizvodi[proizvod]['kategorija']
cen = f"{proizvodi[proizvod]['cena']:,.2f}" + " EUR"
boj = ' '
for b in proizvodi[proizvod]['boja']:
boj = boj + b + ', '
# elinisanje dva poslednja karaktera ukoliko smo naišli na ', ' (nema više boja)
if len(boj) > 2:
boj = boj[:-2]
else:
boj = "<nema>" # nije definisana boja za navedeni proizvod
print(f"{idp:<6} {kat:<17} {tip:<8} {pro:<10} {mod:<10} {ozn:<6} {cen:>12} {boj}")
ID Kat Tip Proiz. Model Oznaka Cena
----------------------------------------------------------------------------------------------------------------------
RL256 racunar laptop Lenovo ThinkPad L590 650.00 EUR crna, siva, crvena
RL114 racunar laptop HP ProBook 650G1 420.00 EUR siva
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 25
7. FUNKCIJE
Prilikom razvoja većih projektnih rešenja od izuzetne važnosti je da programski kod bude modularan i
skalabilan kako bi članovi razvojnog tima ili sam programer, ukoliko samostalno radi na izradi
programa, mogli da jasno definišu programske celine. U tu svrhu se delovi programskog koda sa jasno
određenom namenom (ulaznim i izlaznim parametrima) odvajaju u celine koje se nazivaju funkcije.
Funkcije se mogu pozvati sa više mesta u toku programa tako da se eliminiše potreba da se taj deo
koda svaki put iznova piše kada je potrebno odraditi neki zadatak. Funkcija se formira upotrebom
službene reči def iza koje sledi naziv funkcije i par zagrada, te znak :. Izuzetno je važno primeniti dobru
praksu pisanja komentara!
Programski kod unutar funkcije (kao i unutar petlji, grananja, definicija rečnika podataka i drugih sličnih
konstrukcija) mora biti uvučen jer Python nema naredbu za njen završetak, te jedino na taj način može
prepoznati da se radi o telu funkcije.
Primer:
# funkcija za ispis poruke uz primenu default parametra; osnovni oblik je hello(ime)
def hello(ime = "niko"):
""" opis funkcije: ispis pozdravne poruke uz ime prosleđeno kao argument funkcije """
print("Hello " + ime)
# poziv funkcije
osoba = "Sonja"
hello(osoba)
# za poziv funkcije bez argumenata biće iskorišćen default parametar definisan u samoj funkciji
hello(), dakle "niko".
Parametri koji se koriste unutar funkcije imaju oblast važenja samo u njoj. Međutim, treba ipak
poštovati praksu da se isti nazivi ne koriste u i izvan funkcija. Vrednosti koje se prosleđuju funkciji
nazivaju se argumenti i pišu se unutar zagrada pored njenog naziva u pozivu.
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 26
Ukoliko funkcija očekuje neke ulazne vrednosti one se moraju definisati i proslediti prilikom poziva
funkcije. U slučaju da je parametar opcionog karaktera, funkcija mora da zna koju vrednost treba da
ima ukoliko joj se pozivom ne prosledi ništa. U slučaju da se funkciji prosleđuje više od jedne vrednosti,
one moraju biti odvojene zarezima kako u zaglavlju funkcije (kada predstavljaju parametre) tako i u
pozivu funkcije (kada predstavljaju argumente) i mora se voditi računa o njihovom redosledu. Postoji i
način prosleđivanja vrednosti u proizvoljnom redosledu ali se onda pri pozivu funkcije unutar zagrada
moraju navesti i tačni nazivi parametara koji su upotrebljeni u zaglavlju funkcije (tako zvani kwargs u
Python slengu). Primer poziva naše funkcije bio bi hello(ime=osoba). U ovom primeru to nema smisla
ali se nadam da shvatate poentu. Unutar same funkcije možemo kontrolisati ispis proverom da li neki
parametar prosleđen. Najelegantniji način za to je upotrebom if naredbe.
Argument poziva funkcije, odnosno parametar funkcije može biti i lista. Ovde treba imati na umu da se
funkciji prosleđuje samo pokazivač (pointer) na listu te funkcija kao takva ne može menjati elemente
liste koji dolaze iz „stvarnog sveta“, odnosno iz dela programskog koda koji je van funkcije. Zbog toga
je praksa da se unutar funkcije napravi kopija prosleđene liste i da se onda ona obrađuje.
Izlazna vrednost, dobijena nakon obrade podataka u funkciji, vraća se upotrebom službene reči return.
Primer: funkcija kojoj se prosleđuje lista
# funkcija za sortiranje prosleđene liste
def sortiranje(ulazna_lista=[]):
""" opis funkcije: sortiranje liste sa imenima u abecednom redu; default vrednost je prazna lista """
sort_lista = ulazna_lista.copy()
sort_lista.sort()
# pravimo u stvari izlazni string (inicijalna vrednost je prazan string)
izlazni_string = " "
# prolazak kroz imena iz sortirane liste
# sa dodavanjem svakog novog podatka iza zareza i praznog karaktera
for ime in sort_lista:
izlazni_string = izlazni_string + ime + ", "
# elinisanje dva poslednja karaktera ', ' (iza poslednjeg imena)
izlazni_string = izlazni_string [:-2]
# dobićemo ispis (preko funkcije): Aleksa, Marko, Nenad, Sonja
return izlazni_string
# poziv funkcije
lista = ["Marko", "Sonja", "Aleksa", "Nenad"]
# kada se koristi return, pri pozivu funkcije rezultat treba smestiti u neku promenljivu
krajnja_lista = sortiranje(lista)
print(krajnja_lista)
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 27
8. KLASE
Python je između ostalog i objektno-orijentisani programski jezik u kome se mogu definisati klase,
objekti i metodi. Klasa se definiše svojim atributima i metodima (akcijama, odnosno aktivnostima koje
se mogu preduzeti nad njenim elementima - objektima). Objekat predstavlja određeni pojavni oblik
same klase, odnosno njenu instancu. To je dakle element koji nastaje iz klase. Jedna klasa može imati
više objekata. Klasa se u programskom kodu pojavljuje kao jasno izdvojena celina i ima, kako je već
napomenuto, svoje atribute, metode i ime. Praksa je da ime klase počinje velikim slovom abecede kako
bi se klasa razlikovala od promenljive. Iz nje možemo „stvoriti“ jedinstveni objekat, njenu instancu sa
atributima koji dobijaju svoja svojstva. Metodi su praktično funkcije koje se definišu unutar klase i kao
takvi su dostupne za primenu nad objektima.
Primer: definisanje „prazne“ klase koju ćemo kasnije razviti
class Radnik:
pass
# upotrebom službene reči pass stavljamo do znanja Pythonu da ćemo klasu razviti kasnije
# na ovaj način se izbegava prijava greške prilikom izvršavanja koda
Da bi klasi omogućili formiranje njenih instanci (objekata) moramo definisati inicijalni metod (init
method) kroz koji ćemo klasi proslediti podatke potrebne za kreiranje svakog pojedinačnog objekta. U
navedenom primeru klase Radnik definisaćemo inicijalni metod i tako joj saopštiti da ćemo joj prilikom
svakog kreiranja novog objekta proslediti sledeće podatke: korisničko ime i ime i prezime zaposlenog.
def __init__(self, korisnicko_ime, ime_prezime):
self.korisnicko_ime = korisnicko_ime
self.ime_prezime = ime_prezime
# self je default naziv za promenljivu koja je vezana za objekat koji se u tom trenutku kreira
# prilikom iniciranja objekat self je prazan a potom mu se definišu potrebni atributi
# korisnicko_ime i ime_prezime su atributi
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 28
Konkretan objekat (instancu klase) kreiramo pozivom klase i prosleđivanjem vrednosti koje njeni
atributi trebaju dobiti:
novi_radnik = Radnik("srdjani", "Srdjan Ilić")
print(novi_radnik.korisnicko_ime)
# ispis bi bio srdjani
# vrednosti atributa se mogu menjati:
novi_radnik.korisnicko_ime = "ilicsr"
Prilikom kreiranja objekta nije obavezno da se klasi proslede sve vrednosti koje treba da definišu njene
atribute. Klasa može iskoristiti predefinisane (dafault) vrednosti koje će usvojiti umesto onih koji nisu
prosleđeni ili se atributima mogu dodeliti vrednosti definisane u samoj klasi na osnovu nekog
kriterijuma. Klasu Radnik možemo proširiti novim atributima datum_zaposlenja (generiše se za svakog
novog radnika čiji se objekat prvi put kreira i dobija vrednost današnjeg datuma) i prisutan (definiše da
li je radnik na poslu ili je na odmoru; predefinisana vrednost biće True). Već znamo da kada koristimo
datum i vreme moramo da izvršiti uvoz spoljnog modula sa import datetime as dv. Unutar klase ćemo
definisati nove atribute kao:
self.datum_zaposlenja = dv.date.today()
self.prisutan = True
Naša klasa Radnik bi sada trebala da izgleda ovako:
class Radnik:
def __init__(self, korisnicko_ime, ime_prezime):
self.korisnicko_ime = korisnicko_ime
self.ime_prezime = ime_prezime
self.datum_zaposljenja = dv.date.today()
self.prisutan = True
Vreme je da definišemo metode vezane za navedenu klasu. Metodi se generišu unutar klase.
Definisaćemo prvi metod koja vraća datum zaposlenja. Ovaj metod neće imati parametre koji mu se
prosleđuju ali je ipak unutar zagrada obavezno navesti self.
def prikazi_datum_zaposlenja(self):
return f"{self.ime_prezime} se zaposlio {self.datum_zaposlenja:%d.%m.%Y.}"
U programu ćemo zatim nad definisanim objektom pozvati ovaj metod:
novi_radnik.prikazi_datum_zaposlenja()
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 29
Drugi metod će preuzeti prosleđeni parametar iz programa i na osnovu njega potvrditi ili promeniti
atribut prisutan.
def prisutnost(self, da_ne):
self.prisutan = da_ne
Kompletan primer sada izgleda ovako:
import datetime as dv
class Radnik:
def __init__(self, korisnicko_ime, ime_prezime):
self.korisnicko_ime = korisnicko_ime
self.ime_prezime = ime_prezime
self.datum_zaposlenja = dv.date.today()
self.prisutan = True
def prikazi_datum_zaposlenja(self):
return f"{self.ime_prezime} se zaposlio {self.datum_zaposlenja:%d.%m.%Y.}"
def prisutnost(self, da_ne):
self.prisutan = da_ne
novi_radnik = Radnik("srdjani", "Srdjan Ilić")
print(novi_radnik.korisnicko_ime)
novi_radnik.korisnicko_ime = "ilicsr"
print(novi_radnik.korisnicko_ime)
zaposlenje = novi_radnik.prikazi_datum_zaposlenja()
print(zaposlenje)
na_odmoru = True
if na_odmoru == True:
novi_radnik.prisutnost(False)
else:
novi_radnik.prisutnost(True)
if novi_radnik.prisutan == False:
print(f"{novi_radnik.ime_prezime} je na odmoru.")
else:
print(f"{novi_radnik.ime_prezime} je prisutan.")
Alternativni način poziva nekog od definisanih metoda iz programa je:
Radnik.prikazi_datum_zaposlenja(novi_radnik)
Radnik.prisutnost(novi_radnik)
U klasama se mogu definisati klasne promenljive. Ove promenljive se definišu neposredno ispred
definisanja inicijalnog metoda. U navedenom primeru možemo napraviti kompleksnije rešenje koje će
uzeti u obzir i da li je novi radnik primljen na određeno ili neodređeno vreme. U programskom kodu,
prilikom formiranja objekta, klasi Radnik u tom slučaju moramo proslediti i vrednost neke promenljive
koju ćemo nazvati recimo radni_odnos (može imati dve vrednosti "na odredjeno" i "na neodredjeno").
U samoj klasi definisaćemo klasnu promenljivu trajanje i dodeliti joj neku vrednost (recimo 90; misli se
na broj dana trajanja radnog odnosa na određeno vreme). Na osnovu ove vrednosti, odnosno njenim
sabiranjem sa datumom zaposlenja možemo dobiti datumsku promenljivu koja će nam vratiti podatak
kada radni odnos zasnovan na određeno vreme ističe (datum_istice).
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 30
U klasama se mogu definisati i specifični klasni metodi koji se ne odnose na instance klasa. Ovi metodi
imaju specifičnu sintaksu. Pre njihovog definisanja moramo napisati tako zvani dekorator
@classmethod a unutar zagrada zaglavlja se ne piše self već cls. U našoj klasi ćemo definisati klasni
metod kojim ćemo moći da promenimo internu promenljivu trajanje, pozivom iz samog programskog
koda.
Pored već navedenih metoda koji se koriste u klasama postoje i tako zvani statički metodi. Ovi metodi
se takođe ne odnose na konkretne instance klase i mogu se upotrebljavati nezavisno od njih. Jedini
razlog zašto se pojavljuju u određenoj klasi je zbog konkretne logičke zamisli o organizaciji koda. Pre
njihovog definisanja moramo upotrebiti dekorator @staticmethod a unutar zagrada zaglavlja se ne
piše self već cls. U našoj klasi ćemo definisati statički metod kojim ćemo moći da proverimo trenutno
vreme.
Naš primer bi posle ovih proširenja trebao da izgleda ovako:
import datetime as dv
class Radnik:
trajanje = 90
def __init__(self, korisnicko_ime, ime_prezime, radni_odnos):
self.korisnicko_ime = korisnicko_ime
self.ime_prezime = ime_prezime
self.datum_zaposlenja = dv.date.today()
self.radni_odnos = radni_odnos
if radni_odnos == "na odredjeno":
self.datum_istice = dv.date.today() + dv.timedelta(days = Radnik.trajanje)
else:
self.datum_istice = dv.date.today() + dv.timedelta(days = 365 * 100)
self.prisutan = True
# definisanje metoda
def prikazi_datum_zaposlenja(self):
return f"{self.ime_prezime} se zaposlio {self.datum_zaposlenja:%d.%m.%Y.}"
def prisutnost(self, da_ne):
self.prisutan = da_ne
@classmethod
def odredi_trajanje(cls, broj_dana):
cls.trajanje = broj_dana
@staticmethod
def vreme():
sada_je = dv.datetime.now()
return f"{sada_je:%H:%M}"
novi_radnik = Radnik("srdjani", "Srdjan Ilić", "na odredjeno")
print(novi_radnik.korisnicko_ime)
novi_radnik.korisnicko_ime = "ilicsr"
print(novi_radnik.korisnicko_ime)
zaposlenje = novi_radnik.prikazi_datum_zaposlenja()
print(zaposlenje)
na_odmoru = True
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 31
if na_odmoru == True:
novi_radnik.prisutnost(False)
else:
novi_radnik.prisutnost(True)
if novi_radnik.prisutan == False:
print(f"{novi_radnik.ime_prezime} je na odmoru.")
else:
print(f"{novi_radnik.ime_prezime} je prisutan.")
print() # prazan red
print(f"{novi_radnik.ime_prezime} radi {novi_radnik.radni_odnos} i radni odnos ističe
{novi_radnik.datum_istice:%d.%m.%Y.}") # trajanje je 90 dana
Radnik.odredi_trajanje(30)
print(novi_radnik.trajanje) # trajanje je 30 dana
print(Radnik.vreme())
Koncept nasleđivanja klasa u Pythonu uvodi pojam sub klasa. Klasa višeg nivoa (roditeljska klasa)
definiše karakteristike (atribute i metode) koje se implicitno prenose na klasu nižeg nivoa koja je
definisana kao njena sub klasa. U sub klasi se potom definišu samo one karakteristike koje su specifične
za nju, nasleđujući opšte karakteristike koje su već definisane u klasi višeg nivoa. Prvi korak pri
definisanju hijerarhije klasa je definisanje osnovne klase. Krećemo sa novim primerom vezanim za
korisnike računara. Definisaćemo osnovnu klasu Korisnik i dve sub klase: Administrator i Ostali. U
osnovnoj klasi uvešćemo neke osnovne atribute (identifikacioni broj, ime i prezime), a preko sub klasa
atribute koju su karakteristični samo za konkretnu sub klasu. Za administratore ćemo imati recimo duže
trajanje pristupnih prava od ostalih korisnika, kao i posebnu lozinku za pristup.
import datetime as dv
# osnovna klasa
class Korisnik:
trajanje_pristupa = 90
def __init__(self, id, ime_prezime):
self.id = id
self.ime_prezime = ime_prezime
self.datum_isteka_prava = dv.datetime.today() + dv.timedelta(days = self.trajanje_pristupa)
def prikazi_datum(self):
return f"Pristup ističe {self.datum_isteka_prava:%d.%m.%Y.}"
# sub klase uz navođenje imena osnovne klase unutar zagrada
class Administrator(Korisnik):
trajanje_pristupa = 365 # menjamo vrednost promenljive definisane u osnovnoj klasi
def __init__(self, id, ime_prezime, lozinka):
super().__init__(id, ime_prezime) # prezimanje atributa iz osnovne klase
self.lozinka = lozinka # definisanje novog atributa, samo za ovu sub klasu
class Ostali(Korisnik):
pass
novi_administrator = Administrator(1972, "Srđan Ilić", "OzGoT!5p@ss")
novi_korisnik = Ostali(2020, "Marija Ilić")
print(novi_administrator.ime_prezime); print(novi_administrator.prikazi_datum())
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 32
LITERATURA
Python All-in-One Edicija: For Dummies Autori: Alan Simpson, John Shovic Godina izdanja: 2019. Broj strana: 740 Jezik: engleski
Ovaj kreativni kurs dostupan je i u naprednoj verziji. Napredne verzije kurseva iz oblasti programiranja
osmišljene su tako da kreativno učenje podignu na stepenik više. Organizovane su na prepaid principu
sa novim temama i primerima dostupnim na nedeljnoj osnovi ili na drugom, unapred dogovorenom
periodičnom principu. Rad je organizovan putem Google Classroom platforme a radni materijal se šalje
i putem e-pošte. Uz svaki napredni kurs dobijate i pravo na konsultacije preko e-pošte i/ili messaging
grupe za vreme njegovog trajanja. Svaki modul naprednog kursa obrađuje određeni broj povezanih
tema a izbor modula je proizvoljan – možete aplicirati za sve ili se opredeliti samo za neke. Opciono se
u napredni kurs može, kao inicijalna tema, uvrstiti i obnavljanje celokupnog kurikuluma obuhvaćenog
osnovnim kursom. Više o ovom i ostalim naprednim kursevima možete saznati na veb lokaciji
www.portalis.rs ili putem e-pošte, slanjem upita na adresu [email protected].
PLAN MODULA POKRIVENIH NAPREDNIM KURSOM – PYTHON, KORAK DALJE
▪ REPETITORIJUM: OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON [7 termina]
▪ UPRAVLJANJE GREŠKAMA I IZUZECIMA [2 termina]
▪ RAD SA SPOLJNIM DATOTEKAMA PODATAKA [5 termina]
▪ JSON DATA KONCEPT [3 termina]
▪ INTERAKCIJA SA INTERNETOM [2 termina]
▪ BIBLIOTEKE, PAKETI I MODULI [2 termina]
OSNOVE PROGRAMIRANJA – PROGRAMSKI JEZIK PYTHON
HËLLO – THE FREELANCE PROJECT 33