AI Asistent Učitelj Vasa: Praktična obuka za početnike (32 dana)

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

  1. Otvori PyCharm sa projektom “ucitelj-vasa”
  2. Desni klik na src folder → New → Python File
  3. Ime fajla: vasa_core (bez .py ekstenzije – PyCharm je dodaje automatski)
  4. Klikni OK
PyCharm sa src folder i New → Python File dijalogom

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:

  1. Docstring (trostruki navodnici na početku) – dokumentuje svrhu modula
  2. VASA_INFO – dictionary (rečnik) koji čuva osnovne podatke. Koristi se VELIKA_SLOVA jer je konstanta
  3. def pozdrav() – najjednostavnija funkcija, vraća string
  4. f-string u predstavi_se() – omogućava umetanje promenljivih u tekst sa {}
  5. 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):

  1. Otvori main.py u PyCharm-u
  2. Desni klik bilo gde u kodu → Run ‘main’
  3. Ili pritisni Ctrl+Shift+F10 (Cmd+Shift+R na Mac-u)

Način 2 – Kroz terminal:

  1. Otvori terminal u PyCharm-u (dole na ekranu)
  2. Proveri da si u pravom folderu: cd src
  3. Pokreni: python main.py
PyCharm sa pokrenutim programom u konzoli

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 src foldera: cd src zatim python main.py
  • Za pokretanje sa python -m src.main iz 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]:

  1. Šta je Python modul?
  2. Kako se poziva funkcija u Python-u?
  3. Zašto koristimo if __name__ == "__main__"?

[NIVO 2]:

  1. Koja je razlika između import vasa_core i from vasa_core import pozdrav?
  2. Šta su type hints i zašto su korisni?
  3. Kako bi proširio program da pamti ime korisnika između opcija?

🤔 MINI-KVIZ:

  1. Kako bi objasnio razliku između apsolutnog i relativnog importa nekome ko zna samo pojmove “kuća” i “strana kuća”?
  2. Šta će help(pozdrav) prikazati ako si zaboravio da dodaš docstring?
  3. 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