python

127
 Utolsó frissítés: 2006. február 26. Python Software Found ation Email: . A fordításhoz észrevételek: E-mail:

Upload: biro-oszkar

Post on 21-Jul-2015

49 views

Category:

Documents


0 download

TRANSCRIPT

Utols frissts: 2006. februr 26.

Python Software Foundation Email: . A fordtshoz szrevtelek: E-mail:

hgy fe"dvsrqghf u Bg gyhxpwvtsrqpihgf u

SC 9 Sa X W U SRP I % F D C 97 c'ed4A 0P cbP `Y# S 0 VA TQ47 H% C G E4BA@86

5"4321)'&$"! 0 0 ( %#

Ez a fordts Horvth rpd Python tutorial fordtsnak a folytatsa s aktualizlt verzija. A fordts a 2.1-es verzij tutoriallal kezd dtt, ezt a verzit teljes egszben a 2.4.1-es verzihoz igaztottam. o A tutorial fordtst Horvth rpd kezdte el, n az o munkjt folytatom. rpd elrhet sge: ahorvath at szgti.kando.hu o (at helyett @ kell, s egyberni, gy taln kevesebb spam-et kap) A tutorialt jelenleg gondozza: Nyro Balzs (diogenesz at pergamen.hu ha van valamilyen szrevteled a fordtssal kapcsolatban, rd meg!)

A Nem kell megijedni, nem nehz LTEX-ben lv szveget rni, egyszer szvegszerkeszto (notepad, emacs, joe, o u A vim. . . ) kell hozz, s segtek ha kell. Tl sok ismeret nem szksges a L TEX-b l. o

Hogy knnyebben ellen rizhet legyen, a fordtsnl rdemes benne hagyni a forrsban az angol szveget mego o jegyzsbe tve % a sor elejn, plda itt:% % % % Finally, the least frequently used option is to specify that a function can be called with an arbitrary number of arguments. These arguments will be wrapped up in a tuple. Before the variable number of arguments, zero or more normal arguments may occur.

ez mr nincs megjegyzsbe tve

A A LTEX-ben res sor jelli, hogy j bekezds jn. A A LTEX-ben tallkozhatsz utastsokkal s krnyezetekkel. Azokat hagyd ugyangy. Az albbi pldban a code egy utasts, a print az argumentuma. (A kapcsos zrjel ktelez o, a szgletes opcionlis argumentumot jell.) Az item is egy utasts. Az itemize egy krnyezet (rendezetlen (sorszmozatlan) listt kszthetsz vele).

gfquedvi#EyEEewEy0Ewv2t yx u rrr 3 8f 36B Ucb%) 6B 8 'S Q PH 3 'B 9 86 1 ' $ " CCsqpgihCgGSYeIdYa`DY4XWPV0U7T&RDIG6FEBDC0A@275"4320)(&%#!

A \code{print} utastssal ... \begin{itemize} \item a magasszint adattpusok lehetv teszik szmodra egyetlen utastsban u o egy sszetett mvelet kifejtst; u \item az utastsok csoportostsa a sorok elejnek behzsval trtnik a kezd s vgzrjelek helyett; o \item nem szksges a vltozk s argumentumok deklarlsa. \end{itemize}

A kritikus rszeket tripla krd jellel (???) jelljk meg. Itt azokra a helyekre gondolok, amit msnak rdemes o tnznie, hogy j-e gy, ami rthetosg, pontossg, magyar nyelv szempontjbl valszn leg javtand. u A Python dokumentciksztsrol a oldalon b vebb lerst tallhatsz. Fent van egy o link: Documentation Download Current Documentation (kzptjt) Documenting Python (lent). (url: ) A Python dokumentci egyben is letltheto ugyanitt html, pdf formtumban.A Ha Linuxod van, s van fent LTEX (tetex-* csomagok), s latex2html (latex2html csomag), akkor megprblhatod lefordtani a forrst html-l.

Tapasztalatok: a fordtst a teljes Python forrssal egytt rdemes letlteni, ekkor m kdtt nekem rendesen a u beptett html s pdf generlsi funkci. A Python dokumentci el ore elksztett genertorral rendelkezik, ami a A LTEX fjl alapjn a html-t s a pdf-et automatikusan generlja.

Gondban vagyok a string literal szval. A prompt szra sem tudtam j magyar megfelelot, hagytam az eredetit. A backslash jellst a LaTeX knyv tletes rep-jel megnevezsvel fordtottam el oszr. jabb tancs alapjn kicserltem az elterjedtebb vissza-per jel megnevezsre. A tuple szra eddig a vektor szt hasznltuk hossztvon az eredeti tuple kifejezst fogjuk visszalltani. Vrom a javaslatokat. Szvesen veszek minden tletet, ami a magyarosabb-ttelt segti.

8 P P $ B '"X b 9HA 8b b" " 9 P% ( eiBD&Bg U 7d7 " U D0BDCCB &B4$dd gg g0A@(g 6

Bg fgyhxhwu uxpxy

dpxy "pigf pigf "g f"gyhxpwu rrqpigf uxpxy

Copyright 2001-2004 Python Software Foundation. All rights reserved. Copyright 2000 BeOpen.com. All rights reserved. Copyright 1995-2000 Corporation for National Research Initiatives. All rights reserved. Copyright 1991-1995 Stichting Mathematisch Centrum. All rights reserved. See the end of this document for complete license and permissions information.

qvu q

angol argument built-in function control ow statements string-literal backslash prompt tuple method sequence object exceptions raise an exception clause handler (az exeption-knl) token default scope keyword argument right-hand side expression sequence unpacking shortcut operators slice notation List Comprehensions Library reference

magyar argumentum (?paramter) beptett/bels /alap fggvny o vezrl utastsok o ??? vissza-per jel (rep-jel) prompt??? tuple eljrs >> def function(a): ... pass ... >>> function(0, a=0) Traceback (most recent call last): File "", line 1, in ? TypeError: function() got multiple values for keyword argument a

Ha van egy **nv alak formlis paramter utolsknt, akkor egy ilyen nev sztrban troldik az sszes kulcsu szavas argumentum, amelynek a kulcsszava nem illeszkedik egyetlen formlis paramterre sem. Ez egytt hasz nlhat egy *nv alak formlis paramterrel (ez a kvetkezo alszakaszban lesz lerva) amely belerakja az sszes olyan nem-kulcsszavas argumentumot, amely nincs benne a formlis paramterlistban, egy tuplba. (A *nv-nek mindg a **nv el tt kell lennie.) Pldul, ha egy ilyen fggvnyt denilunk: odef sajtuzlet(sajtfajta, *argumentumok, **kulcsszavak): print "-- Van nknl nhny", sajtfajta, ? print "-- Sajnlom, teljesen kifogytunk a", sajtfajta+bl for arg in argumentumok: print arg print -*40 for kw in kulcsszavak.keys(): print kw, :, kulcsszavak[kw]

Ez meghvhat gy is:

d"Fdwv qw 0 1 xyx

& %# $" !

sajtuzlet(Plpusztai, "Ez nagyon bds, uram.", "Ez nagyon, NAGYON bds, uram.", vevo=Sajti Jnos, boltos=Plinks Mihly, helyszin=Sajtbolt)

s termszetesen ezt fogja kirni:-- Van nknl nhny Plpusztai ? -- Sajnlom, teljesen kifogytunk a Plpusztaibl Ez nagyon bds, uram. Ez nagyon, NAGYON bds, uram. ---------------------------------------vevo : Sajti Jnos boltos : Plinks Mihly helyszin : Sajtbolt

Megjegyzend , hogy a kulcsszavak nev sztr tartalmnak kinyomtatsa elott hvtuk meg a kulcsszo u argumentum neveinek listjhoz tartoz sort() eljrst; ha nem ezt tesszk, akkor az argumentumok listzsi sorrendje hatrozatlan.

Vgl itt a legritkbban hasznlt lehetosg, amikor egy fggvnynek tetszoleges szm argumentuma lehet. Eze ket az argumentumokat egy tuplba helyezi el a Python. A vltoz szmossg argumentum el ott akrhny (akr egy sem) egyszer argumentum is elofordulhat. udef fprintf(file, format, *args): file.write(format % args)

Ennek fordtottja trtnik, ha listba vagy tuplba becsomagolt argumentumokat ki kellene csomagolni olyan fggvny meghvshoz, amely elklntett, helyhez-kttt vltozkat vr. Pldul a beptett range() fggvny egymstl elklntve vrja a start s stop rtkeket. Ha ezek nem egymstl elvlasztva llnak rendelkezsre, akkor a fggvnyhvsban a * m veletjelet tegyk az sszetett-tpus vltoz neve el, ez kicsomagolja a listbl u vagy tuplb l az adatokat. o>>> [3, >>> >>> [3, range(3, 6) 4, 5] args = [3, 6] range(*args) 4, 5] # normlis fggvnyhvs, klnll paramterekkel

# listbl kicsomagolt paramterekkel trtn fggvnyhvs o

Tbbek kvnsgra nhny olyan vons kerlt a Pythonba, amelyek a funkcionlis programozsi nyelvekben s a Lisp-ben is megtallhatak. A lambda kulcsszval rvid nvtelen fggvnyeket lehet ltrehozni. me egy fggvny, amely a kt argumentumnak sszegvel tr vissza: lambda a, b: a+b. A lambda formkat

& %# $ " !

)1

xyx u d"Fdwv qudgyEey1y f

qu 1q x ) ) 1 gFdv xyx

u xvi g! qx

mindenhol hasznlhatjuk, ahol fggvny objektumok szerepelhetnek. Szintaktikailag egyetlen kifejezs szerepelhet bennk. ltalnossgban tekintve hab a normlis fggvnyek tortjn. Begyazott fggvnydenciknt ltja az ot meghv krnyezet minden vltozjt.>>> ... ... >>> >>> 42 >>> 43 def make_incrementor(n): return lambda x: x + n f = make_incrementor(42) # make_incrementor magyarul kb.: csinlj nvel-t o f(0) f(1)

A dokumentcis szvegek tartalmval s formjval kapcsolatban egy kialakult s bevlt szoksrl beszlhetnk. Az els sor mindig az objektum cljnak rvid, tmr sszegzse. Rvidsge miatt nem kell tartalmaznia az o objektum nevt vagy tpust, hiszen ezek az adatok ms ton is kinyerhet ok (kivve, ha az objektum neve a fggvny m kdst ler ige). A szveg nagybet vel kezd odik s ponttal vgz dik. u u o Ha a dokumentcis szveg (docstring) tbb sorbl ll, a msodik sor res lesz ezzel vizulisan elklntjk a fejrszt/sszegzst a lers tovbbi rsztol. Az res sort egy vagy tbb rsz kvetheti, ahol lerjuk az objektum hvsnak mdjt, a mellkhatsokat stb. Maga a Python rtelmez nem szedi le a helykzket a tbbsoros begetett szveb ol ha ezek kisz rse szko u sges, akkor ehhez kln szvegfeldolgoz progit kellene hasznlni. Ezt a problmt a kvetkez o konvenci hasznlatval kezeljk. Az els sor utn a legels nem res sorban megjelen szveg behzsi tvolsga hato o o rozza meg az egsz dokumentcis szveg behzst. (A legels o sort azrt nem hassznljuk erre a clra, mert a szveg els bet je ltalban szorosan kveti a karakterlncot nyit macskakrmt, ennek eltolsa nem lenne o u nyilvnval dolog.) A docstring fejrszt kveto minden els sornak elejr l levgunk pont ennyi helykzt. o o Ha ennl kevesebb helykzt tartalmaz valamely sor br ilyennek nem kne lennie csak a helykzk trl odnek, sgt ajnlott mindig a tabultorokat kibontva ellenorizni (ltalban 1 karakter nem vsz el. A behzsok egyenlo tabultort 8 helykzzel helyettestnk). Itt van egy plda a tbbsoros docstring-re:>>> def fuggvenyem(): ... """Nem csinl semmit, de ez dokumentlva van. ... ... Valban nem csinl semmit. ... """ ... pass ... >>> print fuggvenyem.__doc__ Nem csinl semmit, de ez dokumentlva van. Valban nem csinl semmit.

2

yEqy @q ) u Fd d yx

& %# $" !

5. fejezet

AdatstruktrkEz a fejezet az eddig tanultakbl pr dolgot rszletesebben is ler, s pr j dolgot is megmutat.

A lista adattpusnak a mr megismerteken kvl tbb eljrsa (method) is van. Az sszes eljrs ismertetse: append(x) Egy elemet hozzad a lista vghez; megegyezik az a[len(a):] = [x] utastssal. =

extend(L) A lista vghez hozzf zi az L listt (mindegyik elemt egyenknt); ugyanaz, mint az a[len(a):] u L.

insert(i, x) Beszr egy elemet az adott helyre. Az elso argumentum az elem indexe, amely el beszrjuk, gy a.insert(0, x) a lista elejre szr be, s az a.insert(len(a), x) ugyanazt jelenti mint az a.append(x). remove(x) Eltvoltja a legels olyan elemet a listbl, amelynek rtke x. Hiba, ha nincs ilyen. o pop([i ]) Eltvoltja az adott helyen lv elemet a listbl, s visszaadja az rtkt. Ha nem adtunk meg indexet, o akkor az a.pop() az utols elemmel tr vissza. (Ekkor is eltvoltja az elemet.) (A fggvny-argumentum megadsnl hasznlt szgletes zrjel azt jelenti, hogy a paramter megadsa tetsz oleges, s nem azt, hogy a [] jeleket be kell gpelni az adott helyen. Ezzel a jellssel gyakran tallkozhatsz a Python Standard Library-ban (Szabvnyos Python knyvtrban)) index(x) Visszatr az els olyan elem indexvel, aminek az rtke x. Hiba, ha nincs ilyen. o count(x) Visszaadja x el fordulsnak a szmt a listban. o sort() Rendezi a lista elemeit. A rendezett lista az eredeti listba kerl. reverse() Megfordtja az elemek sorrendjt a listban - szintn az eredeti lista mdosul. Egy plda, amely tartalmazza a legtbb eljrst:

P 'b " P% RR (EhdgGSE3W9 P8 V % (I) 2(% 3 H g d rr

>>> a = [66.25, 333, 333, 1, 1234.5] >>> print a.count(333), a.count(66.25), a.count(x) 2 1 0 >>> a.insert(2, -1) >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a [333, 1234.5, 1, 333, -1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5]

A lista eljrsai megknnytik a lista veremknt (stack) trtno hasznlatt ahol az utols lerakott elemet vesszk ki el szr (utoljra be, el szr ki, LIFO). Ahhoz, hogy a verem tetejre egy elemet adjunk, hasznljuk az o o append() utastst. A lista legels /legfels elemnek kivtelhez hasznljuk a pop() utastst mindenfle index nlkl. Pldul: o o>>> >>> >>> >>> [3, >>> 7 >>> [3, >>> 6 >>> 5 >>> [3, stack = [3, 4, 5] stack.append(6) stack.append(7) stack 4, 5, 6, 7] stack.pop() stack 4, 5, 6] stack.pop() stack.pop() stack 4]

A listt hasznlhatjuk gy is mint egy sort, ahol az elso hozzadott elemet vesszk ki eloszr (rst-in, rst-out, FIFO). Ahhoz, hogy elemet hozzadjunk a sor vghez, hasznljuk az append() utastst. A sor els o elemt visszakaphatjuk a pop() utastssal, ha az argumentuma 0. Pldul:

& %# $ " !

# 2

yy d d C2q v 5 1u 2qd#u ) f

Fw xyEvqy w 1u q f )

>>> sor = ["Maca", "Jnos", "Mihly"] >>> sor.append("Teri") # Teri megrkezett >>> sor.append("Gergely") # Gergely megrkezett >>> sor.pop(0) Maca >>> sor.pop(0) Jnos >>> sor [Mihly, Teri, Gergely]

Hrom olyan beptett fggvnynk van, amelyek nagyon hasznosak a listknl ezek a filter(), map(), s a reduce(). A filter(fggvny, sorozat) egy lehetosg szerint azonos tpus sorozattal tr vissza, mely a sorozatnak azokat az elemeit tartalmazza, amelyekre fggvny(elem) igaz. Pldul a kvetkez o mdon sz rhetjk ki a 3-mal u s 2-vel nem oszthat szmokat:>>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]

A map(fggvny, sorozat) kiszmolja a fggvny(elem) rtket a sorozat minden elemre s az eredmnyek listjval tr vissza. Pldul gy szmolhatjuk ki az elso nhny kbszmot:>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Egynl tbb sorozatot is feldolgozhatunk; a fggvnynek ekkor annyi argumentumnak kell lennie, ahny sorozat van. Ekkor a fggvnyt az egymshoz tartoz rtkprokkal hvja meg a Python (vagy None-t ad, ha valamelyik sorozat rvidebb a msiknl). Ha a fggvny helyre None-t runk, akkor a fggvny a sajt argumentumait adja vissza.>>> >>> ... >>> [0, seq = range(8) def add(x, y): return x+y map(add, seq, seq) 2, 4, 6, 8, 10, 12, 14]

A kt esetet sszevetve lthatjuk, hogy a map(None, lista1, lista2) elegns mdja annak, hogy kt listt prok listjv alaktsunk. Pldul:>>> sor = range(8) >>> def negyzet(x): return x*x ... >>> map(None, seq, map(negyzet, seq)) [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]

A reduce(fggv, sorozat) egyetlen rtkkel tr vissza, melyet gy kapunk, hogy a binris, ktvltozs fggv

dfw0uqxqvd ) 1 u ) 2 v

& %# $" !

fggvnyt meghvjuk a sorozat elso kt elemvel, majd az eredmnnyel s a kvetkezo elemmel, s gy tovbb. Pldul az 1-t l 10-ig terjed egsz szmokat gy adhatjuk ssze: o o>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55

Ha csak egy rtk van a sorozatban, akkor azt az rtket kapjuk; ha a sorozat res, kivteldobs trtnik. A harmadik argumentum hasznlatval megadhatjuk a kezd ortket. Ekkor gy m kdik, mintha a sorozat legeu lejn ez az rtk llna. Ekkor teht egy res sorozat a kezdeti rtket adja vissza. Pldul:>>> def sum(seq): ... def add(x,y): return x+y ... return reduce(add, seq, 0) ... >>> sum(range(1, 11)) 55 >>> sum([]) 0

Ne hasznld a pldban denilt sum() fggvnyt: mivel szmok sszegzsre gyakran van igny, a beptett sum(sequence) fggvnyt hasznljuk erre, amely pontosan ugyangy m kdik, mint a fenti pldban denilt u fggvny. New in version 2.3.

Ha megrtjk, hogyan m kdnek a listk, akkor rvid s tlthat programokat kszthetnk listafeldolgozsra a u map(), filter() vagy lambda fggvnyek hasznlata s az ezt kveto jrarendezs nlkl is. Az eredmnyknt kapott listadenci gyakran vilgosabb, mintha a beptett eljrsokkal kaptuk volna. Minden magas fok listakezels gy pl fel: a kifejezst egy for g kveti, ezt pedig nulla vagy tbb for vagy if g. Az eredmny egy olyan lista, amely a for s if gak alapjn a kifejezs kirtkelsvel keletkezik. Ha a kifejezs tuple tpust eredmnyez, akkor zrjelbe kell tenni a kifejezst.

& %# $ " !

5 1u 2qdf C ) @qFq x u ) 1

>>> freshfruit = [ banana, loganberry , passion fruit ] >>> [weapon.strip() for weapon in freshfruit] [banana, loganberry, passion fruit] >>> vec = [2, 4, 6] >>> [3*x for x in vec] [6, 12, 18] >>> [3*x for x in vec if x > 3] [12, 18] >>> [3*x for x in vec if x < 2] [] >>> [{x: x**2} for x in vec] [{2: 4}, {4: 16}, {6: 36}] >>> [[x,x**2] for x in vec] [[2, 4], [4, 16], [6, 36]] >>> [x, x**2 for x in vec] # hiba - a tuple tpus zrjelet kvn File "", line 1 [x, x**2 for x in vec] ^ SyntaxError: invalid syntax >>> [(x, x**2) for x in vec] [(2, 4), (4, 16), (6, 36)] >>> vec1 = [2, 4, 6] >>> vec2 = [4, 3, -9] >>> [x*y for x in vec1 for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>> [x+y for x in vec1 for y in vec2] [6, 5, -7, 8, 7, -5, 10, 9, -3]

A magasfok listakezels a map() eljrsnl sokkal rugalmasabb, s egynl tbb argumentummal rendelkez o fggvnyekre, valamint begyazott (nested) fggvnyekre is alkalmazhat:>>> [str(round(355/113.0, i)) for i in range(1,6)] [3.1, 3.14, 3.142, 3.1416, 3.14159]

del

Egy listaelem eltvoltsnak egyik mdja, hogy az elem rtke helyett az indext adjuk meg: ez a del utasts. Ez arra is hasznlhat, hogy szeleteket trljnk a listbl (amit mr megtettnk ezel ott gy, hogy a szeletnek az res lista rtkt adtuk). Pldul:>>> >>> >>> [1, >>> >>> [1, a = [-1, 1, 66.25, 333, 333, 1234.5] del a[0] a 66.25, 333, 333, 1234.5] del a[2:4] a 66.25, 1234.5]

A del utastst arra is hasznlhatjuk, hogy az egsz vltozt trljk:>>> del a

A tovbbiakban hibt generl, ha az a nvre hivatkozunk (kivve, ha j rtket adunk neki). Ms alkalmazsval

9 9 3 g5S431 75"ac

& %# $" !

r d r

is tallkozunk ks bb a del utastsnak. o

Lttuk, hogy a listknak s a karakterlncoknak rengeteg kzs tulajdonsga van, pldul az indexels s a szeletek hasznlata. Ez kt Mindkett plda a sorozat../lib/typesseq.html-adattpusra. Mivel a Python egy folyamatos o fejl dsben lv nyelv, msfajta sorozat adattpusok is hozzadhatak. Egy msik beptett sorozat-adattpusa a o o tuple1 . A tuple objektumokat tartalmaz vesszokkel elvlasztva, pldul:>>> t = 12345, 54321, hello! >>> t[0] 12345 >>> t (12345, 54321, hello!) >>> # A tuplkat egymsba gyazhatjuk: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, hello!), (1, 2, 3, 4, 5))

Az objektumok klnbz tpusak is lehetnek. A tuple nem megvltoztathat adattpus, viszont lehetnek mego vltoztathat elemei. Plda:

Ahogy lthat, a kimeneten a tuplk mindig zrjelezve vannak, gy azok egymsba gyazva is helyesen rtelmezhet k; megadhatjuk zrjelekkel s anlkl is, nha azonban felttlenl szksgesek a zrjelek (amikor az o egy nagyobb kifejezs rsze). A tuple tpust sokfle dologra felhasznlhatod. Pldul: (x, y) koordintapr trolsa, dolgozk rekordjai egy adatbzisban. . . A tuplk a karakterlncokhoz hasonlan megvltoztathatatlanok: nem adhatunk rtket egyetlen elemnek (tovbbi hasonlsgok vannak a szeletelssel s az sszef zssel kapcsolatban is). Ltrehozhat olyan u tuple, amely megvltoztathat elemeket pldul tmbket tartalmaz. Egy klns problma nulla vagy egy elemet tartalmaz tuple ltrehozsa: a nyelv szintaxisa lehet ov teszi ezt. Az res zrojellel hozhat ltre a nulla elem ; az egy elem pedig az rtk utn tett vessz ovel (nem elg, ha az u u rtket zrjelbe tesszk). Csnya, de hatkony. Pldul:1A

& %# $ " !

b "A ' 9H b P ( 3% egE%(0%9 DVeiH2 c r d r>>> megtanulni = [matek, angol] # Ez egy megvltoztathat lista, [] jells! >>> orarendem = (tesi, nyelvtan, megtanulni) # ket string elem, es egy lista a tuplban >>> orarendem[0] = rajz # az els rt t akarom rni, nem lehet o Traceback (most recent call last): File "", line 1, in ? TypeError: object doesnt support item assignmentlista s a tuple hasonl a PHP tmb tpushoz a lista egy rhat tmb, a tuple egy csak olvashat tmbnek felel meg els kzeltsre. o

>>> orarendem[2][0]=versek # viszont a tuple lista elemn bell -- ami megvltoztathat t

3

>>> ures = () >>> egyszeres = hello, >>> len(ures) 0 >>> len(egyszeres) 1 >>> egyszeres (hello,)

# >> x, y, z = t

This is called, appropriately enough, sequence unpacking. Sequence unpacking requires that the list of variables on the left have the same number of elements as the length of the sequence. Note that multiple assignment is really just a combination of tuple packing and sequence unpacking! Ezt hvjk, elg helyesen, sorozat sztbontsnak. A sorozat sztbontshoz az szksges, hogy a bal oldalon annyi elem szerepeljen, ahny elem van a tuplban. Jegyezzk meg, hogy a tbbszrs rtkads csak egy vltozata a tuple lehetsges feltltsnek! Van egy kis asszimetria itt: a klnbzo objektumokkal val feltlts mindig tuplt eredmnyez, ugyanakkor a sztbonts minden sorozatra m kdik. u

A Python a set adattpust (sets) is alaptpusknt denilja. a set: elemek rendezetlen halmaza, amelyben minden elem csak egyszer fordulhat el . Alapvet hasznlata: megadott elem megltnek ellenorzse, elemek kett zso o o nek kisz rse. A set objektumok tmogatjk az olyan matematikai m veleteket, mint az egyests (union), kzs u u metszet (intersection), klnbsg (difference), s a szimmetrikus eltrs (symmetric difference). me egy rvid bemutat:2 Ha

a vltoz mr tartalmazott objektumokat, az sszes eleme trlodik, s az j feltltsnl megadott elemeket tartalmazza csak

qpFd Q (C7" U g2 3B b%A P"

& %# $" !

r d r

>>> kosar = [alma, narancs, alma, korte, narancs, banan] >>> gyumolcsok = set(kosar) # set ltrehozsa egyedi elemekkel >>> gyumolcsok set([narancs, korte, alma, banan]) >>> narancs in gyumolcsok # gyors ellenrzs: benne van-e o True >>> kakukkfu in gyumolcsok False >>> # Plda: set mveletek kt sz egyedi betin u u ... >>> a = set(abracadabra) >>> b = set(alacazam) >>> a # a-nak egyedi elemei set([a, r, b, c, d]) >>> a - b # a-ban megvan, b-bl hinyzik o set([r, d, b]) >>> a | b # vagy a-ban, vagy b-ben megvan set([a, c, r, d, b, m, z, l]) >>> a & b # a-ban s b-ben is megvan set([a, c]) >>> a ^ b # vagy a-ban, vagy b-ben megvan, de # egyszerre mindkettben nem o set([r, d, b, m, z, l])

Egy msik hasznos adattpus a Pythonban a sztr. A sztrakat ms nyelvekben asszociatv tmbknek nevezik. Szemben a sorozatokkal amelyek szmokkal vannak indexelve a tmbket kulcsokkal indexeljk, amely mindenfle megvltoztathatatlan tpus lehet; karakterlncok s szmok mindig lehetnek kulcsok. Tuplk is hasznlhatk kulcsnak, ha csak szmokat, karakterlncokat vagy tuplkat tartalmaznak; ha egy tuple megvltoztathat objektumot tartalmaz kzvetlenl vagy kzvetve, akkor nem lehet kulcs. Listt nem lehet kulcsknt hasznlni, mert annak rtkei az append(), extend() eljrsokkal, valamint a szeletel vagy indexelt rtkadsokkal (helyben) mdosthatk. o Gondoljunk gy a sztrra, mint kulcs: rtk prok rendezetlen halmazra, azzal a megktssel, hogy a sztrban a kulcsoknak egyedieknek kell lennik. Egy kapcsos zrjelprral egy res sztrat hozhatunk ltre: {}. Ha a zrjelbe vessz kkel elvlasztott kulcs:rtk prokbl ll listt helyeznk, akkor ez belekerl a sztrba; egy o sztr tartalma is ilyen mdon jelenik meg a kimeneten. A legfontosabb m veletek egy sztron: eltrolni egy rtket egy kulccsal egytt, visszakapni egy rtket megadva u a kulcst. Lehet trlni is egy kulcs:rtk prt a del-lel. Ha olyan kulccsal trolsz egy j rtket, amilyen kulcsot mr hasznltl, a kulcs az j rtkre fog vonatkozni, a rgi rtk elveszik. Hiba, ha egy nemltez o kulcsra hivatkozol. A sztr objektum keys() eljrsa a kulcsok listjt adja vissza vletlenszer sorrendben (ha rendezni akarod, u hasznld a sort() eljrst a kulcsok listjra). Ha ellenorizni szeretnd, vajon egy kulcs benne van-e a sztrban, hasznld a sztrak has_key() eljrst. me egy kis plda a sztr hasznlatra:

& %# $ " !

b ' 3hA r r g0"g5S7Cd dd

>>> tel = {Jnos: 4098, Simon: 4139} >>> tel[Gza] = 4127 >>> tel {Simon: 4139, Gza: 4127, Jnos: 4098} >>> tel[Jnos] 4098 >>> del tel[Simon] >>> tel[Pisti] = 4127 >>> tel {Gza: 4127, Pisti: 4127, Jnos: 4098} >>> tel.keys() [Gza, Pisti, Jnos] >>> tel.has_key(Gza) True

A dict() konstruktor kzvetlenl tuplkban trolt kulcs-rtk prok listjbl is ltre tudja hozni a sztrat. Ha a prok valamilyen mintt kvetnek, akkor lista-m veletekkel rvidebb mdon is megadhatjuk a kulcs-rtk listt. u>>> dict([(sape, 4139), (guido, 4127), (jack, 4098)]) {sape: 4139, jack: 4098, guido: 4127} >>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension {2: 4, 4: 16, 6: 36}

Later in the tutorial, we will learn about Generator Expressions which are even better suited for the task of supplying key-values pairs to the dict() constructor. Az oktat egy ks bbi rszben tanulni fogunk a Genertor kifejezsekrol (Generator Expressions), melyek mg o alkalmasabbak a kulcs-rtk prok beillesztsre, mint a dict() konstruktor.

Ha vgig szeretnnk menni egy sztr elemein, akkor az iteritems() eljssal lpsenknt egyid oben megkapjuk a kulcsot, s a hozz tartoz rtket.>>> lovagok = {Gallahad: a tiszta, Robin: a btor} >>> for k, v in lovagok.iteritems(): ... print k, v ... Gallahad a tiszta Robin a btor

Ha sorozaton megynk vgig, akkor az pozcit jelzo index rtkt s a hozz tartoz rtket egyszerre kaphatjuk meg az enumerate() eljrssal. Plda:3>>> for i, v in enumerate([tic, tac, toe]): ... print i, v ... 0 tic 1 tac 2 toe

3A

tic-tac-toe az am ba jtk angol nyelvterleten elterjedt neve. o

b 86 f 9 P 7S b 2I DB E32c d 8b

& %# $" !

rr ad

Kt vagy tbb sorozat egyszerre trtno feldolgozshoz a sorozatokat a zip() fggvnnyel kell prba lltani.>>> kerdesek = [neved, csoda, amit keresel, kedvenc szined] >>> answers = [Lancelot, A szent Gral, Kek] >>> for q, a in zip(kerdesek, valaszok): ... print Mi a %s? %s. % (q, a) ... Mi a neved? It is lancelot. Lancelot. Mi a csoda, amit keresel? A szent Gral. Mi a kedvenc szined? Kek.

Egy sorozaton visszafel haladshoz eloszr add meg a sorozatot, majd utna hvd meg a reversed() fggvnyt.>>> for i in reversed(xrange(1,10,2)): ... print i ... 9 7 5 3 1

Rendezett sorrendben val listzshoz hasznld a sorted() fggvnyt, amely j, rendezett listt ad vissza, vltozatlanul hagyva a rgi listt.>>> kosar = [alma, narancs, alma, korte, narancs, banan] >>> for f in sorted(set(basket)): ... print f ... alma banan korte narancs

A while s az if utastsokban eddig hasznlt felttelek egyb m veleteket is tartalmazhatnak az sszehasonlu ts mellett. Az in s not in relcik ellen rzik, hogy az rtk el fordul-e egy sorozatban. Az is s is not relcik o o sszehasonltjk, hogy kt dolog valban azonos-e; ez csak olyan vltozkony dolgoknl fontos, amilyenek pldul a listk. Minden sszehasonlt relcinak azonos precedencija van, mely magasabb mint a szmokkal vgzett m veletek. u Relcikat lncolhatunk is, pldul: az a < b == c megvizsglja, hogy az a kisebb-e mint b, s ezen fell b egyenl -e c-vel. o A relcikat sszef zhetjk and s or logikai m veletekkel is, s a relci erdmnyt (vagy brmely logikai u u m velett) ellentettjre vltoztathatjuk a not m velettel. Ezeknek mindnek kisebb precedencijuk van, mint a u u relciknak, s kzlk a not rendelkezik a legmagasabbal s az or a legkisebbel. Teht az A and not B or C ugyanazt jelenti, mint az (A and (not B)) or C. Termszetesen a zrjeleket hasznlhatjuk a kvnt felttel elrshez. Az and s or logikai m veletek gynevezett shortcat (lusta/rvid kirtkels ) m veletek: Az argumentumaik u u u balrl jobbra fejt dnek ki, s a kifejts rgtn megll, mihelyt a vgeredmny egyrtelm . Pldul: ha A s C o u

& %# $ " !

P 'b P 3 P $ " P% RR ( dDB DB FH 43D&BV % (I) 2(% 3 H d d rr

mindkett igaz de B hamis, akkor a A s B s C kifejezs sorn a C rtkt a Python mr nem vizsglja. o ltalban a shortcut m veletek visszatrsi rtke ha ltalnos rtkeket s nem logikai rtket hasznlunk az u utolsnak kifejtett argumantummal egyezik. Lehetsges, hogy egy relci vagy ms logikai kifejezs rtkt egy vltozba rakjuk. Pldul:>>> string1, string2, string3 = , Trondheim, Hammer Dance >>> non_null = string1 or string2 or string3 >>> non_null Trondheim

Jegyezzk meg, hogy a Pythonban szemben a C-vel nem lehet rtkads egy kifejezs belsejben. Lehet, hogy a C programozk morognak emiatt, de gy kikerlheto egy gyakori problma, amelyet a C programokban gyakran elkvetnek: = jelet rnak ott, ahol == kellene.

Sorozat objektumokat sszehasonlthatunk msik azonos tpus objektummal. Az sszehasonlts a lexikograkai rendezst hasznlja: el szr az els elemeket hasonltja ssze, ha ezek klnbznek, ez meghatrozza az o o sszehasonlts eredmnyt; ha egyenloek, akkor a msodik elemeket hasonltja ssze, s gy tovbb, amg az egyik sorozatnak vge nem lesz. Ha a kt sszehasonltand elem azonos tpus sorozat, akkor az sszehasonts rekurzvan trtnik. Ha a kt sorozat minden eleme azonos, akkor tekinthet oek a sorozatok egyenl eknek. Ha o sz egyik sorozat a msiknak kezdo rsz-sorozata, akkor a rvidebb sorozat a kisebb. A karakterlncok lexikograkai elemzsre az egyes karakterek ASCII rendezst alkalmazzuk. Nhny plda azonos tpus sorozatok sszehasonltsra:(1, 2, 3) < (1, 2, 4) [1, 2, 3] < [1, 2, 4] ABC < C < Pascal < Python (1, 2, 3, 4) < (1, 2, 4) (1, 2) < (1, 2, -1) (1, 2, 3) == (1.0, 2.0, 3.0) (1, 2, (aa, ab)) < (1, 2, (abc, a), 4)

Jegyezzk meg, hogy klnbzo tpus objektumok sszehasonltsa is szablyos. A kimenet jl meghatrozott, de nknyes: a tpusok a tpusneveik szerint rendezodnek. gy egy lista mindig kisebb, mint egy karakterlnc, egy karakterlnc mindig kisebb, mint egy tuple, stb. 4 Vegyes szmtpusok a szmrtkeik szerint rendezodnek, gy pldul 0 egyenl 0.0-val. o

G"g5S431 2(0%g2 C0A9 (% (0%2I G13 7S DH (% dggE%(d a d 9 P6 9" B 9 b 9c 9 U 9 b 3"A '% r r4A

klnbz tpus objektumok sszehasonltsi szablyai nem megbzhatak a Python ks bbi verziiban vltozhatnak. o o

& %# $" !

3

6. fejezet

Modulok (2.4 doc) o Ha a Pythont interaktv mdban hasznlod, s kilpsz az rtelmez ob l, majd jra visszalpsz, minden fggvnyde nci s denilt vltoz elvsz. Emiatt ha nagyobb programot akarsz rni, jobban jrsz ha valamilyen szerkeszt o programot hasznlsz az rtelmezo szmra el kszteni a bemeneti adatokat, s az rtelmezot gy futtatod, hogy a o bemenet a szvegfjlod legyen. Ezt a folyamatot script rsnak nevezik. Ahogy a programod egyre hosszabb lesz, el obb-utbb rszekre (fjlokra) akarod majd bontani, a knnyebb kezelhetosg vgett. Valszn leg lesznek praktikus fggvnyeid, amit mr u megrt programjaidbl szeretnl hasznlni a fggvnydencik msolsa nlkl. Ennek a tmogatsra a Python el tudja helyezni a fggvnydencikat egy adott fjlba, amik aztn elrhet ok lesznek egy szkriptb l, vagy az interaktv rtelmez b l. Ezeket a fjlokat moduloknak hvjuk. A modulban haszo o o nlt dencik importlhatk ms modulokba (pldul a modulok hierarchijban legfell lv o main modulba is). (A kvetkez pldkhoz: a felhasznlt vltozk mind a legfelso nvtrben helyezkednek el, a modulok fggvo nyeit itt futtatjuk, interaktv mdban.) A modul egy olyan szveges le, ami Python dencikat s utastsokat tartalmaz. A le neve egyben a modul neve is (a kiterjesztst nem belertve). A programbl az aktulis modul neve a __name__ globlis vltozbl elrhet (karakterlncknt). o

Krlek egy neked megfelel szvegszerkeszt vel hozd ltre a o o# Fibonacci szamok modul

def fib(n): # kiirja a Fibonacci sorozatot n-ig a, b = 0, 1 while b < n: print b, a, b = b, a+b def fib2(n): # visszater a Fibonacci sorozattal, n-ertekig result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result

Most lpj be a Python rtelmez be, s importld a fenti modult a kvetkezo paranccsal: o>>> import fibo

Ez a parancs a fibo-ban denilt fggvnyneveket kzvetlenl nem emeli be az aktulis szimblumtblba; csak magt a modul nevt, fibo-t emeli be. (ford.: mivel a fggvnyek a fibo modul rszei, ezrt elrhet ov vlnak

3

pwu g

hwu

fjlt, a kvetkezo tartalommal:

bo-n keresztl: bo.b(szam) )>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ fibo

Ha egy fggvnyt gyakran szeretnl hasznlni az importlt modulbl, hozzrendelheted azt egy loklis fggvnynvhez:>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377

A modulok vgrehajthat utastsokat ugyangy tartalmazhatnak, mint fggvnydencikat. Ezeket az utastsokat rendszerint a modul inicializlshoz hasznljuk. Kizrlag a modul els importlsakor o futnak le. 1 Minden modulnak megvan a sajt szimblumtblja, ami a modulban denilt fggvnyek szmra globlis. Emiatt a modul ltrehozja nyugodtan hasznlhatja a modulban lv o globlis vltozkat, s nem kell aggdnia egy esetleges nvtkzs miatt. (hiba ugyanaz a neve kt vltoznak, ha kln nvtrben vannak, nem rjk fell egyms rtkt) Msrszr l ha pontosan tudod hogy mit csinlsz, el tudod rni a modul globlis vltozit a vltoznv teljes elrsi o tjnak a hasznlatval: modulnev.elemnev. A modulok importlhatnak ms modulokat. Szoks de nem ktelez o az import utastsokat a modul elejn elhelyezni (vagy a szkript elejn, lsd ksobb). Az importlt modulneveket az rtelmezo az importl modul globlis szimblumtbljba helyezi el. Az import utasts egyik felhasznlsi mdja, hogy az importlt fggvnyeket kzvetlenl az importl modul szimblumtbljba helyezzk el. Pldul:>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Az el bbi plda a helyzi szimblumtblba nem helyezi el a modul nevt, amib ol az importls trtnt. (fibo o objektum nem jn ltre a nvtrben) Ha a modulban lv sszes nevet kzvetlenl a helyi szimblumtblba szeretnd importlni, gy tudod megtenni: o>>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ha gy hasznlod az import utastst, a forrsmodul minden nevt a helyi szimblumtblba emeled, kivve az alhzssal kezd d eket (_). o o1 Valjban a fggvnydencik szintn vgrehajthat utastsok; A fggvny neve a vgrehajts sorn kerl bele a modul globlis szimblumtbljba.

& %# $ " !

r Wrr eB Ie( R (Ehd(% I2) U 6 RRB P 'b Pc %

rr g a

3

o Amikor a spam modult importljuk, az rtelmezo el szr az aktulis knyvtrban keresi a fjlt. Ha itt nem tallja, tovbb keres a PYTHONPATH krnyezeti vltozban felsorolt knyvtrakban. Ennek a vltoznak a szintaktisa ugyanolyan, mint a PATH hj-vltoznak (Linuxon). Egyszer en knyvtrnevek listjt tartalmazza. u Ha a PYTHONPATH vltoz nincs belltva, vagy az abban felsorolt knyvtrak a keresett fjlt nem tartalmazzk, a keress az alaprtelmezett knyvtrban folytatdik. Ez mr fgg az installlstl, U NIX-on rendszerint . Jelenleg a modulokat az rtelmezo a sys.path vltozban felsorolt knyvtrakban keresi. Ez a vltoz az ak tulis knyvtrbl (ahonnan a programot futtatjuk), a PYTHONPATH-ban lv o knyvtrakbl, s az installlstl fgg alaprtelmezett knyvtrbl ll. gy a Python programoknak mdjuk nylik a modulok keressi tvonalt o mdostani, vagy akr teljesen kicserlni. Fontos megemlteni, hogy mivel az aktulis knyvtr is a keressi tvonal rsze, a programnak mg vletlenl se legyen ugyanaz a neve, mint valamely standard modulnak. Ebben az esetben ugyanis a Python megksrli a programot modulknt betlteni annak importlsakor, ami hibazenethez vezet. Tovbbi informcik: 6.2, Standard Modules,.

Fontos a standard modulokat hasznl programok indulsi idejt lervidteni. Ha fjl ltezik abban a knyvtrban, ahol is megtallhat, az rtelmezo felttelezi, hogy a fjl a fjlnak az elore lefordtott vltozata. (A Python a .py fjlokat eloszr .pyc bjtkdra fordtja, ami mr egy binris, ember sz mra nem rtelmes, olvashat llomny ezt hajtja vgre az rtelmez o. Ez a m kds a Java nyelvhez hasonl u konstrukci) A fordts sorn a fjl ugyanazzal a mdostsi idovel jn ltre, mint a mdostsi ideje klnbzik, a fjlt jrafordtja a Python. Rendszerint nem kell tenni semmit a sakor automatikusan ltrejn.

fjl. Ha a kt fjl utols sikeres bjtkdra fordt-

fjl ltrehozsrt, mert az a

Nem hiba, ha ez az automatizmus ltszlag nem m kdik. Ha brmi oknl fogva a u rsa flbeszakad, a fjl-t a Python ks bb mindenkppen rvnytelen fjl-nak fogja felismerni. A lefordtott o fjl tartalma plat form fggetlen, ezrt a Python modulknyvtrat nyugodtan megoszthatod klnbz o achitektrj gpek kztt. Nhny tipp haladknak:

Amikor a Python rtelmez t a -O paramterrel hvjuk meg, az optimalizlt kdot generl s trol a o fjlokban. Az optimalizl jelenleg nem tl sok segtsget nyjt egyszer en csak eltvoltja az assert u utastsokat. Amikor a -O paramtert hasznljuk, minden bjtkd optimalizlt lesz. A .pyc fjlokat az rtelmez gyelmen kvl hagyja, s a .py fjlokat optimalizlt bjtkdra fordtja. o Amikor kt -O paramterrel hvjuk meg a Python rtelmezot, (-OO) a bjtkd-fordt gy optimalizl, hogy az optimalizci ritka esetekben hibs programm kdst okoz??? ???optimizations that could in some rare u cases result in malfunctioning programs. Jelenleg csak a __doc__ szvegeket trli a bjtkdbl, tmrebb fjlt eredmnyezve. Mivel nhny program szmt a dokumentcis vltoz elrhetosgre, csak akkor hasznld ezt az opcit, ha pontosan tudod hogy mit csinlsz. A program semmivel sem fut gyorsabban, ha vagy kiterjeszts bjtkdot futtatunk a sebesu sgnvekeds a betltsi id ben jelentkezik. Ha a flj bjtkdra fordtott verzija rendelkezsre ll, o nincs szksg a fordtsra, rgtn lehet futtatni a bjtkdot tartalmaz verzit. Amikor egy szkriptet a parancssorbl futtatunk a nevnek megadsval, a fut program bjtkdja soha nem rdik vagy fjlba. Ebb l kifolylag a program indulsi ideje lervidtheto, ha a kd nagy o rszt modulokba helyezzk t, s az indtprogramunk kis mret , s importlja a szksges modulokat. u ??? Lehet sg van a o , vagy fjlok kzvetlen futtatsra is.???

pgpwu

3

pwu "duq

pwu ipwu "duhiq pwu

ipwiu pwu d"uq wpu "d uq pwu

pgpwu

ghwu pwu hipwu

F u xe1 1dfCTt qdvi y u

hipwu Bd uq

1 "e ) Eyvqy 1 D pgpwu pwu hiwpu pgpwu pwu "duq hipwu hipwu

"gyhxpwu epig 3qg

& %# $" !

Lehetsges, hogy van egy (vagy fjlod, ha a -O fordtsi paramtert hasznltk) gy, hogy nincs mellette fjlod. Ez egy mdja a Python knyvtrak kzzttelnek gy, hogy a knyvtrat nem tudjk mdostani, megvltoztatni (hiszen nincs meg a forrskd, amib ol fordtottk). A compileall modul fjlokat tud kszteni az aktulis knyvtr sszes moduljbl. (vagy ha a -O kapcsolt hasznltad)

A Python funkcijuk szerint csoportokba sorolt szabvnyos modulokkal rendelkezik egy knyvtrral rszletesen: Python Library Reference Python referenciaknyvtr a ks bbiekben A modulok tteles felsorolsa o Module index Nhny modult az rtelmezobe ptettnk be, ezeken keresztl olyan funkcik megvalstsa lehetsges, amelyek ugyan nem tartoznak szorosan a nyelvhez, de pldul az opercis rendszerrel val kapcsolathoz szksgesek ilyenek pldul a rendszerhvsok. Ezen modulok fggenek a hasznlt opercis rendszertol, hiszen annak m kdtetshez kellenek. Pldul az u amoeba modul csak azokon a rendszereken elrheto, amik tmogatjk az Amoeba primitvek hasznlatt. A msik gyelemre mlt s klnleges modul a sys , ami minden Python rtelmez obe be van ptve. Pldul a sys.ps1 s sys.ps2 vltozk tartalmazzk az rtelmezoben megjelen els dleges s msodlagos prompt o o karakterlnct:>>> import sys >>> sys.ps1 >>> >>> sys.ps2 ... >>> sys.ps1 = C> C> print Yuck! Yuck! C>

Ez a kt vltoz csak akkor ltezik, ha az rtelmezo interaktv mdban fut. A sys.path vltoz karakterlncok listjt tartalmazza, melyek meghatrozzk az rtelmez o keressi tvonalt, amit az a modulok importlsakor bejr. Kezdeti rtkt a PYTHONPATH krnyezeti vltozbl veszi, vagy ha ez nem ltezik, akkor az rtelmezobe beptett alaprtelmezett tvonalakbl. A vltoz rtkt ugyangy mdosthatod, mint egy listt:>>> import sys >>> sys.path.append(/ufs/guido/lib/python)

dir()

A beptett dir() fggvnnyel listzhatjuk ki a modulban denilt neveket. A dir() meghvsa utn a nevek rendezett listjval tr vissza.

& %# $ " !

pgpwu

pgpwu "duq

ipwu pw u "dBdu q uq ipwu

-t,

X6H YDY $

b Pc % '")6 (% I2) U E)g2275"3 r a r

r a r

33

>>> import fibo, sys >>> dir(fibo) [__name__, fib, fib2] >>> dir(sys) [__displayhook__, __doc__, __excepthook__, __name__, __stderr__, __stdin__, __stdout__, _getframe, api_version, argv, builtin_module_names, byteorder, callstats, copyright, displayhook, exc_clear, exc_info, exc_type, excepthook, exec_prefix, executable, exit, getdefaultencoding, getdlopenflags, getrecursionlimit, getrefcount, hexversion, maxint, maxunicode, meta_path, modules, path, path_hooks, path_importer_cache, platform, prefix, ps1, ps2, setcheckinterval, setdlopenflags, setprofile, setrecursionlimit, settrace, stderr, stdin, stdout, version, version_info, warnoptions]

Ha paramterek nlkl hvjuk meg a dir() fggvnyt, az aktulis nvtrben denilt nevekkel tr vissza:>>> a = [1, 2, 3, 4, 5] >>> import fibo, sys >>> fib = fibo.fib >>> dir() [__name__, a, fib, fibo, sys]

Fontos, hogy az gy kapott lista az sszes nvfajtt tartalmazza. Vltozkat, modulokat, fggvnyeket, stb. A dir() nem listzza ki a nyelvben elore denilt (beptett) fggvnyeket s vltozkat. __builtin__ modulban vannak denilva: Ezek a

>>> import __builtin__ >>> dir(__builtin__) [ArithmeticError, AssertionError, AttributeError, DeprecationWarning, EOFError, Ellipsis, EnvironmentError, Exception, False, FloatingPointError, IOError, ImportError, IndentationError, IndexError, KeyError, KeyboardInterrupt, LookupError, MemoryError, NameError, None, NotImplemented, NotImplementedError, OSError, OverflowError, OverflowWarning, PendingDeprecationWarning, ReferenceError, RuntimeError, RuntimeWarning, StandardError, StopIteration, SyntaxError, SyntaxWarning, SystemError, SystemExit, TabError, True, TypeError, UnboundLocalError, UnicodeError, UserWarning, ValueError, Warning, ZeroDivisionError, __debug__, __doc__, __import__, __name__, abs, apply, bool, buffer, callable, chr, classmethod, cmp, coerce, compile, complex, copyright, credits, delattr, dict, dir, divmod, enumerate, eval, execfile, exit, file, filter, float, getattr, globals, hasattr, hash, help, hex, id, input, int, intern, isinstance, issubclass, iter, len, license, list, locals, long, map, max, min, object, oct, open, ord, pow, property, quit, range, raw_input, reduce, reload, repr, round, setattr, slice, staticmethod, str, string, sum, super, tuple, type, unichr, unicode, vars, xrange, zip]

3

& %# $" !

A csomagok adnak lehet sget a Python modulok nvtereinek struktrlsra, a pontozott modulnevek haszno latval. Pldul a A.B modulnv hivatkozik a B modulra, ami az A modulban tallhat (ott importltuk). Ha a programozk a fenti plda szerint hasznljk a modulokat, nem kell amiatt aggdniuk, hogy egyms globlis neveivel tkzs lp fel. Pldul a tbb modulbl ll csomagok (NumPy, Python Imaging Library...) ri is a pontozott modulnevek hasznlatval kerlik el a vltoznevek tkzst. Tegyk fel, hogy egy modulokbl ll csomagot akarsz tervezni, hogy egysgesen tudd kezelni a hangfjlokat s a bennk lv adattartalmat. Tbb klnbzo hangfjlformtum ltezik (rendszerint a kiterjesztsk alapjn o o lehet oket beazonostani, pl.: , , ) valszn leg egy bovl modulcsoportot kell ksztened s u karbantartanod a fjlformtumok kztti konvertlsra. There are also many different operations you might want to perform on sound data (such as mixing, adding echo, applying an equalizer function, creating an articial stereo effect), so in addition you will be writing a neverending stream of modules to perform these operations. Heres a possible structure for your package (expressed in terms of a hierarchical lesystem): Radsul mg tbbfajta m veletet is el kell tudnod vgezni a hanganyagon, pldul keverst, visszhang ksztst, u hangsznszablyzst, m vszeti sztereo effekteket szval a fentiek tetejbe mg rni fogsz egy vgelthatatu lan modulfolyamot, ami ezeket a m veleteket elvgzi. A csomagok egy lehetsges struktrja a hierarchikus u fjlrendszereknl hasznlatos jellssel:Sound/ __init__.py Formats/ __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Effects/ __init__.py echo.py surround.py reverse.py ... Filters/ __init__.py equalizer.py vocoder.py karaoke.py ... Legfels szint csomag o u a sound csomag inicializlsa A fjlformtum konverzik alcsomagja

A csomag: olyan hierarchikus knyvtrszerkezet, amely egymssal sszefgg o modulokat tartalmaz. Egy csomag importlsa sorn a Python bejrja a sys.path vltozban szerepl o knyvtrakat, a csomag al knyvtrak utn kutatva. A sys.path az elore meghatrozott keressi tvonalakat tartalmazza. fjlok jelenltb l tudja, hogy egy knyvtrat csomagknt kell kezelnie s ez a fjl o A Python az segt abban is, hogy az alknyvtrakban lvo csomagokat is rzkelje a Python. A legegyszer bb esetben az u egy res fjl, de tartalmazhat s vgrehajthat a csomaghoz tartoz inicializl kdot, vagy bellthatja az __all__ vltozt (lsd lejjebb). A csomag felhasznli egyenknt is importlhatnak modulokat a csomagbl:

& %# $ " !

"g B

hwu ! x

pwu ! x

b% U 9 Yg " (0%Cf

r a r

A hangeffektek alcsomagja

A szrk alcsomagja u o

3

import Sound.Effects.echo

Ez betlti a Sound.Effects.echo almodult. A hivatkozst teljes tvonallal kell megadni.Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)

Egy msik alternatva almodulok importlsra:from Sound.Effects import echo

Ez szintn betlti az echo almodult, s elrhetov teszi a csomagnevek nlkl is (nem kell a Sound.Effects el tag). oecho.echofilter(input, output, delay=0.7, atten=4)

Van mg egy lehet sg a kivlasztott fggvny importlsra: ofrom Sound.Effects.echo import echofilter

Ez szintn betlti az echo almodult, de a echofilter() fggvny kzvetlenl elrhet ov vlik:echofilter(input, output, delay=0.7, atten=4)

Fontos, hogy a from csomag import elem hasznlatakor az elem az importlt csomag almodulja (submodule) vagy alcsomagja (subpackage) is lehet, vagy valamilyen ms, a csomagban denilt elem nev objektum, pldul u fggvny, osztly vagy vltoz. Az import utasts el szr ellen rzi, hogy az importland elem denilva van-e a csomagban. Ha nem, o o akkor az elemr l felttelezi, hogy az egy modul, s megksrli azt betlteni. Ha a modul keresse sikertelen, o ImportError kivtel vltdik ki. Ezzel ellenttben az import elem.alelem.alelem_aleleme utastsforma hasznlatakor az utols alelem_aleleme kivtelvel mindegyik elemnek csomagnak kell lennie. Az utols elem lehet modul vagy csomag is, de a fentiekkel ellenttben nem lehet osztly, fggvny vagy denilt vltoz.

Mi trtnik, amikor a programoz kiadja a from Sound.Effects import * utastst? Idelis esetben az rtelmez a fjlrendszerben megtallja a csomagban lvo almodulokat, s mindet importlja. o Sajnos ez a m velet Mac vagy Windows platformon nem igazn jl m kdik ennek oka a fjlrendszerek hiu u nyossgban keresend , hiszen az nem tartalmaz pontos informcikat a fjlnv pontos kisbet s - nagybet s o u u rsmdjrl. A fenti platformokon nincs garantlt mdszer annak kidertsre, hogy az fjlt visszhang, Visszhang vagy VISSZHANG modulknt kell-e importlni. u Pldul a Windows 95 egyik bosszant tulajdonsga, hogy minden fjlnevet nagy kezd obet vel jelent meg. A DOS 8+3 bet s nvhosszsga szintn rdekes problmkat vet fel hossz modulnevek esetben. u A csomagkszt k szmra az egyedli megolds az, ha a csomagot egyrtelm index-el ltjk el. Az import o u utasts a kvetkez szablyokat hasznlja: ha a csomag o llomnynak kdjban szerepel az __all__ nev lista, az abban felsorolt nevek lesznek az importland modulnevek a from package import u * utasts vgrehajtsakor.

3

$

pwu ! x

wu 1uvg x ) gExy 21Ey q x q y y

& %# $" !

A csomag kszt jnek feladata, hogy ezt a listt naprakszen tartsa, mikor a csomag jabb verzijt kszti. A o csomagkszt k dnthetnek gy, hogy ezt a funkcit nem tmogatjk, ha valszn tlennek tartjk hogy valaki o u az import * utastst hasznlja a csomagra. Pldul a fjl a kvetkez o kdot tartalmazhatja:__all__ = ["echo", "surround", "reverse"]

A fentiek rtelmben a from Sound.Effects import * importlni fogja a hrom felsorolt almodult a Sound csomagbl. Ha az __all__ lista nem meghatrozott, a from Sound.Effects import * utasts nem importlja a Sound.Effects csomag sszes almoduljt az aktulis nvtrbe csupn azt biztostja, hogy a Sound.Effects csomag importlva legyen (taln, ha az inicializl kdbl adod ki az utastst ???) s aztn a csomagban tallhat sszes nevet importlja. Ebbe belertend minden nv, amit az o -ben vagy az almoduljaiban deniltak. Szintn importlva lesz a csomag minden almodulja, amit a from Sound.Effects import * utasts elott importltunk. Figyeljk meg, mi trtnik ebben a kdban:

import Sound.Effects.echo import Sound.Effects.surround from Sound.Effects import *

Ebben a pldban az echo s a surround modulokat az rtelmez o a helyi (bels ) nvtrbe importlja, mert a o Sound.Effects csomag rszei voltak a from...import utasts vgrehajtsakor. (Ez szintn m kdik, u amikor az __all__ vltoz denilva van) J tudni, hogy az import * importlsi md hasznlata kerlend o, mert a kdot nehezen olvashatv teszi. m br ennek az importlsi mdnak a hasznlatval egyszer bben dolgozhatunk az rtelmez o interaktv mdjban, u egyes modulokat gy terveznek, hogy csak az __all__ vltozban megadott neveket exportljk. Emlkezznk r, hogy semmi problma nincs a from Package import specific_submodule szerkezet hasznlatval! Valjban ez az ajnlott importlsi md, hacsak az importl modulnak nincs szksge klnbz csomagokbl szrmaz azonos nev almodulok hasznlatra. o u

Az almodulok gyakran hivatkoznak egymsra pldul a surround modul elkpzelhet o hogy hasznlja az echo modult. Valjban ha a pldhoz hasonl hivatkozs trtnik, az import utasts el oszr a mr importlt csomagokban keres, miel tt a standard modulok keressi tvonalt vgignzi. o Ennlfogva a surround modul egyszer en hasznlhatja az import echo vagy a from echo import u echofilter importlsi utastst. Ha az importlt modul nem tallhat meg az aktulis csomagban (az a cso mag, amelyiknek az aktulis modul is rsze almodulja), az import utasts a fels o szint modulokban keresi a u megadott nevet. Amikor a csomagok kisebb egysgekbol alcsomagokbl plnek fel, a fenti pldban szereplo Sound csomaghoz hasonlan, az almodulok egymsra teljes pontozott, hierarchikus nevkkel kell hivatkozzanak. Pldul ha a Sound.Filters.vocoder-nek hasznlnia kell a Sound.Effects csomagban tallhat echo modult, a kvetkez kppen rheti azt el: from Sound.Effects import echo o

A csomagok rendelkeznek egy egyedi tulajdonsggal, melyet __path__ -nak hvunk. Ez egy lista, amelyben az fjlt tartalmaz knyvtr nevt talljuk mielott az aktulis fjlban lv kd vgrehajtdna. o

& %# $ " !

1

iy#2d 1 g1 ! ) 1 D qvu C F 1 1 u 1 y x

pwu ! x qxri hqf ghg

pwu ! x

pwu ! x

q0uqq5q ) f ) 1 21(! qq#qx y

!

!

y #qye1qx e1 D

pwu ! x

3

Ez egy mdosthat vltoz, amely befolysolja a csomagban tallhat modulok s alcsomagok keresst. Br erre a lehet sgre ritkn van szksg, a csomagot jabb modulokkal egszthetjk ki vele. o

3

& %# $" !

7. fejezet

Bemenet s kimenet (2.4 doc)Egy program kimenete tbbflekppen jelenhet meg: pldul ember ltal olvashat nyomtatott formban, vagy ks bbi feldolgozs cljbl fjlba rva. Ez a fejezet a lehetosgek kzl tbbet is bemutat. o

Az rtkek kirsra kt lehet sgnk van: Sajt kimenet-formzs fggvnyekkel ??? s a print utasts. (a fent o emltett harmadik lehet sg a write() metdust hasznlja fjl objektumok kezelsre; a szabvnyos kimeneti o fjlt a sys.stdout -knt rhetjk el. A referencia knyvtrt rdemes megnzni (Library Reference), ott tbb informcit tallunk a szabvnyos kimenet hasznlatrl. Gyakori igny, hogy a programoz az egyszer - szkzkkel tagolt kimeneti formzsnl tbb lehet osget szeu retne. A ktflekppen formzhatod a kimenetet: A kimeneti karakterlncok teljes formzst te kezeled a karakterlncok sztvgsval s sszeilleszt svel brmilyen elkpzelt kimenetet elollthatsz. A szabvyos modulok kztt tallhat string szmos hasznos karakterlnc-kezel rutint tartalmaz (pl. karakterlnc kitltse adott szlessg elrshez) ezek o rvid bemutatsa lejjebb tallhat. A msodik lehet sg a % opertor hasznlata, ahol a formzand karakterlnc baloldali argumentum (Plda o pr sorral lentebb!). A % operator feldolgozza a baloldali karakterlncot, mintha az sprintf() fggvnyt hasznltuk volna s a formzott karakterlncot adja visszatrsi rtkknt. Egy krds maradt htra: hogy hogyan konvertlhatsz egy szmjegyekb ol ll karakterlncot rtkkel br szmm? Szerencsre a Python erre tbb lehetosget is biztost: add t a karakterlncot a repr() vagy az str() fggvnyeknek. A fordtott egyszeres idzojelek () hasznlata egyenrtk a repr() fggvny hvu sval, de hasznlatuk helyett a fggvnyhvst javasoljuk. Az str() fggvny az rtkek ember ltal olvashat formjval tr vissza, mg a repr() fggvny visszatrsi rtke az interpreter szmra rtelmezheto adat. (vagy SyntaxError kivtelt vlt ki nem megfelelo szintaxis esetn.) Azon objektumok esetben, amelyeknek nincs emberi olvassra sznt brzolsa, az str() fggvny ugyanazzal az rtkkel tr vissza, mintha a repr() fggvnyt hvtuk volna meg. Nhny rtk, pldul a szmok vagy a struktrk esetben mint pldul a listk vagy a sztrak, brmely kt fent emltett funkcit hasznlva ugyanazt az eredmnyt kapjuk. Karakterlncok s lebegopontos szmoknak kt eltr brzolsi mdjuk van: o Nhny plda:

G"gGSi3d7" 7W"dCaDVU d2db G8FH F0A9 g d 9 1b P 8b 3B6B 8b 9c 3 3 r r

>>> s = Hell, vilg. >>> str(s) Hell, vilg. >>> repr(s) "Hell, vilg." >>> str(0.1) 0.1 >>> repr(0.1) 0.10000000000000001 >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = x rtke: + repr(x) + , s y rtke: + repr(y) + ... >>> print s x rtke: 32.5, s y rtke: 40000... % >>> # The repr() of a string adds string quotes and backslashes: >>> # A repr() fggvny idzjelek kz rakja a stringet, o >>> # s kijelzi a klnleges (escape) karaktereket is: ... hello = hell vilg\n >>> hellos = repr(hello) >>> print hellos hell vilg\n >>> # A repr() fggvnynek akr objektumokat is tadhatunk: ... repr((x, y, (hs, tojs))) "(32.5, 40000, (hs, tojs))" % >>> # reverse quotes are convenient in interactive sessions: >>> # A visszahajl idzjeleket () interaktv mdban hasznlhatjuk, o >>> # ugyanazt rjk el, mint ha a repr() fggvnyt hvtuk volna meg: ... x, y, (spam, eggs) "(32.5, 40000, (spam, eggs))"

Ha akarunk kszteni egy tblzatot, amiben a szmok msodik s harmadik hatvnyai szerepelnek, kt lehet osgnk is van:

& %# $ " !

>>> for x in range(1, 11): ... print repr(x).rjust(2), repr(x*x).rjust(3), %... # Note trailing comma on previous line ... # Figyelem! az elz sor vgn szerepl vessz miatt a o o o o o o o ... # kvetkez print az elz sor vgn folytatja a kirst! ... print repr(x*x*x).rjust(4) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 >>> for x in range(1,11): ... print %2d %3d %4d % (x, x*x, x*x*x) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000

(Megjegyzs: az oszlopok kztt 1 szkznyi helyet a print utasts hagyott az utasts a paramterei kztt mindig 1 szkzt hagy.) Ez a plda bemutatja a szveges (karakterlnc) objektumok rjust() metdust, ami a megadott karakterlncot jobbra igaztja, majd a megadott szlessgig feltlti res karakterekkel a baloldalt. Ehhez hasonlak a ljust() s a center() fggvnyek. Ezek rsi m veletet nem vgeznek, egyszer en visszatrnek az j karakterlncu u cal. Ha a bemenetknt megadott szveg tl hossz, azt nem csonkoljk vltozatlanul adjk vissza az eredeti karakterlncot. Ez elrontja ugyan a kimenet rendezettsgt, de rendszerint jobb, mintha a fggvny valtlan (csonktott) rtkkel trne vissza. (Ha valban szeletelni akarod a karakterlncot, ezt gy tudod megtenni: x.ljust( n)[:n].) Ltezik egy msik metdus, a zfill(), amely az adott numerikus karakterlncot balrl nulla karakterekkel tlti fel. Ez knnyen megrthet a plusz s minusz jelek esetben: o>>> 12.zfill(5) 00012 >>> -3.14.zfill(7) -003.14 >>> 3.14159265359.zfill(5) 3.14159265359

A % opertort hasznlata gy nz ki:>>> import math >>> print PI rtke megkzeltleg %5.3f. % math.pi o PI rtke megkzeltleg 3.142. o

Ha a karakterlncban egynl tbb formzst szeretnl hasznlni, akkor az albbi pldt kvetve egy tuple vltozt

& %# $" !

kell paramterknt hasznlnod:>>> table = {Sjoerd: 4127, Jack: 4098, Dcab: 7678} >>> for name, phone in table.items(): ... print %-10s ==> %10d % (name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd ==> 4127

A legtbb formzs pontosan ugyangy m kdik, mint C-ben, s a megfelel o tpus vltoz tadst ignyli. Ha u kivtel vltdik ki, s azt a kdodban nem kapod el, ???not a core dump???. A %s formzs ennl rugalmasabb: ha a csatolt paramter nem egy karakterlnc, akkor a str() beptett fggvny hasznlatval automatikusan azz konvertlja. A * hasznlata a szlessg, vagy a pontossg meghatrozsra egy kln paramterknt (integer) lehetsges. A kvetkez o C formzsok nem tmogatottak: %n, %p. Ha egy nagyon hossz formzott karakterlncot szeretnl hasznlni, amit nem akarsz darabokra felosztani, szp lenne, ha hivatkozni tudnl a formzand vltozkra azok neveivel, pozcijuk helyett. Ezt a %(name)format forma hasznlatval teheted meg, pldul gy:

>>> table = {Bea: 1975, Balazs: 1978, Fanni: 2003} >>> print Fanni: %(Fanni)d; Bea: %(Bea)d; Balazs: %(Balazs)d % table Fanni: 2003; Bea: 1975; Balazs: 1978

Ez klnsen hasznos az j vars() fggvnnyel egytt, amely egy sztr tpus vltozval tr vissza, amely az sszes helyi vltozt tartalmazza.

Az open() fggvny egy object objektummal tr vissza, s rendszerint kt paramterrel hasznljuk: open(lename, mode).>>> f=open(/tmp/munkafile, w) >>> print f

Az els paramter egy fjlnevet tartalmaz karakterlnc. A msodik paramter nhny karakterb ol ll csupn, o s a fjl hasznlatnak a mdjt (rs, olvass) llthatjuk be vele. A megnyits mdja (mode) lehet r mikor csak olvassuk a fjlt w, ha kizrlag rni szerentnk (a mr esetleg ugyanezen nven ltez o fjl tartalma trl dik!) s a, amikor hozzf zs cljbl nyitjuk meg a fjlt; ilyenkor brmilyen adat, amit a fjlba runk, o u automatikusan hozzf z dik annak a vghez. A r+ megnyitsi md egyszerre nyitja meg a fjlt rsra s u o olvassra. A mode paramter belltsa nem ktelezo; elhagysa esetn r alaprtelmezett rtket vesz fel. Windows s Macintosh rendszereken a megnyitsi mdhoz hozzf ztt b karakterrel binris mdban nyithatjuk u meg a fjlt, pldul gy: rb, wb vagy r+b. A Windows megklnbzteti a szveges s binris fjlokat; a szveges fjlban a sorvget jelzo karakterek (end-of-line) kis mrtkban automatikusan megvltoznak adat rsa vagy olvassa esetn. Ez a httrben zajl mdosts ugyan megfelelo az ASCII szveges fjlok szmra, de a binris fjlokat hasznlhatatlann teszi (pl. vagy fjlokat). Ezrt nagyon gyelj oda, hogy a binris mdot hasznld olvasskor s rskor. (Megjegyezzk, hogy Macintosh-on a hasznlt C knyvtrtl fgg a megnyitsi mdok pontos m kdse. u

& %# $ " !

G"7GS7g (% eH G"7 1'S (i%EP r d 9 9" P 9 9 b S r

3

A fejezet tovbbi pldi felttelezik, hogy mr ltezik az f fjl objektum. A fjl tartalmnak olvasshoz hvd meg az f.read(size) metdust, ami a megadott adatmennyisgnek megfelel hossszsg karakterlnccal tr vissza. A size egy opcionlis paramter elhagysa, vagy negatv rtke o esetn a teljes tartalmat visszaadja a metdus ha esetleg a fjl ktszer akkora, mint a gpedben lv o memria, az esetleg problmt jelenthet neked. Ha hasznlod a size paramtert, akkor a visszatrsi rtkknt kapott karakterlnc hosszt maximalizlni tudod. Ha elred a fjl vgt, az f.read() egy res karakterlnccal tr vissza ("").>>> f.read() Ez a fjl teljes tartalma.\n >>> f.read()

A f.readline() egy sort olvas ki a fjlbl. A sor vgt az jsor karakter (\n) jelenti, amely a beolvasott karakterlnc vgn tallhat. Ez a karakter egyetlen esetben maradhat ki a visszaadott karakterlcbl: ha a fjl utols sort olvassuk be, s az nem jsor karakterre vgzodik. Ez a visszatrsi rtket egyrtelm v teszi: ha a f.readline() metdus res karakterlnccal tr vissza, az u olvass elrte a fjl vgt. Ekkor az res sort a \n karakter jelkpezi a karakterlnc egyetlen egy jsor karaktert tartalmaz.>>> f.readline() Ez a fjl els sora.\n o >>> f.readline() A fjl msodik sora.\n >>> f.readline()

A f.readlines() metdus egy listval tr vissza, amely a fjl minden sort tartalmazza. Ha megadjuk a sizehint paramtert, a metdus a megadott szm byte-ot kiolvassa a fjlbl, s mg annyit, amennyi a kvetkez o jsor karakterig tart. (A fordt megjegyzse: sizehint paramtert hiba adtam meg, 2.1-es pythont hasznlva a teljes fjltartalmat kiolvasta.)>>> f.readlines() o [Ez a fjl els sora.\n, Ez pedig a msodik\n]

A f.write(string) metdus a string tartalmt a fjlba rja, s None rtkkel tr vissza.>>> f.write(Tesztszveg, az rs bemutatsra\n)

Ha egy karakterlnctl eltr tpus vltozt szeretnnk kirni, akkor azt elobb karakterlncc kell konvertlni: o>>> value = (a valasz, 42) >>> s = str(value) >>> f.write(s)

Ford.: Ha megnzzk a keletkezett fjl tartalmt, az (a valasz, 42) lesz. Az f.tell() metdussal a fjl objektum aktulis pozcijt krdezhetjk le bjt-ban, a fjl kezdett ol szmolva. (pl.: hnyadik bjt-ot olvassuk most ppen)

)

d e sdFyC! 1 G u yx x

& %# $" !

A fjl objektum pozcijnak (a kurzornak) a megvltoztatsnak mdja: f.seek(lptets, innen_kezdve). Az innen_kezdve ponttl lptets mennyisggel mozgatjuk a kurzort. (Plda: ha van egy 100 bjtos fjl, amiben ppen a 39. karakternl llunk, akkor az aktulis pozcihoz kpest ugorhatunk tovbb, megadott lpsekben) A from_what value of 0 measures from the beginning of the le, 1 uses the current le position, and 2 uses the end of the le as the reference point. from_what can be omitted and defaults to 0, using the beginning of the le as the reference point. Az innen_kezdve paramter a kvetkezo rtkeket veheti fel: 0: a fjl eleje lesz a hivatkozsi pont 1: az aktulis pozci lesz a hivatkozsi pont 2: a fjl vge az aktulis hivatkozsi pont

>>> >>> >>> >>> 5 >>> >>> d

f = open(/tmp/munkafajl, r+) f.write(0123456789abcdef) f.seek(5) # Ugorj a 6. bajthoz a fajlban f.read(1) f.seek(-3, 2) # Ugorj a fajl vegehez kepest harom karakterrel vissza f.read(1)

Ha mr minden mdostst elvgeztl a fjl-al, hvd meg a f.close() metdust a fjl bezrshoz (a rendszerer forrsok felszabadtshoz). A f.close() hvsa utn a fjl objektum hasznlatra tett ksrletek automao tikusan meghisulnak.>>> f.close() >>> f.read() Traceback (most recent call last): File "", line 1, in ? ValueError: I/O operation on closed file

A fjl objektumoknak van nhny kiegszto metdusuk, pldul az isatty() s a truncate() ezek ritkbban hasznltak. A Referencia knyvtrban teljes tmutatt tallsz a fjl objektumok hasznlathoz.

pickle

A karakterlncokat knny fjlba rni s onnan kiolvasni. A szmokkal kicsit nehezebb a helyzet, mert a read() u metdus mindent karakterknt ad vissza, amit aztn t a szmm trtn o talakts miatt pldul az int() fggvnynek kell tadnunk, ami a 123 karakterlncbl a 123-as rtket adja vissza. Hogyha sszetettebb adattpusokat akarsz menteni, pldul listkat, sztrakat vagy osztly-pldnyokat, egyre bonyolultabb vlik a dolgod. Ahelyett, hogy a felhasznlknak llandan adatmento algoritmusokat kelljen rnia s javtania, a Python rendel kezik a pickle modullal. Ez egy elkpeszto modul, ami kpes a legtbb Python objektumot karakterlncknt brzolni. (even some forms of Python code!???) Ezt a folyamatot pickling-nek hvjk. Az objektum karakterlncbl trtno ltrehozst pedig unpickling-nek nevezik. A karakterlncc trtn konvertls s a visszakonvertls kztt a karakterlnc jelkpezi az objektumot. Ezt o akr fjlban, akr ms formban trolhatjuk. (hlzaton elkldve msik gpen, vagy adatbzisban) Ha van egy x objektumod, s ltezik az rsra megnyitott f fjl objektum, a legegyszer bb t az objektumod u trolsra a kvetkez egysoros kd: o

& %# $ " !

1

D x

pickle.dump(x, f)

Ha jbl el kvnod lltani az objektumot, s az f egy olvassra megnyitott fjl objektum: ox = pickle.load(f)

(Vannak ms varicii is ennek, amik tbb objektum trolsnl / jbli el olltsnl hasznlatosak, illetve akkor, ha nem akarod a trolsi formba alaktott objektumodat tnylegesen fjlba rni; a tma teljes dokumentcija: pickle a Python Library Reference-ben.) A pickle a szablyos mdja a Python objektumok ksztsnek, amiket trolhatsz, vagy jra felhasznlhatsz ms programokkal, vagy akr a jvobeni felhasznls cljbl a jelenlegi programoddal. Ennek a technikai megnevezse: persistent objektumok (lland, tarts). Azrt, mert a pickle szles krben elterjedt, a legtbb Python kiegsztst kszt programoz gyelmeztet, hogy bizonyosodj meg arrl, hogy az j adattpusok trolhatk s o jra el llthatk (mintha egy matrict leragasztanl, majd jra felvennd). o

& %# $" !

8. fejezet

Hibk s kivtelek Eddig csak emltettk a hibajelzseket, de ha kiprbltad a pldkat feltehet oen lttl nhnyat. Ktfajta megklnbztetend hibafajta van (legalbb): szintaktikai hiba (syntax error) s kivtel (exception). o

A szintaktikai hibk, vagy mskpp elemzsi hibk, taln a leggyakoribb hibazenetek, amg tanulod a Pythont:>>> while 1 print Hello vilg File "", line 1 while 1 print Hello vilg ^ SyntaxError: invalid syntax

Az elemz megismtli a hibs sort, s kitesz egy kis nyilat amely a sorban el ofordul legels nek szlelt hibra o o mutat. A hibt a nyilat megel z szcska (token) okozza (vagy legalbbis itt szlelte az rtelemez o): a pldban, oo a hibt a print utastsnl szlelte, mivel a kettospont (:) hinyzik el le. A fjl neve s a sorszm kirdik, o gy tudhatod, hol keressed, ha egy szkriptet futtattl.

Ha egy llts vagy kifejezs szintaktikailag helyes, akkor is okozhat hibt, ha megprbljuk vgrehajtani. A vgrehajts sorn szlelt hibkat kivteleknek (execptions) nevezzk s nem felttlenl vgzetesek: nemsokra megtanulod, hogyan kezeld ezeket a Python programban. A legtbb kivtelt ltalban nem kezelik a programok, ekkor az albbiakhoz hasonl hibazeneteket adnak:>>> 10 * (1/0) Traceback (most recent call last): File "", line 1 ZeroDivisionError: integer division or modulo >>> 4 + spam*3 Traceback (most recent call last): File "", line 1 NameError: spam >>> 2 + 2 Traceback (most recent call last): File "", line 1 TypeError: illegal argument type for built-in operation

bS 8 8 3b 3 8A r r g2WRI 7" Wb8 Yg5"Y6 Dd g a

b P 3H eiBDB FY 8 r a r

A hibazenetek utols sora mutatja, mi trtnt. Klnbzo tpus kivteleket kaphatunk, s a tpus az zenet rszeknt kerl kiratsra: a tpusok a pldkban: ZeroDivisionError (nullval val oszts), NameError (nv hiba) s TypeError (tpussal kapcsolatos hiba). A kivtel tpusaknt kirt szveg a fellp o kivtel bels o (built-in) neve. Ez minden bels kivtelre igaz, de nem felttlenl igaz a felhasznl ltal denilt kivtelekre o (habr ez egy hasznos megllapods). A szoksos kivtelnevek bels o azonostk (nem fenntartott kulcsszavak). A sor fennmarad rsze egy rszletezs, amelynek alakja a kivtel fajtjtl fgg. Az ezt megel z rsze a hibazenetnek megmutatja a szvegkrnyezetet ahol a kivtel trtnt egy veremo o visszakvets (stack backtrace) formjban. ltalban ez veremvisszakvetst tartalamazza egy listban a forrs sorait. jllehet, ez nem fog megjelenteni a sztenderd bementer ol kapott sorokat. A Python Library Reference felsorolja a belso kivteleket s a jelentseiket.

Van r lehet sg, hogy olyan programokat rjunk, amik kezelik a klnbz o kivteleket (exception). Nzzk csak a o kvetkez pldt, amely addig krdezi a felhasznltl az rtket amg egy egsz szmot nem r be, de megengedi o a felhasznlnak, hogy megszaktsa a program futst (a Control-C hasznlatval, vagy amit az opercis rendszer tmogat). Jegyezzk meg, hogy a felhasznl ltal ltrehozott megszakts KeyboardInterrupt kivtelknt lp fel.>>> while 1: ... try: ... x = int(raw_input("rj be egy szmot: ")) ... break ... except ValueError: ... print "Ez nem egsz szm. Prbld jra... " ...

A try utasts a kvetkez kppen m kdik. o u El szr a try mellkg hajtdik vgre, azaz a try s except kztti utastsok. o Ha nem lp fel kivtel, az except gat a program tugorja, s a try utasts befejez odik. Ha kivtel lp fel a try g vgrehajtsa sorn, az g maradk rsze nem hajtdik vgre. Ekkor ha a tpusa megegyezik az except kulcssz utn megnevezett kivtellel, ez az expect g hajtdik vgre, s ezutn a vgrehajts a tryexcept blokk utn folytatdik. Ha olyan kivtel lp fel, amely nem egyezik a az expect gban megnevezett utastssal, akkor a kivtelt tadja egy kls bb try utastsnak. Ha nincs kezelve a kivtel, akkor ez egy kezeletlen kivtel a futs o megll egy utastssal, ahogy korbban lttuk. A try utastsnak lehet egynl tbb except ga is, hogy a klnbz o kivteleket kezelhessk. Egynl tbb kezel hajtdhat vgre. A kezel k csak a hozzjuk tartoz try gban fellpo kivtelt kezelik a try utasts o o msik kezel jben fellp kivtelt nem. Egy expect gat tbb nvvel is illethetnk egy kerek zrjelbe tett lista o o segtsgvel, pldul:... except (RuntimeError, TypeError, NameError): ... pass

(Magyarul: Futsidej hiba, TpusHiba, NvHiba) u Az utols expect g esetn elhagyhat a kivtel neve. Rendkvl vatosan hasznljuk, mert elfedhet valdi programozsi hibkat! Arra is hasznlhat, hogy kirjunk egy hibazenetet, majd jra kivteldobst hajtsunk vgre, (megengedve a hvnak, hogy lekezelje a kivtelt):

& %# $ " !

0BDiHeCC7eiBDB FY 8 r a 9 PBABb b P 3H r

import string, sys try: f = open(file.txt) s = f.readline() i = int(string.strip(s)) except IOError, (errno, strerror): print "I/O error(%s): %s" % (errno, strerror) except ValueError: print "Nem kpes az adatot egsz szmm alaktani." except: print "Vratlan hiba:", sys.exc_info()[0] raise

A try . . . except utastsnak lehet egy else ga is, amelyet ha ltezik az sszes except gnak meg kell el znie. Ez nagyon hasznos olyan kdokban, amelyeknek mindenkppen vgre kell hajtdniuk, ha a try gban o nem lp fel kivtel. Pldul:for arg in sys.argv[1:]: try: f = open(arg, r) except IOError: print nem nyithat meg, arg else: print arg, len(f.readlines()), sorbl ll. f.close()

Az else g hasznlata jobb, mintha a kdot a try ghoz adnnk, mivel ez elkerli egy olyan kivtel elkapst, amely nem a try . . . except utastsok ltal vdett gban vannak. Ha kivtel lp fel, lehetnek hozztartoz rtkei, amelyeket a kivtel argumentumnak is neveznk. A meglte s a tpusa a kivtel fajtjtl is fgg. Azokra a kivteltpusokra, amelyek argumentummal rendelkeznek, az except g el rhat egy vltozt a kivtel neve (vagy a lista) utn, amely felveszi az argumentum rtkt, ahogy itt lthat: o>>> try: ... spam() ... except NameError, x: ... print A(z), x, nv nincs definilva. ... A(z) spam nv nincs definilva.

Ha a kivtelnek argumentuma van, az mindg utols rszeknt kerl a kperny ore. A kivtelkezel k nem csak akkor kezelik a kivteleket, ha azok tnylegesen a try gban szerepelnek, hanem akkor o is, ha azok valamelyik try gban meghvott fggvnyben szerepelnek (akr kzvetve is). Pldul:>>> def ez_rossz(): ... x = 1/0 ... >>> try: ... ez_rossz() ... except ZeroDivisionError, detail: ... print Handling run-time error:, detail ... Handling run-time error: integer division or modulo

& %# $" !

A raise utasts lehet v teszi a programoz szmra, hogy egy j, ltala megadott kivtelt hozzon ltre. Plo dul:>>> raise NameError, IttVagyok Traceback (most recent call last): File "", line 1 NameError: IttVagyok

A raise els argumentuma a kivtel neve amit ltrehozunk. Az esetleges msodik argumentum adja meg a o kivtel argumentumt.

A programok elnevezhetik a sajt kivteleiket, ha karakterlncot rendelnek egy vltozhoz, vagy egy j kivtelosztlyt hoznak ltre. Pldul:>>> class MyError: ... def __init__(self, value): ... self.value = value ... def __str__(self): ... return self.value ... >>> try: ... raise MyError(2*2) ... except MyError, e: ... print A kivtelem fellpett, rtke:, e.value ... A kivtelem fellpett, rtke: 4 >>> raise MyError, 1 Traceback (most recent call last): File "", line 1 __main__.MyError: 1

Sok a Pythonban megtallhat modul ezt hasznlja a fggvnyekben el ofordul esetleges hibk megjelentsre. B vebb informci az osztlyokrl a 9 fejezetben tallhat. o

A try utastsnak van egy msik opcionlis ga, mely takart-rendberak m veletek trolsra szolgl ezeket u a megel z gak lefutsa utn kell vgrehajtani. Pldul: o o

& %# $ " !

G"7S 7S I6 IDB FiBDY U hgeC PB 0hi3017" 7" aa 9 P 8 B) b 3 PB 'SA ' b r r

96 3 Bf )B6 B ' r r 2( 8% a FI DIT a) D0B9 da

G"gegI EBG'FiHeiBDB FY 8 r a 9SA% 3 P b P 3H r

>>> try: ... raise KeyboardInterrupt ... finally: ... print Viszlt vilg! ... Viszlt vilg! Traceback (most recent call last): File "", line 2 KeyboardInterrupt

A vgs zradk akr kivteldobs trtnt a try zradkban, akr nem mindenkppen vgrehajtdik. Ha kio vteldobs trtnt, a kivtel a finally zradk vgrehajtsa utn jra kivltdik. A nally a kivteldobs utszeleknt, lefutsa vgeknt hajtdik vgre, amikor a try utasts elhagyja a break vagy a return utastst. (Fontos: fggvnyeknl ha nem helyeznk el return utastst, akkor rejtetten egy return None utasts fut le teht ha nem ltunk egy utastst, az esetleg rejtetten akkor is lefuthat!) A try utasts vagy except zradkok(at) tartalmazhat, vagy egy nally zradkot, de a kett ot egytt nem.

& %# $" !

3

9. fejezet

Osztlyok A Python osztlymechanizmusa osztlyokat ad a nyelvhez a lehet o legkevesebb szintaxissal s szemantikval. A Python osztlyok a C++ s a Modula-3 ban tallhat osztlymechanizmusok keverke. Ahogy a modulokra is igaz, az osztlyokban a Python nem hatrolja el lesen a dencit s a felhasznlt: megbzik a felhasznl tl kpessgben, hogy nem akar a "mindent denilni fogok" hibjba esni. o Az osztlyok legfontosabb tulajdonsgai teljes egszben megmaradnak: az rkl odsi mechanizmus lehet v o o teszi a tbb ost l val szrmaztatst; a szrmaztatott osztlyok a szlok brmely metdust fell tudjk rni; a metdusok ugyanazon a nven rhetik el a szloosztly metdusait. Az objektumok tetszoleges szm egyni adatot tartalmazhatnak. C++ szhasznlattal lve az osztly minden eleme (belertve az adatokat is) publikus, s minden tagfggvny virtulis. Nincsenek konstruktor s destruktor fggvnyek. A Modula-3 hoz hasonlan nincsen rvidtett hivatkozs az objektum alkotelemeire annak metdusaibl: az objektum fggvnyeinek deklarlsakor els o paramterknt az objektumot jelkpez vltozt adjuk t, melynek rtke rtelemszer en objektumonknt vltozik. o u A Smalltalk-hoz hasonlan az osztlyok nmaguk is objektumok, a sz tgabb rtelmben, mert a Pythonban minden adattpus objektum. Ez biztostja a sz felismerst importlshoz s tnevezshez A C++-tl s a Modula-3 -tl eltr en a beptett tpusok szl osztlyokknt felhasznlhatk. S vgl a C++o o hoz hasonlan, de a Modula-3 tl eltroen a legtbb, egyni szintaktikval br beptett opertor (aritmetikai m veletek, alprogramok (???: metdusokra gondol?) , stb.) jradenilhatk az osztly pldnyaiban. u

Nem lvn ltalnosan elfogadott szhasznlat az osztlyok tmakrre, alkalmanknt Smalltalk s C ++ kifejezseket fogok hasznlni. (Szerettem volna Modula-3 kifejezseket alkalmazni, mert annak hasonlt leginkbb az objektum-orientci rtelmezse a Pythonhoz, de sajnos nagyon kevesen ismerik ezt a nyelvet.) Szeretnlek gyelmeztetni a szhasznlatban rejlo csapdra: A Pythonban az objektum sz nem felttlenl egy osztly pldnyt jelenti. A C++-hoz s a Modula-3 -hoz hasonlan, de a Smalltalk-tl eltroen nem minden tpus osztly: az alapvet beptett tpusok, pldul az egsz szmok s a listk (integer, list) nem azok, s nhny elgg o egzotikus tpus sem az. (Pldul a le-ok.) Akrhogy is, minden Python tpus osztozik az ltalnos jellsen, amit a legrthet bben az objektum kifejezs kzelt meg. o Az objektumoknak egyni jellege van, s tbbszrsen is el lehet nevezni ugyanazt az objektumot (klnbz o nvterekben). Ez a lehet sg fed nvknt (aliasing) ismert ms nyelvekben. Ezt a lehetosget a nyelvvel val o o els tallkozskor rendszerint nem becslik meg egybknt a fed onv hasznlata nyugodtan mellozhet mego o vltoztathatatlan tpusok hasznlatakor (pldul szmok, karakterlncok, tuple-ek esetben). Ugyanakkor a fed nv hasznlata szndkosan rsze a Python nyelvtannak a megvltoztathat tpusok esetben, o mint pldul a listk, sztrak s a legtbb, programon kvli entitst jelkpez o tpus esetben (le-ok, ablakok, stb.). A fed nevek ltalban a program hasznra vlnak, klnsen amita a mutatkhoz hasonltanak nhny o vonatkozsban. Pldul egy objektum tadsa kevs eroforrsfelhasznlssal jr, mita csak egy mutat (az ob-

P 3 PS6 9" h 9 3 P%)6% X6S H r (EhG'd" 7TD0A7T D0A" d" (IIYg Y7T g r

jektumra) kerl tadsra a vgrehajts sorn. Ha a meghvott funkci mdostja a neki tadott objektumot, a hv ltja a vltozst ez szksgtelenn teszi kt klnbzo paramter tadst ( mint pldul a Pascal-ban). (nincs szksg visszatrsi rtkre a meghvott fggvnybol, mert a megvltoztatott objektum kzvetlenl elrheto a hv nvterb l. A fordt megjegyzse) o

Miel tt megismerkednnk az osztlyokkal, beszlnnk kell a hatkrkr ol. Az osztlydencik nhny gyes o trkkt adnak el a nvterekkel, s neked ismerned kell a nvterek s hatkrk m kdst ahhoz, hogy teljeo u sen tlsd, mi is trtnik. Egybknt ennek a tmakrnek az ismerete minden halad Python programoznak a hasznra vlik. Kezdetnek nzznk meg nhny dencit. A nvtr a neveket objektumokra kpezi le. A legtbb nvtr jelenleg Python sztrakknt van megvalstva, de ez a teljestmny kivtelvel normlis esetben nem szlelheto a jv ben ez egybknt vltozni fog. Pldk a o nvterekre: a foglalt nevek listja (fggvnyek, pldul az abs(), vagy a beptett kivtelek nevei); a modulokban jelenlv globlis nevek; vagy a helyi nevek fggvnyhvsok sorn. Bizonyos rtelemben egy objektum o tulajdonsgai is kln nvteret alkotnak. Fontos tudni, hogy klnbz o nvterekben lv kt nv kztt semmio modul egyarnt denilhat egy maximum_beallitas nev lyen kapcsolat nem ltezik. Pldul ha kt klnbzo u fggvnyt brmilyen kvetkezmny nlkl, mert a modulok hasznlinak a fggvnynv el otagjban a modul nevvel egyrtelm en jeleznik kell, hogy pontosan melyik fggvnyt fogjk hasznlni. u Aprop a tulajdonsg jelz t hasznlom brmilyen nvre, ami a pontot kveti pldul a codez.real kifejezso ben a real a z objektum egyik tulajdonsga. Az igazat megvallva egy modulbeli nvre val hivatkozs egy tulajdonsg-hivatkozs: a codemodname.funcname kifejezsben a modname egy modul objektum s a funcname annak egy tulajdonsga. Ebben az esetben egyenes hozzrendels trtnik a modul tulajdonsgai s a modulban denilt globlis nevek kztt: ezek egy nvtren osztoznak. 1 A tulajdonsgok lehetnek csak olvashatak, vagy rhatak is. Az utbbi esetben rtket rendelhetnk a tulajdon sghoz pldul gy: modname.the_answer = 42. Az rhat tulajdonsgok a del utastssal trlhet ok is, pldul a del modname.the_answer trli a a modname objektum the_answer tulajdonsgt. A nvterek klnbz id pontokban szletnek, s lettartamuk is vltoz. Tartalmazzk a Python rtelmez o o o beptett neveit, melyek nem trlhetok. A modulok rszre a globlis nvtr a modul denci olvassakor o jn ltre ltalnos esetben a modul nvterek az rtelmezob l val kilpsig megmaradnak. Az utastsok az rtelmez fels szint hvsai alapjn futnak le, vagy le-bl kiolvasva, vagy az rtelmez obe begpelt utastsok o o u alapjn a __main__ modul megklnbztetett ???considered??? rszeknt, ezrt sajt nvtrrel rendelkeznek. (A beptett nevek szintn a modulban lteznek, __builtin__ nv alatt.). A fggvnyek helyi nvtere a fggvny hvsakor keletkezik, s a fggvny lefutsakor, vagy le nem kezelt kivtelek ltrejttekor sz nnek meg. (Taln a felejts sz pontosabb jelz o lenne a trls helyett.) Termszetesen a u rekurzv hvsok mindegyike sajt, helyi nvtrrel rendelkezik. A hatkr (scope) a Python kd azon szveges rsze ahol a nvtr kzvetlenl elrhet o. A kzvetlen elrhet sg o itt azt jelenti, hogy a nv a teljes elrsi tjnak kifejtse nlkl elrhet o a nvtrben. (pldul a codez.real-ban a . jelzi, hogy a codez objektumhoz tartoz tulajdonsgrl van sz, ez itt most teljesen kifejtett.) mbr a nvterek meghatrozsa statikus, dinamikusan hasznljuk oket. Brmikor a program futsa sorn leg albb hrom kzvetlenl elrheto nvtr ltezik: a bels nvtr, amiben az rtelmez el szr keres, s helyi o o o neveket valamint fggvnyek neveit tartalmazza (a fggvnyeket mindig a legkzelebbi zrt nvtrben keresi az rtelmez ) a msodszor vizsglt kzpso nvtr, ami az aktulis modul globlis vltozinak neveit tartalmazza o valamint az utoljra vizsglt kls nvtr, ami a beptett neveket trolja. o Ha egy vltoznv globlisan deklarlt, minden hivatkozs s m velet kzvetlenl a kzps o nvtrben keres, mert u nvtren kvl tallhat nevek csak olvashatak. ott tallhatk a modul globlis nevei. Fontos tudni, hogy a bels o1 Kivve egy esetet: a modul objektumoknak van egy rejtett csak olvashat tulajdonsguk, a __dict__ amit kiolvasva megkapjuk a modul nvterben lvo nevek listjt egy sztr tpus vltozban. A __dict__ egy tulajdonsg, de nem egy globlis nv. Hasznlata nyilvnvalan megsrti a nvtr-elv alkalmazsnak tisztasgt, s csak olyan vgs o esetekben alkalmazhat, mint a program-kiakadsok utn futtatott hibakeres k. o

& %# $ " !

6"R6% 3 b ' 3 H6 9 b '%b " g2dYa dX " DEBDB d IeH Y2%Y&Y0h3 #! r r

Rendszerint a helyi nvtr a szvegkrnyezetben tallhat helyi vltozkra hivatkozik az aktulis fggvnyben. A fggvnyeken kvl a helyi nvtr a globlis nvtrhez hasonlan egyben az aktulis modul nvtere is. Az osztlydencik pedig jabb nvtereket helyeznek el a helyi nvtrben. Tudatostani kell, hogy a nvterek a szvegkrnyezet ltal meghatrozottak: a modulban denilt fggvny glo blis nvtere a modul nvterben jn ltre a fggvny nevei kizrlag itt elrhet ok. Msrszr l az aktulis nevek keresse mg dinamikusan, futsidoben trtnik, a nyelvi denci akrmennyire is o trekszik a fordtskori, statikus nvfeloldsra, szval hossztvon ne szmts a dinamikus nvfeloldsra! (Igazsg szerint a helyi vltozk mr statikusan meghatrozottak) A Python egy klnleges tulajdonsga, hogy a hozzrendels mindig a bels o nvtrben trtnik. A hozzrendels nem msol adatokat csak ktst hoz ltre a nevek s az objektumok kztt. A trlsre ugyanez igaz: a del x utasts eltvoltja az x ktst a helyi nvtr nyilvntartsbl, Valjban minden m velet, ami j nv hasznlatt vezeti be, a helyi nvteret hasznlja pldul utastsok imu portlsa, s fggvnydencik modulbeli ltrehozsa vagy ktse. A global kulcsszval jelezheted hogy bizonyos vltozk a globlis nvtrben lteznek.

Az osztlyok hasznlathoz szksgnk van valamennyi j nyelvtanra, hrom j objektumtpusra, s nhny j kifejezs hasznlatra.

A legegyszer bb osztlydenci gy nz ki: uclass Osztalynev: . . .

Az osztlydencik hasonltanak a fggvnyek dencijra (def statements) abbl a szempontbl, hogy az osztly deklarcijnak meg kell eloznie az els hasznlatot. Osztlydencit elhelyzehetsz egy if utasts o valamely gban is, vagy egy fggvnybe begyazva. A gyakorlatban az osztlyokon belli utastsok tbbsge ltalban fggvnydenci, de brmilyen ms utasts is megengedett, s nha hasznos is erre mg ksobb visszatrnk. Az osztlyon belli fggvnyeknek egyedi argumentumlistjuk (s hvsi mdjuk) van az osztly metdusainak hvsi mdja miatt ezt szintn ks obb fogjuk megvizsglni. Egy osztlydenciba val belpskor j nvtr jn ltre s helyi nvtrr vlik ebb ol kifolylag minden helyi vltozra trtn hivatkozs tkerl ebbe az j nvtre. ???A gyakorlatban ltalban az j fggvnydencik o kerlnek ide.??? Az osztlydencikbl val normlis kilpskor egy class object objektum jn lre. Ez lnyegben egybefoglalja, beburkolja az osztlydencikor ltrejtt j nvtr tartalmt az osztlyobjektumokrl a kvetkez o alfejezetben fogunk tbbet tanulni. Az eredeti helyi nvtr (az osztlydenciba val belps el otti llapotban) helyrelltdik, s az osztlyobjektum neve is a helyi nvtr rsze lesz (az Osztalynev a pldban).

Az osztlyobjektumok a m veletek ktfle tpust tmogatjk: attribtum m veletek s a pldnyosts. Az Attriu u btum tulajdonsgok az ltalnosan hasznlt Python jellsmdot hasznljk: objektum.attribtumnv.

P bb% P 3 9% 9SA% P P 7" d(Y4XgGSC0A(A " geggb gWS75"3 P9

) ) ) d dDe1u y

x dF2yD!1 u

& %# $" !

rr

Az sszes nv rvnyes attribtumnv ami az osztly nvterben volt az osztlyobjektum ltrehozsakor. Ha egy osztly denci valahogy gy nz ki:class Osztalyom: "Egy egyszeru pelda osztaly" i = 12345 def f(self): return hello vilag

akkor codeOsztalyom.i s Osztlyom.f egyarnt rvnyes attribtum hivatkozs egy egsz szmmal s egy objektum-eljrssal trnek vissza. Az osztlyattribtumoknak ugyangy adhatunk rtket mint egy normlis vl toznak (Osztalyom.i = 2). A __doc__ eljrs is rvnyes attribtum, ami az osztly dencijban lv o els szabad, nem hozzrendelt string-objektummal tr vissza: "Egy egyszeru pelda osztaly" o Class instantiation uses function notation. Just pretend that the class object is a parameterless function that returns a new instance of the class. For example (assuming the above class): Egy osztly pldnyostsa a fggvnyek jellsmdjhoz hasonl. Egyszer en gy kell tenni, mintha az osztu lyobjektum egy paramter nlkli fggvny lenne, amit meghvva az osztly egy j pldnyt kapjuk visszatrsi rtkknt. Pldul (a fenti osztlyt alapul vve):x = Osztalyom()

creates a new instance of the class and assigns this object to the local variable x. kszt egy j pldnyt az osztlybl, s hozzrendeli a visszatrsi rtkknt kapott objektumot az x helyi vltozhoz. //::::::::::::::::::::::::::::::::::::::::::::::::::::::: // 2004. okt. 7: A pldnyosts m velete (az objektum hvsa) egy res objektumot hoz ltre. Elkpzelhet o, hogy az j pldnyt u egy ismert kezdeti llapotba lltva szeretnnk ltrehozni. Ezt egy klnleges metdussal, az __init__()-el tudjuk elrni:def __init__(self): self.data = []

Ha az osztly denilja az __init__() metdust, egy j egyed ltrehozsakor annak __init__() metdusa automatikusan lefut. Lssunk egy pldt egy j, inicializlt egyedre:x = Osztalyom()

Termszetesen az __init__() metdusnak paramtereket is tadhatunk. A paramterek az osztly pldnyostsa sorn az inicializl metdushoz jutnak. Lssunk egy pldt:>>> class Complex: ... def __init__(self, realpart, imagpart): ... self.r = realpart ... self.i = imagpart ... >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5)

& %# $ " !

s most mihez tudunk kezdeni az j egyedekkel? Fontos hogy tisztban legynk az j objektumok lehetsges alkotelemeivel. Kt lehetsges alkotelem van: a belso vltozk (adat tulajdonsgok) s az ezekkel dolgoz fggvnyek. A Pythonban hasznlt adat tulajdonsgok fogalma megegyezik a Smalltalk pldny vltoz fogalmval, s a C++adat tagok fogalmval. Az adat tulajdonsgokat nem kell a hasznlatuk el ott deklarlni, a helyi vltozkhoz hasonlatosan m kdnek az elso hasznlatukkor automatikusan ltrejnnek. Pldul ha x az Osztalyom egy u pldnya, a kvetkez kdrszlet 16-ot fog kirni: ("anlkl, hogy letrnnk az trl", Ford. javtani!) ox.szamlalo = 1 while x.szamlalo < 10: x.szamlalo = x.szamlalo * 2 print x.szamlalo del x.szamlalo

Fentebb mr emltettk, hogy az objektumnak lehetnek sajt fggvnyei (ms nven metdusai) is. Fontos hogy ezek m kdst is megrtsk. A metdus pontosan egy objektumhoz tartoz fggvnyt jell. (A Pythonban a u metdus kifejezs nem kizrlag egy osztly pldnyt jelenti ms objektum tpusok is rendelkezhetnek metdusokkal. Pldul a lista objektumoknak vannak sajt metdusai: append, insert, remove, sort, s gy tovbb. A ford. megjegyzse: valjban ezek is egy a nyelvbe beptett osztly pldnyai, csak tudatostani kell, hogy itt a Python helyettnk elvgzi a pldnyostst, s mi ennek a pldnynak a metdusait hasznljuk. Az albbi sorokban a metdus kifejezst kizrlag egy osztly metdusaira rtjk, hacsak nincs kln kihangslyozva, hogy most egy msik objektum metdusrl van sz. A ltrehozott objektum metdusainak neve a szloosztlytl fgg. (Egy osztly belso elemei lehetnek: fggvnyek vagy vltozk) Meghatrozs szerint minden felhasznl ltal denilt osztlyfggvnyt az adott (ltez o) pldny nevvel kell hvni. Pldul x.f egy rvnyes fggvnyhivatkozs, ha az Osztalyom.f fggvny ltezik (x objektum az Osztalyom pldnya), de x.i nem rvnyes ha Osztalyom.i vltozt nem hoztuk ltre az osztly denilsakor. Fontos, hogy x.f nem ugyanaz, mint Osztalyom.f ez egy Objektum metdus, nem egy fggvny objektum. Fordt megjegyzse: az osztlydenci egy minta, ami alapjn a konkrt objektumokat ltrehozza a Python. Van egy prototpus, ami alapjn legyrthat tbb pldny - a prototpus nyilvn nem ugyanaz, mint a rla mintzott jabb egyedek. Ms nyelvekben jrtas programozknak zavar lehet hogy a tutorial a fggvnyeket ugyangy jelli, mint a vltozkat: x.f egy fggvny, mg pldul a php-ban ezt a tnyt az res zrjelekkel kln