Upravljačke i strukture podataka u Python-u

Python strukture podatakaZa novu godinu sam od kolege dobio najbolji mogući poklon za programera – knjigu o programiranju. Konkretno – Python – uvod u programiranje. Ovo je veliki vetar u leđa za moje učenje. Zbog mnogobrojnih obaveza i interesovanja nisam u stanju da posvetim baš puno vremena svemu ali za Python se uvek mora naći vremena. Uskoro će doći vreme kada ću i ja programirati na jeziku u kome se, kažu, kodira brzinom razmišljanja. Danas ću nastaviti da vas upoznajem sa osnovnim komandama u Python-u. Kroz primere ću vas naučiti da koristite grananje, petlje, n-torke, liste i rečnike i uputiti vas u osnovne komande nad stringovima.

Grananje

Grananje započinjemo komandom if koju prati uslov i blok koda koji se izvršava u slučaju ispunjenja uslova. U praksi bi to izgledalo ovako:

if promenljiva > 10 :
    print('Promenljiva je veća od 10')

Kada hoćemo da obradimo i slučaj kada je promenljiva manja ili jednaka od postavljenog uslova koristićemo komandu else. Tada bismo napisali:

if promenljiva > 10 :
    print('Promenljiva je veća od 10')
else :
    print('Promenljiva je manja ili jednaka 10')

Ukoliko želimo da neki iskaz ili promenljivu proveravamo po više uslova tada možemo da koristimo komandu elif :

if promenljiva > 10 :
    print('Promenljiva je veća od 10')
elif promenljiva > 5 :
    print('Promenljiva je veća od 5 a manja ili jednaka 10')
else :
    print('Promenljiva je manja od ili jednaka 5')

Zanimljivi i jednostavno je kombinovanje komande if i in kako bi odredili da li je jedan string substring drugog stringa. Skripta bi izgledala ovako:

poruka = "Ja učim Python"
trazeni_tekst = "Python"
if trazeni_tekst in poruka:
    print('Jeste')
else :
    print('Nije')

Python je u pretragama ostetljiv na mala i velika slova pa je neophodno prilikom pretraga neophodno dodati deo koji će pretvoriti sva slova u oba pojma u mala:

poruka = "Ja učim Python"
trazeni_tekst = "python"
if trazeni_tekst.lower() in poruka.lower():
    print('Jeste')
else :
    print('Nije')

Petlje

U Pythonu su dostupne while i for petlje.

While petlja ima sledeću sintaksu:

promenljiva = 0
while promenljiva < 10 :
    print(promenljiva)
    promenljiva += 1

For petlja se može koristiti u različite svrhe. Ukoliko imamo znakovnu promenljivu uz pomoć ove petlje možemo prikazati pojedinčne znakove unutar datog znaka:

promenljiva = 'python'
for slovo in promenljiva:
    print(slovo)

Izvršenjem ove skripte kao rezultat dobijamo:

p
y
t
h
o
n

Ako imamo neku n-torku onda pomoću petlje for možemo da iteriramo kroz ovu n-torku:

jezici = ('php', 'python', 'c#', 'java')
for jezik in jezici:
    print(jezik, len(jezik))

a nakon izvršenja skripte imamo sledeći rezultat:

php 3
python 6
c# 2
java 4

Prilikom ispisa svakom jeziku smo pridružili i dužinu njihovog stringa.

N-torke

N-torke (tuples) predstavljaju nepromenljive strukture. To znači da se jednom definisane vrednosti unutar njih ne mogu menjati. Mogu sadržati elemente svih vrsta tj. sve što se može dodeliti promenljivoj može se dodati i u n-torku. Kreiraju se vrlo lako:

jezici = ('php', 'python', 'c#', 'java')
prazna_ntorka = ()
ugnjezdena_ntorka = ((1,2), (3,4), 'simple string')

Elementi unutar ntorke su indeksirani tj. svakom od elemenata možete direktno pristupiti ukoliko znate njegov indeks. Tako bi u našem primeru iskaz jezici[0] ukazivao na prvi element tj. ‘php’, jezici[1] na ‘python’ itd… Poslednjem elementu možemo pristupiti na dva načina – jezici[3] gde broj 3 predstavlja dužinu ntorke umanjenu za jedan, i jezici[-1] jer je to element susedan prvom ali sa druge strane. Po toj logici pretposlednji element bi imao indeks -2 itd… Ovakvo indeksiranje važi i za sve ostale strukture. Elementima struktura koje se nalaze unutar neke strukture takođe možemo pristupiti preko indeksa – ugnjezdena_ntorka[0][0] ukazuje na element 1, ugnjezdena_ntorka[1][1] na element 4 itd… Prvi indeks se odnosi na ntorku ugnjezdena_ntorka dok se drugi indeks odnosi na strukuru koja se nalazi unutar nje na tom indeksu. Preko indeksa možemo baratati i sa određenim opsegom unutar ntorke:

jezici = ('php', 'python', 'c#', 'java')
print(0:2)
print(:3)
print(:)

gde kao rezultat dobijamo:

('php', 'python')
('php', 'python', 'c#')
('php', 'python', 'c#', 'java')

Naveo sam da su ntorke nepromenljive. To znači da ne možemo izmeniti, dodati ili brisati elemente u ntorci nakon što je definisana. Ako bismo pokušali da izvršimo iskaz jezici[3] = ‘javascript’ program bi izbacivao grešku. Korisne funkcije koje se izvršavaju nad ntorkama su min(ntorka) i max(ntorka) koje vraćaju minimalnu odnosno maksimalnu vrednost u ntorci sa ograničenjem da se ne mogu primenjivati nad ntorkama koje imaju ugnježdene elemente. Funkcija len(ntorka) vraća ukupan broj elemenata. Da bismo proverili da li se neki element nalazi unutar ntorke koristićemo komandu in tj u našem primeru sa jezicima:

if 'php' in jezici:
    print('Jeste')
else:
    print('Nije')

Nad n-torkama možemo izvršiti operacije spajanja i repeticije:

prva_ntorka = (1, 2, 3)
druga_ntorka = (4, 5, 6)
print (prva_ntorka+druga_ntorka)
print (prva_ntorka*2)

gde kao rezultat izvršenja dobijamo:

(1, 2, 3, 4, 5, 6)
(1, 2, 3, 1, 2, 3)

Ukoliko nam je poznato značenje elemenata u listi možemo ih na sledeći način dodeliti promenljivim:

spisak = (('Milan Popović', 'PHP developer'), ('Borislav Ilić', 'Frontend Developer'))
for pojedinac in spisak:
    ime, zanimanje = pojedinac
    print(ime, zanimanje)

gde kao rezultat izvršenja dobijamo:

Milan Popović PHP developer
Borislav Ilić Frontend Developer

Liste

Liste (Lists) predstavljaju promenljive strukture. Sve operacije koje sam naveo za n-torke važe i nad listama. Promenljivost elemenata je osnovna razlika između n-torki i listi. Liste se definišu i menjaju na sledeći način:

jezici = ['php', 'pithon', 'c#', 'java']
print(jezici)
jezici[1] = 'python'
print(jezici)
jezici.append('javascript')
print(jezici)
jezici.remove('c#')
print(jezici)
jezici.insert(2, 'erlang')
print(jezici)

gde kao rezultat izvršenja dobijamo:

['php', 'pithon', 'c#', 'java']
['php', 'python', 'c#', 'java']
['php', 'python', 'c#', 'java', 'javascript']
['php', 'python', 'java', 'javascript']
['php', 'python', 'erlang', 'java', 'javascript']

Prvo smo definisali listu jezici. Za razliku od n-torki koje se definišu između običnih zagrada () lista se definiše između uglastih []. Unutar liste smo namerno pogrešili drugi element – pithon. Pristupajući direktno tom elementu preko indeksa izmenili smo mu vrednost. Zatim smo izbacili iz liste element sa vrednošću c#. Zatim smo hteli da tačno na indeks 2 ubacimo element erlang te je lista dobila svoj krajnji oblik – [‘php’, ‘python’, ‘erlang’, ‘java’, ‘javascript’].

Pored navedenih korisne su i sledeće metode:

jezici.reverse()
print(jezici.pop())
print(jezici.count('python'))

Najpre smo pozvali metodu reverse() pomoću koje smo obrnuli redosled elemenata u listi pa je u tom trenutku lista izgledala ovako – [‘javascript’, ‘java’, ‘erlang’, ‘python’, ‘php’]. Metoda pop() vraća poslednji element sa liste i briše ga. Metoda count(value) vraća broj pojavljivanja elementa value u listi.

Kao što PHP ima deljenu referencu za objekte na isti način Python ima deljenu referencu za liste tj ako postavimo da je kopija_liste = original_lista i pri tom menjamo vrednosti elemenata u listi kopija_liste to će se odraziti i na listu original_lista. Ako bismo hteli pravu kopiju liste tada bismo morali navesti kopija_liste = original_lista[:]

Kao što možete da primetite liste mogu sve što i n-torke i još više. Fleksibilne su i u većini slučajeva ćemo im dati prednost u odnosu na n-torke. Međutim i n-torke imaju svoju ulogu:

  • Brže su – budući da su nepromenljive smeštaju se u memoriju u takvom obliku da je njihovo korišćenje brže.
  • Idealne su za konstante
  • Neki tipovi rečnika zahtevaju isključivo njihovu upotrebu
  • N-torke su heterogene dok su liste homogene strukture

Rečnici

Rečnici (Dictionary) takođe predstavljaju promenljive strukture. U rečnicima podaci se ne čuvaju u obliku skevenci nego u obliku parova. Dakle slično pravim rečnicima – imamo reč tj ključ i njeno značenje tj. vrednost. Rečnici u Python-u se još zovu i asocijativni nizovi ili hash tabele. Definišu se i menjaju na sledeći način:

recnik = {'Partizan': '100', 'Vojvodina': '69', 'Rad': '82'}
recnik['Vojvodina'] = 85
del recnik['Vojvodina']
novi_recnik = {(1,2): [1,2], (3,4): [3,4], (5,6): [5,6]}

Kao što vidite rečnici se definišu između vitičastih zagrada. Značenje kao i brisanje ključa se vrši slično kao kod nekog elementa liste. Ključ u rečniku je nepromenljiv šo znači da to može biti broj, string ili n-torka. Korišćenje bilo koje druge promenljive nije dozvoljeno.

Neke od korisnih metoda nad rečnicima su:

recnik = {'Partizan': '100', 'Vojvodina': '69', 'Rad': '82'}
recnik.get('OFK', 0)    # Vraća podrazumevanu vrednost ključa ako ne postoji
recnik.items()          # Vraća listu koja se sastoji od ntorki koje predstavljaju kljuc/vrednost
recnik.keys()           # Vraća listu koja se sastoji od ključeva rečnika
recnik.values()         # Vraća listu koja se sastoji od vrednosti ključeva rečnika

Malo poređenja

N-torke, liste i rečnici su tri Python-ove strukture koje rade sa nizovima podataka. U PHP-u su one spojene u jednu strukturu – nizove (arrays). Lakši pristup koji ima PHP svakako utiče na performanse u radu sa nizovima. Još jedna stvar mi je izazvala pažnju – počinjem da shvatam odbojnost programera prema needle – haystack principu koji ima PHP kada određuje da li neki element pripada nizu – mnogo je čitljivija i jednostavnija ista stvar u Python-u preko komande in. Kod odredjivanja da li je neki string substring drugog stringa Python opet koristi istu komandu – in – dok PHP ima posebnu funkciju za to. Python je svakako dosledan i praktičan u komandama a da li se u njemu stvarno programira brzinom razmišljanja – to ću tek videti. Za sada su svi utisci krajnje pozitivni.

Leave a Reply

Your email address will not be published. Required fields are marked *