A python listákról 2. rész

Folytatom az előző bejegyzést (1. rész itt).
Szeretnék bemutatni egy egyszerű egész számokból álló számsorlista előállító eljárást. A range() függvény a barátunk ehhez. Ez egy beépített függvény, meg kell adni neki a kezdő- és végértéket:
>>> range(2,7)
[2, 3, 4, 5, 6]

Mire jó ez nekünk?


Nos, aki már programozott, az hallott a for ciklusokról, amellyel egy kezdőértéktől egy végértékig elszámol a ciklusunk egy ciklusváltozó segítségével. Pythonban ez így néz ki:
>>> for i in range(0,10):
...     print "i: ",i
...
i:  0
i:  1
i:  2
i:  3
i:  4
i:  5
i:  6
i:  7
i:  8
i:  9

A pythonban nincsenek köznapi értelemben vett változók, a pythonban minden objektum. Egy objektumnak meg vannak tulajdonságai (amik valamit tárolnak az objektumról), és vannak metódusai (olyan függvényei - vagy hívhatjuk eljárásoknak is, de inkább függvények :) -, amik valamit csinálnak az objektummal, annak adataival).Illetve hadd pontosítsam a python változókat, ők az egyes objektumokra mutatnak. Ezt fontos lesz megjegyezni mert ennek ismeretében könnyebben meg fogjuk találni a programjainkban a funkcionális hibákat.

A listák is objektumok, ezeknek is megvannak a metódusaik. Nézzük az alábbi helyzetet:
>>> lista=[]
>>> lista[0]=1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

Csináltunk egy üres listát, majd a 0. elemének értéket akartunk adni. Logikus, nem? Azt mondja nekünk a kígyónk, hogy nincs ilyen indexű elem. Mit tudunk akkor tenni?
Használhatjuk pl. a listák append() (hozzáfűzés) metódusát:
>>> lista.append(1)
>>> lista.append('a')
>>> lista
[1, 'a']

Az eltávolításra a remove() metódus szolgál:
>>> lista.remove(1)
>>> lista
['a']

Kanyarodjunk vissza picit az üres listára, és nézzük meg ezt:
>>> lista=[]
>>> lista[0:0]='a'
>>> lista
['a']
>>> lista[1:1]='b'
>>> lista
['a', 'b']

Vajon miért működik? Egyszerű. Bár a lista üres, a 0:0 szelete érvényes, hiszen ez nulla elemet tartalmaz, vagyis üres lista. Ennek az üres listának adtunk értéket, vagyis a 0 pozícióba szúrtuk be az 'a' sztringet.

A listák elemei objektumok. Ha pythonban minden objektum, akkor bármit listába lehet szervezni, ebből következően lista eleme lehet lista is. Ezzel el is jutottunk a más nyelvekből ismert többdimenziós tömbökhöz.
>>> lista1=range(1,4)
>>> lista2=range(10,15)
>>> lista=[lista1,lista2]
>>> lista
[[1, 2, 3], [10, 11, 12, 13, 14]]

Na most vegyük elő amit fent mondtam a változókról! Mi is volt az? Hogy ők valójában mutatók. Itt most a lista1 és lista2 változók egy-egy listára mutatnak.
A lista változó szintén egy listára mutat, egy harmadikra. Ennek elemei a lista1 és lista2, amik tudjuk, hogy mutatók. Mi lesz ennek az eredménye?
>>> lista1[0]='bbb'

Ötlet?

Hát nézzük:
>>> lista
[['bbb', 2, 3], [10, 11, 12, 13, 14]]

Megváltozott a lista listában tárolt első elem - ami egy lista szintén - első eleme. Ezért nagyon körültekintőnek kell lennünk mikor listákat fűzünk egybe, illetve allistákat használunk. Ez vonatkozik az allistákat tartalmazó listák függvényparaméterkénti átadására:
>>> def f(plista):
...     plista[0][0]='ez plistából'
...     print "plista :: ",plista
...
>>> f(lista)
plista ::  [['ez plist\xc3\xa1b\xc3\xb3l', 2, 3], [10, 11, 12, 13, 14]]
>>> lista
[['ez plist\xc3\xa1b\xc3\xb3l', 2, 3], [10, 11, 12, 13, 14]]

Az unikódos tárolás most ne zavarjon senkit :)
Ennit mára a technika és a tudomány újdonságaiból, a többit legközelebb :D

2 megjegyzés:

  1. Hát én egyelőre csak olvasgatom a blogot, ami nagyon jó, de marhára nem értem az egész pythont :D Na jó, most ez szerintem azért van, mert ahogy írtad, itt objektumok vannak, nem változók, így hiába a php+js+mysql gyakorlatom, nem sokat ér :) Kezdem úgy érezni, hogy eddig csak tojást tudtam sütni, de a főzelék még nem megy :D

    VálaszTörlés
  2. Csak ne csüggedj! Én tavaly nyáron kezdtem a Pythonnal foglalkozni, majd 2-3 hét után elkezdtem megoldogatni az emelt szintű infó érettségi programozás feladatait. Kb a 60-70%-át sikerült megoldani, ami szerintem igen jó arány ennyi előzetes tanulás után. Az, hogy interpreteres nyelv, segít abban, hogy ne kelljen az egész programot megírni, majd lefordítani ahhoz, hogy ki tudd próbálni. Sőt! A különböző objektumokra vonatkozó metódusokat is könnyen ki lehet próbálni.

    VálaszTörlés