7a: Tekstas

Iki šiol tekstą naudojome labai paprastai - tiesiog atspausdindavome. Šioje pamokoje išmoksime jį analizuoti ir pertvarkyti.

Kas yra tekstas?

Angliškai tekstiniai duomenys vadinami "string" - eilutėmis, todėl, kad kompiutriuose tekstas yra raidžių/simbolių eilutė. Pvz, "Hello, World!" yra eilutė iš 13 simbolių. Jo duomenų tipas žymimas str.

Visa kompiuteryje išsaugota informacija yra nuliukai ir vienetukai (dvejetainėje sistemoje galima užkoduot bet kokį skaičių). O kaip saugoma tekstinė informacija? Yra specialios simbolių lentelės - anksčiau ASCII, dabar Unicode ar pan. - kuriose iš eilės išvardinti visi galimi simboliai. Pvz,  "H" numeris jose yra 40.  Tad užtenka saugoti skaičius - simbolių numerius, o atvaizdavimo metu paimti atitinkamus simbolius (vaizdelius).
PS: dėl to, kartais, supainiojus koduotę arba šriftą, vietoj lietuviškų raidžių matosi "kringeliai".

Teksto tvarkymas, imant po simbolį: Tekstas[..]

Tekstas yra simbolių sąrašas.  Jame simboliai sunumeruoti iš eilės. Visos "Hello, World!" teksto reikšmės būtų sunumeruotos taip:

Numeris  : 0  1  2  3  4  5  6  7  8  9 10 11 12
Reikšmės.: H  e  l  l  o  ,     W  o  r  l  d  !
Kaip paimti teksto simbolį?

Tekstas[ nr ]
grąžina simbolį iš eilutės Tekstas, esantį nr vietoje. Daug kam neįprasta, bet programuotojams patogiau numeruoti nuo nulio, tad pradinis simbolis bus Tekstas[0]!

Kitose programavimo kalbose būna specialus simbolio duomenų tipas. Pitone, tai tiesiog vieno simbolio ilgio tekstas, taigi jų tipas yra str.

Teksto ilgis: len

Norėdami sužinoti teksto ilgį, naudokite len funkciją. Pavyzdžiui, len("Hello, World!") grąžina 13.

Pasirinkimo užduotis: Paskautinė raidė
Kaip pasiekti paskutinę teksto  T raidę?
len(T) grąžina visos tekstinės eilutės ilgį, bet kadangi tekstinė eilutė numeruojama nu 0, paskutinės raidės numeris yra vienu mažesnis negu eilutės ilgis: len(T)-1.

Štai len ir numeracijos naudojimo pavyzdys.

Pavyzdys: Teksto ilgis ir simboliai

Teksto atkarpos: S[:]

Pagal simbolių numerius galima paimti teksto dalį/atkarpą (angl. substring/slice). Pavyzdžiui, "eat" ir "ted" yra "repeated" dalys. Atkarpos nurodymo pvz.:

Tekstas[ pradžiosNr : pabaigosNr ]
paims tekstą nuo pradžiosNr (imtinai) iki pabaigosNr (neimtinai - realiai paima iki pabaigosNr-1). Pabandykite atspėti rezultatą prieš paleisdami kodą.
Pavyzdys: Substrings

Turbūt keista, kad  pabaigosNr naudojamas neimtinai.  Dėl šios priežasties dažnai pasitaiko klaidų - kaip ir dėl numeravimu nuo nulio. Tačiau, tai yra patogu sudėtingesniuose skaičiavimuose. Pavyzdžiui, teksto atkarpoje  T[i:j] visada yra j-i simbolių. Arba jei reikia tekstą padalint į 2 dalis ties k-tąja raide,  galima rašyt T[0:k], T[k: len(T)-1] -- pirmoje dalyje k bus neimtinai, o antroje imtinai. 

Programavimo pratimas: Tekstinių eilučių skutimas
Parašykite programą, kuri gauna tekstą iš input(), ir atspausdina jį "apskustą" - be pirmos ir paskutinės raidžių. (Tarkime, kad pradinio teksto ilgis bus bent 2). Pavyzdžiui įvedę Pitonas turėtume gauti itona.
Žemiau galima įvesti duomenis programai (angl. "input")

Teksto sudėtis: +

Žinome, kad 1+2=3. Tekstui sudėties ženklas veikia kitaip - tiesiog sujungia (angl. "concatenate") 2 tekstus į vieną:

Pavyzdys: Tekstinių eilučių sudėtis

Programavimo pratimas: Galvos ir uodegos
Dažnai pradinė teksto dalis vadinama "galva" (angl "head"), o galutinė - "uodega" (angl. "tail"). Parašykite programą, kuri perskaito input() ir atspausdina  sukeitusi pirmą ir paskutinę raides. Tarkime, kad teksto ilgis yra bent 2. Pavyzdžiui, įvedę Indeniada turėtume gauti andeniadI.
Žemiau galima įvesti duomenis programai (angl. "input")

Jei norėsite prie teksto prijungti skaičių, pirmiau reikės jį  konvertuoti į tekstą, naudojant str. Kitaip gausite vieną iš dviejų klaidų, priklausomai nuo reikšmių eiliškumo.
Pavyzdys
Pakeiskite eilučių tvarką ir pamatysite, kaip atrodo abi konkatenacijos klaidos
  • print("high " + 5)
  • print(110 + " percent")
Štai teisingas pavyzdys: str() funkcija paverčia skaičių į tekstą.
Pavyzdys
Skaičių konvertavimas į tekstą su str()

Ketvirtoje pamokoje minėjome, kad įmanoma dauginti tekstines eilutes iš skaičiaus: S * n reiškia S + S + ... + S.

Pavyzdys
Tekstinių eilučių dauginimas

Simbolių kodai: ord, chr

Kaip minėjome pamokos pradžioje, mūsų kompiuteriai kiekvieną raidę koduoja skaičiumi. Koks kiekvieno simbolio numeris? Bendrai, viskas priklauso nuo to, kokią koduotę naudoja Jūsų kompiuteris. Tačiau beveik visi šiandieniniai kompiuteriiai pagrinidniams rašmenims naudoja skaičius tarp 32 ir 255. Štai, susipažinkime su simboliais, kurių vertės yra tarp 32 ir 127:

ord: 32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47
chr:      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
ord: 48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63
chr:  0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
ord: 64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79
chr:  @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
ord: 80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95
chr:  P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
ord: 96  97  98  99  100 101 102 103 104 105 106 107 108 109 110 111
chr:  `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
ord: 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
chr:  p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~
Vėliau, aštuntoje pamokoje, rašysime programą, kuri atkartos aukščiau esančią lentelę.
Atmintinai išmokti šios lentelės tikrai nereikia. Tačiau verta prisiminti keletą detalių.

  • mažosios raidės a, b, c, ..., z turi iš eilės didėjančius kodus
  • didžiosios raidės A, B, C, ..., Z irgi turi iš eilės didėjančius kodus
  • ir skaičiai 0, 1, 2, ..., 9 turi iš eilės didėjančius kodus

Simbolis 32 yra tarpas, o 127 yra vienas iš specialių simbolių. Svarbūs tekstui spec. simboliai yra 9 -  tab (tabuliacija) bei  10 ir 13 -  peršokimas į naują eilutę (angl "newline").

Pitone galime sužinoti simbolio numerį su ord funkcija (nuo angl. "order" - "eilės tvarka"). Ir atvirkšičai - chr funkcija pagal skaičių grąžina  atitinkamą simbolį (angl "character").

Pavyzdys
ord ir chr

Programavimo pratimas: Raidžių ratas
Įvestyje bus didžioji lotyniška raidė. Parašykite programą, kuri nuskaito input() ir  atspausdina kitą iš eilės ("sekančią")  abėcėlės raidę. Pvz.,  "Z" rezultatas turėtų būti "A". Programoje reiks naudoti tik vieną if sakinį. Kita  užuomina.)
Žemiau galima įvesti duomenis programai (angl. "input")

Yra sistemų, kuriose teksto simboliai yra tik tarp 32 ir 127; kitose sistemose yra daug daugiau spausdinamų simbolių, iki 255 ar net 65535; Unicode sistemoje yra šimtai tūkstančių raidžių. Daugiau apie tai galite pasiskaityti (angliškai) čia bei čia.

Pamoką baigsime dviem uždaviniais.

Programavimo pratimas: Pig Latin
Pig Latin yra pseudo-kalba. Kad įprastos kalbos žodį "išverstume" į Pig Latin, turime perkelti pirmą žodžio raidę į pabaigą ir pridėti  "ay". Pavyzdžiui, pagalba tampa agalbapay o Jonas tampa onasJay. Parašykite programą, kuri paima vieną žodį ir paverčia jį į Pig Latin. (Šiaip, Pig Latin taisyklės yra sudėtingesnės, bet čia mums užteks vienos taisyklės.)
Žemiau galima įvesti duomenis programai (angl. "input")

Programavimo pratimas: Vardų žaidimas
Vardų žaidimas leidžia iš bet kurio vardo padaryti dainą. Perklausykite šią dainą:
Jūsų programa turėtų paimti vardą ir atspausdinti dainą. Pavyzdys su vardu “pearl”

pearl, pearl, bo-bearl
banana-fana fo-fearl
fee-fi-mo-mearl
pearl!
Svarbu, tikras vardas/žodis atsiranda tik tris kartus, priedo, vardas atsiranda dar tris kartus, tačiau šiais kartais varde būna pakeista pirmoji raidė.
Žemiau galima įvesti duomenis programai (angl. "input")

Paieška ir pakeitimas

Dažnai norime patikrinti, ar tekste yra kažkoks žodis/fragmentas

Pavyzdys: Fragmento tikrinimas

Yra specialios funkcijos, tiesiogiai susietos su tekstu - jos vadinamos "metodais", pvz "Labas.upper()" duos reikšmę "LABAS".

Pavyzdys: Paieška tekste

Teksto formatavimas

Dažnai pranešimuose naudotojui tekstas turi būti pateiktas su įterptom kintamųjų reikšmėm. Tam galima naudot teksto sudėtį, bet patogiau naudoti formatavimo galimybes - nurodant, kur turi būt įterpiama ir išvardinant reikšmes vėliau.

Pavyzdys: Formatavimo galimybės