Karakterláncok

2019.11.13

Számok vs karakterláncok, bemenet beolvasása

Már tanultunk egy kicsit a karakterláncokról, véletlen mondatokat készítettünk. Most megnézzük őket közelebbről. Már tudunk:

- karakterláncokat összefűzni a + művelettel
    szo = 'Py'+'thon'
    print(szo)

- szöveg típust átalakítani szám típussá az int() utasítással. Szám beolvasására használtuk az entry-ből.
    a = int(entry1.get())
    b = 10
    print(a+b)

Ha  a vászonra akarunk kiíratni számértéket, akkor a szám típusból kell szöveg típusra konvertálni az értéket a str() utasítás segítségével.
   canvas.create_text(100, 100, text = 'Elért pontszámok: ' + str(pontok))
vagy egy példa shell-ben:
   pontok = 12
   uzenet = 'Pontjaid: ' + str(pontok)
   print(uzenet)

Kérdések

1. Hogyan tudjuk megkülönböztetni, hogy a változó típusa szám vagy szöveg?

2. Mi történik, ha a + műveletet használjuk szám és szöveg típus között?

3. Mi történik, ha a * műveletet használjuk szám és szöveg típus között?

Ha meg akarjuk tudni, hogy egy változóban milyen típusú érték van, akkor a type(valtozo_neve) függvényt használhatjuk.

>>> a = 12
>>> type(a)
<class 'int'>
>>>

Láthatjuk, hogy az a változó típusa int, ami az integer rövidítése, vagyis egész szám. A szöveg str típusú, ami a string rövidítése.

Kérdések

4. Az uzenet = '' hozzárendelés után milyen típusú lesz az uzenet változó?

5. Végrehajtjuk ezeket a hozzárendeléseket: mennyiseg = '12' eredmeny = mennyiseg * 5. Mi lesz az ererdmeny változóban és milyen típusú lesz?

6. Végrehajtjuk ezeket a hozzárendeléseket: mennyiseg = '12' eredmeny = mennyiseg * 5. Mi történik, ha az eredmeny = mennyiseg * -1 lenne?

Eddig a programjaink többsége tartalmazott grafikus felületet. A bemenetet entry segítségével tudtuk megadni. Sok feladat viszont nem igényli a grafikus felületet, elég a shell-t használni a bemenet megadására és kimenet kiírására. A shell-bő az input() függvény segítségével tudjuk beolvasni a szükséges adatokat. 

Nézzük az alábbi programot, ami egy párbeszédet szimulál a gép és felhasználó között:

   from random import *
   nev = input('Hogy hívnak? ')
   print('Szia ' + nev + ', örülök, hogy megismerhetlek!')
   datum = input('Melyik évben születtél? ')
   nev2 = choice(('Kati', 'Zsófi', 'Tamás', 'András'))
   print('Emlékszem, ' + datum +'-ban született '+ nev2 + ' is.')

Karakterláncok bejárása és létrehozása

Írassuk ki egy szó minden betűjét egy külön sorba. A karakterlánc bejárására használhatunk for ciklust.

for betu in 'Python':
     print(betu)

vagy

szo = 'Python'
for betu in szo:
     print(betu)

A len(szo) függvény megadja a szo változó hosszát - mennyi karakterből áll.

mondat = input('Adj meg egy mondatot! ')
hossz = len(mondat)
print('A megadott mondat '+str(hossz)+' karakter hosszú.')

A karakterlánc egyes karaktereihez a sorszámukon (indexeken) keresztül is hozzájuthatunk.Az indexelés 0-val kezdődik és fokozatosan 1-gyel növekszik és len(s)-1-ig tart - ahol s egy karakterlánc.

szo = 'Python'
print(szo[0])    #kiírja a P betűt
print(szo[1])     #kiírja a y betűt

Az egész szavunkat kiírathatjuk így az indexekkel együtt:

szo = 'Python'
for i in range(len(szo)):
     print(szo[i])
     print(i)

Sokszor előfordul, hogy egy karakterlánc utolsó karakterével van dolgunk, ilyenkor használhatunk negatív indexeket. A szo[-1] a szavunk utolsó betűje, a szo[-2] az utolsó előtti betűje és így tovább...

Ha olyan indexet próbálunk használni, ami nincs a szavunkban, akkor a Python hibajelentést ír ki.

A Pythonban a string típus nem megváltoztatható (immutable), ez azt jelenti ha például egy karakterét próbáljuk felcserélni egy másikra (szo[i] = 'k'), akkor hibajelentést ír ki. Ha mégis változtatni szeretnénk a szavunkon, akkor létre kell hoznunk egy új változót - lehet ugyanaz a neve.

>>>szo = 'kér'
>>>szo = szo[0]+'á'+szo[2]
>>>print(szo)
'kár'

A következő példában az első mondat minden 'o' betűjét lecseréljük '*'-ra.

mondat1 = 'Pythonban programozunk'
mondat2 = ''
for i in range(len(mondat1)):
     if mondat1[i] == 'o':
         mondat2 = mondat2 + '*'
     else:
         mondat2 = mondat2 + mondat1[i]
print(mondat1)
print(mondat2)

 Vagy valamelyik karaktert ki is hagyhatjuk, például a szóközt:

mondat1 = 'Pythonban programozunk'
mondat2 = ''
for i in range(len(mondat1)): 
      if mondat1[i] != ' ':
           mondat2 = mondat2 + mondat1[i]
print(mondat1)
print(mondat2)
 

Szeletelés

Új karakterláncokat létrehozhatunk szeleteléssel is: szo[mettől: meddig]. A karakterláncukat így a szo[mettől] karaktertől a szo[meddig-1] karakterig fog tartani.

>>> s = 'Pythonban programozunk'
>>> s[10:14]
'prog'
>>> s[10:22]
'programozunk'

Szeletelést alkalmazhatunk akkor is, ha például meg szeretnénk változtatni egy dátum formátumát:

>>> datum_hu = '2019.11.14.'
>>> datum_sk = datum_hu[8:11] + datum_hu[5:8] + datum_hu[0:4]
>>> datum_sk
'14.11.2019'

A programozás szempontjából célszerűbb az év-hónap-nap formátumot használni, mert könnyebben lehet rendezni a dátumokat. Elég csak összehasonlítani őket (<, >, =).

Ha a karakterláncunk elejéről akarunk kivágni egy szeletet, azt felírhatjuk a következő képpen:
sz[:5]  - ez ugyanaz, mint szo[0:5]. Vagy A ha a szavunk végérő szeretnénk egy szeletet: szo[6:] - egy 8 karakteres szó esetében ez ugyanaz, mint szo[6:8]. A teljes szavunkat pedig felírhatjuk így is: szo[:].

A szeletelésnél megadhatunk egy lépésközt is (ahogy a for ciklusnál a range()-ben). A lépésköz megadja, hogy mennyivel fogjuk növelni az indexeket az első megadottól. Ha nem adunk meg lépésközt, az automatikusan 1.

>>> szo = 'Pythonban programozunk'
>>> szo[0:10:2]
'Ptobn'
>>> szo[0:22:2]
'Ptobnpormzn'
>>> sz[-1:-13:-1]
'knuzomargorp'
>>> szo[::-1]
'knuzomargorp nabnohtyP'

Szeletelésnél indexként nem csak konkrét számokat használhatunk, hanem változókat is. Pl.:

szo = 'Python'
for i in range(len(szo)):
     print(szo[:i+1])

                P
                Py
                Pyt
               Pyth
               Pytho
               Python

Szeletelés segítségével létrehozhatunk új karakterláncot is, amelyben az eredeti szóhoz képest meg változtatunk egy vagy több karaktert.

>>> szo = 'Python'
>>> szo = szo[:2] + 'T' + szo[3:]
>>> szo
'PyThon'

Karakterek és kódjaik

Mivel a számítógép mindent számok formájában jegyez meg, úgy a karaktereket is. Minden karakternek van egy szám kódja, amit a megfelelő kódtáblában meg is találunk. A legtöbb betűnek a kódja megegyezik különböző kódtáblákban.

Pythonban az ord('a') utasítással megtudhatjuk az 'a' betű kódját. A chr(97) utasítással pedig a 97-es számhoz tartozó karakterhez juthatunk hozzá. A kódtáblában a karakterek logikus sorrendben vannak elhelyezve. Tehát egymás után állnak a nagy betűk, egymás után állnak a kis betűk, és a számjegyek is egymás után szerepelnek.

Kérdések

1.  Milyen messze van a kódtáblában az 'A' az 'a' betűtől?

2.  Milyen messze van a kódtáblában a 'B' és 'b' betű?

3.  Hogyan tudnánk a kisbetűből nagybetűt csinálni?

4.  Hogyan tudnánk a nagybetűből kisbetűt csinálni?

5.  Hogyan tudnánk véletlen kisbetűt kisorsolni? 

A karaktereket össze is hasonlíthatjuk (<, >, ==, <=, >=, !=)-  a számítógép ekkor a kódjaikat veszi figyelembe.

Szöveggel dolgozunk

Caesar-kód

A Caesar-kód a legrégibb és legismertebb kódolási mód. Eltolásos kódolásnak is hívják, mivel az az alapja, hogy minden betűhöz a tőle x távolságra lévő betűt rendeljük hozzá, így kapunk egy új abécét. Például a 1-es eltolással: 'a' -> 'b', 'b' -> 'c', 'c' ->'d'...

Most készítünk egy programot, amely így kódolja a kapott szöveget.

Logikai műveletek és a karakterláncok

Az in művelet és a logikai értékek (boolean)

Az in művelettel megállapíthatjuk, hogy szöveg részlet megtalálható-e egy szövegben. Ezt a  műveletet használhatjuk például az if feltételében, úgy mint az összehasonlításokat.

szo = 'Python'
if 'o' in szo:
    print('benne van')
else:
    print('nincs benne')

Az 'o' in 'Python' kifejezésnek az értéke True (igaz).
A 'ty' in 'Python' kifejezés értéke False (hamis) lesz.

Ezeket az értékeket is hozzárendelhetjük változókhoz. Az ilyen változó típusa boolean (logikai érték) lesz. A Pythonban bool típus.

További hasznos függvények szövegekhez

Néhány függvénylen speciális formája van: karakterlánc.függvény(paraméter). Ezek már előre definiálva vannak a Pythonban, és metódusoknak hívjuk őket (bővebben róluk az objektumorientált programozásnál tanulunk).

Néhány hasznos metódus karakterláncokhoz (ha s karakterlánc):
s.find(resz) - Visszaadja azt a legkisebb indexet, ahonnan kezdve resz előfordul az s stringben. -1-                         gyel tér vissza, ha resz nem található s-ben.

s.lower() - s minden betűjét kisbetűre cseréli.

s.upper() - s minden betűjét nagybetűre cseréli.

s.replace(resz1, resz2) - Az s-ben resz1 minden előfordulását lecseréli resz2-re.

Karakterláncok formázása

Karakterláncokat formázni, illetve beilleszteni egy láncba változóértékeket a format metódussal tudunk. Ez a metódus a {} első előfordulására az első paraméter értékét helyettesíti, a második {} előfordulásra a második paramétert helyettesíti és így tovább... Például:

>>> nev = 'Kati'
>>> 'Szia {}, örülök, hogy megismerhetlek!'.format(nev)
'Szia Kati, örülök, hogy megismerhetlek!'

Formázásra használhatunk további felírásokat a {}. Így meg tudjuk változtatni például egy szám formátumát. A {:b} kettes számrendszerben írja ki a számot, a {:x} tizenhatosban.
A {:05x} formátum tizenhatos számrendszerben 5 számjegy - ha szükséges, akkor feltölti 0-kal.
A {:4} úgy írja ki a számot, hogy az 4 karakternyi helyet foglaljon - ha kell felölti szóközökkel.
A {:03} a szám elé helyez annyi nullát, hogy az egész szám 3 karakternyi helyet foglaljon el.

A format segítségével az egyes tízes számrendszerbeli RGB színkódokból fel tudjuk írni a 16-os megfelelőjét karakterláncként.
r = 100
g = 152
b = 45
szin = '#{:02x}{:02x}{:02x}'.format(r, g, b)

Így könnyen tudunk színátmeneteket s képezni:

Próbáljatok más színátmeneteket képezni! Próbáljátok ki azt is, mikor minden négyzet teljesen véletlen színű!

A format metódussal tizedesszámokat (float) is formázhatunk.

>>> szam = 10/3
>>> szam
3.333333333333333335
>>> '{:5.2f}'.format(szam)
' 3.33'
>>> '{:5.0f}'.format(szam)
'    3'
>>> '{:.4f}'.format(szam)
'3.3333'

A {:.2f} két tizedes számot jelenít meg.
A {:7.3f} úgy jelenít meg a számot, hogy 3 tizedes helye legyen és az egész szám 7 karakternyi helyet foglaljon.
A {:f} - a standard megjelenítés 6 tizedeshely.

© 2023 Minden jog fenntartva.
Az oldalt a Webnode működteti
Készítsd el weboldaladat ingyen! Ez a weboldal a Webnode segítségével készült. Készítsd el a sajátodat ingyenesen még ma! Kezdd el