Dan 1/28: Struktura projekta i prvi Python fajl
Vreme potrebno: 60 – 120 minuta
Gde je Učitelj Vasa danas?
Učitelj Vasa ima svoj digitalni dom – GitHub repozitorijum sa profesionalnom strukturom foldera i osnovnim konfiguracionim fajlovima. Sve je spremno, ali Vasa još uvek ne postoji kao funkcionalan program. Danas menjamo to – pisaćemo prve linije Python koda koje će oživeti našeg AI asistenta i omogućiti mu da komunicira sa korisnicima kroz konzolu.
Cilj današnje lekcije
Danas ćeš kreirati vasa_core.py modul sa prvim funkcijama koje omogućavaju Učitelju Vasi da se predstavi i pozdravi korisnike. Nakon ove lekcije, moći ćeš da pokreneš program koji ispisuje pozdrave i osnovne informacije o Vasi, razumećeš kako Python moduli funkcionišu i kako se importuju.
Predznanja
- Kreiran GitHub repozitorijum “ucitelj-vasa” (Dan -1)
- Postavljena folder struktura sa Python paketima (Dan 0)
- Razumevanje šta su fajlovi i folderi
- Osnovno poznavanje PyCharm interfejsa
- Python 3.13+ instaliran i podešen
Glavni sadržaj
Prvi susret sa Python funkcijama
Python funkcije su kao recepti – sadrže niz instrukcija koje se izvršavaju kada ih pozoveš. Danas ćemo napisati prve funkcije koje će činiti srce Učitelja Vase.
📚 NIVO 1 – Osnovno objašnjenje
Funkcija u programiranju je kao upakovana instrukcija. Zamisli da imaš robota kome možeš reći “napravi kafu”. Robot zna šta znače ti koraci: uzmi šolju, sipaj vodu, dodaj kafu, promešaj. U Python-u, funkcija je upravo to – ime koje krije niz instrukcija. Umesto da svaki put pišeš sve korake, samo kažeš “napravi_kafu()” i Python zna šta da radi.
🚀 NIVO 2 – Dublje razumevanje
Python funkcije su objekti prve klase (first-class objects), što znači da mogu biti dodeljene promenljivim, prosleđene drugim funkcijama ili vraćene kao rezultat. Definišu se ključnom reči def, praćenom imenom i zagradama. Python koristi indentaciju (uvlake) da označi koje linije pripadaju funkciji. Ovo je fundamentalno drugačije od jezika koji koriste vitičaste zagrade.
🔍 UVID: Tretiranje funkcija kao “objekata prve klase” je jedan od najmoćnijih koncepata u Python-u. To znači da je funkcija podatak, baš kao i broj ili tekst. Na početku, ovo koristimo da bismo organizovali kod. Kasnije u kursu (npr. Dan 17, Strategija izbora AI servisa), ovaj koncept će nam omogućiti da dinamički biramo koju AI funkciju (npr. pozovi_openai, pozovi_claude) da izvršimo, tretirajući ih kao delove koje možemo menjati i kombinovati. Ovakav pristup čini sistem fleksibilnim i lakim za proširenje.
💡 PRO TIP: Dok pišeš funkcije, navikni se da odmah dodaješ docstring (trostruke navodnike ispod def). To je kao da u svesci pored recepta upišeš zašto i kada ga koristiš. Posle samo mesec dana zaboravićeš zašto si nešto napisao; help(tvoja_funkcija) će ti tada pokazati sopstvenu malu “uputu za upotrebu”. Kratki, jasni docstringovi čine projekat čitljivim i drugima i tebi-u-budućnosti.
🎈 ZABAVNA ČINJENICA: Python tretira funkciju kao objekat – možeš je smestiti u listu, proslediti drugoj funkciji ili je čak vratiti kao rezultat (tzv. first-class citizens). Dobićeš super-moćan “lego” sistem za gradnju programa!
Kreiranje prvog Python modula
Vreme je da napravimo naš prvi pravi Python fajl! Ovaj fajl će biti mozak Učitelja Vase.
📚 NIVO 1 – Korak po korak
- Otvori PyCharm sa projektom “ucitelj-vasa”
- Desni klik na
srcfolder → New → Python File - Ime fajla:
vasa_core(bez .py ekstenzije – PyCharm je dodaje automatski) - Klikni OK

PyCharm sa src folder i New → Python File dijalogom
PyCharm će kreirati prazan fajl vasa_core.py u src folderu. Sada dodaj sledeći kod:
"""
Učitelj Vasa - Osnovni modul
Ovaj modul sadrži osnovne funkcionalnosti AI asistenta Vase.
"""
# Osnovne informacije o Vasi
VASA_INFO = {
"ime": "Učitelj Vasa",
"verzija": "0.1.0",
"opis": "AI asistent za pomoć u učenju programiranja",
"autor": "Student AISYNTHESIS akademije"
}
def pozdrav():
"""Vraća pozdravnu poruku od Učitelja Vase."""
return "Zdravo! Ja sam Učitelj Vasa, tvoj AI asistent za učenje programiranja! 🎓"
def predstavi_se():
"""Vraća detaljne informacije o Učitelju Vasi."""
poruka = f"""
{VASA_INFO['ime']} - Verzija {VASA_INFO['verzija']}
{'=' * 50}
{VASA_INFO['opis']}
Stvorio: {VASA_INFO['autor']}
"""
return poruka.strip()
def glavni_meni():
"""Prikazuje glavni meni sa opcijama."""
meni = """
Šta želiš da uradiš?
1. Pozdravi me
2. Predstavi se
3. Izađi
Tvoj izbor: """
return meni
if __name__ == "__main__":
# Ovo se izvršava samo kada direktno pokreneš ovaj fajl
print("=" * 50)
print("Dobrodošao u test mode za vasa_core.py!")
print("=" * 50)
# Testiraj funkcije
print("\nTest funkcije pozdrav():")
print(pozdrav())
print("\nTest funkcije predstavi_se():")
print(predstavi_se())
print("\nTest funkcije glavni_meni():")
print(glavni_meni())
🚀 NIVO 2 – Objašnjenje koda
Hajde da analiziramo svaki deo:
- Docstring (trostruki navodnici na početku) – dokumentuje svrhu modula
- VASA_INFO – dictionary (rečnik) koji čuva osnovne podatke. Koristi se VELIKA_SLOVA jer je konstanta
- def pozdrav() – najjednostavnija funkcija, vraća string
- f-string u predstavi_se() – omogućava umetanje promenljivih u tekst sa {}
- if name == “main“ – specijalni Python pattern koji omogućava da fajl funkcioniše i kao modul i kao samostalan program
🔍 UVID: Konstrukcija if __name__ == "__main__" je ključna za kreiranje komponenti koje se mogu ponovo koristiti. Ona daje fajlu dvostruku ličnost: može biti biblioteka (modul) čije se funkcije uvoze negde drugde, ili samostalni program koji se može pokrenuti radi testiranja. Ovo je osnova “best practice” razvoja u Pythonu jer omogućava da svaku komponentu testiraš izolovano pre nego što je integrišeš u veći sistem.
💡 PRO TIP: U velikim projektima uvodnik “top-level” koda (if __name__ == "__main__":) odličan je poligon za brze eksperimente. Dodaj privremene print-ove, testiraj ideje, a zatim ih obriši pre komita. Tako modul ostaje uredan, a ti ne moraš da praviš poseban fajl za svaki mikro-test.
📊 DIJAGRAM: Dvojna uloga vasa_core.py fajla
Pokretanje: python src/main.py Pokretanje: python src/vasa_core.py
│ │
▼ ▼
[ main.py ] [ vasa_core.py ]
│ │
`import vasa_core` __name__ postaje "__main__"
│ │
▼ ▼
Koristi funkcije (pozdrav, ...) IZVRŠAVA se kod unutar if bloka
(korisno za brzi test)
🎈 ZABAVNA ČINJENICA: Datoteke u folderu mogu da postanu paket čim dodaš __init__.py. Do 2025-e PEP 420 je omogućio i “namespace” pakete – folderi bez tog fajla se takođe mogu uvoziti, što olakšava deljenje koda među timovima.
Python moduli i importovanje
Sada kada imamo naš prvi modul, hajde da naučimo kako da ga koristimo iz drugih delova programa.
📚 NIVO 1 – Osnovno objašnjenje
Python modul je jednostavno Python fajl. Kada kreiraš vasa_core.py, automatski kreiraš modul koji se zove vasa_core. Ovaj modul možeš da “uvezeš” (import) u druge Python fajlove i koristiš njegove funkcije. To je kao da imaš kutiju sa alatima – možeš je poneti gde god ti treba.
🚀 NIVO 2 – Import sistem
Python ima sofisticirani sistem za import modula. Kada napišeš import vasa_core, Python traži fajl vasa_core.py u određenom redosledu lokacija (sys.path). Pošto smo označili src kao Sources Root u PyCharm-u, možemo direktno importovati module iz njega.
💡 PRO TIP: Kada projekt poraste, razmisli o relativnim importima (from .vasa_core import pozdrav). Oni ti jasno pokazuju da modul dolazi “iz kuće”, dok apsolutni import (import requests) otkriva spoljnu zavisnost. Ta razlika pomaže novim kolegama da odmah shvate arhitekturu projekta.
🎈 ZABAVNA ČINJENICA: Python pri uvozu pravi i keš fajl (__pycache__/vasa_core.cpython-313.pyc). To ubrzava sledeće pokretanje jer preskače parsiranje izvornog koda.
Praktična implementacija
📊 DIJAGRAM: Tok izvršavanja glavnog programa (main.py)
[Start] → [Pozdravna poruka] → [Glavna petlja: while True]
↑ │ ↓
│ │ [Prikaži meni] → [Čekaj unos]
│ │ ↓
└──────────────────│───────── [Procesiraj izbor (if/elif/else)]
│ │
│ Izbor '3'?
│ / \
│ DA NE
│ │ │
│ ▼ ▼
│ [break] → [Odgovori korisniku]
│ │ │
▼ ▼ │
[Exit] ←─────────────┘ │
│
└────────(nazad na vrh petlje)
Kreiranje glavnog programa
Sada ćemo kreirati glavni program koji koristi naš vasa_core modul.
U src folderu, kreiraj novi fajl main.py:
"""
Glavni program za Učitelja Vasu
Ovo je ulazna tačka za pokretanje AI asistenta.
"""
# Import našeg modula
from vasa_core import pozdrav, predstavi_se, glavni_meni
def pokreni_vasu():
"""Pokreće glavnu petlju programa Učitelj Vasa."""
print("\n" + "🎓" * 25)
print(pozdrav())
print("🎓" * 25 + "\n")
# Glavna petlja programa
while True:
print(glavni_meni())
izbor = input().strip()
if izbor == "1":
print("\n" + pozdrav() + "\n")
elif izbor == "2":
print("\n" + predstavi_se() + "\n")
elif izbor == "3":
print("\nHvala što si koristio Učitelja Vasu! Vidimo se! 👋")
break
else:
print("\n❌ Nepoznata opcija. Pokušaj ponovo.\n")
print("\nProgram završen.")
# Pokreni program
if __name__ == "__main__":
pokreni_vasu()
🔄 VEŽBA: Izmeni vasa_core.py tako da funkcija pozdrav() prima parametar ime_korisnika i vraća personalizovan pozdrav. Zatim prilagodi main.py da prvo traži ime, pa ga prosleđuje funkciji. Ovo je mali korak ka interaktivnijem asistentu – i sjajan trening za rad sa parametrima.
🎯 ALTERNATIVNO REŠENJE: Umesto “if-elif” lavirinta, možeš mapirati opcije na funkcije:
from vasa_core import pozdrav, predstavi_se, glavni_meni
AKCIJE = {
"1": lambda: print("\n" + pozdrav()),
"2": lambda: print("\n" + predstavi_se()),
}
def pokreni_vasu():
while True:
izbor = input(glavni_meni()).strip()
if izbor == "3":
print("\nHvala na druženju – vidimo se! 👋"); break
# get default is lambda: print("Nepoznata opcija…")
AKCIJE.get(izbor, lambda: print("\n❌ Nepoznata opcija. Pokušaj ponovo.\n"))()
Ovaj pristup koristi rečnik kao “switch”: dodavanje nove opcije svodi se na umetanje jedne linije, bez izmene postojećih if-ova.
Pokretanje programa
📚 NIVO 1 – Prvi put pokrećemo Vasu!
Postoje dva načina da pokreneš program:
Način 1 – Kroz PyCharm (preporučeno za početnike):
- Otvori
main.pyu PyCharm-u - Desni klik bilo gde u kodu → Run ‘main’
- Ili pritisni Ctrl+Shift+F10 (Cmd+Shift+R na Mac-u)
Način 2 – Kroz terminal:
- Otvori terminal u PyCharm-u (dole na ekranu)
- Proveri da si u pravom folderu:
cd src - Pokreni:
python main.py

PyCharm sa pokrenutim programom u konzoli
🚀 NIVO 2 – Razumevanje import putanja
Kada pokreneš python main.py iz src foldera, Python automatski dodaje trenutni folder u sys.path, omogućavajući import vasa_core modula.
Važno za naprednije: Ako želiš da pokreneš iz root foldera sa python -m src.main, Python tretira src kao paket i zahteva da prilagodiš importе (from src.vasa_core import ...). Ovo je profesionalniji pristup koji ćemo koristiti kasnije u kursu.
💡 PRO TIP: Možeš pokrenuti program kao modul iz root foldera projekta! Ali prvo moraš prilagoditi import u main.py:
# Promeni ovu liniju:
from vasa_core import pozdrav, predstavi_se, glavni_meni
# Na ovu:
from src.vasa_core import pozdrav, predstavi_se, glavni_meni
Zatim možeš pokretati sa python -m src.main iz root-a. Ovaj pristup je profesionalniji jer tretira tvoj kod kao pravi Python paket. Kasnije ćeš moći dodati opcije (--help, --version) pomoću argparse. Za sada, lakše je pokretati iz src foldera sa python main.py.
⚡ SAVET ZA OPTIMIZACIJU: Naša while True petlja sa input() unutra je veoma efikasna. Program ne troši procesorsko vreme dok čeka tvoj unos; operativni sistem ga “uspava” dok ne pritisneš Enter. Ovo je standardni i performantno optimalan način za pravljenje konzolnih menija. Korišćenje break za izlazak iz petlje je takođe mnogo čistije i brže od korišćenja pomoćnih promenljivih (npr. running = True), jer direktno prekida izvršavanje bez dodatne provere uslova na vrhu petlje.
🎈 ZABAVNA ČINJENICA: Konvencija -m je toliko popularna da i sam Python standardni bibliotekar “živi” ovako – npr. python -m http.server za brzi lokalni web-server u jednoj liniji.
Dodavanje Type Hints
Type hints čine kod čitljivijim i pomažu PyCharm-u da ti predlaže ispravke:
def pozdrav() -> str:
"""Vraća pozdravnu poruku od Učitelja Vase."""
return "Zdravo! Ja sam Učitelj Vasa, tvoj AI asistent za učenje programiranja! 🎓"
def predstavi_se() -> str:
"""Vraća detaljne informacije o Učitelju Vasi."""
# ... ostatak koda
💡 PRO TIP: Type hints nisu obavezni u Python-u, ali su kao putokazi – govore drugima (i tebi u budućnosti) kakav tip podataka funkcija prima i vraća. PyCharm će ti pokazati upozorenja ako pokušaš da koristiš funkciju pogrešno.
Česte greške i rešenja
❌ GREŠKA: ModuleNotFoundError: No module named 'vasa_core'
💡 REŠENJE:
- Proveri da li si u pravom folderu kada pokrećeš program
- U PyCharm: desni klik na
src→ Mark Directory as → Sources Root - Ili pokreni iz
srcfoldera:cd srczatimpython main.py - Za pokretanje sa
python -m src.mainiz root-a, moraš promeniti import (vidi PRO TIP gore)
🔬 DETALJNIJE: Greška ModuleNotFoundError se dešava jer Python interpreter ne zna gde da pronađe vasa_core.py. Python pretražuje listu putanja sačuvanu u sys.path. Kada pokreneš python main.py iz ucitelj-vasa/ (root) foldera, src folder nije u sys.path i Python ne može da nađe modul.
Sistemsko rešenje: Komanda “Mark Directory as Sources Root” u PyCharm-u govori okruženju: “Hej, kada tražiš module, OBAVEZNO pogledaj i u ovaj src folder”. To efektivno dodaje src na sys.path za tvoj projekat. Ovo simulira ponašanje profesionalnih alata za pakovanje i deployment, učeći te od prvog dana kako da strukturiraš kod na način koji je prenosiv i skalabilan.
❌ GREŠKA: SyntaxError: invalid syntax na f-string liniji
💡 REŠENJE: F-stringovi rade samo u Python 3.6+. Proveri verziju: python --version. Ako koristiš stariju verziju, zameni sa .format() metodom
❌ GREŠKA: Program se odmah zatvara nakon pokretanja
💡 REŠENJE: Pokrećeš program duplim klikom? Koristi PyCharm ili terminal. Windows zatvara konzolu čim se program završi
❌ GREŠKA: Ćirilica ili emoji se ne prikazuju ispravno
💡 REŠENJE: Dodaj na početak fajla: # -*- coding: utf-8 -*- ili podesi PyCharm: Settings → Editor → File Encodings → UTF-8
❌ GREŠKA: input() ne čeka moj unos
💡 REŠENJE: U nekim IDE okruženjima (ne PyCharm), potrebno je eksplicitno flushovanje: input().strip() nakon print()
Proveri svoje razumevanje
[NIVO 1]:
- Šta je Python modul?
- Kako se poziva funkcija u Python-u?
- Zašto koristimo
if __name__ == "__main__"?
[NIVO 2]:
- Koja je razlika između
import vasa_coreifrom vasa_core import pozdrav? - Šta su type hints i zašto su korisni?
- Kako bi proširio program da pamti ime korisnika između opcija?
🤔 MINI-KVIZ:
- Kako bi objasnio razliku između apsolutnog i relativnog importa nekome ko zna samo pojmove “kuća” i “strana kuća”?
- Šta će
help(pozdrav)prikazati ako si zaboravio da dodaš docstring? - Zašto je važno razumeti gde se nalazi tvoj Python fajl kada pokrećeš program?
Ažuriranje dokumentacije
Ažuriraj postojeći README.md dodavanjem novog statusa:
## 🚀 Trenutni Status
- ✅ Dan -3: Python 3.13+ instaliran
- ✅ Dan -2: PyCharm unified edition podešen
- ✅ Dan -1: GitHub repository kreiran
- ✅ Dan 0: Profesionalna struktura projekta
- ✅ Dan 1: Prvi Python moduli - Vasa može da pozdravi!
- ⏳ Dan 2: Razumevanje AI API-ja (sutra)
Kreiraj novi unos u docs/development_log.md:
## Dan 1: Prvi Python Moduli (12.01.2025)
### Šta je urađeno:
- ✅ Kreiran vasa_core.py sa osnovnim funkcionalnostima
- ✅ Implementirane funkcije: pozdrav(), predstavi_se(), glavni_meni()
- ✅ Kreiran main.py sa glavnom programskom petljom
- ✅ Dodate type hints za bolje razumevanje koda
- ✅ Učitelj Vasa može da komunicira kroz konzolu!
### Naučene lekcije:
- Python moduli su jednostavno .py fajlovi
- Funkcije grupišu kod koji obavlja specifičan zadatak
- f-stringovi omogućavaju lako formatiranje teksta
- if __name__ == "__main__" omogućava dvostruku upotrebu fajla
### Problemi i rešenja:
- **Problem**: Import error pri pokretanju
- **Rešenje**: Označen src folder kao Sources Root
### Za sutra (Dan 2):
- Razumevanje kako AI API-ji funkcionišu
- Priprema za integraciju sa OpenAI
Git commit za danas
git add .
git commit -m "Dan 1: Dodat vasa_core.py i main.py - Vasa može da pozdravi!"
git push
Odličan napredak! Učitelj Vasa je danas progovorio! 🎉 Iako su to samo osnovni pozdravi, postavili smo temelje na kojima ćemo graditi prave AI sposobnosti.
Sutra Učitelj Vasa uči
Sutra ulazimo u fascinantan svet AI API-ja! Naučićeš kako velike AI kompanije omogućavaju programerima da koriste njihove modele kroz jednostavne pozive. Razumećeš koncept API-ja, kako funkcioniše komunikacija sa AI servisima i pripremiće te za Dan 3 kada ćemo dobiti pravi API ključ. Biće to veliki korak ka pravom AI asistentu!
📚 REČNIK DANAŠNJE LEKCIJE:
- Modul (Module): Python fajl koji sadrži funkcije i promenljive koje možeš koristiti u drugim fajlovima
- Funkcija (Function): Imenovani blok koda koji obavlja specifičan zadatak i može se pozivati više puta
- def: Python ključna reč za definisanje funkcije
- return: Ključna reč koja vraća vrednost iz funkcije
- f-string: Moderan način formatiranja stringova u Python-u koji omogućava umetanje promenljivih sa {}
- Type Hints: Opcione oznake koje specificiraju tipove podataka koje funkcija prima i vraća
- import: Python komanda za uvoženje modula ili specifičnih funkcija iz modula