S_042020 S_042020 S_042020

Python / 4. časť: Efektívny lovec

0

Reťazce (str)
Reťazce (strings) patria medzi tzv. zložené (compound) dátové typy, a to z dôvodu, že obsahujú viacero menších prvkov – konkrétne znakov (characters), ktoré zoskupujú do jedného celku. Objektová podoba reťazcov ponúka viacero metód, ktoré možno využiť na manipuláciu s ich obsahom. Vo vývojovom prostredí IDLE si môžeme zoznam dostupných metód vypísať stlačením tabulátora za znakom bodky.

Dôležitá je skutočnosť, že reťazce sú sekvenčné (indexovateľné) a nemeniteľné (immutable). Pokiaľ potrebujeme zmeniť existujúci reťazec, musíme to urobiť cestou vytvorenia nového reťazca.

Pretože typ string je nemeniteľný, môže sa stať, že pre dva rovnaké reťazce sa v pamäti použije to isté pamäťové miesto (ide o ten istý objekt). Kontrolu, či dve rozdielne premenné, ktorým sme priradili rovnaký reťazec, ukazujú na rovnaký objekt (rovnaké pamäťové miesto), môžeme vykonať pomocou operátora is.

Základná manipulácia s reťazcami
Na výber jedného prvku (znaku) z reťazca používame indexovací operátor [i], ktorého argumentom je pozícia znaku v reťazci počnúc od 0. Index špecifikuje umiestnenie prvku v sekvenčnom zozname údajov, v tomto prípade konkrétneho znaku. Možné sú aj tzv. negatívne indexy, pri ktorých má posledný znak reťazca index [-1], predposledný [-2]… Indexom nemusí byť iba jediné číslo, ale aj dvojica čísel oddelená znakom :, ktorú označujeme ako kúsok (slice). V takom prípade je z reťazca vybratá jeho časť nachádzajúca sa medzi prvým a druhým indexom (prvý či druhý index sa môže vynechať). Výstupom indexovacieho operátora je údaj typu reťazec aj napriek tomu, že ide iba o jediný znak. Ďalšie často využívané metódy a operátory sú:

len() dĺžka reťazca
enumerate() vytvorenie páru index – údaj
==, !=, <, <=, >, >= abecedné porovnanie reťazcov
in, not in operátor testujúci, či sa ľavý argument nachádza v reťazci (pravý argument)
lower(), upper() zmena veľkosti (case conversion) znakov reťazca
find() získanie indexu hľadaného reťazca, v prípade negatívneho výsledku vráti -1
rfind() získanie indexu hľadaného reťazca, postupujúc od konca reťazca, v ktorom hľadáme
split()
split(delimiter) rozdelí reťazec na časti, ktoré sú v reťazci oddelené bielymi miestami (tabulátormi, medzerami, novými riadkami), resp. oddelené špecifikovaným oddeľovačom (delimiter)
join(separator) spojí reťazec s použitím spojovača (separator)
for prvok in reťazec postupný prechod (traverse) každým prvkom (znakom) reťazca
list() konverzia typu string, resp. ľubovoľného typu na typ list 

 

Rozšírená manipulácia s reťazcami
Veľmi komplexná metóda, ktorá je určená na formátovanie reťazcov, je metóda format():

text {0} text {1} text {2} … .format(argument1,argument2,argument3,...)

 

Vyčlenené miesta (place holders), označené ako {0}, {1}, {2}…, sa nahradia argumentmi argument1, argument2, argument3… Označenie miest môže byť štruktúrované doplnkovými symbolmi:

:< ^ > zarovnanie reťazca doľava, na stred, doprava
:šírka vyhradenie šírky miesta, do ktorého bude vypísaný reťazec
:konverzný typ konverzia reťazca na požadovaný typ
:počet f požadovaný počet čísel za desatinou čiarkou pri konverzii na typ float

 

Príklad č. 4

Tuple
Typ tuple sa používa na zoskupenie údajov rôznych typov do jedného celku, čím vzniká tzv. záznam (record). Záznam ohraničený jednoduchými zátvorkami obsahuje položky, resp. údaje oddelené čiarkami, ktoré patria jednej entite. S premennými typu tuple môžeme vykonávať rovnaké operácie, aké sú definované pre typ string. Tuple sú rovnako ako reťazce nemeniteľné a s výhodou ich možno použiť ako návratový typ funkcií, keď namiesto jedinej hodnoty dokážeme vrátiť hneď niekoľko rôznych údajov. Môžeme ich vnárať jeden do druhého, čím dokážeme vytvárať veľmi sofistikované záznamy.

Priradenie
Python dokáže s premennými typu tuple realizovať efektívne priraďovanie (tuple assignment). Treba pritom prispôsobiť počet priraďovaných položiek priraďovaným premenným. V podstate ide o naplnenie premenných nachádzajúcich sa na ľavej strane priraďovacieho operátora údajmi, ktoré sú obsahom premennej typu tuple nachádzajúcej sa na jeho pravej strane:

zbalenie (packing): premenná typu tuple = (položka1, položka2, položka3, …)
rozbalenie (unpacking): (premenná1, premenná2, premenná3, …) = premenná typu tuple

 

List
List je sekvenčné zoskupenie položiek (items), resp. elementov rôznych typov do jedného celku, ktorý ohraničujeme hranatými zátvorkami. Rovnako ako typ tuple môžeme vytvárať vnorené (nested) listy, kde je jeden list položkou iného listu. Na získanie konkrétnej položky listu používame rovnaký indexovací operátor ako v prípade typu string. Mnohé ďalšie metódy a operátory typu string, ako napr. len(), for element in list, in, not in…, sú adekvátne použiteľné aj v prípade typu list. Operátor + sa používa na spájanie (concatenate) a operátor * na opakovanie listov.

Najdôležitejší rozdiel typu list oproti typom string a tuple je ten, že typ list je meniteľný (mutable). To znamená, že jednotlivé položky premennej typu list môžeme kedykoľvek zmeniť. Pre typ list je navyše definovaná metóda del(), pomocou ktorej môžeme konkrétne položky zmazať.

List aliasing a klonovanie
Z dôvodu, že typ list je meniteľný, pre dva rovnaké listy nikdy nebude vyhradené rovnaké pamäťové miesto, čo je v kontraste s typmi string a tuple. No ak priradíme jednu premennú typu list inej premennej typu list, obe budú ukazovať na rovnaké pamäťové miesto. Vytvoríme tak alias, čo znamená, že len čo zmeníme niektorú položku jednej premennej, rovnako sa zmení tá istá položka aj pri druhej premennej. To platí aj pre používanie typov list ako argumentov volaných funkcií.

V prípade, ak chceme priradiť jednu premennú typu list inej premennej bez odkazu na to isté pamäťové miesto, robíme tak pomocou operátora slice. V takom prípade sa vždy vytvorí (naklonuje) nový list (nový objekt), na ktorý bude ukazovať druhá premenná:

premenná a: a = [1,2,3]
klon premennej a: b = a[:]

 

Príklad č. 5 

Pri práci s typom list sa často používa funkcia enumerate() a metódy ako napr.

append() doplnenie položky do záznamu
insert() vloženie položky na konkrétnu pozíciu v zázname
extend() rozšírenie záznamu o nové položky
count() spočítanie výskytu položky v zázname
index() získanie indexu položky v zázname
sort() zoradenie položiek záznamu
remove() odstránenie položky zo záznamu
 

Marek Sopko

Všetky autorove články
programovanie pocitac

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať