Írtam egy cikket a Python programozási nyelvr?l ami megjelent az SZTE TTK Newtone egyetemi lap 2005 februári számában, majd kés?bb a Magyar Unix Portálra is beküldtem. A cikket közérthet?, játékos stílusban írtam.
Az eredeti formátum a Newtone kérésére DOC, amit shusaku átkonvertált HTML-be és taltos PDF-be. Köszönet nekik érte!
Pitonológia
Ki kell ábrándítanom a bilológusokat, mert nem a pitonokról lesz szó. Ahelyett, hogy a hüll?k világát tanulmányoznánk én inkább egy programozási nyelvb?l, a Pythonból szeretnék átadni néhány villanást, ezzel remélve hogy minél többen fogjátok használni és ezzel végs? soron rengeteg id?t fogtok megtakarítani amelyet mindenféle értelmesebb dolgokra fogtok használni, mint például elmentek bulizni, megsétáltatjátok a kutyát, elutaztok nyaralni, vagy esetleg vesztek néhány tucat Python könyvet, és egész hátralev? életetekben már csak Pythonban fogtok kódolni és ki sem mozdultok a barlangotokból.
Gondolkodtam rajta hogy hosszasan regélek a különböz? típusú nyelvek közötti alapvet? szemléletbeli különbségekr?l, a Python helyér?l köztük és hasonló mély és tanulságos dolgokról, de végülis úgy döntöttem, hogy minél emészthet?bb és játékosabb, de nem lebutított stílusban fogom írni ezt a cikket. Néhány sor bekezdés után rögtön elkezdünk kódolni és van egy olyan érzésem hogy akit kicsit is érdekel a téma az rettent?en fogja élvezni.
Hogy miért? Mert a Python az a nyelv, amely valóban képessé tesz arra, hogy a problémára koncentrálj. Úgy tervezték meg, hogy ne a nyelv sajátosságain kelljen rágódnod, hanem amennyire csak lehet magától értet?d? legyen a használata. Gyorsabban fogod megtanulni, mint bármely más eddigi nyelvet amit ismersz és pillanatok alatt képes leszel benne kódot írni. Értékelni fogod a nyelv páratlan egyszer?ségét és tisztaságát.
De várjunk csak, már hallom hogy kérdezed: Ha ez egy ilyen csúcs nyelv, akkor miért nem hallottam róla vagy miért nem tanítják? A legtöbb nyelv, amiket tanítanak mind komoly míúttal rendelkez? ipari szabványok. Ilyen a C, C++, Java, vagy majd pár év míúva a C#. Mindegyik ilyen nyelv mögött neves szabványosító szervezetek és cégek állnak komoly anyagi érdekekekkel. A Python nem egy ilyen nyelv. Éppen ezért az egyetemeken nem (nagyon) tanítják és csak akkor szerzel tudomást róla ha te magad teszel kitér?t az alternatív nyelvek világába. Több hasonló nyelv is van a Python síúycsoportjában, (pl. a Perl, a Tcl vagy a Ruby) de az a tapasztalatom (és sok más ember tapasztalata), hogy a Python a legjobban méretezhet? és legtisztább ezek közül. Tehát ha írsz egy programot és az természetszer?leg egyre hosszabra n?, akkor nem fog "szétesni", hanem átlátható marad, mert a nyelvet jól megtervezték. Persze ez azért rajtad is múlik, de a nyelven a legkevésbé.
Hogy mire tudod használni? Tulajdonképpen szinte akármire. Írhatsz benne szövegszerkeszt?t, játékot, webszervert, kalkulátort vagy szinte amit csak akarsz. Rengetek különböz? kiterjeszés tölthet? le hozzá amelyekkel a legkülönböz?bb feladatokat oldhatod meg könnyedén. Talán egyszer?bb lenne arról írni hogy mire nem használhatod. Nem írhatsz benne például villámgyors 3D-s engine-t. Általános szabályként elmondható, hogy a Python sebességben kicsit gyenge a gyengén típusos mivolta miatt (amir?l kés?bb majd ejtek néhány szót). Összehasonlításként dúrván elmondható, hogy ami C-ben 1 másodperc alatt lefut, az mondjuk Javában 5 másodperc és Pythonban 20. Bár ez jelent?s sebességveszteségnek t?nhet, a gyakorlatban általában nem az. Ez utóbbit alátámasztja jónéhány nagyon sikeres, robosztus Python alkalmazás is, például a Plone, vagy a Mailman.
A nyelv prototipizáláshoz is kiváló. Ez azt jelenti, hogy kezdetben van valalmi elképzelésed egy feladat megoldására vonatkozóan. A fejedben vagy papiron már elkészítettél egy algoritmust és most eljött az id? hogy kipróbáld. Ahelyett hogy bármelyik másik nyelven valósítanád meg és tesztelnéd az algoritmusod, inkább írd meg Pythonban. Pillanatok alatt kész leszel vele és ha hibásnak bizonyul, akkor minimális er?feszítéssel korrigálhatod. Majd ha kész vagy és úgy m?ködik ahogy akartad, akkor átírhatod egy más nyelvre az immáron helyes algoritumst, hogy gyorsabban fusson.
Pár szót illene ejtenem a nyelv történelmér?l is, nem igaz? Rövid leszek, egyrészt mert engem mindig is untatott a történelem másrészt pedig a cikk gyakorlatias jellege miatt. A Pythont Guide Van Rossum hozta létre. Guido egy osztott operációs rendszeren, az Amoeba projecten kezdett el dolgozni 1986-ban az Amszterdami Egyetem berkein belül. Az Amoebának szüksége volt egy szkriptnyelvre. Guidora hárult a feladat és elég nagy szabadságott kapott a munkájában. Korábban ugyanitt már dolgozott az ABC-n, egy nyelven, amelyet úgy terveztek hogy könnyen tanulható és használható legyen a nem-programozók számára is. Az ABC-vel kapcsolatos tapasztalatait felhasználva kifejlesztett egy új nyelvet, amely az ABC minden el?nyös tulajdonságát magában foglalta és a hibáit elhagyta, így született meg a Python. A projecthez rengetegen csatlakoztak. Az Internet elterjedésével felkarolta a Szabad Szoftver Közösség és egyre növ? népszer?ségnek örvend azóta is.
Pár szó a használatáról: Ha Linux közelében vagy, könny? a dolgod, mivel minden valamirevaló disztribúcióban jelen van az értelmez?. Ha pedig Windowst használsz, akkor letöltheted a http://python.org címr?l. Kis példáknál egyszer?en indítsd el az értelmez?t (csak símán írd be hogy "python") és máris egyenként pötyögheted bele a sorokat és a végeredményt rögtön látodhatod. Ha kezdetben kísérletezgetsz vele, mindenképpen próbáld ki.
Ha a programjaidat forrásfájlokban akarod tárolni (ami nagyobb programoknál persze nélkülözhetetlen), akkor nyisd meg a kedvenc szövegszerkeszt?det, hozz benne létre egy fájlt .py kiterjesztéssel, mondjuk filenev.py néven és ha megvagy vele, akkor etesd meg az értelmez?vel a következ?képpen:
python filenev.py
Ennyi bevezet? után már igazán megírhatjuk az els? programunkat. Legyen valami rendhagyó. Mondjuk írjuk ki, hogy "Mizu?":
print 'Mizu?'
Talán néhányotoknak felt?nt hogy nincs pontosvessz? a sor végén, mint ahogy olyan sok nyelvben megszoktad. Ez nem a véletlen m?ve. Valld be, amúgy is csak zavart, nem igaz? Miután kigyönyörködtük magunkat a kimenet esztétikus mivoltában és túl vagyunk a nehéz feladat okozta mentális sokkon, találjunk ki valami komolyabbat. Például irjunk egy mesemondó programot ami megírja helyettünk a bevezetést:
dolgok = ['óceán', 'cápa', 'Bill Gates']
for dolog in dolgok:
print 'Egyszer volt egy ' + dolog + '.'
A nem túl meglep? kimenet pedig a következ?képpen fest:
Egyszer volt egy óceán.
Egyszer volt egy cápa.
Egyszer volt egy Bill Gates.
Ha a példából messzemen? követketetéseket vonnál le a Bill Gates-szel kapcsolatos véleményemr?l, akkor valószín?leg nem jársz túl messze az igazságtól. Kicsit boncolgassuk a programot hogy mindenki pontosan megértse minden apró darabját. Az elején a dolgok egy változó, amelynek rögtön értéket is adunk. Ez az érték az egyenl?ségjel jobb oldalán egy tömb, amely ahogy látod három sztringet tartalmaz. A tömb elemei szögletes zárójelek között szerepelnek és vessz?vel vannak elválasztva egymástól. Minden sztringet aposztrófok határolnak. Ez után egy for ciklussal végigiteráljuk a dolgok elemeit amelyek a cikluson belül egyenként dolog néven jelennek meg. Azt hiszem mostanra már rájöttél, hogy a print paranccsal írhatsz ki sztringeket. A + operátor az egyedi sztringek összef?zésére való. Így már biztos tiszta a kép.
Most nézzünk egy nagyon népszer? szösszenetet amit kis korunkban olyan nagy hévvel csacsogtunk:
ki = ['Az egyik', 'A másik', 'harmadik', 'A negyedik', 'Az icurka-picurka']
mitcsinal = ['elment vadászni', 'megl?tte', 'hazavitte', 'megsütötte', 'mind megette']
for i in range(5):
print ki[i] + ' ' + mitcsinal[i] + '.'
Itt az egyetlen újdonság amit felfedezhetsz, a range függvény. Ez egyike a Python beépített fügvényeinek. Ha egy paramétert adsz át neki, akkor a megadott paraméternek megfelel? nagyságú tömböt hoz létre. Így pl. a range(5) függvényhívás a [0, 1, 2, 3, 4] tömböt adja vissza, amelynek az elemeit a for ciklus végigjárja. A [] operátorral pedig a tömböket indexelhetjük, mint ahogy azt már megszokhattuk máshonnan.
Legutolsó példaként ugorjunk egy nagyot és hozzunk létre valami használhatót: írjuk meg a világ legegyszer?bb szótárprogramját. Nade hogy is m?ködjön? Mondjuk rögtön az elindulása után várjon parancsokra. Két féle parancsot fogadjon el: lekérdezést és feltöltést. A lekérdezés értelemszer?en egy szó visszakeresése a szótárból, a feltöltés pedig egy szó megadása. Kicsit írjuk le pontosabban a m?ködését. Minden feltöltést vezessen be egyenl?ségjel, rögtön utána a megadandó szóval, majd a következ? sorban a jelentésének a beírásával. Egy szó lekérdezése magának a szónak a beírásával legyen elvégezhet? és a szótár teljes szókészletének a kiírását egy kérd?jellel lehessel lekérdezni. Lássuk hogy is néz ki egy ilyen program Pythonban:
szavak = {}
while True:
parancs = raw_input('> ')
if parancs == '?':
for szo in szavak:
print szo + ' -> ' + szavak[szo]
elif parancs[0] == '=':
szo = parancs[1:]
jelentes = raw_input(szo + ' -> ')
szavak[szo] = jelentes
else:
if szavak.has_key(parancs):
print szavak[parancs]
else:
print 'A szo nem talalhato a szotarban.'
Micsoda? Hogy lehagytam a kapcsos zárójeleket? Az az igazság hogy itt nincs olyan. Ha egy új blokkot kezdesz, akkor azt beljebb kell igazítanod, nem pedig kapcsos zárójelekkel határolnod. Bár ez a szintaxis kezdetben talán zavarni fog, csak hozzászoksz majd. A kapcsos zárójelek hiányának kellemes mellékhatása az olvashatóbb kód amelyet id?vel biztos te is értékelni fogsz. Hely hiányában megpróbálom a lehet? legtömörebben és legérthet?bben elmagyarázni a fenti kódot. Egy furcsa értékadással kezd?dik. Ez egy üres asszociatív tömböt hoz létre szavak néven. Gyakorlatilag ez ebben a példában sztringeket képez le sztringekre, tehát például az egyes szavak angol megfelel?jét magyarra. A kés?bbi sorokból könnyen ki tudod olvasni a használatát. Ez után egy végtelen ciklus következik, ami ugyebár itt nem túl elegáns. Azért ne ijedj meg, ilyenkor a Control-D -vel mindig ki tudsz lépni. Ennek a ciklusnak minden egyes ismétl?désében egy-egy parancsot fogadunk. A raw_input függvénnyel bekérünk a felhasználótól egy sztringet. A raw_input argumentuma a bevitelkor megjelenítend? szöveg. Az if-elif-else szerkezet nem meglep? módon a Python feltételes vezérlési szerkezete. Az if ágban ha kérd?jelet kapunk, akkor az összes szót kiirjuk. Az elif ágban az új szó feltöltését kezeljük le. Itt kihámozzuk a szót a parancsból az els? karakter, az egyenl?ségjel lehagyásával. A parancs[1:] kifejezésben a szeletel? operátor használaba kaphatsz betekintést, ami eldobja a sztring els? karakterét. Az else ágban talán a has_key szó lehet homályos néhányotoknak. A szavak.has_key egy metódushívás. Ugyebár a szavak egy asszociatív tömb. Minden asszociatív tömb rendelkezik egy has_key metódussal, amely megmondja, hogy a argumentuma (a keresett szó) eleme -e az asszociatív tömbnek. Ett?l függ?en írjuk ki a keresett szót vagy a hibaüzenetet.
Csak hogy lássuk él?ben is a szótárunkat, itt egy próba a felhasználó által beírt részt kövér bet?típussal kiemelve:
> =apple
apple -> alma
> =honey
honey -> méz
> =sin
sin -> b?n
> ?
honey -> méz
apple -> alma
sin -> b?n
> honey
méz
Ennyi erre a hónapra. A Python legyen veled, meg a jó szerencse és ami még jól esik. Minden cikkel kapcsolatos kritikát vagy bármi mást boldogan fogadok a laci @ monda.hu levélcímemre vagy ha gondolod a honlapomat is megnézheted a http://monda.hu webcímen.