Uvod u Python
Uvod
Python je interpretirani programski jezik visokog nivoa, nastao početkom devedesetih godina dvadesetog veka, kada je tvorac ovog jezika (holandski programer Gvido Van Rosum), odlučio da sprovede u delo ideju o jednostavnom programskom jeziku znatnih mogućnosti, u kome će akcenat (za razliku od tadašnjih popularnih jezika), biti na izrazito čitljivom i preglednom kodu koji će programeri lako razumeti i rado međusobno razmenjivati.
Reklo bi se da je zamisao urodila plodom i Python je tokom vremena postao veoma popularan jezik za pisanje najraznovrsnijih skripti i programa (između ostalog, koristi se pri razvoju web aplikacija, kao i u naučnim istraživanjima, a poslednjih godina nalazi primenu i u oblasti mašinskog učenja i veštačke inteligencije).
Najlepše od svega je to što kreiranje i pokretanje Python skripti ne zahteva ništa drugo osim editora teksta i male instalacije koja se lako može preuzeti sa interneta.
Instalacija i pokretanje
Kao što smo već spomenuli, Python je interpretirani jezik, što znači da se programi napisani u Python-u ne kompajliraju i ne pokreću direktno iz operativnog sistema, već, preko interpretatora - konzolne aplikacije koja učitava, tumači i (u slučaju da u kodu nema grešaka), pokreće skripte, a takođe je u stanju da prima i izvršava pojedinačne naredbe (slično tome kako shell programi interpretiraju naredbe). *
Sa adrese python.org/downloads, možete preuzeti instalacionu verziju Python-a (uz napomenu da treba da preuzmete verziju koju vaš operativni sistem podržava).
Program koji preuzmete (i pokrenete :)), instaliraće interpretator sa svim neophodnim bibliotekama i (takođe), dodaće putanju do interpretatora (to jest, putanju do datoteke python.exe
u direktorijumu koji ste izabrali za instalaciju) - među putanje koje sistem pretražuje pri pozivanju programa iz konzole.
(U suprotnom, uvek biste morali da pozivate Python preko pune putanje, nalik na C:\Program Files\Python\python.exe
i sl.)
Skripte koje ćete pisati, treba smeštati u direktorijum koji je specifično namenjen 'Python skriptama' (u tom smislu predlažemo da kreirate folder sa putanjom koja nije na C:
particiji, već na nekoj drugoj putanji; recimo: d:\python_skripte
, ili e:\python_skripte
i sl (praktičan primer putanje za druge operativne sisteme, naveden je u gornjoj napomeni)).
Bitno je (za početak), da manje programe čuvate u zasebnim datotekama sa prepoznatljivim imenima, dok će kasnije (kada budete kreirali projekte koji koriste više datoteka), biti potrebno da za svaki veći projekat kreirate i zaseban direktorijum (tj. 'folder').
Pokrenite konzolu (otvorite startni meni, ukucajte "cmd"
) i unesite sledeće dve komande:
Pokrenite editor i sačuvajte skriptu sa nazivom 00_prvenac.py
u folderu koji ste izabrali za čuvanje skripti.
Sada smo spremni da napišemo prvu skriptu, ali, pre toga - nekoliko reči o formatiranju koda .....
Pravila za formatiranje koda (indentacija)
U programskom jeziku C (i ostalim jezicima koji koriste C-oliku sintaksu), razdvajanje pojedinačnih naredbi obavlja se preko separatora naredbi ;
(tačka-zarez), za uokviravanje blokova koda koriste se vitičaste zagrade, a pojava (dodatnih) whitespace znakova ispred naredbi (i inače, oko promenljivih, naredbi dodele i poziva funkcija) - jednostavno se zanemaruje.
U Python-u, pojava whitespace znakova na početku naredbi, ne samo da se ne zanemaruje, već se upravo preko pravilne indentacije (to jest, "uvlačenjem" delova koda), određuje pravi smisao naredbi, odnosno, hijerarhija (pripadnost naredbi određenim blokovima koda).
U tehničkom smislu, indentacija označava "broj tabova" - na početku svakog reda (pri čemu se doslovno može koristiti znak "TAB", a mogu se koristiti i uzastopni razmaci).
Recimo, sledeća while
petlja u Python-u koja ispisuje brojeve od 1 do 5:
.... praktično je ekvivalent sledeće petlje u C-u:
.... dok je naizgled vrlo slična petlja u Python-u:
.... zapravo ekvivalent sledeće petlje u C-u ....
.... i u pitanju je petlja koja je sasvim drugačija po smislu!
Poslednje dve petlje ispisuju samo vrednost 5, pri čemu je u C-u očigledno "zašto je tako", dok u Python-u nije - i upravo zato je potrebno voditi računa o indentaciji u Python-u.
Pravilno uvlačenje postiže se tako što se u svakom bloku koriste isti (početni) razmaci za sve naredbe na istom "nivou uvlačenja" (to jest, na istom nivou hijerarhije):
Uvlačenje koda, u okviru jednog bloka, moguće je obaviti:
- upotrebom znakova "TAB"
- uzastopnim razmacima, tako da se u svakoj situaciji - umesto jednog znaka TAB - koristi isti broj razmaka
.... i svejedno je koji će pristup biti korišćen (tabovi ili razmaci) - pod uslovom da se znakovi ne kombinuju!
Ako se odlučite za razmake umesto tabova, broj razmaka koji se koristi umesto jednog znaka "TAB", može biti proizvoljan, ali, preporučujemo da to bude 4 razmaka (ili 2) - onako kako verovatno već koristite tabulaciju i u drugim programskim jezicima (na gornjoj slici, 1 TAB ima širinu 4 razmaka).
Sada se (konačno ) vraćamo na datoteku 00_prvenac.py
i prelazimo na kodiranje ....
Osnovne komande
Naveli smo da je preglednost i jednostavnost programskog koda, jedna od glavnih osobina Pythona - i odmah ćemo se uveriti u navedenu tvrdnju (i kroz prvi primer, i kroz ostale).
print - naredba izlaza
Za sam početak, kao i u ostalim situacijama kada započinjemo upoznavanje sa novim programskim jezikom, prvi program biće skripta koja pozdravlja korisnika:
Nema pozivanja biblioteka, nema vitičastih zagrada koje ograničavaju blokove koda i nema operatora ;
, koji u većini drugih programskih jezika terminiše pojedinačne naredbe.
Za pokretanje skripte koju smo napisali, možemo uneti u konzolu sledeću komandu:
.... i "to je to" - program ispisuje pozdravnu poruku:
Inicijalizacija promenljivih i osnovni operatori
Za razliku od mnogih jezika kod kojih je deklaracija promenljivih obavezna (ili makar, "postoji", kao na primer u JavaScript-u), Python ne raspolaže naredbom za deklaraciju promenljivih.
Promenljive praktično nastaju preko naredbi dodele, i budući da se tipovi podataka ne navode (što smo na neki način implicirali kada smo naveli da ne postoji naredba za deklaraciju) - jasno je da se radi o tzv. dinamičkoj tipizaciji podataka (sa kojom smo se sretali i u JavaScript-u i PHP-u).
Shodno navedenom, prost program koji sabira dva broja i ispisuje rezultat, vrlo lako se može zapisati na sledeći način:
Videli smo u prvom programu da naredba print
može ispisivati niske (koje su uokvirene navodnicima), a u prethodnom primeru smo videli da naredba print
može ispisivati vrednosti promenljivih.
Međutim, ako je potrebno da se običan tekst spoji sa vrednostima promenljivih, prvo se vrednosti promenljivih moraju pretvoriti u niske (tj. "običan tekst"); recimo, preko funkcije str
(koja za uneti brojčani podatak vraća odgovarajuću nisku), posle čega se niske mogu spojiti preko operatora +
(i, na kraju, ispisati).
Da pojasnimo zašto je potrebno postupati tako kako smo naveli ....
Kada se naredbi print
preda jedan argument (kao što smo ranije videli), interpretator će obaviti ispis u skladu sa tipom podatka * (tj. obaviće sve što treba da se vrednost prikaže na odgovarajući način).
Kada se string konstante (tj. niske uokvirene navodnicima, koje se zadaju u toku pisanja programa), kombinuju sa niskama koje su zapisane preko promenljivih - i dalje nema potrebe za preduzimanjem dodatnih koraka, jer se i taj proces obavlja automatski ....
.... ali, ako bismo pokušali (u gornjem primeru (i inače)), da neposredno predamo vrednost promenljive koja nije niska, došlo bi do greške.
Kada operator +
, koji se koristi unutar naredbe print
, naiđe na dva argumenta različitog tipa - nije u stanju da se "opredeli" za jedan od dva moguća načina funkcionisanja (a isto je i kada se operator +
koristi van naredbe print
).
Komanda print(5 + 5)
ispisuje "10"
, * dok komanda print("5" + "5")
ispisuje "55"
, ** međutim, kada se argumenti različitog tipa kombinuju, interpretator ne zna kako treba da postupi (krajnje opravdano), i upravo je upotreba funkcije str
(preko koje se broj pretvara u nisku) - jedan od načina da se problem reši.
Problem se (inače) može rešiti i preko tzv. formatiranih niski:
Slovo f
, kao prefiks niske, navodi interpretator na postupak u kome se pojava promenljivih (i izraza) unutar vitičastih zagrada, tretira kao poziv za konvertovanje brojčanih vrednosti u niske (uz prethodno računanje vrednosti izraza).
Naredba ulaza - input
Učitavanje podataka u Python-u obavlja se na jednostavan način, preko funkcije input
:
.... ali, rezultat izvršavanja gornje skripte vas može iznenaditi.
Ako pri pokretanju programa unesemo sledeće 'podatke': 12
i 15
, program će ispisati 1215
(to jest, neće ispisati 27
)!
Naravno, radi se o tome da naredba input
vraća niske (a interpretator neće "nagađati" tip podatka koji je programer zamislio (pri čemu je vrlo moguće da je programer zamislio upravo - učitavanje niske)), pa, ako je potrebno da uneti podaci budu formatirani kao brojčane vrednosti - to se mora i 'naglasiti':
U drugom slučaju, konzolni ulaz je pretvoren u celobrojne vrednosti, i sada je rezultat (praktično) - sabiranje brojeva.
Kontrola toka - grananja i petlje
Osnovno if
grananje i while
petlja u Python-u, funkcionišu na 'očekivani način' (pretpostavićemo da očekujete da bi petlje i grananja u Python-u trebalo da funkcionišu slično kao petlje i grananja u C-u), ali, zato su druge konstrukcije: ili implementirane na (ponešto) drugačiji način (for
), ili uopšte ne postoje (switch
, do-while
).
Međutim, bez brige: for
petlje u Python-u su jednostavne za razumevanje (i prilično zanimljive same po sebi), a switch
i do-while
se mogu simulirati prilično lako ....
Grananja u programu - if - else
Za upoznavanje sa naredbama grananja, napisaćemo dobro poznati program koji (preko 'trokrake' provere), proverava da li je broj veći, manji, ili jednak nuli (a obratićemo pažnju i na to kako je programski kod formatiran).
U idejnom smislu, grananja u Python-u su istovetna kao grananja u C-u, ali, budući da se vitičaste zagrade ne koriste za izdvajanje blokova, mora se voditi računa o formatiranju koda:
Posle uslova (i posle rezervisane reči else
), pišu se dve tačke, a složeno grananje (kao u gornjem primeru), svakako je situacija u kojoj se strogo mora voditi računa o indentaciji.
U prethodnom primeru, mogli smo videti i to da se za jednostavne uslove ne moraju koristiti zagrade.
Međutim, ukoliko je uslov složen (i/ili dvosmislen) ....
.... zagrade se moraju koristiti.
Simulirani switch
Budući da u Python-u ne postoji regularna razgranata struktura switch
, "simulacija" se tipično svodi na if-else
grananje i ("obilno") korišćenje rezervisane reči elif
(koja, kao što možete pretpostaviti, praktično predstavlja uzastopnu pojavu rezervisanih reči else
i if
, čime se uvodi "novi nivo grananja", ali - bez toga da programski kod počne "da beži u desnu stranu").
Da pojasnimo: ako za primer uzmemo program koji treba da ispiše dan u nedelji koji odgovara unetom rednom broju - i pri tom se koristi if-else
konstrukcija koja ispituje prvih sedam brojeva - bez preglednije sintakse uz rezervisanu reč elif
....
.... programski kod nije ni izdaleka elegantan.
"Simulirani switch", implementiran preko rezervisane reči elif
, koja praktično označava "sledeći nivo grananja" (a u još praktičnijem smislu, nešto nalik na case
iz programskog jezika C) ....
.... predstavlja znatno elegantniju jezičku konstrukciju.
Petlja while
Pošto smo se u uvodnim odeljcima detaljno upoznali sa indentacijom (i maločas se podsetili na važnost pravilnog uvlačenja koda), kao primer funkcionisanja while
petlje uzećemo dobro poznati kod za generisanje niza Fibonačijevih brojeva (niz u kome se prva dva elementa zadaju, a svaki sledeći element, od trećeg nadalje, dobija se sabiranjem prethodna dva):
Simulacija petlje do-while
U većem broju drugih programskih jezika (pogotovo onih koji su zasnovani na C-u), postoji i do-while
petlja ....
U pitanju je specifičan oblik while
petlje, koja se od osnovne while
petlje razlikuje po tome što se u ciklus petlje (obavezno) ulazi bar jednom.
U Python-u, konstrukcija do-while
(za razliku od regularne while
petlje), ne postoji - već se samo može simulirati, a simulacija najčešće podrazumeva beskonačnu petlju - sa uslovom za prekid (koristićemo primer iz prethodnog bloka):
(Grananje bez False
grane može se zapisati u jednom redu.)
Petlja for
Kada su u pitanju for
petlje u Python-u, postoje dva naizgled različita formata zapisa, ali, u oba slučaja - radi se o istom principu izvršavanja.
Možemo 'prolaziti' kroz iterabilne strukture (tj. pristupati redom svim elementima):
.... a možemo takođe organizovati for
petlju na "naizgled uobičajen" način, uz korišćenje brojača:
Obe (naizgled različite) metode, omogućavaju da se izvede sve ono što se može izvesti preko for
petlje u C-u, ali (najjednostavnije rečeno), pošto nijedan od dva načina zapisivanja nije 'previše sličan' C-olikoj sintaksi za for
petlje, za početak se nećemo detaljnije osvrnuti na for
petlju #2, koja donekle podseća na for
petlje u C-u (i srodnim jezicima), već upravo na varijantu #1, koja "baš ne liči" na petlje u C-u (a uskoro će postati jasno i zašto smo izabrali takav redosled).
Prolazak kroz sve elemente iterabilnih struktura
Pošto smo već naveli opšti obrazac za for
petlju koja "prolazi kroz sve elemente iterabilne strukture", za primer ćemo kreirati (upravo) jednu takvu strukturu, na sledeći način:
For petlja koja prolazi kroz sve elemente gornjeg "niza" (tj. liste), ima sledeći oblik ....
.... a rezultat izvršavanja programa je ispis: "ponedeljak", "utorak", "sreda", "četvrtak", "petak", "subota", "nedelja"
(kada se program zapravo pokrene, niske se ispisuju jedne ispod drugih, ali, nećemo bez potrebe zauzimati dodatni prostor).
Drugi zapis for
petlje podrazumeva (kao što smo već videli), navođenje raspona vrednosti, ali, za tako nešto je potrebno koristiti funkciju koja generiše - raspon vrednosti.
range() - raspon vrednosti
Funkcija range
vraća listu celobrojnih vrednosti, koja se generiše shodno unetim argumentima, koji predstavljaju:
- početnu vrednost
- granicu (poslednja generisana vrednost je za 1 manja ili veća od navedene vrednosti)
- korekciju (uvećanje ili umanjenje, u svakom koraku)
Međutim, neki od argumenata se mogu izostaviti - u situacijama kada se odgovarajući rezultati mogu dobiti preko podrazumevanih vrednosti (ali, naravno, mora se predati bar jedan argument).
Pogledajmo nekoliko primera.
Primer #1: Ukoliko se preda (samo) jedan argument ....
.... predati argument predstavlja graničnu vrednost, početna vrednost je 0
, poslednji element liste ima vrednost prvi_argument - 1
, a korekcija je + 1
(svaki sledeći element je za 1 veći od prethodnog).
Primer #2: - Ukoliko se predaju dva argumenta ....
.... prvi argument označava početnu vrednost, drugi argument predstavlja granicu, a poslednji element liste ima vrednost drugi_argument - 1
(korekcija je i dalje + 1
).
Primer #3: Ako se predaju (sva) tri argumenta ....
.... prvi argument predstavlja početnu vrednost, drugi argument predstavlja granicu, i praktično definiše poslednju (manju ili veću) * vrednost koja se može dobiti shodno vrednosti trećeg argumenta - koji predstavlja korekciju (u gornjem primeru, + 3
)).
Da pojasnimo (preko gornjeg primera): budući da je treći argument pozitivan broj, * poslednja celobrojna vrednost koja se može dobiti s obzirom na početnu vrednost 2 i korekciju 3, nije - ni 17 - ni 16 - već 14:
- vrednost 17 ne može biti poslednja vrednost u listi, budući da je poslednja vrednost (po pravilu), manja * od zadate granice
- vrednost 16 se praktično "preskače", budući da korekcija nije 1 (već 3)
for x in range()
Pošto funkcija range
vraća listu celobrojnih vrednosti, sada je potpuno jasno da obe for
petlje (koje smo prikazali na početku), koriste isti princip prolaska kroz iterabilne strukture (i upravo je to razlog zašto nismo prvo navodili primer for
petlje 'koja donekle podseća na for
petlje iz C-a').
Dakle, ako je u određenom zadatku potrebno proći kroz određeni raspon brojeva, može se koristiti funkcija range
za kreiranje liste koja (u praktičnom smislu), predstavlja traženi raspon.
Ako se preda samo jedan argument (vraćamo se na listu u kojoj su zapisani dani u nedelji):
.... program će ispisati prva tri dana "ponedeljak", "utorak", "sreda"
(jedan ispod drugog).
Ako se predaju dva argumenta, za desnu granicu važiće ista pravila kao malopre, dok će prvi argument predstavljati početnu vrednost pri indeksiranju:
.... i program sada (shodno prethodno navedenim pravilima), ispisuje: "sreda", "četvrtak", "petak"
.
Liste (nizovi)
Liste u Python-u (koje se često kolokvijalno nazivaju i nizovima, iako nisu implementirane kao statički nizovi), predstavljaju iterabilne kolekcije podataka preko kojih je moguće skladištiti više uzastopno zapisanih podataka unutar jedne promenljive.
Liste (tj. 'nizovi'), mogu se inicijalizovati neposredno, preko naredbe dodele:
.... pri čemu se pojedinačnim elementima može pristupati isto onako kako se (npr. u C-u), pristupa elementima statičkih nizova:
Prolazak kroz sve elemente liste (tj. 'niza'), već smo videli:
Dodavanje elemenata (na kraj liste), obavlja se preko komande append
:
Uklanjanje elemenata (sa kraja liste), može se obaviti preko komande pop
:
U Python-u postoji i jednostavan način za sortiranje nizova:
Funkcije u Python-u
Python dolazi sa standardnom bibliotekom koja sadrži brojne funkcije za obavljanje svakodnevnih zadataka, a jezik pored toga (očekivano), takođe omogućava programerima da sami definišu sopstvene funkcije (što nas za početak zanima više od ugrađenih funkcija).
Definisanje korisničkih funkcija
Kao i u drugim jezicima, delovi koda koji se često ponavljaju, mogu se smestiti u funkcije (praktično - zasebne potprograme).
Definisanje korisničkih funkcija obavlja se preko rezervisane reči def
(slično kao što u JavaScript-u definiciji funkcije prethodi rezervisana reč function
), a za primer ćemo uzeti jednostavnu funkciju koja ispisuje veći od dva uneta broja:
Definisana funkcija može se koristiti na već poznate načine:
Najčešće korišćene ugrađene funkcije
Uz instalaciju Python-a dolazi i veći broj ugrađenih funkcija.
Sa nekima od njih susretaćete se samo po potrebi, ali, ima i onih koje ćete koristiti gotovo svakodnevno, i stoga smo izdvojili neke od najbitnijih.
len - broj elemenata niza ili dužina niske
Za proveru dužine niske koristi se funkcija len
:
(Program sa gornje slike ispisuje vrednost 12.)
Ista funkcija može se koristiti i za očitavanje broja elemenata niza:
(Program sa gornje slike ispisuje vrednost 6.)
replace - zamena delova niske
Funkcija replace
koristi se za zamenu delova niski, drugim niskama.
Kao prvi argument navodi se podniska koju je potrebno pronaći (u niski s
), a drugi argument je niska kojom treba zameniti pojavu prve podniske.
Sledeći kod:
.... ispisaće nisku "Monti Pajton" (pošto je prethodno, podniska "Kengur" zamenjena niskom "Pajton").
matematičke funkcije - abs, round, floor, ceil
Za korišćenje matematičkih funkcija u Python-u, potrebno je prvo uključiti u program (tj. "importovati"), modul math
, posle čega se mogu koristiti funkcije iz modula:
rand - generisanje nasumične vrednosti
Za generisanje nasumične celobrojne vrednosti, koristi se ugrađena funkcija randint
:
Parametri (tj. argumenti), predstavljaju granične vrednosti.
type - ispis tipa podatka
Za kraj pregleda često korišćenih funkcija, ostavili smo funkciju type
, koja vraća tip podatka unetog argumenta:
Kod sa prethodne slike daje sledeći ispis:
U praktičnom smislu, dobijene informacije mogu se koristiti u svrhu provere (na primer, može se proveriti da li je određena funkcija vratila listu (u određenom primeru u kome je lista bila očekivani rezultat), ili je funkcija vratila sistemsku vrednost None
(što je praktično "signal" da nismo dobili željeni rezultat, zbog čega je potrebno preduzeti mere predostrožnosti u daljem toku izvršavanja programa)).
Pre nego što uvodni članak privedemo kraju, upoznaćemo se sa osnovnim mehanizmima za kreiranje klasa i objekata.
Klase i objekti u Python-u
Po pitanju klasa i objekata, Python je ponešto "relaksiran" u odnosu na Javu, C++ ili C#, ali i striktniji od JavaScript-a, i rekli bismo da stvari funkcionišu na dobro poznat način.
Definisanje klase
Da bismo se upoznali sa načinom definisanja klasa u Python-u, kreiraćemo jednostavnu klasu koja (praktično) predstavlja kolekciju podataka i koristi nekoliko osnovnih 'pristupnih mehanizama'.
Na samom početku, navešćemo naziv klase i polja:
Klasa se sada može instancirati i koristiti (uz napomenu (tj. podsećanje), da se u Python-u za instanciranje ne koristi rezervisana reč new
):
U najosnovnijem smislu, klasa je sasvim funkcionalna, ali, svakako ćemo u nastavku dodati i konstruktor (i druge metode).
Konstruktor
Za definisanje konstruktora, koristi se funkcija posebnog imena __init__
:
Objekat se sada može instancirati na mnogo elegantniji način:
Na sličan način mogu se definisati i druge (opšte) metode klase.
Definisanje metoda klase
Za definisanje metoda klase, koristi se (baš kao i kada se funkcije definišu izvan klase), rezervisana reč def
:
Sada se može pozivati metoda ispis
(za objekat koji smo prethodno instancirali) ....
.... pri čemu se dobija očekivani rezultat:
Primer upotrebe Python-a
Za kraj uvodnog članka, pokazaćemo - preko sasvim jednostavne skripte - šta je prava "poenta" skriptnog jezika kao što je Python.
Korišćenjem veoma malog broja 'linija koda' (manje od 15), napisali smo program koji:
- učitava tekstualnu datoteku
- deli sadržaj datoteke na redove
- prolazi kroz sve redove i u svakom redu pronalazi URL sajta i naziv sajta
- kreira HTML link (preko podataka koji su pronađeni u prethodnom koraku)
- ispisuje formatirane linkove na ekranu
- beleži formatirane linkove u datoteku
Praktičan rezultat izvršavanja skripte je sledeći: od običnog teksta - pri čemu ulazni tekst namerno nije formatiran na idealan način (program vodi računa o formatu)....
.... nastaju HTML linkovi:
Analiza
Prethodnu skriptu prikazali smo iz dva razloga: da pokažemo da Python može uraditi "dosta toga sa malo linija koda", ali, pre svega - da potaknemo mlađe čitaoce na razmišljanje.
Python je jezik koji je veoma "zgodan" za slične zahvate (a svakako i za ozbiljnije poduhvate), ali, uvek se postavlja pitanje u vezi sa tim da li mlađi programeri treba odmah da se priklone sažetom pristupu kakav nudi Python?!
Ako pitate nas, odgovor je - nikako. :)
Python može biti sjajan alat za iskusne programere, koji "dobro znaju šta rade" - i pri tom žele da određene zadatke obave na što jednostavniji način.
Za osobe koje tek uče programiranje, Python mnogo toga olakšava (rekli bismo, u prevelikoj meri) - a to nije dobar način da se nauči programiranje.
Sledeći koraci ....
Posle početnog upoznavanja sa osnovnim operacijama u programskom jeziku Python, verovatno razmišljate o tome šta bi sve, u nastavku, moglo da se "radi i gradi" uz ovakav jezik.
Odgovor je - "sve i svašta", a mi za početak pripremamo članak koji će pokazati kako preko Python-a možemo (brzo i lako), samostalno kreirati jednostavan (ali, vrlo solidan i funkcionalan) "kompajler" za markup jezik.
Nakon toga, bavićemo se back-end tehnologijama (kao što su FastAPI, Flask i sl), a biće i drugih tema ....