Tuple

11.2 Tuple 

Problem: Eh, sada... Po tvojim rečima nije baš poželjno da neka stvar bude promenljiva u memoriji računara. Jel to znači da treba da izbegavam liste, i ako treba da ih izbegavam, koja je alternativa?
Odgovor: Rekao sam da to nije poželjno u određenim situacijama, koje su retke. I zbog toga ne, ne treba da izbegavaš liste – one su veoma moćne strukture podataka, pa onda, zašto ne iskoristiti njihovu prednost? Ako ti treba alternativa, koja nije promenljiv tip podataka, ali ima skoro sve osobine kao i liste – tu je! Te alternativne strukture podataka se u Pythonu nazivaju tuple.
Tuple se, kao i liste, koriste za držanje više nezavisnih objekata zajedno, na jednom mestu u tačno određenom rasporedu (što nam govori da je i ovde pozicija objekata bitna, kao i kod lista). Budući da me mrzi da non-stop ponavljam ovo „kao liste“, ti možeš tuple zamisliti kao nešto što je jako slično listama, ali, bez mnogih funkcionalnosti koje ti klasa lista može pružiti. Jedna od glavnih karakteristika tupli je, kao što sam ti već i napomenuo, da su one nepromenljive(isto kao i stringovi), odnosno njenu sadržinu ne možeš da modifikuješ.
Ok, sada kada donekle imaš predstavu čemu služe tuple, daj da vidimo kako se definišu. Tuple se zaista jednostavno definišu: navedemo sve stavke koje želimo da budu u tupli, međusobno ih razdvojimo zarezima, a sve to strpamo unutar zagrada (). 
Znači to izgleda otprilike ovako:
neka_tupla = (prvi_objekat, drugi_objekat)
Ili u interaktivnom promptu:
>>> a = (1, 'moja', 'tupla') 
>>> a 
(1, 'moja', 'tupla') 
>>> type(a) 
<class 'tuple'> 
>>> b = 'moja', 'druga', 'tupla' 
>>> b 
('moja', 'druga', 'tupla') 
>>> type(b) 
<class 'tuple'> 
>>> 
Čekaj malo.... A ova promenljiva b? I to je tupla? Ali, gde su zagrade?
Zagrade su samo opcioni elemenat. Python smatra da je sve što je napisano u jednoj logičkoj liniji i pri tome je razdvojeno sa zarezima – tupla. Ponekad je brže definisati tuplu bez zagrada, ali je ipak pametnije to raditi sa zagradama, jer sebi ili nekom drugom, ko će čitati našu skriptu, jasno dajemo do znanja da je taj skup podataka u stvari jedna tupla.
Tuple se obično koriste u slučajevima kada nam je potrebno da naredba ili neka definisana funkcija treba da obrađuje neki skup različitih vrednosti, koji bi nam bili potrebni na nekom drugom mestu nepromenjeni, pa se korišćenjem tuple osiguravamo da se te vrednosti neće promeniti.
Evo banalan primer kako se tuple mogu koristiti. Hajde da definišemo neke škole.
>>> škole = ('OŠ Dositej Obradović', 'STŠ Mileva Marić-Ajnštajn', 'VŠ Mihajlo Pupin', 'FTN Nikola Tesla') 
>>> 
Promenljiva škole ima vrednost koja je tupla nekih različitih stavki. Ona predstavlja škole u koje si možda išao. Hajde da vidimo koliko ti imaš diploma? Da bi smo to proverili koristićemo len() funkciju  koja će nam dati dužinu tuple. Ovo je moguće zato što je tupla takođe i sekvenca.
>>> len(škole) 
4 
>>> for i in škole: 
...     print(len(i)) 
... 
20 
25 
16 
16 
>>> 
Kada smo kroz tuplu „prošli“ sa for petljom, len() funkcija nam je dala dužinu svakog pojedinačnog elementa.
Ti si sada završio svoje školovanje, ono postaje samo deo tvog životnog iskustva. Znači, sada moramo da kreiramo novu tuplu koja će se zvati životno_iskustvo, i koja će da sadrži neke tvoje osobine koje već poseduješ, zajedno sa školovanjem.
>>> životno_iskustvo = 'lenština', 'pametan', 'nezaposlen', 'u stanju raspada', škole 
>>> len(životno_iskustvo) 
5 
>>> 
Šta se sada desilo? Pa moje životno iskustvo bi trebalo da je veće? 4 zasebne stavke i 4 stavke vezane za školovanje? Zašto mi Python „zakida“ moje teškim trudom i zalaganjem stečeno životno iskustvo?
Zapravo, nije te zakinuo ni za jedan delić tvog iskustva:
>>> životno_iskustvo 
('lenština', 'pametan', 'nezaposlen', 'u stanju raspada', ('OŠ Dositej Obradović', 'STŠ Mileva Marić-Ajnštajn', 'VŠ Mihajlo Pupin', 'FTN Nikola Tesla')) 
>>> 
Da se vratimo mi malo u realnost? Zapamti da tupla koju smestimo unutar neke druge tuple neće izgubiti svoj identitet, drugim rečima, ona će i dalje biti samo tupla, kao jedinstven objekat koji je sačinjen od nekih drugih objekata. Ovo je vrlo važna osobina koju moraš zapamtiti: u Pythonu kada koristimo neki objekat koji je sačinjen od nekih drugih objekata, uvek će to ostati taj objekat – nikada se neće nekim čudom, „raspasti“ na one objekte od kojih je sačinjen! Znači tupla je jedan objekat (koji je sačinjen od više nekih drugih objekata).
Evo i dokaza:
>>> for i in životno_iskustvo: 
...     print('Moje životno iskustvo je', i) 
... 
Moje životno iskustvo je lenština 
Moje životno iskustvo je pametan 
Moje životno iskustvo je nezaposlen 
Moje životno iskustvo je u stanju raspada 
Moje životno iskustvo je ('OŠ Dositej Obradović', 'STŠ Mileva Marić-Ajnštajn', 'VŠ Mihajlo Pupin', 'FTN Nikola Tesla') 
>>> 
Da bi smo pristupili pojedinačnim stavkama unutar tuple tako što navodimo položaj te stavke (koji je broj, ne zaboravi da je prva stavka na položaju broj 0, jer Python broji od 0), koji stavljamo između uglastih zagrada, isto kao što smo radili i sa listama. Ovo se, inače,  naziva operator indeksiranja. Indeksiranje je prisutno u svim tipovima podataka koje su sekvence. Tako ćemo mi pristupiti stavki koja predstavlja naše školovanje u tupli životno_iskustvo, pišući životno_iskustvo[4]:
>>> for i in životno_iskustvo[4]: 
...     print('Završio sam', i) 
... 
Završio sam OŠ Dositej Obradović 
Završio sam STŠ Mileva Marić-Ajnštajn 
Završio sam VŠ Mihajlo Pupin 
Završio sam FTN Nikola Tesla 
>>> 
Pošto operacijom indeksiranja dobijamo samo neki objekat, u našem slučaju dobili smo drugu tuplu, možemo da pristupimo i njenim stavkama direktno – na primer trećoj stavki u okviru ove tuple pišući: životno_iskustvo[4][2].
>>> viša_škola = životno_iskustvo[4][2] 
>>> viša_škola 
'VŠ Mihajlo Pupin' 
>>> 
Sve ovo u vezi indeksiranja je prilično jednostavno, ali kada shvatiš poentu. A da bi shvatio poentu probaj na nekim svojim primerima da radiš indeksiranje stringova, listi, tupli.... Pusti mašti na volju i vežbaj.... 
Reč dve, tri o zagradama: 
Rekao sam ti da su zagrade samo opcija prilikom definisanja tuple, ali da bi uvek trebalo da ih koristimo, kako bi bilo očigledno da je to tupla, jer se tako izbegava konfuzija pri proučavanju izvornog koda. Evo ti jedan neočekivani primer u kom se pojavljuje tupla:
>>> print('a', 'b', 'c') 
a b c 
>>> print(('a', 'b', 'c')) 
('a', 'b', 'c') 
>>> 
U prvom primeru zagrade služe funkciji print() da prikaže tri zasebne stavke, ali ukoliko želimo da su te stavke u stvari tupla – onda nam je potreban još jedan par zagrada, kao što smo u drugom slučaju i napisali. 
Reč, dve, tri o tuplama koje sadrže 0 ili 1 stavku: 
Logikom koju smo koristili prilikom korišćenja lista, praznu tuplu konstruišemo samo praznim zagradama, na primer:
>>> a = () 
>>> a 
() 
>>> type(a) 
<class 'tuple'> 
>>> 
Ali šta je sa tuplom koja treba da sadrži samo jednu stvar?
>>> a = ('usamljen') 
>>> a 
'usamljen' 
>>> type(a) 
<class 'str'> 
>>> 
Pa i nismo dobili ono što smo očekivali... Da bi se definisala tupla sa jednom stavkom moramo navesti oznaku zarez posle prve (i jedine) stavke, tako da Python može da razlikuje kada je nešto tupla, a kada je samo par zagrada koje okružuju neki objekat u nekom izrazu:
>>> a = ('usamljen',) 
>>> a 
('usamljen',) 
>>> type(a) 
<class 'tuple'> 
>>> 
Ako si se susretao sa Perl programskim jezikom: 
Liste koje se nalaze unutar neke druge liste, nikada ne gube svoje osobine, odnosno liste neće biti "izravnate" kao u Perlu. Isto važi i za tuple unutar tuple, ili tupla unutar liste, ili listu unutar tuple, itd. Što se Python-a tiče, oni su samo objekti koji se čuvaju unutar drugog objekta, i to je cela filozofija.

11.1.2 Povratak
na liste
Indeks 11.3 Rečnici

Коментари

Popularno

Audacious - program za slušanje muzike

LibreOffice Calc - program za izradu tabela

Brasero - program za rezanje CD-ova

Bekstvo iz Titela

Minitube - program za praćenje YouTube sadržaja

Idemo

Bezimena

Pozadina Bekstva iz titela

Pažljivo sa MS Word dokumentima koje primate putem elektronske pošte

Šta je to "prosijački štap" i kako se do njega dolazi? (prvi deo)