Python kezdőknek kurzus 3. lecke

A Ubuwiki wikiből

A mai leckében a Python két fontos típusával ismerkedünk meg: a sztringgel és a listával.

Sztringek

Már használtunk korábban egyszerű sztringeket (pl. "Hello vilag!"). A Python szövegek kezelésére nagyon jó, számos hasznos dolgot tehetünk a sztringekkel (ez a lecke csak egy kis betekintést nyújt ebbe).

Talán még emlékszünk, egyik korábbi leckében volt szó a sztringek összefűzésére szolgáló +-ról.

Példáként:

keresztnev = "Monty"
vezeteknev = "Python"
teljesnev = keresztnev + " " + vezeteknev

Használhatjuk a +=-et is, ha egy sztring végéhez szeretnénk másik sztringet fűzni. A

teljesnev += lastname

csak egy rövidített formája az alábbi kifejezésnek:

teljesnev = teljesnev + lastname

Tehát akár így is létrehozhatjuk a nevet:

teljesnev = "Monty"
teljesnev += " "
teljesnev += "Python"

Ha kíváncsiak vagyunk egy sztring hosszára (arra hány betűből áll), a len(teljesnev) parancs adja meg. Más adattípusok esetén is fogunk találkozni a len-nel, érdemes tehát megjegyezni.

Sztringek darabolása

Mi van olyankor, ha fordítva szeretnénk csinálni? Van egy teljes nevünk, például "Linus Torvalds", és szeretnénk szétdarabolni keresztnévre és vezetéknévre?


Pythonban sztringek darabolását kényelmesen elvégezhetjük, például így:

>>> teljesnev = "Linus Torvalds"
>>> teljesnev.split(" ")
['Linus', 'Torvalds']


A teljesnev.split(" ") formája (szintaxisa) talán kicsit furának tűnik. Ez az első alkalom a kurzus során, hogy objektumorientált programkóddal találkozunk.

Az „objektum orientált” kifejezés pusztán a Python objektumaira vonatkozik (például a sztringekre), melyeknek saját függvényeik vannak, mint például a split(). Ha a teljesnev változó sztring és azt mondjuk teljesnev.split(" "), akkor a Python tudni fogja, hogy azt a függvény hívja meg, amelyik sztringeket darabol. Ha a teljesnev másik típusú objektum, mint például egész szám, vagy szótár vagy egy általunk definiált objektumtípus, akkor a split() valószínűleg egészen mást jelent vagy nem is létezik.

Ha a fenti bekezdésnek számodra semmi értelme sem volt, ne aggódj. Csak jegyezd meg, hogy ha egy s nevű sztringet szeretnél darabolni, akkor a s.split()et kell használnod.

Nem csak szóközök mentén darabolhatsz sztringeket, hanem akár karakterek halmaza mentén. Tehát ha valaki ad egy vesszővel elválasztott listát, mint például az alábbit:

>>> zoldek = "borso,zoldbab,spenot,kukorica,tök"

akkor használva a split() parancsot az alábbit kapjuk:

>>> zoldek.split(',')
['borso', 'zoldbab', 'spenot', kukorica', 'tok']

De mi is valójában a ['Linus', 'Torvalds'] ?

Listák

A ['Linus', 'Torvalds']-t listának hívjuk. Egy listában bármennyi elemet lehet, és úgy tudsz hivatkozni az elemekre, hogy (a változó neve után) szögletes zárójelbe teszed azt, hányadik elemről van szó. A számozás 0-tól indul:

Python 2.x Python 3.x
>>> teljesnev = "Linus Torvalds"
>>> nevek = teljesnev.split()
>>> print "Hello", names[0]
Hello, Linus
>>> teljesnev = "Linus Torvalds"
>>> names = teljesnev.split()
>>> print("Hello", names[0])
Hello, Linus

A listák bármilyen típust tartalmazhatnak, emellett nem muszáj azonos típusú elemekből állnia egy listának. Például a

mylist = [1, "eeny meeny miny moe", 3.14159]

egy teljesen érvényes lista. A listák akár listákat is tartalmazhatnak, de ezzel most nem foglalkozunk.

Egy ciklussal akár végig is mehetünk a lista elemein

Python 2.x Python 3.x
for n in names :
    print n
for n in names:
    print(n)

Szeletek

A keresztnév és vezetéknév kezelése egyszerű, ha csak két nevünk van. De mi történik olyankor, ha több szóból áll a név Okay, firstname and lastname are easy if th?


>>> fullname = "Guido van Rossum"
>>> names = fullname.split()
>>> names
['Guido', 'van', 'Rossum']

Ezesetben még mindig megkaphatjuk a keresztnevet a names[0] segítségével. De a vezetéknév már nem a names[1], hiszen az a "van". Pythonban van egy elegáns megoldás arra, ha a lista egy bizonyos szeletére szeretnénk hivatkozni. Szeleten a lista bizonyos részét (egy adott kezdőpozíciótól egy végpozícióig) értjük. Tehát ha Guidonak 2 részből álló vezetékneve van, akkor azt a

>>> names[1:3]
['van', 'Rossum']

paranccsal kérdezhetjük le.

Vagy ha szükségünk van a névre a keresztnév nélkül, akkor lekérhetjük a len segítségével:

>>> names[ 1 : len(names) ]
['van', 'Rossum']

Sokszor a lista végéig szeretnénk lekérni az elemeket, ezért ha a kettőspont után nem írunk értéket a Python feltételezi, hogy a lista végéig szeretnénk lekérni a lista elemeit:

>>> names[1:]
['van', 'Rossum']

Hasonlóságok a listák és sztringek közt

Sok dolgot amit listákkal tehetünk, sztringekkel is elvégezhetünk és vica versa. Vehetjük sztringek egy szeletét:

>>> fullname[0:5]
'Guido'
>>> fullname[6:]
'van Rossum'

és végigjárhatunk ciklussal egy sztring minden karakterén:

Python 2.x Python 3.x
for c in fullname :
    if c  " " :
        print "It's a space!"
for c in fullname :
    if c  " " :
        print("It's a space!")

Listák végéhez is adhatunk új elemeket, de a += helyett erre az append parancsot használjuk: names.append("Jr.")

Házi feladat

1. Hogy számolnád meg a szavak számát egy egyszerű sztringben? A megoldásnál feltehetjük, hogy a szavak szóközökkel vannak elválasztva. Újsorral, vesszővel vagy elválasztás jellel ne törődjünk.

2. A [-1]-es vagy negatív index mit jelent listák vagy sztringek esetében? Tippelj, majd próbáld ki és nézd meg igazad volt-e!

3. Ki Guido van Rossum és vajon miért ő volt a példa?

4. Írd újra a 2-es lecke feladatát, amiben az "egy", "ketto", "harom", "negy", "ot" szavak szerepeltek, hasznalj listát az if-elif helyett

5. Az utolsó kicsit nehezebb lesz, de ha van időd próbáld megcsinálni. Rajzolj egy hisztogramot számok listájából, ahol minden szám a listában egy sort jelöl.

Például, ha az alábbi listánk van:

vals = [ 0, 2, 4, 8, 16, 18, 17, 14, 9, 7, 4, 2, 1 ]

akkor ezt kellene kirajzolni:

**
****
********
****************
******************
*****************
**************
*********
*******
****
**
*

ahol az első sorban nincs csillag, a másodikban 2 van, a harmadikban 4 és így tovább.

Tipp: két ciklusra lesz szükség, ebből egyik a másikon belül lesz.


További leckék

Személyes eszközök