2011. december 27.

Python: adattípusok és algoritmusok

Az írás könyvismertető és bemutató egyszerre. Egy könyv, ami ezt a folyamatot segítheti, illetve példa, amit felhasználunk is ebből a könyvből származik. Egy ideje keresek egy olyan könyvet, ami az alapokat könnyedén és célzatosan rendbe rakja a fejembe. Ezt a könyvet fogom ajánlani és egy fejezetét példának kiemelni.




Objektumok, adattípusok és algoritmusok. Ezekkel fogalmakkal kezdődik a programozás alapjainak elsajátítása. A könyv kettőre törekszik. Az objektumok alapvető ismeretét feltételezi. Nem tervezési mintákat, hanem csak létrehozásuknak a képességét. A másik kettő, az adattípusok és az algoritmusok a fő feladat, aminek elsajátítására kísérletet teszünk. Ebben segít a számunkra Data Structures and Algorithms Using Python.

Elvárások az olvasóval szemben

Az könyv elvárásai a könyv olvasóival szemben egy rövid lista. Ez pedig az alap Python ismeretként definiálhatjuk. A könyv olvasója legyen képes függvényeket és osztályokat definiálni és a programját lefuttatni. Ha ezekkel az alapvető ismeretekkel rendelkezünk a Python programozási nyelven, akkor nem fog komolyabb problémát okozni a könyv a számunkra.

A könyv

A bevezetőben emlegetett könyv a Data Structures and Algorithms Using Python. A könyvet azzal a céllal írták, hogy bevezető könyv legyen informatikus hallgatók számára. A programozási nyelvet, a Python is ezzel a céllal választották. Igaz, hogy például C-ben sokkal nagyobb lehetőségünk van a hibák megoldására hiszen alacsonyabb szintű programozási nyelv, amelyben akár Assembly-be is lenyúlhatunk a probléma megoldásán töprengve. (Míg Pythonban a C-hez nyúlhatunk a probléma megoldása során. A C-ből pedig persze megint lenyúlhatunk az Assemblyhez, de ez a többszörös áttétel, ha szükségünk van rá: erősen utal arra, hogy C-ben kellene kezdenünk.)

A könyv alap felvetése az, hogy elsőre ne nehezítse meg az életünket a szintaxis. Először koncentráljuk arra, ami lényeges, az elsajátítandó fogalmakra és azok felhasználására. Ha erre törekszünk, akkor később könnyebben fogunk eligazodni más programozási nyelvek során is. Szabadon válogathatunk érdeklődésünk és az aktuális feladat során. Egy új programozási nyelv elsajátítása nem fog komolyabb problémát és nehézséget okozni.

A könyv nagyon érthető és könnyedén követhető. Az adattípusokat sem mint egy elképzelhetetlen absztrakciót mutatja be, hanem egy olyan folyamatra vezeti át, amely az olvasó feltételezett ismertségi szintje. Az adattípusok nem egyebek, mint speciálisan definiált osztályok. Csupán abban különböznek, hogy egy-két beépített függvényt is fel kell használnunk a definiálásuk során.

A probléma vázolása


A probléma a következő. Egy programot kell írnunk, amelynek a célja a bevásárlólistánk tárolása. A tárolása és lehívása, hogy el ne feledjük, hogy mit kell vásárolnunk. A probléma megoldható az alapvető, beépített adattípusok felhasználásával, de ha szűkítjük és pontosítjuk a problémát, akkor a megoldásunk is sokkal konkrétabb és specializáltabb lesz.

A bevásárló lista létrehozása

Mire lesz szükségünk egy bevásárló lista létrehozásakor?

  1. Először is létre kell tudnunk hozni, többször is példányosítani
  2. Meg kell tudnunk mondani a hosszát (length)
  3. Meg kell tudnunk mondani, hogy tartalmazza-e az elemet (contains)
  4. Tudnunk kell hozzáadni (add)
  5. Törölni (remove)
  6. Illetve képesnek kell lennünk rajta iterálni, végigmenni (iterate)

De ehhez miért is kell új adattípus?

Ezekre képes a beépített List adattípus. Hozzá tudunk adni (append), tudunk törölni is (remove), meg tudjuk határozni a hosszát is (lenght), végig tudunk menni az elemeken és még azt is tudjuk ellenőrizni, hogy tartalmazza-e az új hozzáadandó elemet. Akkor miért is szükséges ez az egész? Többet szeretnénk kódolni?

  • Fókuszálhatunk arra, ami a konkrét feladat. A programunk csak arra lesz képes, amire tervezzük.
  • Csökkenti a hibák számát. Ez összefügg azzal, hogy csak arra lesz képes a programunk, amit mi magunk terveztünk.
  • Jobb összehangoltságot biztos, mivel az interfészeket, a kommunikációs pontokat mi állítjuk be
  • Illetve, ez az utolsó pont már a tervezési mintáknál lesz nagy előnyünk: ami változik, rejtsd el, illetve delegálás. A dolog igazi érdekessége, hogy azáltal, hogy a programunk egy saját adattípussal dolgozik, így bármikor módosítható és akár teljes egészében kicserélhető. Ki tudjuk cserélni az egész adattípust egy okosabb, több funkcióval rendelkező adattípusra és a programunk ugyan úgy jól fog működni, ha ügyelünk az interfészekre, a kommunikációs pontok megtartására.

Bevárásló lista megvalósítása




Bővebben az iterátorról


A példa igazi érdekessége ez, az iterátor megvalósítása. Az iterátort is delegáltuk, kívül valósítottuk meg egy másik objektumban. Ezzel ez is könnyedén módosíthatóvá vált, ha később módosítanunk kell rajta. De nem is ez a valódi érdekessége és különlegessége, hanem az a képesség, hogy most már bármikor és bárhol létrehozhatunk olyan objektumokat, amelynek az elemein nyugodtan végig mehetünk. - Belelátunk a Python szívébe, ha tudjuk, hogy a rengetegszer használt for-ciklus semmi egyéb, mint egy speciális formát öltő függvény. Ami megkapja az objektumot és a kapott objektumnak hívja meg folyamatosan a __next__() függvényét, amíg el nem érkezik a StopIteration hibához.

Összegzés

Ebben az írásban arra törekedtem, hogy egy könyv ajánlásával és a könyv egy fejezetének felületes bemutatásával kedvet hozzak a könyv elolvasásához. A kedvhez és az időbefektetéshez, amely a későbbiekben erősen és többszörösen meg fog térülni a számunkra.

2 megjegyzés:

oniegin írta...

Lehet, hogy az én hozzáállásom naív, de szerintem az programozás alapjainál az objektumokat nyugodtan ki lehet hagyni -- ahogy te is írtad, elsőre túlbonyolításnak tűnhet! A saját adattípusok létrehozásának igénye úgyis csak egy bizonyos idő után merül fel.

(ezt csak azért írom, mert láttam, amikor egy bevezető szintű kurzusban rázúdították szegény hallgatókra az objektumokat és a metódusokat, ami miatt az is homályossá vált, ami egyébként tiszta is lehetne (mondjuk a loopok vagy a függvények))

De persze, azért fontos, csak ne egyből az elején -- végülis egy csomó nyelv vidáman elvan objektumok nélkül, nem? (assembly?:))

Varjú Zoltán írta...

Nem naiv a hozzáállásod :-) De sok helyen, nem véletlenül, Java-t tanítanak amivel elkerülhetetlen az objektumok bevezetése. A népszerű Deitel Java How to Program könyvnek viszont van két változata is, normál és early objects.

Viszont sokkal jobb más nyelven kezdeni. A Python azért csodálatos mert simán el tudod kezdeni OO nélkül, de azért ahhoz jó pythonista legyél nem árt megtanulni ezt a paradigmát. A legjobb OO bevezetést én az MIT OCW Introduction to Computer Science and Programming kurzusán láttam http://bit.ly/nSj9fw A 14., 15. és 16. előadások videói nagyon jók!