Python sintaksa za apsolutne početnike

Python je postao jedan od najpopularnijih programskih jezika zahvaljujući svojoj jednostavnoj sintaksi koja podseća na engleski jezik. Ako ste apsolutni početnik u programiranju, Python je odličan izbor za vaš prvi jezik. U ovom članku upoznaćemo vas sa osnovama Python sintakse koje morate znati pre nego što krenete u složenije projekte.

Šta je Python sintaksa?

Sintaksa programskog jezika predstavlja skup pravila koja definišu kako program treba biti napisan da bi bio ispravan. Python ima reputaciju čitljivog i elegantnog jezika – njegovu sintaksu je lako razumeti čak i ako nikada ranije niste programirali. To ga čini idealnim za početnike.

Python indentacija (uvlačenje koda)

Za razliku od mnogih drugih programskih jezika koji koriste vitičaste zagrade {} za definisanje blokova koda, Python koristi indentaciju. Ovo znači da uvlačenje koda (najčešće 4 razmaka) nije samo stvar estetike, već je obavezno:

# Ispravan kod
if True:
print("Ovo je uvučeni blok koda")
print("I ovo pripada istom bloku")

# Neispravan kod
if True:
print("Ovo će izazvati grešku")

Indentacija čini Python kod izuzetno čitljivim, ali zahteva da budete dosledni. Uvek koristite isti broj razmaka (preporučeno 4) za uvlačenje.

Komentari u Python-u

Komentari su delovi koda koje interpreter ignoriše. Koriste se za objašnjenje koda ili privremeno isključivanje dela koda:

# Ovo je jednoliniski komentar

"""
Ovo je
višelinijski
komentar
"""

x = 5 # Možete dodati komentar i na kraju linije koda

Varijable i dodela vrednosti

Varijable su “kontejneri” za skladištenje vrednosti. U Python-u ne morate deklarisati tip varijable, a možete joj dodeliti vrednost koristeći znak jednakosti:

# Kreiranje varijabli različitih tipova
ime = "Marko" # string
godine = 25 # integer
visina = 1.85 # float
aktivan = True # boolean

# Python dozvoljava višestruku dodelu
x, y, z = 1, 2, 3

Python varijable su dinamički tipizirane, što znači da možete promeniti tip vrednosti koju varijabla sadrži u bilo kom trenutku:

x = 5  # x je sada integer
x = "pet" # x je sada string

Tipovi podataka

Python ima nekoliko osnovnih tipova podataka koje treba da znate:

Numerički tipovi:

  • int – Celi brojevi: x = 5
  • float – Brojevi sa decimalnom tačkom: y = 5.0
  • complex – Kompleksni brojevi: z = 1+2j

String (tekstualni) tip:

  • str – Sekvence karaktera: ime = "Ana"

Boolean tip:

  • bool – Logičke vrednosti True/False: aktivan = True

Kolekcije:

  • list – Uređena, promenljiva kolekcija: voce = ["jabuka", "banana", "kruška"]
  • tuple – Uređena, nepromenljiva kolekcija: koordinate = (10, 20)
  • set – Neuređena kolekcija jedinstvenih elemenata: slova = {"a", "b", "c"}
  • dict – Neuređena kolekcija parova ključ-vrednost: osoba = {"ime": "Marko", "godine": 25}

Operatori u Python-u

Python podržava standardne matematičke operatore:

# Aritmetički operatori
x = 10
y = 3

print(x + y) # 13 (sabiranje)
print(x - y) # 7 (oduzimanje)
print(x * y) # 30 (množenje)
print(x / y) # 3.3333... (deljenje)
print(x // y) # 3 (celobrojno deljenje)
print(x % y) # 1 (modulo - ostatak pri deljenju)
print(x ** y) # 1000 (stepenovanje)

Takođe, Python ima operatore poređenja koji vraćaju boolean vrednosti:

x = 10
y = 3

print(x == y) # False (jednako)
print(x != y) # True (nije jednako)
print(x > y) # True (veće od)
print(x < y) # False (manje od)
print(x >= y) # True (veće ili jednako)
print(x <= y) # False (manje ili jednako)

I logičke operatore:

x = True
y = False

print(x and y) # False (i)
print(x or y) # True (ili)
print(not x) # False (negacija)

Kontrolne strukture

If-else konstrukcije

Uslovne konstrukcije omogućavaju izvršavanje različitih blokova koda u zavisnosti od određenih uslova:

godine = 18

if godine < 18:
print("Maloletni ste")
elif godine == 18:
print("Tačno 18 godina")
else:
print("Punoletni ste")

Prvo se proverava da li je uslov u if ispunjen, ako je ste izvršava se uvučeni blok ispod njega, ako nije proverava se elif uslov, , ako je on ispunjen izvršava se uvučeni blok ispod njega, a else se izvršava ako ni jednan uslov u if ili elif nije ispunjen. Može biti više elif konstrukcija u okviru if konstrukcije.

Petlje (Loops)

Petlje omogućavaju izvršavanje istog bloka koda više puta:

# For petlja
for i in range(5):
print(i) # Ispisuje 0, 1, 2, 3, 4

# While petlja
brojac = 0
while brojac < 5:
print(brojac)
brojac += 1 # Isto kao brojac = brojac + 1

naredba for

funkcija range([start,] stop[, step]) vraća niz brojeva od start do step u koracima step

in označava iteraciju po “elementima” nekog objekta (liste, uređene n-torke, rječnika, …)

naredba for ide po elementima koje vrati range i dodeljuje varijabli i, kad dođe do poslednjeg elementa završava se izvršavanje

petlja while

petlja while izvršava uvučeni blok sve dok je uslov ispunjen, odnosno u gornjem slučaju dok je vrednost varijable brojač manja od 5.Kad vrednost postane 5 petlja while se prekida.

Rad sa stringovima

Stringovi su sekvence karaktera i jedan od najčešće korišćenih tipova podataka:

# Kreiranje stringova
ime = "Ana"
poruka = 'Dobrodošli'
tekst = """Ovo je
višelinijski
string"""

# Konkatenacija (spajanje) stringova
puno_ime = ime + " Marković" # rezultat: "Ana Marković"

# Formatiranje stringova
godine = 25
poruka = f"{ime} ima {godine} godina" # rezultat: "Ana ima 25 godina"

# Pristupanje karakterima stringa (indeksiranje)
prvo_slovo = ime[0] # rezultat: "A"

# Metode za rad sa stringovima
print(ime.upper()) # "ANA"
print(ime.lower()) # "ana"
print(" tekst ".strip()) # "tekst"
print("1,2,3,4".split(",")) # ['1', '2', '3', '4']

Stringovi se spajaju sa + operatorom. Formatiranje stringova se postiže dodavanjem slova f ispred navodnika i moguće je koristiti varijable unutrar navodinka stavljanjem u vitičaste zagrade.

Takođe postoje različite funkcije za rad sa stringovima, kao što su:

1.upper() – dobijamo tekst sa svim velikim slovima
2.lower() – dobijamo tekst sa svim malim slovima
3.strip() – ukljanja space( prazan karakter) sa leve i desne strane
4.split(parametar) – od stringa pravi listu, string deli po parametru koji je prosleđen funkciji

Liste i rad sa njima

Liste su uređene, promenljive kolekcije koje mogu sadržati elemente različitih tipova:

# Kreiranje liste
voce = ["jabuka", "banana", "kruška"]

# Pristupanje elementima
prva_stavka = voce[0] # "jabuka"

# Izmena elementa
voce[1] = "pomorandža" # lista je sada ["jabuka", "pomorandža", "kruška"]

# Dodavanje elementa
voce.append("ananas") # dodaje na kraj liste

# Uklanjanje elementa
voce.remove("kruška")

# Dužina liste
broj_stavki = len(voce)

# Iteracija kroz listu
for stavka in voce:
print(stavka)

Rečnici (Dictionaries)

Rečnici skladište parove ključ-vrednost i veoma su korisni za rad sa povezanim podacima:

# Kreiranje rečnika
osoba = {
"ime": "Marko",
"godine": 25,
"grad": "Beograd"
}

# Pristupanje vrednostima
ime = osoba["ime"] # "Marko"
# ili
ime = osoba.get("ime") # "Marko" (bezbednija opcija)

# Izmena vrednosti
osoba["godine"] = 26

# Dodavanje novog para ključ-vrednost
osoba["zaposlen"] = True

# Uklanjanje para ključ-vrednost
del osoba["grad"]

# Iteracija kroz rečnik
for kljuc in osoba:
print(f"{kljuc}: {osoba[kljuc]}")

# Ili
for kljuc, vrednost in osoba.items():
print(f"{kljuc}: {vrednost}")

Funkcije

Funkcije omogućavaju organizaciju koda u logičke celine koje možete ponovo koristiti:

# Definisanje funkcije
def pozdravi(ime):
return f"Zdravo, {ime}!"

# Pozivanje funkcije
poruka = pozdravi("Ana") # rezultat: "Zdravo, Ana!"

# Funkcija sa podrazumevanim parametrom
def saberi(a, b=0):
return a + b

rezultat1 = saberi(5, 3) # 8
rezultat2 = saberi(5) # 5 (koristi podrazumevanu vrednost b=0)

Klase i objektno-orijentisano programiranje

Python podržava objektno-orijentisano programiranje (OOP), što vam omogućava da organizujete kod na način koji modeluje realne koncepte. Klase su osnovni gradivni blok OOP paradigme.

Šta je klasa?

Klasa je kao šablon ili nacrt za kreiranje objekata. Na primer, možete imati klasu Auto koja definiše zajedničke karakteristike svih automobila, a zatim možete kreirati konkretne instance (objekte) te klase sa specifičnim vrednostima.

# Kreiranje klase
class Automobil:
# Konstruktor metod (__init__)
def __init__(self, marka, model, godina):
self.marka = marka
self.model = model
self.godina = godina
self.kilometraza = 0 # Podrazumevana vrednost

# Metod za prikaz informacija
def prikazi_info(self):
return f"{self.marka} {self.model} ({self.godina}) - {self.kilometraza} km"

# Metod za vožnju
def vozi(self, km):
self.kilometraza += km
print(f"Vozili ste {km} km. Ukupna kilometraža: {self.kilometraza} km")

# Kreiranje objekata (instanci) klase
auto1 = Automobil("Volkswagen", "Golf", 2020)
auto2 = Automobil("Toyota", "Corolla", 2021)

# Korišćenje metoda
print(auto1.prikazi_info()) # Output: Volkswagen Golf (2020) - 0 km
auto1.vozi(150) # Output: Vozili ste 150 km. Ukupna kilometraža: 150 km
print(auto1.marka) # Output: Volkswagen

Varijable instance vs. klase

U prethodnom primeru, marka, model, godina, i kilometraza su varijable instance – svaki objekat ima svoju kopiju. Python takođe podržava i varijable klase, koje dijele svi objekti te klase:

class Automobil:
broj_automobila = 0 # Varijabla klase

def __init__(self, marka, model):
self.marka = marka # Varijabla instance
self.model = model # Varijabla instance
Automobil.broj_automobila += 1 # Povećavamo brojač za svaki novi automobil

@classmethod
def ukupno_automobila(cls):
return f"Ukupno automobila: {cls.broj_automobila}"

# Testiranje
auto1 = Automobil("BMW", "X5")
auto2 = Automobil("Audi", "A4")

print(Automobil.broj_automobila) # Output: 2
print(Automobil.ukupno_automobila()) # Output: Ukupno automobila: 2

Prilikom kreiranja instance klase se izvršava funkcija __init__ koja je konstruktor klase. U ovom slučaju kreiraju se dve istance klase auto1 i auto2 i u konstrukroru se prosleđuju inicijalne vrednosti varijabli.

self predstavlja vrednost instance klase.

Ako iznad funkcije imamo dekoratoer @classmethod onda je to funkcija klase, a ne funkcija instance i može da pristupa samo varijablama klase( varijabla zajednička za sve instance te klase)

Varijable marka i model i kilometraza imaju posebnu vrednost za svaku instancu klase, a varijabla broj_automobila je ista kod svake instance.Varijabla broj_automobila je varijabla klase a model i marka su varijable instance( objekta klase)

Enkapsulacija i privatni atributi

Python konvencija je da nazivi koji počinju sa jednim donjom crtom (_) označavaju privatne/zaštićene atribute, ali nisu stvarno privatni. Za jače enkapsuliranje, koristite dve donje crte (__):

class Racun:
def __init__(self, vlasnik, stanje=0):
self.vlasnik = vlasnik
self.__stanje = stanje # Privatna varijabla

def polozi_novac(self, iznos):
if iznos > 0:
self.__stanje += iznos
print(f"Položili ste {iznos} dinara. Trenutno stanje: {self.__stanje}")

def podizanje_novca(self, iznos):
if iznos > 0 and iznos <= self.__stanje:
self.__stanje -= iznos
print(f"Podigli ste {iznos} dinara. Preostalo stanje: {self.__stanje}")
else:
print("Nedovoljno sredstava!")

def stanje_na_racunu(self):
return self.__stanje

# Korišćenje
racun = Racun("Marko")
racun.polozi_novac(1000)
racun.podizanje_novca(300)
print(racun.stanje_na_racunu()) # Output: 700

# Pokušaj direktnog pristupa privatnoj varijabli (neće raditi kako se očekuje)
# print(racun.__stanje) # Ovo bi bacilo AttributeError

Ako varijabla instance klase počinje sa __ , to je privatna varijabla instance klase, i nije moguće joj direktno pristupiti nego samo preko javne funkcije. U predhodno primeru stanje je privatna varijabla , i može sjoj se pristupiti samo preko avnih funkcija( polozi_novac, podizanje_novca i stanje_na_racunu)

Nasledjivanje (Inheritance)

Nasledjivanje omogućava kreiranje novih klasa koje nasledjuju karakteristike postojećih klasa:

# Osnovna klasa (parent class)
class Vozilo:
def __init__(self, marka, model):
self.marka = marka
self.model = model

def kreni(self):
print(f"{self.marka} {self.model} je krenuo!")

# Izvedena klasa (child class)
class Automobil(Vozilo):
def __init__(self, marka, model, broj_vrata):
super().__init__(marka, model) # Pozivamo konstruktor osnovne klase
self.broj_vrata = broj_vrata

def trubi(self):
print("Bip bip!")

# Druga izvedena klasa
class Kamion(Vozilo):
def __init__(self, marka, model, nosivost):
super().__init__(marka, model)
self.nosivost = nosivost

def utovar(self):
print(f"Utovaram maksimalno {self.nosivost} tona!")

# Korišćenje nasledjivanja
auto = Automobil("Ford", "Focus", 5)
kamion = Kamion("MAN", "TGX", 40)

auto.kreni() # Metoda iz osnovne klase
auto.trubi() # Metoda iz izvedene klase
kamion.kreni() # Metoda iz osnovne klase
kamion.utovar() # Metoda iz izvedene klase

Klase nasleđivanjem imaju sve varijable i sve funkcije koje ima roditeljska klasa. U gornjem primeru klase Automobil i Kamion nasleđuju varijable marka i model , i funkciju kreni.

Klasa Automobil dodaje varijablu broj_vrata i funkciju trubi. Ovu varijablu i funkciju je moguće koristiti u klasi Automobil ali ne i u klasi Vozilo.

Klasa Kamion dodaje varijablu nosivost i funkciju utovari Ovu varijablu i funkciju je moguće koristiti u klasi Kamion ali ne i u klasama Automobil i Vozilo.Takođe funkciju trubi i varijablu broj_vrata nije moguće koristiti u klasi Kamion.

Praktični primer – To-do Lista

Evo kompletnijeg primera koji demonstrira korištenje klasa za izradu aplikcije za upravljanje zadacima:

from datetime import datetime

class Zadatak:
def __init__(self, opis, prioritet=1):
self.opis = opis
self.prioritet = prioritet
self.zavrsen = False
self.datum_kreiranja = datetime.now()
self.datum_zavrsetka = None

def zavrsi(self):
if not self.zavrsen:
self.zavrsen = True
self.datum_zavrsetka = datetime.now()
print(f"Zadatak '{self.opis}' je završen!")

def __str__(self):
status = "✓" if self.zavrsen else "○"
return f"[{status}] {self.opis} (Prioritet: {self.prioritet})"

class ToDoLista:
def __init__(self, naziv="Moja lista"):
self.naziv = naziv
self.zadaci = []

def dodaj_zadatak(self, opis, prioritet=1):
zadatak = Zadatak(opis, prioritet)
self.zadaci.append(zadatak)
print(f"Zadatak dodat: {zadatak}")

def prikazi_zadatke(self):
print(f"\n===== {self.naziv} =====")
if not self.zadaci:
print("Nema zadataka na listi!")
return

for i, zadatak in enumerate(self.zadaci, 1):
print(f"{i}. {zadatak}")

def zavrsi_zadatak(self, indeks):
if 1 <= indeks <= len(self.zadaci):
self.zadaci[indeks-1].zavrsi()
else:
print("Nevažeći indeks zadatka!")

def filtriraj_po_prioritetu(self, prioritet):
filtrirani = [z for z in self.zadaci if z.prioritet == prioritet]
print(f"\nZadaci sa prioritetom {prioritet}:")
for zadatak in filtrirani:
print(zadatak)

# Korišćenje To-do liste
moja_lista = ToDoLista("Nedeljni planovi")
moja_lista.dodaj_zadatak("Ucenje za diplomski ispit", 3)
moja_lista.dodaj_zadatak("Kupovina namirnica", 1)
moja_lista.dodaj_zadatak("Plaćanje računa", 2)

moja_lista.prikazi_zadatke()
moja_lista.zavrsi_zadatak(2)
moja_lista.prikazi_zadatke()
moja_lista.filtriraj_po_prioritetu(3)

Klase su osnova modernog programiranja i omogućavaju vam da pišete organizovan, modularan i lako održiv kod. Dok ste početnik, dobro je započeti sa jednostavnim klasama kao što su one u primerima iznad, a postepeno se razvijati ka kompleksnijim konceptima.

Zaključak

Savladavanjem osnovne Python sintakse postavili ste temelje za dalje učenje i napredovanje. Python ima mnogo više mogućnosti i biblioteka koje možete koristiti za različite namene – od razvoja web aplikacija do veštačke inteligencije.

U narednim člancima bavićemo se detaljnije pojedinim aspektima Python programiranja i pokazati kako ih primeniti u praksi. Veoma je važno da vežbate pisanje koda – najbolji način da naučite programiranje je kroz praksu i eksperimentisanje sa kodom.

Za kraj, evo jednog jednostavnog programa koji demonstrira mnoge koncepte koje smo obradili:

# Program za upravljanje spiskom zadataka

# Inicijalizacija prazne liste zadataka
zadaci = []

# Funkcija za dodavanje zadatka
def dodaj_zadatak(zadatak):
zadaci.append({"opis": zadatak, "zavrseno": False})
print(f"Zadatak '{zadatak}' je dodat.")

# Funkcija za prikaz zadataka
def prikazi_zadatke():
if not zadaci:
print("Nema zadataka na spisku.")
return

print("\nSpisak zadataka:")
for i, zadatak in enumerate(zadaci):
status = "✓" if zadatak["zavrseno"] else "✗"
print(f"{i+1}. [{status}] {zadatak['opis']}")

# Funkcija za označavanje zadatka kao završenog
def zavrsi_zadatak(indeks):
if 1 <= indeks <= len(zadaci):
zadaci[indeks-1]["zavrseno"] = True
print(f"Zadatak '{zadaci[indeks-1]['opis']}' je označen kao završen.")
else:
print("Nevažeći indeks zadatka.")

# Testiranje programa
dodaj_zadatak("Kupiti namirnice")
dodaj_zadatak("Platiti račune")
dodaj_zadatak("Pozvati majstora")
prikazi_zadatke()
zavrsi_zadatak(2)
prikazi_zadatke()

Ovaj primer demonstrira korišćenje funkcija, listi, rečnika, uslovnih iskaza i petlji u jednom malom, ali funkcionalnom programu.

Sledeća lekcija: Funkcije u Pythonu

Leave a Comment