Sekvence

11.4 Sekvence 

Problem: I kad si mi objašnjavao liste, i tuple, a bogami i stringove, samo si mi zvocao da su one primeri sekvenci, ali ne vidim da si igde rekao šta su to sekvence i šta je to toliko posebno u vezi sa njima?
Odgovor: Pa sekvence su upravo to što im i ime govori – nizovi nekih nezavisnih objekata poređanih u nekom redosledu, a koji zajedno čine jednu celinu, tj jedan objekat.
Sekvence su posebne zato što nam njihove osobine mnogo pomažu prilikom programiranja. Neke od glavnih karakteristika sekvenci su provera da li se objekat nalazi u njoj (tzv. test članstva koji se postiže komandom in ili naredbom not in), ili operacija indeksiranja, koja ti omogućava da pristupiš željenom  objektu koji se nalazi unutar neke sekvence. Obe ove osobine si već video u „akciji“ u našim primerima, ali to nije sve – postoji još jedna operacija koja je podjednako važna!
Sve tri pomenute vrste sekvenci - liste, tuple i stringovi, imaju i operaciju isecanja (slicing), koja ti može omogućiti da od neke sekvence dobijemo njeno parče (isečak). Drugim rečima, možemo da dobijemo drugu, manju, sekvencu iz neke veće sekvence.
Ali, neka primer objasni sve ovo:
Prvo što želim da ti pokažem je kako se koristi operacija indeksiranja da bi se dobili pojedinačni objekti iz neke sekvence. Ova operacija indeksiranja se isto tako naziva i operacija subskripcije. Kada navedem broj u uglastim zagradama, kao što ću ti za trenutak pokazati, Python će mi vratiti objekat koji se nalazi na toj poziciji unutar sekvene (niza). Važno je da zapamtiš da Python počinje sa brojanjem od 0, što sam ti napomenuo do sada bar jedno hiljadu puta. Dakle, primer_liste[0] će biti prvi objekat u listi, a primer_liste[3] će biti četvrti objekat iz naše liste.
>>> primer_liste = ['prvi objekat', 'drugi objekat', 'treći objekat', 'četvrti objekat'] 
>>> primer_liste[0] 
'prvi objekat' 
>>> primer_liste[3] 
'četvrti objekat' 
>>> primer_liste[7] 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
>>> 
Eh... Kada sam pokušao da uradim operaciju indeksiranja sa indeksom koji ne postoji u listi – dobio sam grešku. U primeru sam pokušao da dobijem osmi objekat, ali naša lista ih sadrži samo četiri.
Python je super programski jezik jer nam pruža i mnoge mogućnosti koje drugi jezici nemaju. Tako na primer, kod operacije subskripcije vrednost indeksa može da bude čak i negativan broj! U tom slučaju, pozicija traženog objekta se posmatra od kraja niza. Dakle, primer_liste[-1] će nam vratiti poslednji objekat iz niza, a primer_liste[-2] će nam dati predposlednji objekat:
>>> primer_liste[-1] 
'četvrti objekat' 
>>> primer_liste[-2] 
'treći objekat' 
>>> primer_liste[-4] 
'prvi objekat' 
>>> primer_liste[-7] 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
>>> 
I ovde važi ista priča – ukoliko tražimo sedmu stavku, gledajući od kraja liste – dobićemo grešku, jer u našoj listi postoje samo četiri objekta.
Sva ova priča važi i za tuple, kao i za stringove:
>>> primer_tuple = 'prvi objekat', 'drugi objekat', 'treći objekat', 'četvrti objekat' 
>>> primer_stringa = '1234567890'
>>> primer_tuple[0] 
'prvi objekat' 
>>> primer_tuple[2] 
'treći objekat' 
>>> primer_tuple[-4] 
'prvi objekat' 
>>> primer_stringa[-4] 
'7' 
>>> primer_stringa[0] 
'1' 
>>> primer_stringa[8] 
'9' 
>>> 
A sada ćeš videti da ni sledeća operacija nije neki „bauk“, nego je jako slična svemu ovome što smo već radili.
Operacija isecanja se definiše navođenjem imena sekvence iza kojeg sledi par brojeva koji su razdvojeni dvotačkom, a nalaze se između uglastih zagrada. U suštini, ovo je veoma slično operaciji indeksiranja, koju smo koristili do sada, samo što, kod isecanja imamo dva broja razdvojena sa dvotačkom. Ovde zapamti jednu „sitnicu“: brojevi su neobavezni ali je dvotačka obavezna.
Sličnosti i razlike između ove dve operacije:
Operacija indeksiranja nam vraća samo jedan objekat iz sekvence, dok nam operacija isecanja vraća niz objekata koji je isto tako sekvenca. Zato nam za operaciju isecanja trebaju dva broja – početna tačka od koje krećemo isecanje, i krajnja tačka do koje želimo da dođemo. Zato moramo da zapamtimo da je  prvi broj (pre dvotačke) u operaciji isecanja, je pozicija odakle isečak počinje, a drugi broj (posle dvotačke) pokazuje gde će se zaustaviti isecanje. Ako prvi broj nije naveden, Python će početi isecanje od početka niza. A ako je drugi broj izostavljen, Python će se zaustaviti na kraju niza. Zapamti da deo koji ćemo da dobijamo iz sekvence će da počne na startnoj poziciji i da će se završiti ispred krajnjeg navedenog položaja, odnosno početna pozicija (prvi broj) je uključena, ali objekat koji se nalazi na krajnjoj poziciji neće da bude uključen u isečak niza.
Tako, na primer, primer_liste[1:3] daje parče niza sa početkom u poziciji 1, uključuje položaj 2, ali se zaustavlja na poziciji 3, i samim tim, vraća nam isečak koji sadrži dve stavke:
>>> primer_liste[1:3] 
['drugi objekat', 'treći objekat'] 
>>> primer_liste[:3] 
['prvi objekat', 'drugi objekat', 'treći objekat'] 
>>> primer_liste[:] 
['prvi objekat', 'drugi objekat', 'treći objekat', 'četvrti objekat'] 
>>> primer_liste[2:] 
['treći objekat', 'četvrti objekat'] 
>>> primer_liste[2:3] 
['treći objekat'] 
>>> primer_liste[2:2] 
[] 
>>> primer_liste[2:20] 
['treći objekat', 'četvrti objekat'] 
>>> 
Vidimo da nam primer_liste[:] vraća kopiju cele sekvence, vidimo i primere kada dobijamo praznu listu, a vidimo i da nam kod operacije isecanja više nije bitan krajnji indeks – ukoliko smo premašili dužinu sekvence, Python se neće žaliti, vratiće nam sve objekte do kraja liste.
Ako ti je nejasno ovo oko drugog indeksa koji je naveden u operaciji isecanja, samo se seti funkcije range(). Ti već znaš da nam ona neće dati drugi broj koji smo joj naveli, već će nam dati sve brojeve do drugog broja. Isti sistem je i kod sekvenci.
Kao i kod operacije indeksiranja, mi možemo da radimo i operaciju isecanja sa negativnim brojevima. Negativni brojevi se koriste, kao i kod indeksiranja, da označe pozicije gledano od kraja niza. Na primer, primer_liste[:-1] će da nam vrati deo niza, u kojem je isključena poslednja stavka iz sekvence, ali sadrži sve ostale:
>>> primer_liste[:-1] 
['prvi objekat', 'drugi objekat', 'treći objekat'] 
>>> primer_liste[-4:-1] 
['prvi objekat', 'drugi objekat', 'treći objekat'] 
>>> primer_liste[1:-1] 
['drugi objekat', 'treći objekat'] 
>>> 
Sve ovo može da se primeni i na string i na tuple:
>>> primer_tuple[:] 
('prvi objekat', 'drugi objekat', 'treći objekat', 'četvrti objekat') 
>>> primer_tuple[:2] 
('prvi objekat', 'drugi objekat') 
>>> primer_tuple[2:2] 
() 
>>> primer_stringa[1:8] 
'2345678' 
>>> primer_stringa[1:-3] 
'234567' 
>>> 
Operacija isecanja ima još jednu zanimljivu osobinu – pri njenom korišćenju mi možemo da navedemo i treći broj, koji predstavlja vrednost koraka pri sečenju (uvek se podrazumeva da je korak veličine 1, na primer, kada mi brojimo, kažemo 1, 2, 3, 4... Ako želimo da preskačemo, kazaćemo 1, 3, 5, 7 itd.):
>>> primer_stringa[1:-3:2] 
'246' 
>>> primer_stringa[:-3:2] 
'1357' 
>>> primer_stringa[::2] 
'13579' 
>>> primer_stringa[::3] 
'1470' 
>>> primer_stringa[1::3] 
'258' 
>>> primer_stringa[::-1] 
'0987654321' 
>>> primer_stringa[::-2] 
'08642' 
>>> 
Primetite da kada navedemo vrednost 2 za korak, dobijamo stavke koje su u našoj sekvenci na pozicijama 0, 2, ... Kada je korak veličine 3, dobićemo stavke na pozicijama 0, 3, itd. Negativan korak nam daje sekvencu „u rikverc“ tj od pozadi prema napred.
Probaj različite kombinacije indeksa za operaciju isecanja. Najbolja stvar u svemu ovome je da sve ovo možeš da vežbaš na tupleima, listama i stringovima na identičan način! Dakle – za domaći vežbaj indeksiranje i vežbaj isecanje.

11.3 Rečnici Indeks 11.5 Skupovi

Primjedbe

Popularno

Kako televizija štetno utiče na Vaše zdravlje finansije?

Da li je TV kviz Slagalica "prevara"?

Tu je novi Qt creator 4.4.0!

Kada prijatelji odlaze

Microsoft objavio - nova verzija Windowsa stiže...

Opet su se pojavili lažni kuponi brenda "IDEA" na društvenim mrežama

Najgore obrade velikih rock hitova

Sitnije promene na blogu...

Poslednji pozdrav izgubljenom vremenu

Ne, Marlboro ne deli besplatne cigarete!