You are on page 1of 378

GraceHopper,acompilerfeltallja:

Szmomraaprogramozstbbmintalkalmazotttudomny.Aprogramozsatudsmlysgeibevezet
rdekeskutatsis.

Maximiliennek,lisenek,Lucillenek,AugustinneksAlexanenak.

Colophon
Abortgrafitrajzt,aminektrgyaszdkosantrelaknyvtrgytl,aszerzksztette1987benegyrgi
fnykpalapjnCansonpaprra.Az1923banacowesikiktbenegyregattnrsztvevversenyjachtota106
tonnsValdoratbrzolja.
Ahszvvelkorbbanptett,seredetilegyawlnakfelszereltValdoratbbdjatelhozott,mieltt1912ben
arajzonlthat516mvitorlafelletketchtalaktottk.
Ezapompsvitorls,amitlegnysgeigennagyrabecsltkivltengerjrtulajdonsgairt,majdnemfl
vszzadontkzlekedett.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 2.
TanuljunkmegprogramozniPythonnyelven

GrardSwinnen
tanrspedaggiaitancsad
InstitutStJeanBerchmansSteMarie
59,ruedesWallonsB4000Lige

Ezajegyzetszabadonletlthetakvetkezwebsiteokrl:
http://www.ulg.ac.be/cifen/inforef/swi
http://learnpython.openproject.hu

Aszvegegyrsztakvetkezminspirlta:
AllenB.Downey,JeffreyElkner&ChrisMeyers

Howtothinklikeacomputerscientist

megtallhat:http://rocky.wellesley.edu/downrey/ost
vagy:http://www.ibiblio.org/obp

Copyright(C)20002005GrardSwinnen

CopyrightHungariantranslation(C)2005DarczyPter

EjegyzetterjesztseaGNUSzabadDokumentcisLicencnek(GNUFreeDocumentationLicense,version
1.1)megfelelentrtnik.Ezaztjelenti,hogynszabadonmsolhatja,mdosthatjasterjeszthetiajegyzetet,
amennyiben tiszteletben tartja a licencben felsorolt szablyokat, melyek teljes szvege a GNU Free
Documentationlicencecmfggelkbena366.oldalonolvashat.
Alnyegetilletentudjonrla,nnemsajtthatjakieztaszveget,hogyutnamagnakmsreprodukcis
jogokat meghatrozva azt (mdostva vagy vltoztats nlkl) terjessze. Az n ltal akr mdostott, akr
vltozatlanformbanterjesztettdokumentumnakktelezentartalmaznikellafentidzettlicencteljesszvegt,
eztafigyelmeztetst,azezutnkvetkezbevezetst,valamintazeredetiangolnyelvszvegPrefacerszt
(lsd a fggelket). A jegyzetnek mindenki szmra szabadon hozzfrhetnek kell maradni. Krhet anyagi
hozzjrulstazoktl,akiknekajegyzetetterjeszti,deakrtsszegcsakareprodukcikltsgeirevonatkozhat.
nnemterjeszthetiajegyzetetmagnakkvetelveaszerzijogokat,nemkorltozhatjaaznltalterjesztett
msolatokreproduklsnakjogt.Ennekaszvegnekklasszikusnyomtatottknyvformjban,knyvesboltban
trtnkereskedelmiterjesztsekizrlagosanazO'Reilly(Paris)kiadnakvanfnntartva.
Mindengarancianlklabbanaremnybenpubliklomajegyzetet,hogyazhasznoslesz.

3. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Bevezets
Ez a jegyzet eredetileg a belga kzpfok oktatsban rsztvev, Tudomny s informatika fakultcin
Programozssprogramnyelvektantrgyattanul3.osztlyosokszmrakszlt.Egyksrletiszveg,amitaz
internetenszabadlicencalattpublikltszmosmsdokumentumnagymrtkbeninspirlt.
Ajegyzetbenegynemlineristantsieljrstjavaslunk,amibiztoshogykritizlhat.Tudatbanvagyunk
annak,hogyezegykicsitkaotikusnakfogtnniegyespuristkszemben,demiakartukgy,mertmegvagyunk
rlagyzdve,hogytbbfle(nemcsakprogramozs,hanemegyb)tantsimdszerltezikselkellfogadniazt
atnyt, hogy aklnbzemberek ugyanazokata fogalmakat nem ugyanabban asorrendben tanuljk meg.
Mindenekelttafigyelemfelkeltsretrekedtnksarra,hogyakvetkezvezrelvekbetartsvalakapukat
szlesretrjuk:
Atantsnakegytlagosdikrtelmiszintjhezsltalnosismereteihezkellalkalmazkodni.Aztelutastjuk,
hogy kis zsenikbl ll elitnek oktassunk. Ezen a szemvegen t nzve a dolgokat az az ltalnos
trekvsnk, hogy brmifle specializci nlkl nyilvnvalv tegyk a programozs s az informatika
invarinsait.
Atantssornalkalmazotteszkzknekkorszerekneksversenykpeseknekkelllenni,deazisszksges,
hogyadikokszemlyeshasznlatraleglisanjussanakhozzjuk.Tantsimdszernkazonazelkpzelsen
alapul, hogy a tanulknak nagyon korn el kell kezdenik sajt projektjeik megvalstt, amiket a sajt
elkpzelseikszerintfejlesztenekshasznlnakfel.
Atanulnaknagyonhamarkpesnekkelllennikisgrafikusalkalmazsokmegvalstsra.
Nagyonfiatalokhozszlunk(elvilegppenabbaakorbarkeztek,amikorkpesekelkezdeniabsztrahlni).
Amellett foglaltunk llst, hogy nagyon korn trjnk r a grafikus interface programozsra, mg a
rendelkezsrelladatszerkezetekbemutatsaeltt,mertmegfigyelhet, azosztlyainkbarkezfiatalok
mregyablakokonsmsinteraktvgrafikusinterfaceekenalapulinformatikaikultrbanlubickolnak.
Haaprogramozstanulstvlasztjk,termszetesenszeretnnekminlelbb(lehet,hogynagyonegyszer)
alkalmazsokatkszteni,melyekbenagrafikusmegjelensmrmasszvanjelenvan.Azrtvlasztottukezta
kiss szokatlan megkzeltst, hogy nvendkeinknek nagyon korn lehetsgk legyen kis, szemlyes
projektekbe kezdeni, melyek rvn rezhetik, hogy rtkelik ket. Azt viszont megkveteljk, hogy a
munkikatautomatikuskdgenerl,fejlettprogramfejlesztkrnyezetekalkalmazsanlklrjkmeg,mert
nemakarjukaprogramozssszetettsgtsemelfedni.
Egyesekazzalkritizlnakbennnket,hogymdszernknemlltjaelggkzppontbaatisztaskemny
algoritmizlst. gy gondoljuk, hogy egy ilyen megkzelts a fentebb mr emltett okok miatt nincs a
fiatalokra adaptlva. Radsul ez a megkzelts kevsb lnyeges, mint a mltban volt. gy tnik, az
objektumokkaltrtnmodernprogramozstanulsainkbbaztignyli,hogyatanulamilyenkorncsaklehet
kerljnkapcsolatbamrltezobjektumokkalsosztlyknyvtrakkal.gynagyon kornmegtanulja,hogy
inkbb objektumok kztti interakcikban gondolkozzon, mint eljrsokban s ez lehetv teszi, hogy elg
gyorsankiaknzzaazolyankonstrukcikelnyeit,mintazrklssapolimorfizmus.
Egybkntelgjelentsteretbiztostottunkaklnbztpusadatszerkezetekkezelsnek,mertgyvljk,
hogyazadatszerkezetektgondolsnakkellkpeznimindenprogramfejlesztsgerict.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 4.
Azelsprogramozsinyelvkivlasztsa
Sokprogramozsinyelvltezik.Mindegyiknekvannakelnyeishtrnyai.Biztos,hogyazlenneazidelis,
ha tbb nyelvet hasznlnnk. Csak btortani tudjuk a tanrokat, hogy sznjanak r idt s mutassanak be
klnbz nyelvekbl vett pldkat. El kell azonban fogadnunk, hogy mindenek eltt a szilrd alapok
megszerzsre kell trekednnk s a rendelkezsnkre ll id korltozott. Ezen a szemvegen t nzve a
dolgokataztniksszernek,hogyhaelszrcsakegynyelvethasznlunk,legalbbisazelstanvben.
Demelyiknyelvetvlasszukelsnek?
AmikorazjTudomnyoksInformatikatantrgytantervnekelksztsesornelkezdtnkgondolkodni
ezen a krdsen, mr elg hossz szemlyes programozsi tapasztalatot gyjtttnk ssze Visual Basickel
(Micro$oft)sClarionnal(Top$peed).Delphivel(Borl@nd)isksrleteztnkegykicsit.
Termszetesvolt,hogyelszrezeknekanyelveknekazegyikregondoltunk(aClariontpreferlva,amisajnos
kevssismert).
Haezeketakarnnkalapeszkzknthasznlniazltalnosprogramozstantshoz,akkorazokktkomoly
htrnnyaljrnnak:
Azzletiszoftverekheztartoznak.
Ezaztjelenti,hogynemcsakazezeketaszoftverekethasznlnikvnoktatsiintzmnynekkelleneminden
munkallomsszmralicencetvsrolni(amielgkltsgesnekgrkezik),hanemazokatanulkisimplicit
mdonerrelennnekknyszertve,akikaprogramozsitudsukataziskolnkvlkvnjkalkalmazni,amit
nemtudunkelfogadni.
Specilisanegyetlenopercisrendszerhezktdnek,a Windows hoz.Nemportbilisakmsopercis
rendszerekre(Unix,MacOS,stb.).Eznemilleszkedikabbaapedaggiaitervnkbe,hogyltalnos(sezrt
szertegaz)kpzst adunk,amiben az informatikai invarinsokatamennyirelehetsgesnyilvnvalv
tesszk.

Ezrt gy dntttnk, hogy megnzzk az alternatv knlatot, vagyis amit a szabad szoftver mozgalom1
ingyenknl.Amittalltunk,aznagyonfellelkestettbennnket:azOpenSourcevilgbaningyenesinterpreterek
scompilereklteznekegysornyelvre,radsulezekanyelvekmodernek,versenykpesek,portbilisak(azaz
klnbz opercis rendszerek alatt hasznlhatk, mint a Windows, Linux, MacOS ...) s nagyon jl
dokumentltak.
VitnfellaC/C++adominnsnyelv.Eztanyelvetabszoltreferenciakntfogadjkelsmindenkomoly
informatikusnak elbb vagy utbb sszekell vele akadni. A baj csak az, hogy nagyon ijeszt sbonyolult,
tlsgosangpkzeli.Aszintaxisakevssolvashatsersenkorltoz.Egynagymretprogrammegrsa
C/C++banhosszsfradsgos.(UgyanezekamegjegyzseknagymrtkbenrvnyesekaJavanyelvreis).

1 A szabad software (Free Software) egy olyan program, aminek a forrskdja mindenki szmra hozzfrhet
(Open source). Gyakran ingyenes (vagy majdnem az), a szerzje szndka szerint szabadon msolhat s
mdosthat, ltalban a vilg klnbz rszein l lelkes, nkntes fejlesztk szzai egyttmkdsnek a
termke. Mivel forrskdjt szmos specialista (egyetemi hallgat s oktat) boncolgatta, ezrt az esetek
tbbsgben a nagyon magas technikai sznvonal a jellemzje. A leghresebb szabad software a GNU/Linux
opercisrendszer,amineknpszersgenaprlnapran.

5. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Msrsztennekanyelvnekakorszergyakorlatagyakranfolyamodikalkalmazsgenertorokhozsms
nagyon fejlett segdeszkzkhz, mint amilyen a C++Builder, Kdevelop, stb. Ezek a programfejleszt
krnyezeteknagyonhatkonynakbizonyulhatnakgyakorlottprogramozkkezben,detlsgosansoksszetett
eszkztknlnaksolyanismeretekettteleznekfelafelhasznlrszrl,melyekkelegykezdnyilvnvalan
mgnemrendelkezik.Kzttkelvszakezd,nemltjaaftlazerdt,amiazzalaveszllyeljr,hogya
segdeszkzkelfedikanyelvalapmechanizmusait.EzrtaC/C++tksbbrehagyjuk.
Programozsi tanulmnyaink elejn szmunkra preferlhatbbnak tnik egy magasabb szint, kevsb
korltoz,jobbanolvashatszintaktikjnyelvhasznlata.NzzemegazolvasetrgykrbenJeffreyElkner
Howtothinklikeacomputerscientistknyvnekelszavt(lsda362.oldalt).
MiutnmegvizsgltuksegykicsitksrleteztnkaPerls Tcl/Tknyelvekkel,vglanagyonkorszers
nvekvnpszersgnekrvendPythonmellettdntttnk.

APythonnyelvbemutatjaStfaneFermigier2.
APythonegyportbilis,dinamikus,bvthet,ingyenesnyelv,amilehetvtesziaprogramozsmodulris
sobjektumorientltmegkzeltst.1989tafejlesztiGuidovanRossumsszmosnkntes.

Anyelvjellemzi
Rszletezzkegykicsitanyelv,pontosabbanktjelenlegiimplementcijnakjellemzit:
APython portbilis nemcsakklnbzUnixvltozatokra,hanem MacOS, BeOS, NeXTStep, MSDOS s
klnbzWindowsvltozatokrais.EgyjfordttrtakJavabanJpythonnakhvjkamiJavabytekdot
hozltre.
Ingyenes,ugyanakkorkorltozsnlklhasznlhatkereskedelmiprojektekben.
Egyarntmegfelelnhnyszortzsorosscripteknekstbbtzezersoroskomplexprojekteknek.
Szintaxisa nagyon egyszer, fejlett adattpusokat kombinl (listkat, sztrakat, ...). Nagyon tmr,
ugyanakkorjlolvashatprogramokrhatkvele.AzazonosfunkcijCsC++(vagyppenJava)program
hossznak gyakran a harmadatde az egyenrtk (bsgesen kommentlt s a standard szablyoknak
megfelelen prezentlt) Python program, ami ltalban 510szer rvidebb fejlesztsi idt s lnyegesen
egyszerbbkarbantartstjelent.
A programoz beavatkozsa nlkl kezeli az erforrsokat (memria, filehandlerek, ...) egy hivatkozs
szmll mechanizmus segtsgvel (ami hasonlt egy szemtgyjthz (garbage collector)), de
klnbzikattl).
APythonbannincsenekpointerek.
APython(opcionlisan)tbbszl(multithread).
Objektum orientlt. Tmogatja a tbbszrs rklst s az opertor overloadingot.
ObjektummodelljbenaC++terminolgithasznlvamindenmetdusvirtulis.
APythonbamintaJavabavagyaC++jabbverziibaegykivtelkezelrendszervanbeptve,ami
lnyegesenleegyszerstiahibakezelst.

2 Stfane Fermigier az AFUL (Association Francophone des Utilisateurs de Linux et des logiciels libres =
FranciaajkLinuxsszabadsoftwareFelhasznlkEgyeslete)elnke.EzaszvegaProgrammez!magazinban
1998 decemberben megjelent cikk kivonata, ami a http://www.linuxcenter.org/articles/9812/python.html
webcmeniselrhet.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 6.
A Python dinamikus (az interpreter ki tud rtkelni Python kifejezseket s utastsokat tartalmaz
karakterlncokat), ortogonlis (kevsfogalommalnagyszmkonstrukcirhatle), reflektv (tmogatjaa
metaprogramozst(pldulavgrehajtssornkpesattribtumokatvagymetdusokathozzadni/eltvoltani
egyobjektumhoz/bl,vagyppenmegvltoztatniazosztlyt))sintrospektv(szmosfejleszteszkzmint
adebuggersaprofilermagbanaPythonbanvanimplementlva).
APythondinamikustpusads,minta Scheme vagya SmallTalk.Aprogramozltalmanipulltminden
objektumnakaprogramvgrehajtskorjlmeghatrozotttpusavan,amitnemkellelredefinilni.
Jelenlegktimplementcijavan.Azegyikinterpretlt,melybenaprogramokportbilisutastsokravannak
lefordtva, majd egy virtulis gp hajtja ket vgre (mint a Java esetben, azonban van egy lnyeges
klnbsg: mivel a Java statikus tpusads, ezrt jval egyszerbb egy Javaprogram vgrehajtsnak a
felgyorstsa,mintegyPythonprogram).AmsikimplementcikzvetlenlJavabytekdotgenerl.
Bvthet:minta Tcl tvagya Guile t,aPythont knnyenilleszthetjkmrmeglvCknyvtrakhoz.
Felhasznlhatjukkomplexprogramnyelvekbvtnyelveknt.
AstandardPythonknyvtrsakiegsztpackageekvltozatosszolgltatsokattesznekhozzfrhetv:
stringeksregulriskifejezsek,standardUNIXszolgltatsok(fileok,pipeok,jelek,socketek,szlak,...),
internet protokolok (Web, News, FTP, CGI, HTML...), llandsg (persistence), adatbzisok s grafikus
interfaceek.
APython folyamatosanfejld nyelv,amimgttlelkesfelhasznlksfejlesztkkzssgell,akiknek
tbbsge tmogatja a szabad szoftvereket. A nyelv alkotja ltal Cben rt s karbantartott interpreterrel
prhuzamosanegymsik,Javabanrtinterpretertisfejlesztenek.
VglaPythonXMLkezelsrealkalmasnyelv.

Tbbklnbzverzi?

Amintemltettem,aPythontfolyamatosanfejlesztik.Afejlesztsacljaatermktkletestse.Ezrtnem
kellaztgondolni,hogyelbbvagyutbbmindenprogramunkatmdostanikell,hogyazokategyj,azelz
verzikkal inkompatibiliss vlt verzihoz adaptljuk. A knyv pldi egymst kveten, egy viszonylag
hossz idszak alatt kszltek. Egyeseket a Python 1.5.2, mg msokat az 1.6, 2.0, 2.1, 2.2 s vgl a 2.3
verzijvalrtuk.
Ennek ellenre valamennyi problma mentesen mkdik ez utbbi verzi alatt s bizonyra nagyobb
mdostsoknlklfognakmkdniakvetkezverzikalattis.
Teleptseazutolsverzitsszrakozzonjl!

7. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
APythonterjesztseBibliogrfia

A Python klnbz verzii (Windowsra, Unixra, stb.), az eredeti oktat anyaga, a kziknyve, a
fggvnyknyvtrak dokumentcija, stb. ingyen letlthetk az internetrl, a hivatalos Python websiterl:
http://www.python.org.
NagyonjPythonnalfoglalkozknyvekkaphatk:

Programming Python, by Mark Lutz, Second Edition, O'Reilly,March 2001, 1296 pages, ISBN:
0596000855

Learntoprogramusing Python,byAlanGauld,AddisonWesleyProfessional;, January152001, 288


pages,ISBN:0201709384

Python in a Nutshell, by Alex Martelli, 1st Edition, O'Reilly, March 2003, 654 pages,
ISBN:0596001886
LearningPython, byMarkLutz,DavidAscher,2ndEdition,O'Reilly,December2003,620
pages,ISBN:0596002815
Python:Howtoprogram, byHarveyM.Deitel,etal,PrenticeHall;February4,2002,1292
pages,ISBN:0130923613
PythonandTkinterProgramming,byJohnE.Grayson,ManningPublications;1stedition(January,
2000),688pages,ISBN:1884777813

CorePythonProgramming,byWesleyJ.Chun,PrenticeHall(December15,2000),816pages,ISBN:
0130260363

PythonProgrammingOnWin32,byMarkHammond,AndyRobinson,FirstEditionJanuary2000,669
pages,ISBN:1565926218

PythonStandardLibrary,byFredrikLundh,O'Reilly,05/2001,281pages,ISBN:0596000960
Python cookbook, by Alex Martelli, Anna Martelli Ravenscroft, David Ascher, 2ndEdition, O'Reilly,
03/2005,807pages,ISBN:0596007973
PythonScriptingforComputationalScience,byHansP.Langtangen,Springer;1stedition(September20,
2004),726pages,ISBN:3540435085

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 8.
Atanrnak,akioktatsisegdletkntakarjahasznlniaknyvet
Ajegyzettelazaclunk,hogyszlesretrjukakapukat.Tanulmnyainknakezenaszintjnfontosnaktnik
annakbemutatsa,hogyaszmtgpprogramozsafogalmaksmdszerekrisitrhza,melybenmindenki
megtallhatjaanekiszimpatikusterletet.Nemgondoljukazt,hogymindenhallgatnakpontosanugyanazokata
dolgokatkellmegtanulni.Inkbbaztszeretnnk,hogymindegyikkneksikerljnkifejleszteniegykicsiteltr
szaktudst,amilehetvteszi,hogymindnmaguk,mindpedigtanultrsaikelttrtkeljkmagukatshaegy
nagyobb lptk projektben val egyttmkdst ajnlunk nekik, akkor hozz tudjanak jrulni a specilis
tudsukkal.
Mindenesetrealegfbbgondunkannakkelllenni,hogysikerljnflkeltennkazrdekldst,amimesszea
legnagyobbhaszonegyolyannehztrgykresetbenmintaszmtgpprogramozs.Nemakarunkgytenni,
mint akik azt hiszik hogy dikjaik azonnal lelkesedni fognak a szp algoritmusok rsa irnt. Inkbb arrl
vagyunkmeggyzdve,hogyazrdekldstcsakattlapillanattlkezdvelehettartsanfenntartani,amikortl
kpessvlnakarra,hogynminllsggaleredeti,szemlyesprojektfejlesztshezkezdhetnek.
Ezekameggondolsokvezettekminketegyolyantantrgyszerkezetkialaktshoz,amitegyesektalnkicsit
kaotikusnak fognak tallni. A vezrfonal a kitn How to think like a computer scientist, amit kicsit
kibvtettnk az adatbe/kivitelre s klnsen a Tkinter grafikus interfacere vonatkoz elemekkel. Azt
szeretnnk, ha dikjaink mr programozs tanulmnyaik els vnek vgtl kezdve tudnnak kis grafikus
alkalmazsokatkszteni.
Egszenkonkrtanezaztjelenti,gygondoljukatantrgyelsvbentfutjukajegyzetelsnyolcfejezett.
Ez azt ttelezi fel, hogy elg gyors temben megtrgyalunk egy sor fontos fogalmat (adattpusok,
programvgrehajtsvezrlutastsok,fggvnyeksciklusok),denemfoglalkozunkazzaltlsokat,hogya
tanulktkletesenmegrtsenekmindenegyesfogalmat,mielttrtrnkakvetkezre.Inkbbmegprbljuk
rvezetniketaszemlyeskutatssksrletezszre.Sokszorhatkonyabblesz,haazegyesfogalmakats
fontosmechanizmusokatadottszituciban,vltozatossszefggsekkzttjraelmagyarzzuk.
Elkpzelsnkszerintflegamsodikvaz,amikormegprbljukamegszerzettismereteketelmlytenis
struktrlni. Az algoritmusokat rszletesen elemezzk. A projekteket, feladat meghatrozsokat s elemz
mdszereketkonzultcikonbeszljkmeg.Megkveteljkbizonyosmunkkesetnajegyzknyvrendszeres
hasznlattsatechnikaijelentsekksztst.
A vgcl mindegyik tanul szmra egy komoly, eredeti programozsi projekt kivitelezse lesz. Ezrt
treksznkafontosfogalmakelmletitrgyalsnakelgkornatanvelejntrtnbefejezshez,hogy
mindenkinekelgidlljonarendelkezsre.
Fontosannakamegrtse,hogyjegyzetbenkzltszmosinformciamiegysorspecilisterletetrint
(grafikusinterfaceek,kommunikci,adatbzisokkezelse,stb.)fakultatvtananyag.Ezekcsakjavaslatoks
irnyjelzk,amiketazrtvettnkbeaknyvbe,hogysegtsnkadikjainknakatanulmnyaikatlezrszemlyre
szabottprojektjkkivlasztsbansmegkezdsben.Nemksreljkmegegyadottnyelvvagytechnikaiterlet
specialistinakkpzst:csakegykisrltstszeretnnknyjtaniazokraazrisilehetsgekre,amikazoknak
knlkoznak,akikveszikafradsgotsprogramozitudsratesznekszert.

9. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Aknyvpldi
Aknyvpldinakforrskdjaletlthetaszerzilletveafordtwebsitejrl:
http://www.ulg.ac.be/cifen/inforef/swi/python.htm

http://learnpython.openproject.hu

Ksznetnyilvnts
A jegyzet egy rsze szemlyes munka eredmnye, mg ms jval jelentsebb rsze informcik s
jindulattanrokskutatkltalrendelkezsrebocstotttletekgyjtemnye.Amintfntebbmrjeleztem,az
egyiklegfontosabbforrsomA.Downey,J.Elkner&C.Meyers:Howtothinklikeacomputerscientistkurzusa
volt.Mgegyszerksznetezeknekalelkestanroknak.Bevallom,GuidovanRossum(aPythonfszerzjnek)
eredeti oktat anyaga, valamint a Python felhasznlk (rendkvl aktv) kzssgtl szrmaz pldk s
klnfle dokumentumok is nagymrtkben inspirltak. Sajnos lehetetlen felsorolni valamennyi szveg
hivatkozst,deszeretnmelismersemrlbiztostanivalamennyikszerzit.
Ksznetilletimindazokat,akikaPythonskiegszti,valamintadokumentcifejlesztsndolgoznak,
GuidovanRossummalkezvetermszetesen,deatbbieketsemkifelejtve(Szerencsretlsgosansokanvannak,
semhogyvalamennyiknevtfeltudnmittsorolni).
KsznetilletimgkollgimatFreddyKlichet,ChristineGhiottsDavidCarrerataLigeiSt.Jean
Berchmans Intzet tanrait, akik dikjaikkal egytt vllalkoztak r, hogy belevetik magukat ennek az j
kurzusnakakalandjbasakiknekszintnszmosjobbtjavasoltukvolt.KlnksznmChristopheMorvan
nakazIUTdeMarnelaValletanrnakrtkesvlemnytsbtortst.
Nagyon ksznm szerkesztmnek Florence Leroynak az O'Reilly kiadnl, hogy szakrten javtotta
fogalmazsihibimatsbelgicizmusaimat.
VglmegksznmfelesgemSuzeltrelmtsmegrtst.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 10.
Afordtelszava

A Python a leggyorsabban fejld nyltforrs, ltalnos cl objektum orientlt programozsi nyelv. A


programozk14%ahasznlja.Szintaxisarendkvlegyszer,knnyentanulhat.
Awww.python.orgrlingyenletlthetsmindenkorltozsnlklszabadonfelhasznlhat,mdosthat,
terjeszthet.Azinternetenrengetegdokumentci,pldaprogramtallhat,amiksegtikakezdkelindulst.
A gyakorlati let szmos terletn alkalmazzk pl.: hlzati alkalmazsok, webfejleszts, numerikus s
tudomnyos alkalmazsok, prototipus fejleszts, gyors alkalmazs fejleszts (RAD = Rapid Application
Development),stb.
Grard Swinnen knyve pedaggiailag tgondolt, rendkvl logikus bevezets a Python programozsi
nyelvbe.Viszonylagkisterjedelmeellenreszmosalkalmazsiterletreadrltstapldaprogramoksalapos
elemzsk segtsgvel. A knyv szerves rszt kpezik a pldk, illetve a kln is letlthet mkd
pldaprogramok.
Afordtssalazvoltaclom,hogyegyiskolaitantsraisalkalmaskivlknyvettegyekmagyarnyelven
hozzfrhetv az rdekldknek. Az olvas fordtssal kapcsolatos szrevteleit ksznettel veszem a
python@gportal.humailcmen.

Debrecen,2006.janur10.

DarczyPter

11. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1.Fejezet: Programozkntgondolkodni3
Mieltt elkezdjk a programozs tanulst, be kell vezessek nhny fogalmat, melyek ismeretre a
tovbbiakbanszksgnklesz.Szndkosanegyszerstemamagyarzatokat,hogyneterheljemtlazolvast.A
programozsnemnehz:elghozzegykismdszeressgskitarts.

1.1 Aprogramozs
A tantrgy clja, hogy megtantson programozknt gondolkozni. Ez a gondolkodsmd olyan sszetett
eljrsokatkombinl,mintamilyeneketamatematikusok,amrnkk,satudsokalkalmaznak.
Aprogramozamatematikushozhasonlanformlisnyelvekethasznlazokfejtsek(vagyazalgoritmusok)
lersra.Amrnkhzhasonlanterveketgondolki,azalkotrszekblszerkezeteketlltssze,srtkeli
azok teljestmnyt. Mint a tuds megfigyeli az sszetett rendszerek viselkedst, magyarzatokat vzol fl,
ellenrziajslatokat.
Aprogramozftevkenysgeaproblmamegolds.
Ezklnbzkpessgeketsismereteketignyel:
egyproblmtklnbzmdokonkelltudnunkmeg/jrafogalmazni,
innovatvshatkonymegoldsokatkelltudnunkelkpzelni,
ezeketamegoldsokatvilgosanskomplettmdonkelltudnunkkifejezni.
Aszmtgpprogramozsalnyegbenabblll,hogyrszletesenmegmagyarzzukegygpnekaminem
rtimegazemberinyelvet,csupnkaraktersorozatokautomatikuskezelsrekpes,hogymitkelltennie.

Aprogramelrergztettkonvencikezekegyttestprogramozsinyelvneknevezznkszigorbetartsval
kdoltutastsoksorozata.Agprendelkezikegyeljrssalamigydekdoljaezeketazutastsokat,hogya
nyelvmindenszavhozegypontosanmeghatrozottakcitrendel.
Azolvasmegtanulprogramozni,amimrnmagbanhasznos,mertfejlesztiazintelligencit.Majdodigis
eljut,hogyaprogramozstkonkrtprojektekmegvalstsrahasznlja,amibenbiztosrmtfogjalelni.

1.2 Gpinyelv,programozsinyelv
Aszmtgpktllapotelektromosjelek(pldulegyminimlisvagyegymaximlisfeszltsg)sorozatain
hajtvgreegyszermveleteket.Ezekajelsorozatokegymindenvagysemmitpuslogiktkvetnek.gy
tekinthetjkket,mintolyanszmoksorozatt,melyekmindigcsaka0saz1rtkeketvehetikfel.Azilyen
szmrendszertkettes(binris)szmrendszerneknevezzk.
Aszmtgpabelsmkdsesorncsakbinrisszmokattudkezelni.Mindenmstpusinformcit
binrisformtumvkelltalaktanivagykdolni.Eznemcsakakezelendadatokra(szvegek,kpek,hangok,
szmok,stb.)igaz,hanemaprogramokrais,vagyisazokraazutastssorozatokrais,amiketazrtadunkmega
gpnek,hogymegmondjukneki,mitkellcsinlniazadatokkal.
Az egyetlen nyelv, amit a szmtgp valban megrt tnyleg nagyon tvol van attl amit mi

3 EnnekafejezetnekajelentsrsztDowney,ElknersMeyersHowtothinklikeacomputerscientistjbl
fordtottam.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 12.
hasznlunk. 1esek s 0k (ezek a bitek) hossz sorozata, amiket gyakran 8, 16, 32 vagy ppen 64esvel
csoportostvahasznl.Ezagpinyelvszmunkrarthetetlen.Ahhoz,hogyegyszmtgppelbeszljnk,
olyanfordtrendszereketkellalkalmaznunk,melyekkpesekaszmunkrarthetbbkucsszavakat(rendszerint
angolszavakat)alkotkaraktersorozatokatbinrisszmokkalaktani.
Ezeknekafordtrendszereknek,amiketegysorkonvencialapjnimplementlnak,nyilvnvalanszmos
vltozataltezik.
Attl fggen, hogy milyen eljrst alkalmaz a fordt: hvjuk interpreternek vagy compilernek (lsd
lentebb).A programozsinyelvnagyonpontosszablyokhozrendelt(nknyesenvlasztott)kulcsszavaknaka
kszlete.Aztrjale,hogyanrakhatjuksszeezeketaszavakatolyanmondatokk,amiketazinterpretervagya
compileragpnyelvre(binrisszmokra)letudfordtani.
Az absztrakci szintje alapjn beszlhetnk alacsonyszint (pl.: Assembler) vagy magas szint
nyelvekrl(pl.:: Pascal,Perl,Smalltalk,Clarion,Java...).Egyalacsonyszintnyelvet nagyon elemi, nagyon
gpkzeliutastsokalkotjk.Egymagasszintnyelvutastsaiabsztraktabbakvagyhatkonyabbak.Ez
aztjelenti,hogyazinterpretervagyacompilermindenutaststnagyszmelemigpiutastsrafordtle.
Azolvaselsprogramozsinyelvknta Pythontfogjamegtanulni.Ezegymagasszintnyelv.Abinris
kdratrtnfordtsasszetetteljrssmindigidignyes.Ezknyelmetlennektnhet.Valjbanamagas
szintnyelveknekrendkvlielnyeikvannak:egymagasszintnyelvenaprogramrssokkalegyszerbb,jval
kevesebbidbekerl;annakavalsznsge,hogyhibkatejtnkjvalcseklyebb,minthaegyalacsonyszint
nyelven programoznnk; a karbantarts (vagyis a ksbbi mdostsok) s a hibakeress (debugols)
nagymrtkben egyszersdnek. Radsul egy magas szint nyelven megrt program gyakran hordozhat
(portable)lesz, vagyisgymkdtethetjk,hogynemkellsokatvltoztatnirajtaaklnbzgpekenvagy
opercis rendszereken. Egy alacsonyszint nyelven rt program mindig csak egy gptpuson tud mkdni.
Ahhoz,hogyegymsikgptpusonmkdjnteljesentkellrni.

13. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1.3 Compillssinterpretls
Aprogramot,ahogyanaztegyszerkesztprogrammal(egyfajtaspecilizltszvegszerkesztvel)megrjuk
mostantlfogvaforrsprogramnak(vagyforrskdnak)nevezzk.Mintmremltettem,ktftechnikaltezik
arra, hogy egy ilyen forrskdot a gp ltal vgrehajthat binris kdra fordtsunk: az interpretci s a
compilatio.
Azinterpretciesetnmindenegyesalkalommal,amikorvgreakarjukhajtatniaprogramot,azinterpreter
programot kell hasznlnunk. Ennl a techniknl a fordt a forrsprogram minden egyes elemzett sort
nhny gpi nyelv utastsra lefordtja, amiket azonnal vgre is hajt. Semmilyen trgyprogram sem
generldik

A compills ateljesforrsszvegegyszerilefordtsblll.Afordtprogramelolvassaaforrsprogram
sszessortsegyjkdotlltel,amittrgykdnak(objectkd)hvunk.Ezutbbitmostmracompilertl
fggetlenlvgrehajtathatjukstrolhatjukegyfileban(vgrehajthatfile)

Mindegyiktechniknakvannakelnyeishtrnyai:
Azinterpretciidelisamikoregynyelvettanulunk,vagyegyprojekttelksrleteznk.Ezzelatechnikval
kzvetlenltesztelhetaforrskdmindenmegvltoztatsaanlkl,hogytmennnkegycompillsifzison,
amimindigidignyes.
Ezzel szemben, amikor egy projektnek sszetett funkcii vannak, amiket gyorsan kell vgrehajtani, a
compilatitrszestjkelnyben.Nyilvnval,hogyegycompilltprogrammindiglnyegesengyorsabbanfog
mkdni, mint az interpretlt vltozata, mivel a szmtgpnek a vgrehajts eltt nem kell minden egyes
utaststjrabinriskdralefordtani.
Egyesmodernnyelvekmegprbljkaktmdszertkombinlni,hogymindegyikblalegjobbathozzkki.
EzahelyzetaPythonsaJavaesetbenis.AmikoregyforrskdotadunktaPythonnak,azelszregygpi
kdhozhasonlkzbenskdot.n.bytecodeothozltre,amitaztnegyinterpreternekadtvgrehajtsra.A
szmtgpszempontjbla bytecode otnagyonegyszergpinyelveninterpretlni.Ezazinterpretciteht
sokkalgyorsabblesz,mintegyforrskdinterpretcija.

Ennekamdszernekazelnyeirzkelhetek:

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 14.
Az,hogyllandanrendelkeznkegyinterpreterrel,lehetvteszibrmilyenkisprogramrszlet kzvetlen
tesztelst. Egy alkalmazs brmelyik alkotjnak helyes mkdst igazolhatjuk annak ltrehozst
kveten.
A lefordtott bytecode interpretcija nem olyan gyors, mint egy igazi binris kd, de szmos program
szmra,belertveagrafikusprogramokatis,nagyonmegfelel.
Abytecodeportbilis.Ahhoz,hogyegyPythonvagyegyJavaprogramklnbzgpekenvgrehajtdjon
elghamindegyikgpenrendelkezsrellegyadaptltinterpreter.

Az elmondottak egy kicsit bonyolultnak tnhetnek, az viszont j hr, hogy mindezt a Python
fejlesztkrnyezet automatikusan vgzi el. Elg, ha berjuk a parancsokat a klaviatrn, majd <Entert>
nyomunksaPythonmagravllaljaazokfordtstsinterpretlst.

15. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1.4 ProgramfejlesztsHibakeress(debug)
Aprogramozsnagyonsszetettsmintmindenemberitevkenysgsorn,enneksornisszmoshibt
kvetnkel.Anekdotaiokokblaprogramozsihibkatbug4oknaknevezzk.Adetektlsukrasjavtsukra
hasznlttechnikkegyttestdebugnaknevezzk.
Hromfletpushibaltezhetegyprogramban.Illendmegtanulnimegklnbztetniket:

1.4.1 Szintaxishibk
APythoncsakakkortudvgrehajtaniegyprogramot,haa szintaxisa teljesenkorrekt.Ellenkezesetbena
programvgrehajtslellsegyhibazenetetkapunk.Aszintaxiskifejezsazokraaszablyokrautal,melyeketa
nyelvszerzirgztettekaprogramstruktrjravonatkozan.
Mindennyelvnekvanszintaxisa.Pldulamagyarnyelvbenegymondatmindignagybetvelkezddiks
rsjellelvgzdik.ezrtezamondatktszintaxishibttartalmaz
A kznsges szvegekben nhny kis szintaxishibnak nincs jelentsge. St elfordulhat (pldul a
versekben),hogyszndkosankvettekelszintaxishibkat.Eznemgtoljamegaszvegmegrtst.
Ezzelszembenegyszmtgpprogrambanalegkisebbszintaxishibaamkdslellst(kiakads)segy
hibazenetkirsteredmnyezi.Azolvasprogramoziplyafutsaelsheteibenbiztosansokidtfogeltlteni
aszintaxishibikeressvel.Gyakorlattaljvalkevesebbhibtfogelkvetni.
Tartsuk szben, hogy az alkalmazott szavaknak s szimblumoknak nmagukban semmilyen jelentsk
sincs: ezek csak kdsorozatok, amik arra valk, hogy automatikusan binris szmokk legyenek alaktva.
Kvetkezskntnagyongyelnnkkellanyelvszintaxisnakalegaprlkosabbetartsra.
Szerencse,hogyelsprogramozilpseinketegyolyaninterpetltnyelvveltesszkmeg,mintaPython.
Veleegyszersgyorsahibakeress.Compilltnyelvekkel(mintaC++)mindenmdostsutn,legyenekazok
akrmilyenkicsikis,jrakellenefordtaniateljesprogramot.

1.4.2 Szemantikaihibk
A msodik hibatpus a szemantikai hiba vagy logikai hiba. Ha ilyen tpus hiba van valamelyik
programunkban,akkoraprogramtkletesenhajtdikvgreabbanazrtelemben,hogysemmilyenhibazenetet
semkapunk,deazeredmnynemazamitvrunk:mstkapunk.
Valjbanaprogramaztteszi,amitmondtunkneki,hogyhajtsonvgre.Aproblmaaz,hogyamitmondtunk,
hogy hajtson vgre nem felel meg annak, amit szerettnk volna, hogy a program vgrehajtson. A program
utastsainaksorrendjenemfelelmegakitzttclnak.Aszemantika(alogika)nemkorrekt.
Alogikaihibkkeressenehzfeladatlehet.Elemeznikellazoutputotsmegkellprblniegymsutn
reproduklniazokatamveleteket,amiketagpazegyesutastsokutnvgrehajtott.

4 A "bug" angol eredet kifejezs, olyan kis, kellemetlen rovarokat jelent, mint amilyenek apoloskk. Az els
szmtgpek elektroncsvei meglehetsen nagy feszltsget ignyeltek. Szmos alkalommal megtrtnt, hogy
ezek a rovarok bemsztak az ramkrk kz s ramtst kaptak, sznn gett testk rvidzrakat s gy
rthetetlenmeghibsodsokatokozott.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 16.
1.4.3 Vgrehajtskzbenfellphibk
Ahibkharmadik tpust a vgrehajts kzben fellp hibk (Runtime error)kpezik. Ezek csak akkor
lpnekfel,amikoraprogrammkdsesornspeciliskrlmnyekllnakel(pldulaprogramegymr
nemltezfiletksrelmegolvasni).Ezeketahibkat kivteleknek (exception) ishvjk,mertezekltalban
jelzik,hogyvalamikivtelestrtnt(amitnemlttunkelre).Tbbszrfogunktallkozniilyentpushibval
amikoregyrenagyobbmretprojekteketfogunkprogramozni.

1.5 Hibakeresssksrletezs
Atanulssornelsajttandegyiklegfontosabbkszsgahatkonyprogramhibakeress(debugols).Ez
nhaidegest,demindignagyonsokrtszellemitevkenysg,aminekasornlesltsrlkelltanubizonysgot
tenni.
Emlkeztetegyrendrsgikihallgatsra.Megvizsgljukatnyeketsmagyarzfeltevseketkelltennnk,
hogyrekonstruljukatapasztalteredmnyeketadfolyamatokatsesemnyeket.
Hasonlt a tudomnyos ksrletekre. Van egy elkpzelsnk arrl, hogy mi nem mkdik, mdostjuk a
programunkatsjrakiprbljuk.Kialaktottunkegyfelttelezst,amilehetvtesziannakmegjslst,hogy
mitkelleredmnyezzenamdosts.Haajslatbeigazoldik,tettnkegylpstegymkdprogramirnyba.
Haajslatunk tvesnekbizonyul,akkoregy jabb hipotzist kell alkotnunk.AhogyanaztSherlock Holmes
mondja: Amikor kizrtuk a lehetetlent, annak kell lennie az igazsgnak, ami megmarad, mg ha az
valszntlenis(A.ConanDoyle,Angyesjel).
Egyeseknekaprogramozssdebugolspontosanugyanaztadolgotjelenti.
Ezzelaztakarjkmondani,hogyaprogramozsugyanannakaprogramnakazllanmdostsblsjavtsbl
ll,mindaddig,mgvglaprogramgyviselkedik,ahogyanakarjuk,hogyviselkedjen.Azelkpzelsaz,hogya
programkszts mindig egy mr mkd (azaz debugolt) vzzal kezddik, amihez rtegrl rtegre kis
mdostsokattesznkhozz,fokozatosanjavtjukahibkat,hogyvglafolyamatmindegyikszakaszbanegy
mkdprogramunklegyen.
Pldultudjuk,hogyaLinux egytbbezerkdsorblllopercisrendszer(tehtegynagyprogram).
Ennekellenrekezdetbengyindultmintegykicsi,egyszerprogram,amitLinusTorvaldsarrafejlesztettki,
hogyteszteljeazIntel80386processzorsajtossgait.LarryGreenFieldszerint(TheLinuxuser'sguide,bta
verzi1):Linuselsprogramjainakegyikeegykisprogramvolt,aminekafeladataazAAAAkarakterlnc
BBBBkaraklnccvalalaktsavolt.Ezaz,amiksbbaLinuxszvlt!.
Azelzeknemjelentikazt,hogyhomlyoselkpzelsblkiindulvaszukcesszvenapproximlvaakarnnk
programozni.Amikoregyjelentsprogramprojektbekezdnk,mindenernkkelarrakelltrekednnk,hogya
lehetlegjobbrszletesfeladatmeghatrozstrjukmeg,amiazelkpzeltalkalmazstervnfogalapulni.

Klnbzmdszereklteznekerreaproblmaelemzsre,azonbanezektanulmnyozsameghaladjaenneka
jegyzetnekakereteit.Tovbbiinformcikrtshivatkozsokrtforduljonazolvasatanrhoz.

17. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1.6 Termszetessformlisnyelvek
Azokatermszetesnyelvek,amiketkommunikcirahasznlnakazemberek.Nemkonstrultnyelvek(mg
akkorsem,haegyesekbenmegprblnakrendszertteremteni):termszetesmdonfejldnek.
Aformlisnyelveketspecilisalkalmazsokatszemeltttartvafejlesztettkki.gypldulamatematikusok
ltalhasznltjellsrendszeregyolyanformlisnyelv,amiklnsenhatkonyanfejezikiaklnbzszmok
s mretek kztti relcikat. A vegyszek egy formlis nyelvet hasznlnak a molekulk szerkezetnek
bemutatsra,stb.
Aprogramozsinyelvekazokaformlisnyelvek,amiketalgoritmusoklersrafejlesztettek
ki.
Mintmrfntebbjeleztem,aformlisnyelvekszintaxisarendkvlszigorszablyoknakengedelmeskedik.
Pldula 3+3=6 egymatematikailag korrektbrzolsmd,mga $3=+6 nemaz.Ugyangya H2O kmiai
kpletkorrekt,deaZq3G2nem.
Aszintaxisszablyokatnemcsakanyelvszimblumaira(pldulaZqkmiaiszimblumnemmegengedett,
mertsemmilyenelemneksemfelelmeg),hanemazokkombinlsimdjraisalkalmazzuk.Ezrt,jlleheta6+=
+/5matematikaiegyenletcsakmegengedettszimblumokattartalmaz,azonbanazokinkorrektelrendezse
semmitsemjelent.
Egymondatolvassakorelkelljutnunkodig,hogyelkpzeljkamondatlogikaiszerkezett(mgakkoris
haeztazesetektbbsgbennemtudatosantesszk).PldulamikorApnzdarableesett.mondatotmondjuk,
megrtjk, hogy A pnzdarab az alany s a leesett az lltmny. Az elemzs lehetv teszi, hogy
megrtskamondatjelentst,logikjt(szemantikjt).AnalgmdonaPythoninterpreternekelemeznikella
forrsprogramunkszerkezett,hogyajelentstkihmozzabelle.
Atermszetessaformlisnyelvekneksokkzsjellemzjevan(szimblumok,szintaxis,szemantika),de
nagyonjelentsklnbsgekisvannakkzttk:
Ktrtelmsg.
A termszetes nyelvek tele vannak ktrtelmsgekkel, amik az esetek tbbsgben a szvegkrnyezet
segtsgvelmegszntethetk.Plduleltrjelentsttulajdontunkazrsznakegytermkrl,illetveegy
rvzrl szl szvegben. Egy formlis nyelv nem tartalmazhat ktrtelmsgeket. Minden utastsnak
egyetlen,szvegkrnyezettlfggetlenjelentsevan.
Redundancia.
A termszetes nyelvekben sok a redundancia azrt, hogy ezeket a ktrtelmsgeket s az informci
tvitelbeli szmos hibt s vesztesget kompenzljk (mondatainkban tbbszr klnbz formban
megismteljkugyanazt,hogybiztosaklegynkbenne,hogymegrttettkmagunkat).Aformlisnyelvek
sokkaltmrebbek.
Irodalmisg.
Az irodalmi szvegek tele vannak kpekkel s metaforkkal. Egy formlis nyelvben ezzel szemben a
kifejezseket sz szerint kell venni. Ha egy bizonyos szvegkrnyezetben azt mondom, hogy leesett a
ktforintos,lehetsges,hogyszsincsigaziktforintosrl,sempedigleessrl.Ezzelszembenegyformlis
nyelvbenakifejezseketszszerintkellrteni.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 18.
Atermszetesnyelvekhasznlathozszokvasokszornehezenalkalmazkodunkaformlisnyelvekszigorhoz.Ez
azegyiknehzsg,amintlkelljutni,hogyeljussunkegyhatkonyprogramanalitikusgondolkodsmdjig.
Ajobbmegrtsrdekbenhasonltsunksszemgnhnyszvegtpust:
Vers:
Aversekbenaszavakatmindzeneisgk,mindjelentskmiatthasznljksakeresetthatsfkntrzelmi.
Tobzdnakametaforkbansktrtelmsgekben.
Przaiszveg:
A szavak szszerinti jelentse fontosabb bennk, s a mondatok gy vannak struktrlva, hogy
megszntesskaktrtelmsgeket,deezsohasemsikerlteljesen.Gyakranszksgesekaredundancik.
Szmtgpprogram:
Aszvegjelentseegyrtelmsszszerinti.Tkletesenmegrthetcsakaszimblumoksaszerkezet
elemzservn.Tehtautomatizlnilehetazelemzst.

Nhny javaslat, hogy hogyan olvassunk szmtgpprogramot (vagy brmilyen formlis nyelven rt
szveget).
Tartsukszben,hogyaformlisnyelveksokkaltmrebbek,mintatermszetesnyelvek,amiaztjelenti,hogyaz
olvassukhoztbbidrevanszksg.Radsulastruktraezeknlnagyonfontos.ltalbanazsemjtlet,ha
egymenetbenazelejtlavgigolvasunkelegyprogramot.Ehelyettgyakoroljukaprogramelemzstfejbena
szimblumokazonostsvalsaszerkezetrtelmezsvel.
Vglemlkezznkr,hogymindenrszletnekjelentsgevan.Klnsenfigyelnnkkellakissnagybetkre
valamintazrsjelekhasznlatra.Mindenilyenhiba(mgaltszlaglegkisebbis,mintegyvesszkifelejtse)
jelentsenmdosthatjaakdjelentstsgyaprogramlefutst.

19. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
2.Fejezet: Azelslpsek
Idejemunkhozltnunk.Pontosabban,megkrjkaszmtgpet,hogydolgozzonhelyettnk.Pdulaztaz
parancsotadjukneki,hogyvgezzenelegysszeadstsrjakiazeredmnyt.
Ehhezutastsokatsadatokatkellmegadnunk,melyekrealkalmazniakarjukazelbbieket.

2.1 SzmolsaPythonnal
APythonnakazasajtossga,hogytbbflemdonhasznlhatjuk.
Elszr interaktiv mdban, fogjuk hasznlni, vagyis gy, hogy a billentyzet segtsgvel kzvetlenl
folytathatunkveleprbeszdet.gyigengyorsanfelfedezhetjkanyelvszmoslehetsgt.Ksbbmegtanuljuk,
hogyankellltrehoznisdiszkreelmenteniprogramokat(scripteket).
Azinterpretertkzvetlenlaparancssorblindthatjuk(egyLinuxshellben,vagyWindowsalattegyDOS
ablakbl):elg,habegpeljka"python"parancsot(feltve,hogyaprogramfelvanteleptve)).

Hagrafikusinterfacethasznlunk,mintaWindows,Gnome,WindowMakervagyKDE,valsznleginkbb
egyterminlablakbanfogunkdolgozni,vagyegyspecializltfejlesztkrnyezetben,mintamilyenazIDLE.
Terminlablakban(Linux5alatt)akvetkezjelenikmeg:

WindowsalattazIDLEfejlesztkrnyezetkinzeteazalbbikprehasonlt:

5 Windows alatt vlaszthatunk a Guido Van Rossum ltal rt IDLE fejlesztkrnyezet, amit magam elnyben
rszestek,saMarkHammondltalfejlesztett PythonWinkztt.Lteznekmskifinomult fejlesztkrnyezetekis,
mintakivlBoaConstructor(ezhasonlanmkdik,mintaDelphi),degyvlem,hogyeznemvalkezdknek.
TovbbifelvilgostsrtaPythonwebsiteotrdemesmegnzni.

LinuxalattinkbbaWindowMakergrafikuskrnyezetetrszestemelnyben(mintaKDEtvagyaGnomeot,amiktl
sokerforrstvesznekignybe). MegnyitunkegyegyszerterminlablakotaPythoninterpreterindtshozvagya
scriptekvgrehajtshozsakitnNeditprogramothvjuk,amiascriptekszerkesztsreval.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 20.
A>>>jelafprompt,amiaztjelzi,hogyazinterpreterkszenllegyutastsvgrehajtsra.
Pldul az interpretert azonnal egyszer irodai kalkultorknt hasznlhatjuk. Ellenrizzk az albbi
parancsokat(Vljonszoksunkk,hogyegyfzetbefelrjukakpernynmegjeleneredmnyeket):
>>> 5+3

>>> 2 - 9 # a szkzk opcionlisak

>>> 7 + 3 * 4 # a matematikai opertorok hierarchija


# megmarad-e ?
>>> (7+3)*4

>>> 20 / 3 # meglepets !!!

Megllapthatjuk,hogya+,,*s/.aritmetikaiopertoroksszeads,kivons,szorzssosztsravalk.A
zrjelekmkdnek.
Alaprtelmezsbenviszontazosztsegszoszts,amiaztjelenti,hogyhaegszargumentumokatadunkmeg,
akkorazeredmnyegy(csonkolt)egszlesz,mintafentiutolspldban.Haaztakarjuk,hogyaPythonaz
argumentumtvalsszmkntrtelmezze,akkoreztgytudatjukvele,hogyaszmbaegytizedesponttesznk6.
Prbljukkipldul:
>>> 20.0 / 3 # (hasonltsuk ssze az eredmnyt az el z pldval)

>>> 8./5

Haegymveletetvegyestpusargumentumokkalhajtunkvgre(egszekkelsvalsokkal),akkoraPython
azoperandusokatautomatikusanvalstpusvalaktjatmielttelvgziamveletet.Prbljukki:
>>> 4 * 2.5 / 3.3

6 Valamennyiprogramozsinyelvben:atizedesszepartormindigegypont.Azinformatikbanavalsszmokat
gyakranlebegpontosszmoknak,vagyfloattpusaknaknevezik.

21. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
2.2 Adatoksvltozk
Aksbbiekbenleszalkalmunkrszletezniaklnbznumerikusadattpusokat,deeltteegynagyonfontos
fogalomrlbeszlnk:
Egyszmtgpprogramlnyegtazadatmanipulcikkpezik.Ezekazadatoknagyonklnbzeklehetnek
(lnyegben minden, ami digitalizlhat7), de a szmtgp memrijban vgleg binris szmok vges
sorozatvegyszersdnek.
Ahhoz,hogyaprogram(brmilyennyelvenislegyenmegrva)hozztudjonfrniazadatokhoz,nagyszm
klnbztpusvltozthasznl.
Egyprogramozsinyelvbenegyvltozmajdnemmindegymilyenvltoznvkntjelenikmeg,aszmtgp
szmraegymemriacmetjellhivatkozsrlvansz,vagyisegymeghatrozotthelyrlaRAMban.

Ezen a helyen egy jl meghatrozott rtk van trolva. Ez az igazi adat, ami binris szmok sorozata
formjbanvantrolva,deamiazalkalmazottprogramozsinyelvszembennemfelttlenlegyszm.Szinte
brmilyenobjektumlehet,amielhelyezhetaszmtgpmemrijban,mintpldul:egyegsz,egyvals,
egykomplexszm,egyvektor,egykarakterlnc,egytblzat,egyfggvny,stb.
Aprogramozsinyelvklnbzvltoztpusokat(egsz,vals,karakterlnc,lista,stb.)hasznlaklnbz
lehetsges tartalmak egymstl trtn megklnbztetsre. A kvetkez oldalakon ezeket fogom
elmagyarzni.

7 Igaznmitdigitalizlhatunk? Ezegyrendkvlfontoskrds,amitazltalnosszmtstechnikakurzusonkell
megtrgyalnunk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 22.
2.3 Vltozneveksfoglaltszavak
Avltozneveketmivlasztjukmegmeglehetsenszabadon.Ennekellenretrekednnkkell,
hogyjlvlasszukmegket.Elnybenkellrszesteniazelgrvid,amennyirelehetsgesexplicit
neveket, amik vilgosan kifejezik, hogy mit tartalmaz az illet vltoz. Pldul: az olyan
vltoznevek,mintmagassg,magas,vagymagjobbakamagassgkifejezsre,mintx.

Egyjprogramoznakgyelnikellarra,hogyazutastssoraitknnylegyenolvasni.

EzenkvlaPythonbanavltoznevekneknhnyegyszerszablynakkellelegettenni:
Avltoznvaz(a z,A Z)betksa(0 9)szmoksorozata,aminekmindigbetvelkell
kezddni.
Csakazkezetnlklibetkamegengedettek.Aszkzk,aspeciliskarakterek,mintpl.:$,#,@,stb.
nemhasznlhatk.Kivtela_(alhzs).

Akissnagybetkklnbznekszmtanak.
Figyelem:Jozsef,jozsef,JOZSEFklnbzvltozk.gyeljnkerre!
Vljonszoksunkk,hogyavltozneveketkisbetkkelrjuk(akezdbettis 8).Egyegyszerkonvencirl
vansz,deeztszleskrbenbetartjk.Nagybetketcsakmagnakasznakabelsejbenhasznljunk,hogy
fokozzukazolvashatsgot,mintpldul:tartalomJegyzk.

Tovbbi szably: nem hasznlhat vltoznvknt az albb felsorolt 28 foglalt sz (ezeket a Python
hasznlja):
and assert break class continue def
del elif else except exec finally
for from global if import in
is lambda not or pass print
raise return try while yield

8 Anagybetkkelkezddszavaknincsenektiltva,deezeketinkbbazosztlyokat(classokat)jellvltozknak
tartjukfenn(azosztlyfogalmtksbbfogomelmagyarzni).

23. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
2.4 Hozzrendels(vagyrtkads)
Mostmrtudjuk,hogyhogyanvlasszukmegjlegyvltoznakanevt.Lssukmost,hogyandefinilhatunk
egyvltoztshogyanrendelhetnkhozzrtket.Avltozhozvalrtkhozzrendelsvagyrtkads
kifejezsekegyenrtkek.Egyolyanmveletetjellnek,amelykapcsolatotteremtavltoznvsavltoz
rtke(tartalma)kztt.
APythonbanszmosmsnyelvhezhasonlanahozzrendelsmvelettazegyenlsgjelreprezentlja9:
>>> n = 7 # n-nek a 7-et adjuk rtkl
>>> msg = "Mi jsg ?" # A "Mi jsg ?" rtket adjuk msg-nek
>>> pi = 3.14159 # pi nev vltozhoz hozzrendeljk az rtkt

Afentipythonosrtkadmveletekklasszikusak.Miutnezeketvgrehajtottuk,aszmtgpmemrijnak
klnbzhelyein:
hromvltoznvvan:n,msgspi
hrombytesorozatvan,melyekbena7egszszm,aMijsg?karakterlncsa3,14159valsszmvan
kdolva.

A fenti hrom rtkad utasts mindegyiknek a hatsa tbb mvelet vgrehajtsa a szmtgp
memrijban::
vltoznvltrehozsasbejegyzseamemriba;
vltoznvhezjlmeghatrozotttpusrendelse(eztakvetkezoldalonfogommagyarzni);
egyspecilisrtkltrehozsastrolsaamemriban;
kapcsolat ltestse a vltoznv s a megfelel rtk memriahelye kztt (mutatk bels rendszere
segtsgvel)

Azelmondottakatazalbbillapotdiagrammalszemlltethetjk:

n msg pi

7 Mijsg? 3.14159

Ahromvltoznvamemriaegyspecilisrszbenaz.n.nvtrben(namespace)trolthivatkozs,mg
a megfelel rtkek msutt, egymstl gyakran tvol helyezkednek el. A ksbbiekben alkalmunk lesz
pontostanieztakoncepcit.

9 Fontos,hogymegrtsk,hogyittsemmifleegyenlsgrlsincs sz.Egymsszimbolizmustisvlaszthattunk
volna,mintplduln<7,ahogyaneztgyakranmegteszikms,algoritmusokatlerpszeudonyelvekbenazrt,
hogyjelezzk,egytartalomnak(a7rtknek)egykontnerhez(avltozhoz)valhozzrendelsrlvansz.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 24.
2.5 Vltozrtknekakirsa
Afentigyakorlatkvetkezmnyeknthromvltoznkvan:n,msg,pi
Ktlehetsgvanazrtkkkpernyretrtnkiratsra.Azels:abillentyzetenberjuka
vltoznevt,majd<Enter>.APythonvlaszulkirjaamegfelelrtket:
>>> n
7
>>> msg
"Mi jsg ?"
>>> pi
3.14159

Az interpreter egy msodlagos funkcionalitsrl van itt sz, aminek az a clja, hogy megknnytse az
letnket,amikoregyszerparancssorgyakorlatokatvgznk.Programbanmindigaprintutaststhasznljuk:
>>> print msg
Mi jsg ?

Vegykszreaktflekiratsimddalkapotteredmnykzttiaprklnbsget.Aprintutastsszigoran
csakavltozrtktrjaki,gyahogyanazkdolvavolt,mgamsikmdszer(az,amelyikcsakavltoznv
bersblll)azidzjeleketis(azrt,hogyemlkeztessenavltoztpusra:erremgvisszafogoktrni).

2.6 Avltozktpusadsa
A Pythonban nem szksges a vltozk hasznlata eltt a tpusuk definilsa rdekben specilis
programsorokatrni.Elghahozzrendelnkegyrtketegyvltoznvhez.APythonavltoztautomatikusan
azzalatpussalhozzaltre,amialegjobbanmegfelelazrtknek.Azelzgyakorlatbanpldulazn,msgs
pi vltozk mindegyikt automatikusan hozta ltre klnbz tpusokkal (rendre egsz szm,
karakterlnc,lebegpontosszmtpusokkal).
EzegyrdekessajtossgaaPythonnak,amialapjnaprogramnyelveknekahhozacsoportjhozsoroljuk,
amelyikheza Lisp, Scheme snhnymsnyelvtartozik. APython dinamikus tpusads nyelv,szembena
statikus tpusads nyelvekkel mint amilyenek a C++ vagy a Java. Ezekben a nyelvekben elszr mindig
specilis utastsokkal deklarlni (definilni) kell a vltozk nevt s tpust s csak ezutn lehet tartalmat
rendelnihozzjuk,aminektermszetesenkompatibilisnekkelllenniadeklarlttpussal.
Astatikustpusadstacompilltnyelvekrszestikelnyben,mertazlehetvtesziafordts(aminekakdja
egybefagyottbinriskd)optimalizlst.

A dinamikus tpusads a magasszint logikai konstrukcik (metaprogramozs, reflexivits)


lerst teszi knnyebb, klnsen az objektum orientlt programozs (polimorfizmus)
vonatkozsban. Egyszersti az olyan adatstruktrk hasznlatt, mint amilyenek a listk s a
sztrak(dictionary).

25. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
2.7 Tbbszrsrtkads
APythonbanegyszerretbbvltozhozrendelhetnkrtkeket.Pldul:
>>> x = y = 7
>>> x
7
>>> y
7

Egyetlenopertorsegtsgvelprhuzamosanisvgezhetnkrtkadst:
>>> a, b = 4, 8.33
>>> a
4
>>> b
8.33

Ebbenapldbanazasbegyidejlegveszifela4s8.33rtkeket.
Figyelem : atizedesjegyeket tizedesponttal vlasztjuk elaz egszrsztl,ahogyazazangol
nyelvterleten szoksos. A vesszt a klnbz elemek (argumentumok, stb.) elvlasztsra
hasznljuk ahogyan a pldban lttuk, mind maguknak a vltozknak, mind pedig a hozzjuk
rendeltrtkeknekazelvlasztsra.

(2) Gyakorlatok
2.1. rja le a lehet legrthetbben s teljesebben, hogy mi trtnik az albbi plda hrom
sorban:
>>> szelesseg = 20
>>> magassag= 5 * 9.3
>>> szelesseg * magassag
930

2.2. Rendeljehozza3,5,7rtkeketaza,b,cvltozkhoz.
Vgezzeelazab/cmveletet.Matematikailagkorrekteazeredmny?
Hanemaz,hogyankelleljrnihogyazlegyen?

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 26.
2.8 Opertorokskifejezsek
Azrtkeketsarjukhivatkozvltozkatopertoroksegtsgvelkifejezsekkkombinljuk.Plda:
a, b = 7.3, 12
y = 3*a + b/5

Ebbenapldbanazasbvltozkhozelszrhozzrendeljka7.3s12rtkeket.
APython,ahogyaztazelzekbenmagyarztam,automatikusanavalstpustrendeliazasazegsz
tpustabvltozhoz.

Apldamsodiksorbanazj y vltozhozrendeljkhozzegykifejezseredmnyt,amia*,+s/
opertorokatkombinljaaza,b,3s5operandusokkal.Azopertorokspecilisszimblumok,amiketolyan
egyszermatematikaimveletekreprezentlsrahasznlunk,mintazsszeadsvagyaszorzs.Azoperandusok
azrtkek,amiketazopertoroksegtsgvelkombinlunk.
APythonmindenegyeskifejezstkirtkel,amitberunkneki,legyenazakrmilyenbonyolult senneka
kirtkelsnekazeredmnyemindigegyrtk.Ehhezazrtkhezautomatikusanhozzrendelegytpust,ami
fggattl,hogymivanakifejezsben.Afentipldbanyvalstpuslesz,mertakirtkeltkifejezslegalbb
egyvalsvltozttartalmaz.
NemcsakangymatematikaialapmveletopertoratartozikaPythonopertoraihoz.Hozzjukkellvennia
hatvnyozsopertort**,nhnylogikaiopertort,akarakterlncokonmkdopertorokat,azazonossgots
tartalmazsttesztelopertorokat,stb.Minderrlaksbbiekbenjrafogokbeszlni.
Rendelkezsnkrellamoduloopertor,amita%szimblumjell.
Ezazopertoregyszmnakegymsikszmmalvalegszosztsblszrmazmaradktadjameg.Prbljuk
ki:
>>> 10 % 3 (jegyezzk meg, hogy mi trtnik !)
>>> 10 % 5

Aksbbiekbennagyonhasznoslesz,amikoraztvizsgljuk,hogyegyaszmoszthateegybszmmal.Elg
aztmegnzni,hogyaza%beredmnyeegyenlenullval.

Gyakorlat:
2.3. Ellenrizzeakvetkezutastssorokat.rjaleafzetbe,hogymitrtnik:
>>>r,pi=12,3.14159
>>>s=pi*r**2
>>>prints
>>>printtype(r),type(pi),type(s)
>>>

Vlemnyeszerintmiahasznaatype()fggvnynek?
(Megjegyzs:afggvnyeketaksbbiekbenrszletesenbefogommutatni).

27. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
2.9 Amveletekprioritsa
Ha egy kifejezsben egynl tbb opertor van, akkor a mveletek vgrehajtsnak sorrendje a prioritsi
szablyoktlfgg.APythonbanaprioritsiszablyokugyanazok,mintamiketmatematikbltanultunk:

zrjelek.Ezekalegmagasabbprioritsak.Azttesziklehetv,hogyazltalunkkvntsorrendbentrtnjen
egykifejezskirtkelse.
gy2*(31)=4,s(1+1)**(52)=8.
hatvnyozs.Ahatvnyokkiszmolsraatbbimveletelttkerlsor.
gy2**1+1=3(snem4),s3*1**10=3(snem59049!).
szorzssoszts,azonosprioritssal.Ezeketazsszeadsskivonselttrtkeliki.
gy2*31=5(snem4),s 2/31=1(Emlkezznkvissza,hogyalaprtelmezsbenaPython
egszosztstvgez.)
Haktopertorazonospriorits,akkoravgrehajtsukbalrljobbratrtnik.
gyaz 59*100/60 kifejezsbenelszraszorzst,majdeztkveten,az 5900/60osztstvgziel,
aminekazeredmnyet98.Haelszrazosztstvgeznel,akkorazeredmny59lenne(emlkezznkr,
hogyittegyegszosztsrllennesz).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 28.
2.10 Kompozci
Eddig egy programozsi nyelv klnbz elemeit tanulmnyoztuk : a vltozkat, a kifejezseket s az
utastsokat,deaztnemvizsgltuk,hogyhogyanlehetezeketegymssalkombinlni.
Egy magasszint programozsi nyelv egyik erssge, hogy klnbz elemek kombinlsval sszetett
utastsokathozhatunkltre.gypldul,hatudjukhogyanadunksszektszmotshogyanratunkkiegy
rtket,akkoraktutaststegyetlenutastsskombinlhatjuk:
>>> print 17 + 3
>>> 20

Ez a nyilvnvalnak tn tulajdonsg fogja lehetv tenni az sszetett algoritmusok vilgos s tmr


programozst.Plda:
>>> h, m, s = 15, 27, 34
>>> print "az jfl ta eltelt msodpercek szma = ", h*3600 + m*60 + s

Figyelem:vanegymegszortsarranzve,hogymiketlehetkombinlni:
Amitegykifejezsbenazegyenlsgjelbaloldalnhelyeznkel,annakmindigegyvltoznakkelllenni,nem
pedigegykifejezsnek.Ezabblatnyblfakad,hogyazegyenlsgjelneknemugyanazajelentse,minta
matematikban.Mintmremltettem,egyrtkadsimveletjelrlvansz(egybizonyostartalmattesznkegy
vltozba),nempedigegyegyenlsgjelrl.Azegyenlsgjelet(pldulegyfelttelellenrzsben)egykicsit
ksbbfogombemutatni.
gypldulazm+1=butastsszablytalan.

A matematikban viszont elfogadhatatlan a = a + 1 et rni, pedig ez az rsmd igen gyakori a


programozsban. Az a = a + 1 utasts az a vltoz rtknek eggyel trtn megnvelst (msknt:
incrementlst)jelenti.
Hamarosan alkalmunk lesz visszatrni erre. Eltte azonban egy msik nagyon fontos fogalmat kell
tisztznunk.

29. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
3.Fejezet: Azutastsfolyamvezrlse
Az els fejezetben lttuk, hogy az elemz programoz alaptevkenysge a problmamegolds. Egy
informatikaiproblmamegoldshozatevkenysgeketmindigbizonyossorrendbenkellvgezni.Amegfelel
struktrbanssorrendbenlerttevkenysgeketalgoritmusnaknevezzk.

A tevkenysgek vgrehajtsi sorrendjt meghatroz utastscsoportok a vezrl struktrk. A modern


programozsbancsakhromvanbellk:aszekvenciasakivlaszts,melyeketebbenafejezetbenrokle,sa
kvetkezfejezetbentrgyaltismtls.

3.1 Utastsszekvencia10
Hanemmondunkmst,akkoregyprogramutastsaiegymsutnabbanasorrendbenlesznek
vgrehajtva,ahogyanascriptbenlevoltakrva.

Aztaz tvonalat,amitaPythonaprogramvgrehajtssornkvet utastsfolyamnaknevezzk.Azezt


mdostutastsokazutastsfolyamvezrlutastsok.

NormlisanaPythonazutastsokatazelstlazutolsigvgrehajtja,kivvehaegyfelttelesutastssal
tallkozik,mintamilyenazifutasts,amitezutnfogoklerni(aprogramhurkokkapcsnfogunkvele
tallkozni).Egyilyenutastslehetvfogjatenniaprogramnak,hogyakrlmnyektlfggenms
vgrehajtsiutakatkvessen.

3.2 Kivlasztsvagyfelttelesvgrehajts
Haigaznhasznosprogramokatszeretnnkrni,akkorolyantechnikkravanszksg,amiklehetvteszika
programvgrehajts klnbz irnyokba trtn tirnytst attl fggen, hogy milyen felttelekkel
tallkozunk.Ehhezolyanutastsokkellenek,amikkeltesztelnilehetegybizonyosfeltteltskvetkezmnyknt
mdostanilehetaprogramviselkedst.
Az if utastsalegegyszerbbezekkzlafelttelesutastsokkzl.KsrletkppenrjukbeaPython
editorbaakvetkezktsort:
>>> a = 150
>>> if (a > 100):
...
Azelsutastsazavltozhozhozzrendelia150rtket.Eddigsemmijnincs.
Amikorviszontberjuk amsodiksort,azttapasztaljuk,hogyaPython jfajtamdonviselkedik. Hanem
felejtettk le a : karaktert a sor vgrl, akkor megllapthatjuk, hogy a fpromptot (>>>) most egy
msodlagosprompthelyettesti,amihrompontblll11.
Haazeditorunknemteszimegautomatikusan,akkormosttabullnunkkell(vagy4betkztkellrnunk)
mielttberjukakvetkezsort,gyhogyazazelzsorhozkppestbeljebblegyen(vagyisbelegyenhzva).
Kpernynknakvetkezknekkelllenni:

10 Jelenesetbenaszekvenciakifejezsegymstkvetutastsoksorozattjelli.Ebbenaknyvbeneztazelnevezst
egyPythonfogalomszmratartjukfnn,amimagbafoglaljaa karakterkncokat,tuplekets listkat(lsda
ksbbiekben).
11 APythonwindowsoseditornakbizonyosverziibanamsodlagospromptnemjelenikmeg.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 30.
>>> a = 150
>>> if (a > 100):
... print "a meghaladja a szzat"
...

Nyomjunkmgegy<Enter>t.Aprogramvgrehajtdiksakvetkeztkapjuk:
a meghaladja a szzat
Kezdjkjraagyakorlatot,demosta=20szalazelssorban:mostaPythonsemmitsemrki.

Aztakifejezst,amitzrjelekkztettnk,mostantlfogvafelttelneknevezzk.Azifennekafelttelneka
tesztelstteszilehetv.Haafeltteligaz,akkora:utnbeljebbigaztottutaststhajtjavgreaPython.Ha
afelttelhamis,semmisemtrtnik.Jegyezzkmeg,hogyazittalkalmazottzrjelekopcionlisakaPythonban.
Ezeketazolvashatsgjavtsardekbenalkalmaztam.Msnyelvekbenktelezklehetnek.
Kezdjkjra,rjunkmgktsortazelzekhez,gyahogyanaztalbbltjuk.gyeljnkr,hogyanegyedik
sor bal szlen kezddik (nincs behzs), mg az tdik megint be van hzva (a harmadik sorral azonos
mrtkben):
>>> a = 20
>>> if (a > 100):
... print "a meghaladja a szzat"
... else:
... print "a nem haladja meg a szzat"
...
Nyomjunkmgegyszer<Enter>t.Aprogrammgegyszervgrehajtdiksezalkalommalkirja:
a nem haladja meg a szzat

Azolvasmrbizonyrakitalltaaz else (klnben)utastsegyalternatvvgrehajtsprogramozst


teszilehetv,gyaprogramoznakktlehetsgkzttkellvlasztani.Az elif (azelseifsszevonsa)
utaststhasznlvamgjobbmegoldsttudunkadni:
>>> a = 0
>>> if a > 0 :
... print "a pozitv"
... elif a < 0 :
... print "a negatv"
... else:
... print "a nulla"
...

31. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
3.3 Relcisopertorok
Azifutastsutnkirtkeltfelttelakvetkezrelcisopertorokattartalmazhatja:
x == y # x egyenl y -nal
x != y # x nem egyenl y -nal
x > y # x nagyobb, mint y
x < y # x kisebb, mint y
x >= y # x nagyobb, vagy egyenl mint y
x <= y # x kisebb, vagy egyenl mint y

Plda:
>>> a = 7
>>> if (a % 2 == 0):
... print "a pros"
... print "mert 2-vel val osztsa esetn a maradk nulla"
... else:
... print "a pratlan"
...

Jljegyezzkmeg,hogyktrtkegyenlsgtaduplaegyenlsgjelopertorralteszteljk,nempedigaz
egyszeres egyenlsgjellel12. (Az egyszeres egyenlsgjel egy rtkad opertor.) Ugyanezt a szimbolizmust
fogjuktallniaC++bansaJavaban).

3.4 sszetettutastsokUtastsblokkok
Az if utastssal hasznlt konstrukci az els sszetett utastsunk. Hamarosan msflkkel is fogunk
tallkozni.APythonbanmindensszetettutastsnakmindigugyanazaszerkezete:egyfejsor,amikettspontra
vgzdik,ezalattkvetkezikegyvagytbbutasts,amiafejsoralattbevanhzva.Plda:
Fejsor:
a blokk els utastsa
... ...
... ...
a blokk utols utastsa

Haafejsoralatttbbbehzottutastsvan,akkormindegyiknekpontosanugyanannyirakellbehzvalenni
(pldul 4 karakterrel kell beljebb lenni). Ezek a behzott utastsok alkotjk az utastsblokkot. Az
utastsblokk: egy logikai egyttest kpez utastsok sorozata, ami csak a fejsorban megadott felttelek
teljeslseesetnhajtdikvgre.Azelzbekezdspldjbanazifutaststtartalmazsoralattiktbehzott
soregylogikaiblokkotalkot:ezaktsorcsakakkorhajtdikvgre,haazifelteszteltfeltteligaz,vagyishaa
2velvalosztsmaradkanulla.

12 Emlkeztet:a%opertora modulo opertor:egyegszosztsmaradktszmolja.gypldul, a%2a2vel


valosztsmaradktadja.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 32.
3.5 Egymsbagyazottutastsok
Komplexdntsistruktrkltrehozshozegymsbagyazhattbbsszetettutasts.Plda:
if torzs == "gerincesek": # 1
if osztaly == "eml sk": # 2
if rend == "ragadozk": # 3
if csalad == "macskaflk": # 4
print "ez egy macska lehet" # 5
print "ez minden esetre egy eml s" # 6
elif osztaly == 'madarak': # 7
print "ez egy kanri is lehet" # 8
print"az llatok osztlyozsa sszetett" # 9

Elemezzkapldt.Aprogramrszletcsakabbanazesetbenrjakiazezegymacskalehetet,haazels
ngyfeltteligaz.
Azezmindenesetreegyemlskirshozszksgesselgsges,hogyazelsktfeltteligazlegyen.Az
utbbimondatot(6.sor)kiratutastsugyanazonabehzsiszintenvan,mintazifrend==''ragadozk''(3.
sor).Aktsortehtugyanannakablokknakarsze,amiakkorhajtdikvgre,haaz1.s2.sorbantesztelt
felttelekigazak.
Azeztalnegykanriszvegkirshozazszksges,hogyatrzsnevvltozagerincesekrtket,
sazosztlynevvltozamadarakrtkettartalmazza.
A9.sormondattmindenesetbenkirja,mivelugyanannakazutastsblokknakarsze,mintaz1.sor.

3.6 APythonnhnyszintaktikaiszablya
Azelzekalapjnsszefoglalunknhnyszintaktikaiszablyt:

3.6.1 Azutastsoksablokkokhatraitasortrsdefinilja
Szmosprogramozsinyelvbenmindensortspeciliskarakterrelkellbefejezni(gyakranpontosvesszvel).A
Pythonbanasorvgejel13 jtszaeztaszerepet.(Aksbbiekbenmajdmegltjuk,hogyhogyanhghatteza
szably,hogyegysszetettkifejezsttbbsorraterjessznkki.Egyutastssortkommenttelisbefejezhetnk.
EgyPythonkommentmindiga#karakterrelkezddik.Amia#karaktersaLF(linefeed)karakterkzttvan,a
fordtfigyelmenkvlhagyja.
Anyelvektbbsgbenazutastsblokkotspecilisjelekkelkellhatrolni(nhaabeginsendutastsokkal)
AC++bansJavaban,pldul,azutastsblokkotkapcsoszrjelekkelkellhatrolni.Ezlehetvteszi,hogy
az utastsblokkokat egyms utn rjunk anlkl, hogy a behzsokkal s a sorugrsokkal foglalkoznnk.
Azonbanezzavaros,nehezenolvashatprogramokrshozvezethet.Ezrtmindenprogramoznak,akiezeketa
nyelvekethasznljaazttancsolom,hogyalkalmazzkasorugrsokatsabehzsokatisablokkokjvizulis
hatrolsra.

13 Ezakaraktersemakpernyn,semanyomtatottlistkonnemjelenikmeg.Ennekellenrejelenvansbizonyos
esetekben problmkat okoz, mert nincs azonos mdon kdolva a klnbz opercis rendszerekben. Errl
ksbbfogokbeszlni,amikoraszvegfileokrltanulunk(116.oldal)

33. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
A Pythonban hasznlnunk kell a sorugrsokat s a behzsokat, viszont nem kell ms blokkhatrol
szimblumokkal foglalkoznunk. Vgeredmnyben a Python olvashat kdok rsra s olyan j szoksok
felvtelreknyszertbennnket,amiketmegfogunkriznimsprogramozsinyelvekhasznlatasornis.

3.6.2 sszetettutasts=Fej,kettspont,behzottutastsokblokkja
Akvetkezfejezettlkezdvesokszorleszalkalmunkazutastsblokkfogalmnakazelmlytsres
gyakorlatokvgzsreebbenatrgykrben.
Aszemkztismasszefoglaljaazelvet:
Az utastsblokkok mindig egy jldefinilt utastst tartalmaz
fejsorhoz kapcsoldnak (if, elif, else, while, def, ...), ami
kettspontravgzdik.

A blokkokat behzs hatrolja: egyazon blokk minden sornak


pontosanugyangykellbehzvalenni(vagyisugyanolyanszm
betkzzelkelljobbraeltolvalennik14).Abehzsraakrmennyi
szkzthasznlhatunk, aprogramoktbbsgea4tbbszrseit
alkalmazza.
Jegyezzkmeg,hogyalegklsblokknak(1.blokk)abalmargn
kelllenni(semmibesincsbegyazva).

3.6.3 Aspaceeketsakommenteketrendszerintfigyelmenkvlhagyjaaz
interpreter
A sor elejn lvabehzsraszolglszkzktl eltekintveaz utastsok s kifejezsek belsejben
elhelyezett szkzket majdnem mindig figyelmen kvl hagyjuk (kivve, ha ezek egy karakterlnc rszt
kpezik).Ugyanezvonatkozikakommentekre:ezekmindiga#karakterrelkezddneksazaktulissorvgig
tartanak.

14Tabultorokkalisbehzhatunk,deakkornagyongyelnikellarra,hogyazokatkvetenugyanabbanablokkban
behzsra ne hasznljunk hol szkzkeket, hol pedig tabultorokat. Mg ha az eredmny azonosnak is tnik a
kpernyn,aspaceeksatabultorokklnbzbinriskdak:aPythonezrtezeketasorokatgyfogjatekinteni,
hogy klnbz kppen vannak behzva, igy klnbz blokkoknak a rszei. Ez nehezen debugolhat hibkat
eredmnyezhet.
Kvetkezsknt a programozk tbbsge a tabullsokrl inkbb lemond. Ha egy ''intelligens'' szvegszerkesztt
hasznlunk,a''Tabulcihelyettestseszkzzel''opciaktivlsvalelkerlhetjkaproblmt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 34.
4.Fejezet: Ismtldutastsok

4.1 Ismteltrtkads
Mg nem jeleztem explicit mdon: annyiszor rendelhetnk j rtket egy vltozhoz, ahnyszor csak
akarunk.
Azismteltrtkadsavltozrgirtktegyjrtkkelhelyettesti.
>>> magassag = 320
>>> print magassag
320
>>> magassag = 375
>>> print magassag
375

Ezjrafelhvjaafigyelmnketarraatnyre,hogyazegyenlsgjeletaPythonbanrtkadsrahasznljuks
hogysemmiesetresemkellaztsszekeverniamatematikbanhasznltegyenlsgjellel.Csbtamagassag=
320utaststegyenlsgrevonatkozlltskntinterpretlni,deaznemaz!

Elszris,azegyenlsgkommutativ,mgazrtkadsnemaz.gyamatematikbanaz a=7s 7=a


rsaegyenrtk,mgazolyanprogramutasts,minta375=magassagilleglis.

Msodszor, az egyenlsg lland, mg az rtkadst helyettesteni lehet, amint azt lttuk. Ha a


matematikbanegylevezetselejnaz a=b egyenlsgetlltjuk,akkoraz a azelkvetkezegsz
okfejtsalattllandmarad.
Aprogramozsbanazelsrtkadsktvltozrtkeitegyenlvtehetisegykvetkezutastsazutnaz
egyikvagyamsikrtktmegvltoztathatja.Plda:
>>> a = 5
>>> b = a # a s b egyenl rtkeket tartalmaz
>>> b = 2 # a s b most klnbz ek

Megismtlem,aPythonlehetvteszi,hogytbbvltoznakegyidbenadjunkrtket:
>>> a, b, c, d = 3, 4, 5, 7

APythonnakezatulajdonsgasokkalrdekesebb,mintamilyennekelspillantsratnik.
Tegykfelpldul,hogymostmegszeretnnkvltoztatniazascvltozkrtkeit.(Pillanatnyilagartke3,
scrtke5.Aztszeretnnk,hogyezfordtvalegyen.)Mittegynk?

(4) Gyakorlat
4.1. rjamegaszksgesazutastssorokat,amikakvnteredmnytadjk.
Azgyakorlatsornazolvasbiztosantalltegymegoldsimdszert,satanravalsznlegmegfogjar
krni,hogykommentljaaztazosztlyban.Mivel egymegszokottmveletrlvansz,ezrtaprogramozsi
nyelvek gyakran egy rvidtst knlnak a vgrehajtsra (pldul specilis utastsokat, mint a Basic nyelv
SWAP utastsa). A Pythonban, a tbbszrs rtkads lehetv tesziennek a csernek arendkvl elegns
programozst:
>>> a, b = b, a

(Termszetesenugyanabbanazutastsbanmsvltozkrtktisfeltudnnkegyidejlegcserlni).

35. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
4.2 Ciklikusismtldsekawhileutasts
Azegyikdolog,amitaszmtgpekalegjobbancsinlnak,azazazonosfeladatokhibanlkliismtlse.Az
ismtld feladatok programozsra lteznek eljrsok. Az egyik legalapvetbbel fogjuk kezdeni: a while
utastssalltrehozottciklussal.
rjukbeakvetkezutastst:

>>> a = 0
>>> while (a < 7): # (ne felejtsk el a kett spontot !)
... a = a + 1 # (ne felejtsk el a behzst !)
... print a

Nyomjunkmgegyszer<Enter>t.
Mitrtnik?

Mielttelolvassaakvetkezoldalmagyarzatt,sznjonregykisidtsrjaleafzetbeeztazutasts
sorozatot.rjaleakapotteredmnytissprbljamegalehetlegrszletesebbenmegmagyarzni.

Magyarzatok
A while jelentse: amg. Ez az utasts jelzi a Pythonnak, hogy az utna kvetkez utastsblokkot
mindaddigfolyamatosankellismtelnie,amgazavltoztartalma7nlkisebb.

Mintazelzfejezetbentrgyaltifutasts,awhileutastsisegysszetettutaststkezdmeg.Akettspont
asorvgnamegismtlendutastsblokkotvezetibe,aminekktelezenbeljebbigaztvakelllenni.Ahogyan
aztazelzfejezetbenmegtanultuk,egyazonblokkvalamennyiutastsnakazonosmrtkbenkellbehzva
lenni(vagyisugyanannyiszkzzelkelljobbraeltolvalennik).
Megkonstrultuk teht els programhurkunkat, ami bizonyos szm alkalommal megismtli a behzott
utastsokblokkjt.Ezakvetkezkppenmkdik:
AwhileutastsesetnaPythonazrjelbenlevfelttelkirtkelsvelkezdi.(Azrjelopcionlis.Csaka
magyarzatvilgossttelerdekbenhasznlom)
Haafelttelhamis,akkorakvetkezblokkotfigyelmenkvlhagyjasaprogramvgrehajtsbefejezdik15.
Haafeltteligaz,akkoraPythonaciklustestetalkotteljesutastsblokkotvgrehajtja,vagyis:
aza=a+1utastst,ami1gyelincrementljaazavltoztartalmt
(ami azt jelenti, hogy az a vltozhoz hozzrendelnk egy j rtket, ami egyenl az a 1gyel
megnveltelzrtkvel).
aprintutastst,amikiratjaazavltozaktulisrtkt
amikorezaktutastsvgrehajtdott,akkortanivoltunkazelsiterrcinak,saprogramhurok,vagyisa
vgrehajtsvisszatrawhileutaststtartalmazsorra.Azotttallhatfeltteltjrakirtkelisgytovbb.

Hapldnkban,aza<7felttelmgigaz,aciklustestjravgrehajtdiksfolytatdikaciklus.

15 ...legalbbisebbenapldban.Ksbbmegfogjukltni,hogyaprogramvgrehajtsabehzottblokkotkvet
elsutastssalfolytatdikshogyezugyanannakazutastsblokknakkpeziarszt,mintamelyiknekawhile
utastsrsze.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 36.
Megjegyzsek:
A felttelben kirtkelt vltoznak a kirtkelst megelzen lteznie kell. (Egy rtknek kell mr
hozzrendelvelenni.)
Haafeltteleredetileghamis,akkoraciklustestsohasemfogvgrehajtdni.
Haafelttelmindigigazmarad,akkoraciklustestvgrehajtsavgnlklismtldik(delegalbbisaddig,
amgaPythonmagamkdik).gyelnikellr,hogyaciklustestlegalbbegyolyanutaststtartalmazzon,
amia whilelalkirtkeltfelttelbenmegvltoztatjaegybeavatkozvltozrtktgy,hogyezafelttel
hamisstudjonvlnisaciklusbefejezdjn.

Vgtelencikluspldja(kerlend):
>>> n = 3
>>> while n < 5:
... print "hello !"

37. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
4.3 Tblzatkszts
Kezdjkjraazelsgyakorlattal,deazalbbikismdostssal:
>>> a = 0
>>> while a < 12:
... a = a +1
... print a , a**2 , a**3

Az1tl12igterjedszmokngyzetnekskbneklistjtkellmegkapnunk.
Jegyezzkmeg,hogyaprintutastslehetvteszi,hogyugyanabbaasorbatbbkifejezstrassunkki,egyiket
amsikutn:elgvesszvelelvlasztaniket.APythonautomatikusanbeszregyszkztakirtelemekkz.

4.4 Egymatematikaisormegalkotsa
AzalbbikisprogramaFibonaccisorelstzelemtratjaki.Egyolyanszmsorrlvansz,amelynek
minden tagja egyenl az t megelz kt tag sszegvel. Elemezzk ezt a (tbbszrs rtkadst helyesen
alkalmaz)programot.rjuklealehetlegjobbanazutastsokszerept.
>>> a, b, c = 1, 1, 1
>>> while c < 11 :
... print b,
... a, b, c = b, a+b, c+1

Amikorelindtjukaprogramot,akvetkeztkapjuk:
1 2 3 5 8 13 21 34 55 89

AFibonaccisortagjaiugyanabbaasorbavannakkirva.Eztannakavessznekksznhetjk,amitaprint
utaststtartalmazsorvgrertunk.Hatrljkavesszt,akkoraszmokegymsallesznekrva.
Azolvasnagyongyakranfogaprogramjaibanolyanciklusokatrni,mintamilyeneketittelemznk.Fontos
dologrl van sz, amit tkletesen kell tudni kezelni. Legyen benne biztos, a gyakorlatok segtsgvel
fokozatosanelfogjutniodig.
Amikoregyilyentermszetproblmtvizsglunk,termszetesenmegkellnznnkazutastssorokat,de
fkntaciklusbanrintettklnbzvltozkegymstkvetllapotaitkellelemeznnk.Ezkorntsemmindig
egyszer.Hogysegtsekeztvilgosabbtenni,vegykafradsgotsrajzoljunk egy,azalbbihozhasonl,
llapottbltaFibonaccisorprogramunknak:
Vltozk a b c
Kezdrtkek 1 1 1
Aziterrcisorn 1 2 2
egymsutnfelvett 2 3 3
rtkek
3 5 4
5 8 5
... ... ...
Helyettest b a+b c+1
kifejezsek
Egyilyentblzatbankzzelvgezzkelaszmtgpmunkjt,sorrlsorramegadvaazokatazrtkeket,
amiketazegyesvltozkazegymstkvetiterrcikbanflfognakvenni.Azzalkezdjk,hogyatblzat
tetejrefelrjukazrintettvltozknevt.Akvetkezsorbaezenvltozkkezdrtkeikerlnek(azokaz

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 38.
rtkek, amikkel a ciklus indulsa eltt rendelkeztek). Vgl legalulra azok a kifejezsek kerlnek, amiket
mindenegyesciklusbanazegyesvltozkllapotnakmdostsrahasznltunk.
Kitltjkazelsiterrciknakmegfelelnhnysort.Egysorrtkeinekameghatrozshozelgazelz
sorrtkeit,sazegyesoszlopokaljntallhathelyettestkifejezstfelhasznlni.gyellenrizzk,hogyamit
kapunkazakeresetteredmnye.Hanemezahelyzet,akkormshelyettestkifejezseketkellkiprblni.

Gyakorlatok:
4.2. rjonegyprogramot,amikiratjaa7esszorztblaels20tagjt.

4.3. rjonegyprogramot,amieurbankifejezettpzsszegeketkanadaidollrbavlttsaz
eredmnytegytblzatbarjaki.Atblzatbanapzsszegekgeometriaihaladvny
szerintnvekedjenekgy,mintazalbbipldban:
1euro=1.65dollar
2euro=3.30dollar
4euro=6.60dollar
8euro=13.20dollar
stb.(16384euronlkellmegllni)

4.4. rjonegyprogramot,amikiregy12szmblllsorozatot,aminekmindentagjavagy
egyenlazelztaggal,vagyannakhromszorosa.

4.5 Azelsscriptek,avagy:Hogyanrizzkmegprogramjainkat?
EddigaPythontmindiginteraktvmdbanhasznltuk(vagyisazutastsokatmindenalkalommalkzvetlenl
azinterpreterbertukbeanlkl,hogyazokatksbbegyfilebamentettkvolna).Ezlehetsgetadottarra,hogy
kzvetlen ksrletezssel nagyon gyorsan megtanuljuk a nyelv alapjait. Ez az eljrs egy nagy
knyelmetlensggeljr:mindenutastssorozat,amitbertunk helyrehozhatatlanuleltnik amikorlezrjukaz
interpretert.Mieltttovbbhaladnnkmegtanuljukprogramjainkmerevlemezenvagyfloppynlvfilebaval
mentst,hogyegymstkvetfzisokbanttudjukketdolgozni,msgpekrettudjukketvinni,stb.
Ehhezmostantlfogvavalamilyenszvegszerkesztvelfogjukazutastssorozatainkatszerkeszteni(pldul
LinuxalattJoeval,Nedittel,Katetel,...MSDOSalattEdittel,...WindowsalattWordpaddel,vagymgjobb
egyolyanfejlesztkrnyezetbeliszvegszerkeszt,mintazIDLEvagyaPythonWin).Tehtrunkegyscriptet,
amitaztnelmenthetnk,mdosthatunk,msolhatunk,stb.,mintbrmilyenmsszveget,amitaszmtgppel
kezelnk16.

16 Szvegszerkeszttazzalafelttellelhasznlhatnnk,hogyamentsttisztaszvegknt(plaintext)vgeznnk
(laptrdelsitageknlkl).Kvnatosabbazonbanegyvaldi inteligensANSIszvegszerkesztthasznlni,
mintamilyenaneditvagyazIDLE.EzekaPythonszintaxisnakmegfelelensznezikaforrsszveget,amisegti
aszintaxishibkelkerlst.AzIDLEben:FileNewwindow(vagyCTRLN)valmegnyitunkegyjablakot,
amibeascriptnketfogjukrni.Avgrehajtshozascriptmentseutn:EditRunscript(vagyCTRLF5).

39. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
AzalbbibraaNedithasznlattillusztrljaGnome(Linux)alatt:

Utna,amikorszeretnnkaprogramunkattesztelni,elgleszelindtaniaPythoninterpretert,argumentumknt
ascriptettartalmazfilenevtmegadva.Pldul,haazEnScriptemnevfilebamentettnkelegyscriptet,
akkorelgleszakvetkezparancsotberniegyterminlablakba,hogyascriptvgrehajtdjon:
python EnScriptem

Hogymgjobbancsinljuk,adjunkafilenakolyannevet,ami.pykiterjesztsrevgzdik.

Hatiszteletbentartjukeztakonvencit,akkor(Windows,KDE,Gnome,alatt)afilemanagerben(Explorera
Windows vagy Konqueror a KDE alatt) a filenvre vagy a megfelel ikonra kattintva elindthatjuk a script
vgrehajtst.Ezekagrafikusfilemanagerektudjk,hogymindenalkalommal,amikorafelhasznlmegprbl
megnyitniegy.pykiterjesztsfilet,elkellindtskaPythoninterpretert.(Eztermszetesenaztfelttelezi,hogy
ezek megfelelen voltak konfigurlva.) Ugyanez a konvenci ezen kvl lehetv teszi az intelligens
szvegszerkesztknekaPythonscriptekautomatikusfelismerstsaszintaktikussznezsalkalmazst.
EgyPythonscriptolyanutastsszekvencikatfogtartalmazni,mintamilyenekkeleddigksrleteztnkMivel
ezeketazutastssorokatarrasznjuk,hogymegrizzksksbbakrmagunk,akrmsokjraolvassk,ezrt
melegen ajnlott, hogy scriptjeinket a lehet legjobban szvegezzk meg, bsgesen kommentezzk. A
programozs f nehzsge a korrekt algoritmusok elksztse. Ahhoz, hogy az algoritmusokat j felttelek
mellett tudjuk ellenrizni, javtani, mdostani, stb., lnyeges, hogy szerzjk a lehet legteljesebben s
legvilgosabbanrjaleket.Ezeknekalersoknakalegjobbhelyemagaascript(gyazoknemveszhetnekel).
Egy j programoz mindig gyel arra, hogy sok kommentet szrjon be a scriptjeibe. Ezzel az eljrssal
nemcsakazesetlegesmsolvasknakknnytimegazalgoritmusaiolvasst,demagtisknyszertiarra,hogy
mgvilgosabbgondolatailegyenek.
Egyscriptbeszintebrhovabrmilyenkommentetbeszrhatunk.Elgeljktenniegy#karaktert.Amikora
Python interpreter rtall erre a karakterre, ami utna kvetkezik azt figyelmen kivlhagyja az aktulis sor
vgig.
rtskmeg,hogyfontos,hogyaprogramozs menetesorn rjunkkommenteket.Nevrjukmegascript
befejezst,hogymajdutnarjukhozzazokat.Azolvaslassankntrfogjnni,hogyaprogramozrendkvl
sokidttltasajtkdjajraolvassval(azrt,hogymdostsa,hibt
keressenbenne,stb.)Eztazjraolvasstnagybanegyszerstiaszmosmagyarzatsmegjegyzs.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 40.
Nyissukmegaszvegszerkesztnketsrjukbeazalbbiscriptet:

# Els Python script


# Fibonacci-sort rat ki, azaz egy olyan szmsort, aminek minden tagja
# az el z kt tag sszege.

a, b, c = 1, 1, 1 # a & b az egymst kvet tagok szmolsra valk


# c egy szmll
print 1 # az els tag kiratsa
while c<15: # sszesen 15 tagot ratunk ki
a, b, c = b, a+b, c+1
print b

Azrt,hogyrgtnjpldtmutassak,ascriptetaprogrammkdsnekrvidlersttartalmazhrom
kommentsorralkezdjk.Vljonezazolvasnakisszoksvasajtscriptjeinl.
Akdsorokdokumentlvavannak.Hagyjrel,ahogyann,vagyisamegfelelutastsokjobboldalraszr
bekommenteket,akkorgyeljenr,hogyelggellegyenektolvaazutastsoktlazrt,hogynezavarjkazok
olvashatsgt.
Amikoralaposanellenriztkaszvegnketmentskelshajtassukvgre.
Megjegyzs: Br nem felttlenl szksges, de mgegyszer azt javaslom, hogy a scriptjeinknek .py
kiterjesztsre vgzd fileneveket adjunk. Ez sok segtsget jelent egy folderben trtn azonostsuknl. A
grafikus filekezelk (Windows Explorer, Konqueror) egybknt ezt a kiterjesztst hasznljk arra, hogy egy
specilis ikont kapcsoljanak hozzjuk. Viszont kerljk az olyan nevek vlasztst, amik mr ltez python
moduloknakanevei.Olyanneveketpldul,mintmath.pyvagyTkinter.pytiloshasznlni!
HaLinuxalattszvegmdbandolgozunk,vagyMSDOSablakban,scriptnketapythonscriptnvutastssal
hajtathatjukvgre.HaLinuxalattgrafikusmdbandolgozunk,megnyithatunkegyterminlablakotsugyangy
jrhatunkel.AWindowsExplorerbenvagyaKonquerorbanscriptnkvgrehajtstamegfelelikonratrtn
egrkattintssalindthatjuk.
Haaz IDLEleldolgozunk,aszerkesztsalatta <CtrlF5> billenty kombincisegtsgvelindthatjuk
scriptnket.Konzultljontanrvalazesetlegesmsindtsilehetsgekrlmsopercisrendszerekben.

4.6 kezetessspeciliskarakterekrevonatkozmegjegyzs:
A2.3verzitlkezdveamagyarnyelvethasznlknakajnlatosmindenPythonscriptjkelejrebernia
kvetkezpszeudocommentekegyikt(ktelezenazelsvagyamsodiksorba):
# -*- coding:Latin-2 -*-

vagy:
# -*- coding:Utf-8 -*-

EzekapszeudocommentekaztjelzikaPythonnak,hogyascriptben:
vagyafnyugateurpainyelvekkezeteskarakterkszletthasznljuk(francia,olasz,portugl,stb.)egy
byteonkdolvaazISO8859normaszerint;
vagyaUnicodenaknevezettktbyteoskdolsthasznljuk(aminekazUtf8vltozatacsakaspecilis
karaktereketkdoljaktbyteon,astandardASCIIkarakterekegybyteonvannakkdolva).Ezazutbbi
rendszeregyrejobbankezdelterjedni,mivellehetvteszimindenfleeredet(grg,arab,ciril,japn,stb.)

41. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
karakteregyttltezstugyanabbanadokumentumban.
APython mindktrendszert tudjahasznlni, demeg kell nekiadnunk, hogy melyiket hasznljuk. Ha az
opercis rendszernk gy van konfigurlva, hogy a billentyletsek Utf8 kdokat generlnak, akkor
konfigurljukgyaszvegszerkesztnket,hogyaziseztakdothasznljastegykafntmegadottmsodik
pszeudocommentetmindenscriptnkelejre.
Ha az opercis rendszernk a rgi norma (ISO8859) szerint mkdik, akkor inkbb az els pszeudo
commentetkellhasznlnunk.
Hasemmitsemadunkmeg,akkoridnkntfigyelmeztetzeneteketfogunkkapniazinterpretertlsesetleg
nmi nehzsgeket fogunk tapasztalni amikor az IDE krnyezetben szerkesztjk scriptjeinket (specilisan
Windowsalatt).
Fggetlenlattl,hogyegyik,vagymsiknormt,vagyegyiketsemhasznljuk,ascriptnkkorrektmdon
fogvgrehajtdni.Ahhoz,hogyasajtrendszernkntudjukakdotszerkeszteni,amegfelelopcitkell
vlasztani.

Gyakorlatok:
4.5. rjonegyprogramot,amikiszmoljaegyderkszgparallelepipedontrfogatt,aminek
megvanadvaaszlessge,amagassgasahosszsga.

4.6. rjonegyprogramot,amitszmoljaakiindulskntmegadottegszszmmsodpercet
vekk,hnapokk,napokk,percekksmsodpercekk.
(Hasznljaamoduloopertort:%).

4.7. rjonegyprogramot,amikiratjaa7esszorztblaels20tagjt,csillaggaljellveazokat,
amelyek3naktbbszrsei.
Plda:71421*283542*49

4.8. rjonegyprogramot,amikiszmolja13asszorztblaels50tagjt,decsakazokatrjaki,
melyek7nektbbszrsei.

4.9. rjonegyprogramot,amiakvetkezjelsorozatotrjaki:

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

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 42.
5.Fejezet: Afadattpusok
A2.fejezetbenmrkezeltnkklnbztpusadatokat:egszsvalsszmokatskarakterlncokat.Ideje
mostmregykicsitkzelebbrlismegvizsglniezeketazadattpusokatsmsokatisfelfedezni.

5.1 Numerikusadatok
Azeddigigyakorlatokbanmrhasznltunkktadattpust:egszsvalsszmokat(utbbiakatlebegpontos
szmoknakisnevezik).Prbljukmegbemutatniezekjellemzit(skorltait):

5.1.1 Azintegerslongtpusok
Tegykfel,hogy gy szeretnnkmdostaniazelz Fibonacci sorozatosgyakorlatunkat,hogytbbtagot
rassunk ki. A priori elegend a msodik sorban megvltoztatni a ciklus felttelt. A while c<49:
felttellel49tagotkellkapnunk.Mdostsuktehtagyakorlatotgy,hogykiratjukafvltoztpustis:
>>> a, b, c = 1, 1, 1
>>> while c<49:
print c, " : ", b, type(b)
a, b, c = b, a+b, c+1
...
...
... (az els 43 tag kiratsa)
...
44 : 1134903170 <type 'int'>
45 : 1836311903 <type 'int'>
46 : 2971215073 <type 'long'>
47 : 4807526976 <type 'long'>
48 : 7778742049 <type 'long'>

Millapthatmeg?
Hanemhasznlnnka type() fggvnyt,amimindenegyesiterrcialkalmvallehetvteszia b vltoz
tpusnakellenrizst,akkorsemmitsemvennnkszre.AFibonacciszmoksorozattmindenproblmanlkl
kiratjaascript(smgszmostaggalmeghosszabbthatnnkasort).
gytnikteht,hogyaPythonbrmilyenmretegszszmotkpeskezelni.
Ennekellenreazelzgyakorlatjelzi,hogyvalamitrtntamikorezekaszmoknagyonnaggyvltak.
Aprogramelejnaza,bscvltozkimplicitmdonintegertpusaknakvannakdefinilva.mindigeztrtnik
a Pythonban, amikor egy egsz szmot rendelnk egy vltozhoz, feltve, hogy a szm nem tl nagy. A
szmtgpmemrijbanezazadattpusegy4bytebl(vagy32bitbl)llblokkformjbanvankdolva.
Mrpediga4byteonkdoltdecimlisrtkektartomnya2147483648tl+2147483647igterjed.(Lsdaz
ltalnosinformatikaikurzust).
Azilyentpusszmokkalvgzettszmolsokmindignagyongyorsak,merta szmtgpprocesszoraaz
ilyen32bitesegszszmokatkzvetlenlkpeskezelni.Viszont,hanagyobb szmokat,vagyvalsszmokat
(lebegpontosszmok)kellkezelni,akkoraprogramoknak,(azinterpreterekneksacompilereknek)jelents
kdolsi/dekdolsi munkt kell vgeznik, hogy vgl a processzornak csak maximum 32 bites binris
egszekentrtnmveleteketkldjenek.

43. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Aztmrtudjuk,hogyaPythondinamikusandefiniljaavltozinakatpust.
Mivelaleghatkonyabbtpusrlvansz(mindszmolsisebessgben,mindmemriafoglalsbankifejezve),
ezrtaPythonalaprtelmezsbenmindenalkalommal,amikorcsaklehetazintegertpusthasznlja,vagyishaa
kezeltrtkekafentebbmremltetthatrokkzttvannak(kb.2millird).
Haakezeltrtkekezekenahatrokonkvlesnek,akkorakdolsukbonyolultabbvlikaszmtgp
memrijban.Azokavltozk,amelyekhezilyenszmokatrendelnk,automatikusanhosszegszeknek
lesznekdefinilva(eztatpustaPythonterminolgibanlongnaknevezzk)

Ezalongtpusazegszrtkekmajdnemvgtelenpontossgkdolstteszilehetv.Egyilyenformban
definilt rtk akrhny szignifikns szmjeggyel rendelkezhet, mivel ezt a szmot csak a szmtgp
memrijnakmretelimitlja.

Plda:
>>> a, b, c = 3, 2, 1
>>> while c < 15:
print c, ": ", b
a, b, c = b, a*b, c+1

1 : 2
2 : 6
3 : 12
4 : 72
5 : 864
6 : 62208
7 : 53747712
8 : 3343537668096
9 : 179707499645975396352
10 : 600858794305667322270155425185792
11 : 107978831564966913814384922944738457859243070439030784
12 : 64880030544660752790736837369104977695001034284228042891827649456186234
582611607420928
13 : 70056698901118320029237641399576216921624545057972697917383692313271754
88362123506443467340026896520469610300883250624900843742470237847552
14 : 45452807645626579985636294048249351205168239870722946151401655655658398
64222761633581512382578246019698020614153674711609417355051422794795300591700
96950422693079038247634055829175296831946224503933501754776033004012758368256
>>>

Afentipldbanakirtszmokmretenagyongyorsann,mertmindegyikkazelzktszmszorzatval
egyenl.
Kiindulskoraza,bsc integer tpusak,mertkisegszrtkeket:3,2s1:rendelnkhozzjuk.A8.
iterrcitlkezdveazonbana b s a automatikusan long tpusakklesznek alaktva:a6oss7estagok
szorzsnakeredmnyemrjvalafentebbemltett2millirdoshatrflttvan.
A sor egyre nagyobb szmokkal folytatdik, de a szmols sebessge cskken. A long tpusknt trolt
szmokmretktlfggenvltozmennyisghelyetfoglalnakelaszmtgpmemrijban.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 44.
5.1.2 Afloattpus
Avalsszm,vagylebegpontosnumerikusadattpussal,amitangolulfloatingpointnumbernek
nevezneksamitemiattfloatnakfogunknevezniaPythonban,mrtallkoztunk.
Ezatpusnagyonnagyvagynagyonkisszmokkal(pldultudomnyosadatokkal)trtnszmolsokat
teszlehetvllandpontossggal.
Ahhoz,hogyaPythonegynumerikusadatotfloattpusnaktekintsen,elegend,haaszmegytizedespontot,
vagy10nekegyhatvnykitevjttartalmazza.
Pldulakvetkezrtkeket:
3.1410..0011e1003.14e10

aPythonautomatikusanfloattpuskntrtelmezi.
Prbljukkieztazadattpustegyjprogramocskban(amitazelzinspirlt):
>>> a, b, c = 1., 2., 1 # => a s b 'float' tpusak lesznek
>>> while c <18:
... a, b, c = b, b*a, c+1
... print b

2.0
4.0
8.0
32.0
256.0
8192.0
2097152.0
17179869184.0
3.6028797019e+16
6.18970019643e+26
2.23007451985e+43
1.38034926936e+70
3.07828173409e+113
4.24910394253e+183
1.30799390526e+297
Inf
Inf

Ezalkalommalisegyolyansorozatotratunkki,melynektagjainagyongyorsannvekednek,lvnminden
tagazelzkttagszorzata.Anyolcadik taggalmesszemeghaladjukegy integer kapacitst.Akilencedik
taggalaPythonautomatikusanttratudomnyosjellsmdra(e+njelentse:szertzaznediken).A
tizentdik tag utn jra egy (hibazenet nlkli) tmenet tanui vagyunk, a valban nagyon nagy szmokat
egyszereninf(vgtelen)jelli.
Afloattpusa10308s10308kzes(pozitvvagynegatv)szmok12rtkesszmjegypontossggaltrtn
manipulcijt teszi lehetv. Ezek a szmok specilisan 8 byteon (64 biten) vannak kdolva a gp
memrijban: a kd egy rsze a 12 rtkes szmjegynek felel meg, a msik rsze a nagysgrendnek (10
hatvnynak).

45. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
(5) Gyakorlatok:
5.1. rjonegyprogramot,amiakiindulsulfokokban,percekbensmsodpercekbenmegadott
szgeketradinbaszmoljat.

5.2. rjonegyprogramot,amiakiindulsulradinokbanmegadottszgeketfokokba,percekbe
smsodpercekbeszmoljat.

5.3. rjonegyprogramot,amiCelsiusfokokbaszmoljatakiindulsulFahrenheitfokokban
kifejezetthmrskletetsafordtottirnytalaktstiselvgzi..
Aztalaktskplete: T F =T C 1,832 .

5.4. rjonegyprogramot,amiabankbanelhelyezett4,3%oskamatozstke20valatt
felhalmozdottvikamataitszmoljaki.

5.5. Egyrgiindiailegendaszerintasakkjtkotegyregblcstalltaki.Akirlymegakarta
aztnekiksznnisaztmondta,hogyjutalmulbrmilyenajndkotmegadrte.Azreg
aztkrte,hogyadjonnekiegykevsrizsetregnapjaira,pontosanannyiszemrizset,hogy
azltalafeltalltjtkelskockjra1szemet,2msodikkockrakettt,aharmadikra
ngyet,sgytovbbegszena64ikkockig.
rjon egy Python programot, ami kiratja a sakktbla 64 kockjnak mindegyikre
elhelyezettrizsszemekszmt.Szmoljakieztaszmotktflekppen
arizsszemekpontosszma(egszszm)
arizsszemekszmatudomnyosjellsmdban(valsszm)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 46.
5.2 Azalfanumerikusadatok
Eddig csak szmokat kezeltnk. Egy szmtgpprogram ugyangy kezelhet betkaraktereket, szavakat,
mondatokat,vagybrmilyenszimblumsorozatot.Aprogramozsinyelvektbbsgbenerreaclraltezikegy
karakterlnc(vagyangolulstring)nevadatszerkezet.

5.2.1 Astring(karakterlnc)tpus
APythonban string tpusadatbrmilyenkaraktersorozat,amitvagy szimplaidzjelek (aposztrof),vagy
duplaidzjelekhatrolnak
Pldk:
>>> mondat1 = 'a kemny tojst.'
>>> mondat2 = '"Igen", vlaszolta,'
>>> mondat3 = "nagyon szeretem"
>>> print mondat2, mondat3, mondat1
"Igen", vlaszolta, nagyon szeretem a kemny tojst.

A3vltoz:mondat1,mondat2,mondat3tehtstringtpusvltoz.
Jegyezzkmeg,hogyaz olyanstringeket,melyekbenaposztrofokvannak,idzjelekkelhatroljuk,mgaz
idzjelekettartalmazstringeketaposztrofokkalhatroljuk.Aztisjegyezzkmeg,hogyaprintutastsakirt
elemekkzegybetkztszrbe.
A\(backslash)nhnykiegsztfinomsgotteszlehetv:
Lehetvteszi,hogyegyparancsot,aminemfrelegysorban,azttbbsorbarjunk(ezbrmilyentpus
parancsrarvnyes).
Egykarakterlncbelsejbenabackslashspeciliskarakterek(sorugrs,aposztrofok,duplaidzjelek,stb.)
beszrstteszilehetv.Pldk:
>>> txt3 = "E\'meg kicsoda ? krdezte."
>>> print txt3
E'meg kicsoda ? krdezte.
>>> hello = "Ez egy hossz sor\n ami tbb szvegsort\
... tartalmaz (Azonos mdon \n m kdik, mint a C/C++.\n\
... Jegyezzk meg,hogy a white space-ek\n a sor elejn lnyegesek.\n"
>>> print hello
Ez egy hossz sor
ami tbb szvegsort tartalmaz (Azonos mdon
m kdik, mint a C/C++.
Jegyezzk meg,hogy a white space-ek
a sor elejn lnyegesek..

Megjegyzsek:
A\negysorugrstidzel.
A\'lehetvteszi,hogyaposztrofokkalhatroltkarakterlncbaaposztrofotszrjunkbe.
Mgegyszermegismtlem:akis/nagybetlnyegesavltoznevekben(Szigorantiszteletbenkelltartanunk
akezdetikis/nagybetvlasztst).

47. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Hromszorosidzjelek:
Hogyegykarakterlncbaknnyebbenszrjunkbespecilisvagyegzotikuskaraktereketanlkl,hogya
backslashtalkalmaznnk,vagymagtabackslashttudjukbeszrni,akarakterlncot hromszorosaposztroffal
vagyhromszorosidzjellelhatrolhatjuk:
>>> a1 = """
... Hasznlat: izee[OPTIONS]
... { -h
... -H host
... }"""

>>> print a1

Hasznlat: izee[OPTIONS]
{ -h
-H host
}

5.2.2 Hozzfrsegykarakterlncegyeskaraktereihez
Akarakterlncokaz sszetettadatoknaknevezettltalnosabbadattpusegyspecilisesettkpezik.Egy
sszetett adat egy olyan entits, ami egyszerbb entitsok egyttest egyetlen struktrban egyesti: egy
karakterlnc esetben pldul ezek az egyszerbb entitsok nyilvn maguk a karakterek. A krlmnyektl
fggenakarakterlncotholmintegyetlenobjektumot,holmintklnllkarakterekegyttestakarjukkezelni.
Egyolyanprogramozsinyelvet,mintaPythonttehtelkellltniolyaneljrsokkal,amiklehetvteszikegy
karakterlncegyeskaraktereihezvalhozzfrst.Ltnifogjuk,eznemolyanbonyolult:
Egy karakterlncot a Python a szekvencik kategria egy objektumnak tekint. A szekvencik elemek
rendezett egyttesei. Ez egyszeren azt jelenti, hogy egy string karakterei mindig egy bizonyos sorrendben
vannakelrendezve.Kvetkezskntastringmindenegyeskarakternekmeghatrozhataszekvenciabelihelye
egyindexsegtsgvel.
Ahhoz,hogyegyadottkarakterhezhozzfrjnk,a karakterlncottartalmaz vltoz neveutn szgletes
zrjelberjukakarakterstringbelipozcijnakmegfelelnumerikusindexet.
Figyelem : amint azt egyebtt ellenrizhetjk, az informatikban az adatokat majdnem mindig nulltl
kezdveszmozzuk(nempedigegytl).Ezahelyzetegystringkaraktereiesetben:
Plda:
>>> ch = "Stphanie"
>>> print ch[0], ch[3]
S p

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 48.
5.2.3 Elemimveletekkarakterlncokon
APythonnakszmos, karakterlncokkezelsreszolglfggvnyevan(kis/nagybetstalakts,rvidebb
karakterlncokravaldarabols,szavakkeresse,stb.).Aksbbiekbenelfogunkmlyedniebbenatrgykrben
(lsd129.oldalt).
Pillanatnyilag megelgedhetnk azzal, hogy tudjuk, klnkln hozzfrhetnk egy karakterlnc minden
egyeselemhez,aminteztfentebbmagyarztam.Tudjunkrla,hogyakvetkezketismegtehetjk:
tbbrvidkarakterlncblsszerakhatunkegyhosszabbat.Eztamveletetsszekapcsolsnak(concatenatio
nak)nevezzksa+opertorthasznljukraPythonban.(Ezazopertorszmokraalkalmazvaazsszeads
mveletre,mgkarakterlncokraalkalmazvaazsszekapcsolsraszolgl).
Plda:

a='Akishalbl'
b='nagyhallesz'
c=a+b
printc
Akishalblnagyhallesz

meghatrozhatjukegykarakterlnchosszt(vagyisakarakterekszmt)alen()fggvnyhvsval:

>>>printlen(c)
29

Egyszmotreprezentlkarakterlncotszmmalakthatunk.
Plda:

>>>ch='8647'
>>>printch+45
==>***error***nemadhatunksszeegystringetsegyszmot
>>>n=int(ch)
>>>printn+65
8712#OK:2szmotsszeadhatunk

Ebbenapldbanazint()belsfggvnyastringetszmmalaktja.Afloat()fggvnysegtsgvelvals
szmmlehetalaktaniegykarakterlncot.

49. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:

5.6. rjon egy programot, ami meghatrozza, hogy egy karakterlnc tartalmazzae az e
karaktert.
5.7. rjon egy programot, ami megszmolja az e karakter elfordulsainak szmt egy
stringben.
5.8. rjonegyprogramot,amiegyjvltozbamsoltegykarakterlncotgy,hogycsillagot
szrbeakarakterekkz.
gypldul,gastonblg*a*s*t*o*nlesz.
5.9. rjonegyprogramot,amiegyjvltozbafordtottsorrendbenmsoljategykarakterlnc
karaktereit.
gypldulzorglubblbulgrozlesz.
5.10. Az elz gyakorlatbl kiindulva rjon egy scriptet, ami meghatrozza, hogy egy
karakterlncpalindrome(vagyisamimindktirnyblolvasvaugyanaz),mintpldul
radarvagyss.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 50.
5.3 Alistk(elsmegkzelts)
Azelzfejezetbentrgyaltstringekazsszetettadatokravoltakazelspldk.Azsszetettadatokatarra
hasznljuk, hogy struktrltan csoportostunk rtkegytteseket. Lpsrllpsre fogjuk megtanulni ms
sszetettadattpusokhasznlatt:alistkt,atuplektsasztrakt(dictionnair)17.Ehromadattpuskzl
mostcsakazelstfogjukelgrvidentrgyalni.Egymeglehetsenterjedelmestmrlvansz,amiretbbszr
visszakellmajdtrnnk.
AlistadefincijaaPythonban:szgleteszrjelbezrt,vesszvelelvlasztottelemekcsoportja.Plda:
>>> nap = ['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek']
>>> print nap
['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek']

Ebbenapldbannapnevvltozrtkeegylista.

Megllapthatjuk:avlasztottpldbanalisttalkotelemekklnbztpusaklehetnek.Azelshrom
elemstring,anegyedikegsz,aztdikvalstpus,stb.(Aksbbiekbenltnifogjuk,hogyegylistamagais
lehetegylistnakeleme!).Ebbenatekintetbenalistafogalmameglehetsenklnbzikatmb(array)vagyaz
indexeltvltozfogalmtl,amivelmsprogramozsinyelvekbentallkozunk.
Jegyezzk meg, hogy a listk is szekvencik, gy mint a karakterlncok, vagyis objektumok rendezett
csoportjai. A listt alkot klnbz elemek mindig ugyanabban a sorrendben vannak elrendezve,
mindegyikkhz kln hozz tudunk frni, ha ismerjk a listabeli indexket. Ezeknek az indexeknek a
szmozsanulltlindul,nempedigegytl,akarakterlncokhozhasonlan.
Pldk:
>>> nap = ['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek']
>>> print nap[2]
szerda
>>> print nap[4]
20.357

Astringektl(amikegynemmdosthatadattpustkpeznek/erreaksbbiekbentbbszrleszalkalmunk
visszatrni/)eltrenegylistnakmeglehetvltoztatniazelemeit:
>>> print nap
['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek']
>>> nap[3] = nap[3] +47
>>> print nap
['htf ', 'kedd', 'szerda', 1847, 20.357, 'cstrtk', 'pntek']

17 Majdltrehozhatjukasajtadattpusainkatis,amikormegtanuljukazosztly(class)fogalmt(lsd161.oldal)

51. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Alistameghatrozottelemtakvetkezmdonhelyettesthetjkmselemmel:
>>> nap[3] = 'Jlius'
>>> print nap
['htf ', 'kedd', 'szerda', 'Jlius', 20.357, 'cstrtk', 'pntek']

A len() belsfggvny,amivelmrastringeknltallkoztunk,alistkraisalkalmazhat.Alistbanlev
elemekszmtadjavissza:
>>> len(nap)
7

Egymsikbelsfggvnyadel()18segtsgvel(azindexealapjn)brmelyikelemettrlhetjkalistbl
:
>>> del(nap[4])
>>> print nap
['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek']

Ugyangylehetsgvanarra,hogyhozzfzznkegyelemetegylisthoz,deahhoz,hogyeztmegtegykmeg
kellgondolni,hogyalistaegyobjektum,aminekazegyikmetdustfogjukhasznlni.Azobjektumsmetdus
fogalmakataksbbiekbenfogommegmagyarzni,demostmegtudommutatni,hogyezhogyanmkdikegy
listaspecilisesetben:
>>> nap.append('szombat')
>>> print nap
['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek', 'szombat']
>>>

Afentipldaelssorbanazappend()metdustalkalmaztuka'szombat'argumentummalanapobjektumra.
Haemlkeztetekarra,hogyazappendszhozzfzstjelent,akkorrthet,hogyazappend()metdusegyolyan
fggvnyfajta,amivalamilyenmdonalistatpusobjektumokhozvankapcsolva,vagyazobjektumokba
vanintegrlva.Afggvnnyelhasznlt argumentumtermszetesenazazelem,amitalistavghezakarunk
fzni.
Aksbbiekbenmegfogjukltni,hogyegszsorilyenmetdusvan(vagyisolyanfggvnyekamiklista
tpusobjektumokbavannakintegrlva,vagyinkbbbecsomagolva).Jegyezzkmeg,hogyegymetdustgy
alkalmazunkegyobjektumra,hogyegyponttalkapcsoljukketssze.(Ellllannakavltoznakaneve,ami
egyobjektumrahivatkozik,utnaapont,majdametdusneve,ezutbbitmindigegyzrjelprkveti).

18Lteznekolyantechnikklistkfeldarabolsra,elemcsoportokbeszrsra,elemekeltvoltsra,stb.,amikegy
sajtosszintaxisthasznlnak,amelybencsakazindexekfordulnakel.Ezeketa(karakterlncokraisalkalmazhat)
technikkat ltalnosan slicingnek (szeletelsnek) hvjuk. gy hasznljuk ket, hogy a szgletes zrjelbe tbb
indexetrunk.gyanap[1:3]a['kedd','szerda']alcsoportotjelli.Ezeketaspecilistechnikkategykicsitksbb
fogomlerni(lsda136.sazaztkvetoldalakat).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 52.
A karakterlncokhoz hasonlan a listkkal is rszletesen fogok foglalkozni a ksbbiekben (lsd a 133.
oldalt).Ennekellenreelgismeretnkvanahhoz,hogyeltudjukkezdenikethasznlniaprogramjainkban.
Elemezzkpldulazalbbikisscriptetsmagyarzzukmegamkdst:
nap = ['htf ', 'kedd', 'szerda', 'cstrtk', 'pntek', 'szombat', 'vasarnap']
a, b = 0, 0
while a<25:
a = a + 1
b = a % 7
print a, nap[b]

Az5.sorbanamoduloopertorthasznljuk,amivelmrelzlegtallkoztunksamijszolglatokat
tehetaprogramozsban.Szmosnyelvben(aPythonbanis)a%jelreprezentlja.Milyenmveletethajtvgre
ezazopertor?

Gyakorlatok:
5.11. Legyenekadottakakvetkezlistk:

t1=[31,28,31,30,31,30,31,31,30,31,30,31]
t2=['Janur','Februr','Mrcius','prilis','Mjus','Jnius',
'Jlius','Augusztus','Szeptember','Oktber','November','December']

rjonegykisprogramot,amiegyjt3listthozltre.Ennekfelvltvakelltartalmazniakt
lista minden elemt gy, hogy minden hnap nevt kvetnie kell a megfelel napok
szmnak:['Janur',31,'Februr',28,'Mrcius',31,stb...].

5.12. rjonegyprogramot,amikiratjaegylistasszeselemt.Hapldulafentigyakorlatt2
listjraalkalmaznnk,akkorakvetkeztkellenekapnunk:

JanurFebrurMrciusprilisMjusJniusJliusAugusztusSzeptember
OktberNovemberDecember

5.13. rjonegyprogramot,amimegkeresiegyadottlistalegnagyobbelemt.Pldul,haa [32,


5,12,8,3,75,2,15],listraalkalmaznnk,akkorakvetkeztkellenekirnia:

alistalegnagyobbelemnekazrtke75.

5.14. rjon egy programot, ami megvizsglja egy szmlista minden elemt (pldul az elz
pldalistjt)azrt,hogyktjlistthozzonltre.Azegyikcsakazeredetilistapros
szmaittartalmazza,amsikapratlanokat.Pldul,haakiindulsilistaazelzgyakorlat
listja,akkoraprogramnakegy proslistt kellltrehoznia,amia [32,12,8,2] t
tartalmazzasegypratlanlisttami[5,3,75,15]ttartalmazza.Trkk:Gondoljon
azelzekbenemltettmodulo(%)opertorhasznlatra!

5.15. rjonegyprogramot,amiegyszavakbllllistaelemeitegyenkntmegvizsgljaazrt,
hogyktjlistthozzonltre.(pldul:['Jean','Maximilien','Brigitte','Sonia','JeanPierre',
'Sandra']Azegyikben6karakternlrvidebbszavakatlegyenek,amsikban6,vagyannl
tbbkarakterttartalmazzonszavaklegyenek.

53. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
6.Fejezet: Elredefiniltfggvnyek
Aprogramozsbanazegyiklegfontosabbfogalomafggvny19fogalma.Afggvnyeklehetvteszik,hogy
egy sszetett programot egyszerbb alprogramokra bontsunk szt, amiket aztn megint kisebb darabokra
szedhetnk szt s gy tovbb. Msrszt a fggvnyek jra felhasznlhatk: ha van egy fggvnynk, ami
pldulngyzetgykttudszmolni,aztaprogramjainkbanmindenttjrafelhasznlhatjukanlkl,hogyjra
kellenernunkmindenegyesalkalommal.

6.1 Interakciafelhasznlval:azinput()fggvny
A kidolgozott scriptek tbbsge ignyli egyik vagy msik pillanatban a felhasznl beavatkozst (egy
paramterberst,egykattintstazegyikgombra,stb.).Egyszvegmdscriptben(mintamilyeneketeddig
rtunk) a legegyszerbb mdszer az input() bels fggvny alkalmazsa. Ez a fggvny a fut program
megszaktsteredmnyezi.Afelhasznltfelhvja,hogyrjonbeabillentyzettelkarakterekets<Enter>rel
fejezzebe.Amikorlenyomjaaz<Enter>taprogramvgrehajtsafolytatdiksafggvnyafelhasznlltal
bertrtketadjamegvisszatrsirtkl.Eztazrtketbrmilyenvltozhozhozzlehetrendelni.
Hvhatjukaz input() fggvnytgy,hogyazrjeletresenhagyjuk.Elhelyezhetnkbennea felhasznl
szmraegymagyarzzenetetis.Pldul:
print 'rjon be valamilyen egsz szmot : ',
nn = input()
print nn, 'ngyzete', nn**2

vagymg:
keresztnev = input('rja be a keresztnevt (idz jelben)')
print 'J napot, ', keresztnev

Fontosmegjegyzsek:
Azinput()fggvnyegyolyanrtketadvissza,aminekatpusaafelhasznlltalbertrtktpusnakfelel
meg.Pldnkbanaznnvltozegyegszet,egystringet,egyvalsszmot,stb.fogtartalmazniaszerint,hogy
hogyanfogafelhasznldnteni.Haafelhasznlegystringet akarberni,akkorazt aposztrofokvagy
idzjelekkzttkellbernia.Aksbbiekbenmajdmegltjuk,hogyegyjscriptnekmindigellenriznikell,
hogyabertrtktpusamegfeleleannak,amitaprogrambanvrunk.
Ezrtscriptjeinkbengyakranahasonlfunkcij raw_input() fggvnytfogjukelnybenrszesteni,ami
mindigegykarakterlncotadvissza.Eztakarakterlncotazutnazint()sfloat()fggvnyeksegtsgvel
szmmalakthatjuk.Plda:
>>> a = raw_input('rjon be egy adatot : ')
rjon be egy adatot : 52.37
>>> type(a)
<type 'str'>
>>> b = float(a) # talakts numerikus rtkk
>>> type(b)
<type 'float'>

19 A Pythonban a ''fggvny'' szt klnbsgttel nlkl hasznljuk egyszer a valdi fggvnyek, mskor az
eljrsok(procedure)jellsreAksbbiekbenmegfogjukhatrozniaklnbsgetaktkzelifogalomkztt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 54.
6.2 Fggvnymodulimportlsa
Mrtallkoztunkanyelvbebeptettfggvnyekfogalmval,mintamilyenpldulalen()fggvny,amia
karakterlnchossztadjameg.Magtlrtetd,hogynemlehetazsszeselkpzelhetfggvnytaPython
standardbabelevenni,mivelezekblvgtelensokvan:egybknthamarosanmegfogjuktanulni,hogyanhozzuk
ltre magunk j fggvnyeket. A nyelvbe beptett fggvnyek szma viszonylag csekly: ezek azok, amik
nagyongyakranhasznlhatk.Atbbiekmoduloknaknevezettklnfileokbanvannakcsoportostva.
Amoduloktehtfileok,amikfggvnycsoportokatfognakegybe. Aksbbiekbenmajdmegltjuk,hogy
knyelmesebb egy nagymret programot tbb kisebb mret rszre felbontani, hogy egyszerstsk a
karbantartst.EgyjellegzetesPythonalkalmazstehtegyfprogramblsegyvagytbbmodulblll,melyek
mindegyikekiegsztfggvnyekdefinciittartalmazza.
NagyszmmodultadnakhivatalosanaPythonnal.Msmodulokatmsszolgltatknltallhatunk.Gyakran
egymssal rokonsgban lv fggvnycsoportokat prblnak meg ugyanabba a modulba sszefogni, amit
knyvtrnakneveznk.

A math modulpldulszmosolyanmatematikaifggvnydefincijttartalmazza,mintasinus,cosinus,
tangens, ngyzetgyk, stb. Ezeknek a fggvnyeknek a hasznlathoz elg a scriptnk elejre beszrni a
kvetkezsort:
from math import *

EzasorjelziaPythonnak,hogyazaktulisprogrambabelekellvenniamathmodulmindenfggvnyt(ezt
jelzia*).Ezamodulegymatematikaifggvnyknyvtrattartalmaz.
Ascriptbepldulazalbbiakatrjuk:

gyok = sqrt(szam) ezagyoknevvltozhozrendeliaszamngyzetgykt,


sinusx = sin(szog) ezasinusxnevvltozhozrendeliaszog(radinban!)sinust,stb.

Plda:

# Demo : a <math> modul fggvnyeinek hasznlata

from math import *

szam = 121
szog =
Ascriptvgrehajtsakorakvetkezketrjaki:
ngyzetgyk 121 = 11.0
sinus 0.523598775598 radian = 0.5

55. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ezarvidpldamrnagyonjlillusztrljaafggvnyekfontosjellemzit:
afggvnyvalamilyennvsahozzkapcsoltzrjelekformjbanjelenikmeg
plda:sqrt()
azrjelekbenegyvagytbbargumentumotadunktafggvnynek
plda:sqrt(121)

afggvnynekvanegyvisszatrsirtke(aztismondjuk,hogyvisszaadegyrtket)
plda:11.0

Mindezeketakvetkezoldalakonfogomkifejteni.Ezekamatematikaifggvnyekcsakazelspldka
fggvnyekre.Egy pillantst vetve aPython knyvtrak dokumentcijba megllapthatjuk, hogy mostantl
fogvamrszmosfggvnyllrendelkezsnkre,nagyszmfeladatbelertvenagyonsszetettmatamatikai
algoritmusokat megoldsra (a Pythont ltalnosan hasznljk az egyetemeken magas szint tudomnyos
problmk megoldsra). Nem fogom e fggvnyek rszletes listjt megadni. Egy ilyen lista knnyen
hozzfrhetaPythonhelprendszerben:
HTMLdokumentciPythondokumentciModulindexmath
Akvetkezfejezetbenmegtanuljuk,hogyhogyanhozhatunkltremagunkfggvnyeket.

(6) Gyakorlatok:
(Megjegyzs:Mindegyikgyakorlatbanhasznljaadatbevitelrearaw_input()fggvnyt!)
6.1. rjonegyprogramot,amim/secskm/hbaszmoljatafelhasznlltalmrfld/hbanmegadott
sebessget..(1mrfld=1609mter)

6.2. rjonegyprogramot,amikiszmoljaakerlettsaterlettannakahromszgnek,melynek3oldalt
afelhasznladjameg.
(Ismtls:egyhromszgterlettakvetkezformulasegtsgvelszmoljukki:
S = dd a dbd c
aholdakerletfelt,a,b,cazoldalakhossztjelli).

6.3. rjonegyprogramot,amikiszmoljaegyadotthosszsgmatematikaiingaperidusidejt

Aperidusidszmolsraszolglformulaakvetkez: T =2

ahol:lazingahosszasgaszabadessgyorsulsaaksrlethelyn.
l
g
,

6.4. rjonegyprogramot,amirtkeketteszegylistba.Ennekaprogramnakciklusbankellmkdnigy,
hogymindaddigkriazrtkeket,amgafelhasznltlgynemdnt,hogybefejezsknt <Entert>
t.Aprogramalistakirsvalfejezdikbe.Mkdsiplda:

rjonbeegyrtket:25
rjonbeegyrtket:18
rjonbeegyrtket:6284
rjonbeegyrtket:
[25,18,6284]

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 56.
6.3 Egykispihenaturtle(tekns)modullal
Lttuk, a Python egyik nagyszer tulajdonsga, hogy klnbz modulok importlsval rendkvl
egyszerenlehethozzadniszmosjfunkcionalitst.
Ennekillusztrcijakntmostegykicsitmsobjektumokkalfogunkszrakozni,mintaszmok.Megfogunk
vizsglni egy Python modult, ami tekns grafikk ltrehozst teszi lehetv, vagyis olyan geometriai
rajzokt,mintamilyeneketegykisvirtulisteknshagymagautn,aminekazelmozdulsaitamonitoron
egyszerutastsokkalvezrelhetjk.
Ateknsaktivlsagyerekjtk.Ahosszmagyarzathelyettinkbbprbljukkimris:
>>> from turtle import *
>>> forward(120)
>>> left(90)
>>> color('red')
>>> forward(80)

A gyakorlat nyilvn sokkal


beszdesebb,haciklusokathasznlunk:
>>> reset()
>>> a = 0
>>> while a <12:
a = a +1
forward(150)
left(150)

Figyelem : mieltt elindtunk egy


ilyenscriptet,mindigellenrizzk,hogy
nemtartalmazevgtelenciklust(lsda
37. oldalt), mert ellenkez esetben azt
kockztatjuk,hogynemtudjukvisszavenniavezrlst(specilisanWindowsalatt).
rjunk olyan scripteket, amik elre megadott brkat rajzolnak. A turtle modulban a kvetkez fbb
fggvnyekllnakrendelkezsnkre:
reset() Mindenttrlsjrakezd
goto(x,y) Azx,ykoordintjhelyremegy
forward(tavolsag) Egyadotttvolsgotelremegy
backward(tavolsag) Egyadotttvolsgotvisszafelemegy
up() Felemeliaceruzt(hogyrajzolsnlkltovbbtudjonmenni)
down() Letesziaceruzt(hogyjrakezdjearajzolst)
color(szin) <szin>egyelredefiniltstringlehet('red','blue','green',stb.)
left(szog) Adott(fokokbankifejezett)szggelbalrafordul
right(szog) Jobbrafordul
width(vastagsag) Vonalvastagsgotvlaszt
fill(1) Zrtkrvonalkitltseegykivlasztottsznnel
write(texte) a<texte>nek''lelvagy'falhatroltkarakterlncnakkelllenni

57. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
6.4 Egykifejezsigaz/hamisrtke
Haegyprogramolyanutastsokattartalmaz,mintawhilevagyazif,akkoraszmtgpnekkikellszmolni
egyfeltteligazsgrtkt,vagyismegkellhatroznia,hogyakifejezsigazevagyhamis.Pldula while
c<20:szalbevezetettciklusmindaddigvgrehajtdik,amgac<20feltteligazmarad.
Dehogyantudjaegyszmtgpmeghatrozni,hogyvalamiigaz,vagyhamis?
Aztmrtudjuk,hogyaszmtgpcsakszmokatkezel.Mindent,amitaszmtgpnekkezelnikellelszr
mindigtkellalaktaninumerikusrtkk.Ezrvnyesazigaz/hamisfogalomrais.APythonbanppengy,
mint a Cben, a Basicben s szmos ms programnyelvben minden nulltl klnbz numerikus rtket
igaznaktekintnk.Csakanullartkahamis.Plda:
a = input('rjon be egy tetsz leges szmot')
if a:
print "igaz"
else:
print "hamis"

Afentikisscriptcsakakkorrkihamisat,ha0rtketrunkbe.Mindenmsnumerikusrtkreigaz
atkapunk.
Haegykarakterlncot,vagyegylisttrunkbe,akkorisigazatkapunk.Csakazresstringeketvagyaz
reslistkattekintihamisnak.
Azelzekaztjelentik,hogyegyolyankirtkelendkifejezst,mintaza>5felttel,aszmtgpelszr
numerikusrtkkalaktt.(ltalban1gy,haakifejezsigazs0v,haakifejezshamis):
a = input(' rjon be egy numerikus rtket : ')
b = (a < 5)
print 'A b rtke', b, ':'
if b:
print "A b felttel igaz"
else:
print " A b felttel hamis"

Afentiscriptab=1rtketkldivissza(afeltteligaz),ha5nlkisebbrtketrtunkbe.
Ezek csak elzetes informcik a Boole algebrnak nevezett logikai mveletekkel kapcsolatban. A
ksbbiekbenmegfogjuktanulni,hogyabinrisszmokraolyanopertorokatalkalmazhatunk,mintazand,or,
notstb.,amilehetvteszi,hogyezekkelaszmokkalsszetettlogikaimveleteketvgezznk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 58.
6.5 Ismtls
Akvetkezkbennemfogunkjfogalmakattanulni,egyszerenazeddigtanultakatfogjukkisprogramok
ksztsrealkalmazni.

6.5.1 AzutastsfolyamvezrlseEgyszerlistahasznlata
Kezdjkafeltteleselgaztatsokkal(brmelynyelvnektalnalegfontosabbutastscsoportjrlvansz!):

# Lista s feltteles elgaztats hasznlata

print "A script hrom szm kzl a legnagyobbat keresi"


print 'rjon be hrom, vessz vel elvlasztott szmot : '
# Megjegyzs : a list() fggvny az argumentumknt tadott adatszekvencit
# listv alaktja. Az albbi utasts teht a felhasznl ltal tadott
# adatokat az nn listv alaktja:
nn = list(input())
max, index = nn[0], 'els '
if nn[1] > max: # ne felejtsk el a kett spontot !
max = nn[1]
index = 'msodik'
if nn[2] > max:
max = nn[2]
index = 'harmadik'
print "Ezen szmok kzl a legnagyobb", max
print "Ez a szm a(z) ", index, ". a listban"

Megjegyzs: Ebben a gyakorlatban megint tallkozunk a 3. s 4. fejezetben mr bsgesen kommentlt


utastsblokkfogalmval,amitfelttlenlmegkelltanulnunk.Ismtlsl:azutastsblokkokat behzsok
hatroljk.Azels if utastsutnpldulktbehzottsorvan,amikegy utastsblokkotdefinilnak.Ezekaz
utastsokcsakakkorhajtdnakvgra,haaznn[1]>maxfeltteligaz.

A kvetkez sor (az amelyik a msodik if utastst tartalmazza) viszont nincs behzva. Ez a sor teht
ugyanazonaszintenvan,mintazokasorok,melyekaprogramgerinctdefiniljk.Ezeknekasoroknakaz
utasts tartalma mindig vgrehajtdik, mg a kvetkez kt sor (ami egy msik blokkot alkot) csak akkor
hajtdikvgre,haaznn[2]>maxfeltteligaz.
Azonoslogiktkvetveltjuk,hogyaktutolssorafblokkrszesgymindigvgrehajtdik.

59. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
6.5.2 AwhileciklusBegyazottutastsok
Folytassukmsstruktrkbegyazsval:

# sszetett utastsok <while> - <if> - <elif> - <else> # 1

print 'Vlasszon egy szmot 1-t l 3-ig (vagy nullt befejezsknt) ' # 3
a = input() # 4
while a != 0: # a != opertor jelentse "nem egyenl " # 5
if a == 1: # 6
print "n az egyet vlasztotta " # 7
print "els , egyedi, egysg ..." # 8
elif a == 2: # 9
print "n a kett t szereti :" # 10
print "pr, pros, duo ..." # 11
elif a == 3: # 12
print "n a hrom kzl a legnagyobb mellett dnt:" # 13
print "trio, hrmas, triplet ..." # 14
else : # 15
print "1 s 3 kztti szmot legyen szves" # 16
print 'Vlasszon egy szmot 1-t l 3-ig (vagy 0 befejezsknt) ' # 17
a = input() # 18
print "n nullt rt be :" # 19
print "A gyakorlatnak vge van." # 20

Ittegywhileciklussaltallkozunk,amibeegyif,elifselseutastscsoportvanbegyazva.Mostisfigyeljk
meg,hogyaprogramlogikaistruktrjtbehzsoksegtsgvelalaktottukki(snefelejtskela:otegyik
fejsorvgrlse!)
Awhileutaststittarrahasznljuk,hogyafelhasznlvlaszautnjrakezdjkakrdsfeltevst(hacsaka
felhasznlgynemdnt,hogykilpegynullabersval.(Emlkeztetl: a != opertorjelentsenem
egyenl) A ciklusmagban talljuk az if, elif s else utastscsoportot ( a 6.16. sorokban), ami a
programvgrehajtstklnbzvlaszokfelirnytja,majdegyprintsegyinput()utastskvetkezik(17.s
18.sor)amiketmindigvgrehajtaprogram.Vegykszre,hogyugyanaddigvannakbehzva,mintazif,elifs
elseblokkja.Ezekutnazutastsokutnaprogramhuroksavgrehajtsvisszatrawhileutastsra(5.sor).A
ktutolsprintutasts(19.s20.sor)csakaciklusblvalkilpsutnhajtdikvgre.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 60.
Gyakorlatok

6.5. Mitcsinlazalbbiprogramabbanangyesetben,melybenelremeghatroztuk,hogyazavltoz
rtke:1,2,3vagy15?

ifa!=2:
print'vesztett'
elifa==3:
print'egykistrelmetkrek'
else:
print'nyert'

6.6. Mitcsinlnakezekaprogramok?
a)
a=5
b=2
if(a==5)&(b<2):
print'"&"jelentse"s";az"and"sztishasznlhatjuk'
b)
a, b = 2, 4
if (a==4) or (b!=4):
print 'nyert'
elif (a==4) or (b==4):
print 'majdnem nyert'
c)
a = 1
if not a:
print ' nyert'
elif a:
print 'vesztett

Hajtassukvgreac)programota=0vala=1helyett.Mitrtnik?Kvetkeztessen!

6.7. Vegykac)programota=0vala=1helyett.Mitrtnik?Kvetkeztessen!

6.8. rjon egy programot, ami adott a s b egsz korltok esetn sszeadja a 3 s 5 korltok kz es
tbbszrseit.
Vegykpldulaza=0,b=32tazeredmnynek0+15+30=45nekkelllenni.
Mdostsagyaprogramot,hogyazadjasszea3nak vagy az5nekazasbhatrokkzes
tbbszrseit.A0s32hatrokkalazeredmnynek:0+3+5+6+9+10+12+15+18+20+21+
24+25+27+30=225nekkelllenni.

6.9. Hatrozzukmeg,hogyegyvszkvvagysem.(AzAvszkvhaAoszthat4gyel.Viszontnem
az,haAtbbszrse100nak,kivve,haA400naktbbszrse).

6.10. Krje a felhasznltl a nevt s a nemt (F vagy N) . Ezektl az adatoktl fggen rassa ki a
felhasznlnevtsratvagyAsszonyt.

6.11. Krjk meg a felhasznlt, hogy rjon be hrom hosszsgadatot: a, b, c t. Ennek a hrom
hosszsgnak a segtsgvel hatrozza meg, hogy lehete egy hromszget szerkeszteni. Majd
hatrozza meg, hogy ez a hromszg: derkszg, egyenlszr, egyenloldal vagy ltalnos
hromszg.Figyelem:egyderkszghromszglehetegyenlszr.

61. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
6.12. Krjk meg a felhasznlt, hogy rjon be egy egsz szmot. Ezutn rassa ki ennek a
szmnakvagyangyzetgykt,vagyegyzenetet, amijelzi,hogyennekaszmnak a
ngyzetgyktnemlehetkiszmolni.

6.13. KonvertljukaziskolaiNpontszmot,amitafelhasznladmeg(pldul85bl27)egy
standardizltjeggyakvetkezfelttelekszerint:

Pont rtkels
N>=80% A
80%>N>=60% B
60%>N>=50% C
50%>N>=40% D
N<40% E

6.14. Legyenakvetkezfelsorolsegylista:
['JeanMichel','Marc','Vanessa','Anne',Maximilien','AlexandreBenot','Louise']
rjonegyscriptet,amikirjaezennevekmindegyiktsakaraktereikszmt.

6.15. rjonegyprogramhurkot,amiafelhasznltlkriatanulkrdemjegyeit.Ahurokcsak
akkor fejezdjnbe,haafelhasznl egynegatv rtketrbe.Azgybertjegyekkel
hozzonltreegylistt.Mindenjjegybersautn(tehtmindeniterrcinl)rassakia
bertjegyekszmt,alegnagyobbsalegkisebbjegyetsajegyektlagt.

6.16. rjonegyscriptet,amikt10000kgtmegtestkztthatgravitciserrtktratjaki.
A testek kzttitvolsgok 5cm tl(0,05m)kezdd geometriai sorozatot alkotnak,
melynekkvciense2.
11 mm'
Agravitcisertakvetkezsszefggsalapjnszmoljuk: F=6,67 10 2
d
Plda:

d=.05m:ezernagysga2.668N
d=.1m:ezernagysga0.667N
d=.2m:ezernagysga0.167N
d=.4m:ezernagysga0.0417N
stb.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 62.
7.Fejezet: Sajtfggvnyek
Aprogramozsannakamvszete,hogyaszmtgpetolyanfeladatokelvgzsretantjukmeg,amiket
elzleg nem tudott vgrehajtani. Az egyik legrdekesebb erre szolgl mdszer az, hogy felhasznli
fggvnyekformjbanjutastsokatillessznkazltalunkhasznltprogramozsinyelvbe.

7.1 Fggvnydefinilsa
Azeddigrtscriptjeinkmindnagyonrvidekvoltak,mivelaclunkcsakazvolt,hogyelsajttsukanyelv
elemeit.Amikormajdvaldiprojekteketkezdnkfejleszteni,gyakranrendkvlbonyolultproblmkkalfogunk
tallkoznisaprogramsorokszmasokasodnifog.
Egy problma hatkony megkzeltse gyakran a problmnak tbb, egyszerbb alproblmra val
felbontsbl(dekompozcijbl) ll,amiketazutn kln vizsglunk.(Ezek azalproblmkesetlegtovbb
bonthatkmgegyszerbbalproblmkrasgytovbb).Fontos,hogyazalgoritmusokban20pontosanmutassuk
beeztadekompozcit,hogyazokvilgosakmaradjanak.
Msrsztgyakranelfordul,hogyugyanaztazutastssorozatottbbszrkellalkalmaznunkegyprogramban
snyilvnnemkvnjukaztrendszeresenmegismtelni.
Afggvnyek21 sazobjektumosztlyokeltralprogramstruktrk,amiketamagasszintnyelvekalkoti
azrt talltak ki, hogy a fent emltett nehzsgeket megoldjk. A Python fggvnydefincijnak lersval
kezdjk.Azobjektumokatsosztlyokat(classokat)ksbbfogjuktanulmnyozni.
Mrtallkoztunkklnbzelreprogramozottfggvnyekkel.Mostlssuk,hogyandefinilukmimagunkj
fggvnyeket.
AfggvnydefinciszintaxisaaPythonbankvetkez:

def fggvnyNeve(paramterlista):
...
utastsblokk
...

Fggvnynvnekanyelvfoglalt22 szavaikivtelvelbrmilyennevetvlaszthatunkazzalafelttellel,hogy
semmilyenspecilisvagykezeteskaraktertsemhasznlhatunk(azalhzskarakter_megengedett).A
vltoznevekhezhasonlanfkntakisbetkhasznlatajavasolt,nevezetesenaszavakelejn(anagybetvel
kezddszavakatfennfogjuktartaniazosztlyokszmra,amiketaksbbiekbenfogunktanulmnyozni).
Adefutastsazifhezsawhilehozhasonlanegysszetettutasts.Azasor,amelyikeztazutastst
tartalmazza ktelezen kettsponttal vgzdik, ami egy utastsblokkot vezet be, amit nem szabad
elfelejtennkbehzni.
A paramterlista hatrozza meg, hogy argumentumknt milyen informcikat kell megadni, ha majd

20 Algoritmusnakegyproblmamegoldsraszolglmveletekrszletesfelsorolstnevezzk.

21 Msnyelvekbenlteznekrutinok(ezeketnhaalprogramoknakhvjk)sprocedurk(eljrsok)
A Pythonban nincsenek rutinok. A fggvny elnevezs egyszerre jelli a szigor rtelemben vett fggvny
fogalmt(aminekvisszatrsirtkevan)saprocedurt(amineknincsvisszatrsirtke).
22 APythonfoglaltszavainakteljeslistjaa23.oldalontallhat.

63. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
hasznlni akarjuk a fggvnyt. (A zrjel resen is maradhat, ha a fggvnynek nincs szksge
argumentumokra).
Egy fggvnyt gyakorlatilag gy hasznlunk, mint akrmilyen ms utastst. A programtrzsben a
fggvnyhvsafggvnynevblsazaztkvetzrjelekblll.
Haszksges,azrjelbenadjukmegazokatazargumentumokat,amikettakarunkadniafggvnynek.
Elvilegafggvnydefincibanmegadottmindegyikparamterszmramegkelladniegyargumentumot,br
adhatkalaprtelmezettrtkekezeknekaparamtereknek(lsdksbb).

7.1.1 Paramtereknlkliegyszerfggvny
Afggvnyekelskonkrttrgyalsakormegintinteraktvmdbanfogunkdolgozni.APythoninteraktv
zemmdja idelis olyan kisebb tesztek vgzsre, mint amilyenek most kvetkeznek. Ez egy olyan
knnyebbsg,amitnemmindenprogramozsinyelvknlfel!
>>> def tabla7():
... n = 1
... while n <11 :
... print n * 7,
... n = n+1
...

Ennekanhnysornakabersvalegynagyonegyszerfggvnytdefiniltunk,amikiszmoljaskiratjaa
7esszorztblaelstztagjt.Figyeljkmegazrjeleket23,akettspontot,safejsortkvetutastsblokk(ez
azazutastsblokk,amiafggvnytrzsetalkotja)behzst.
Ahhoz,hogyafggvnythasznljuk,elghaanevvelhvjuk.gy:
>>> tabla7()

kiratja:
7142128354249566370
Eztafggvnytannyiszorhasznlhatjuk,ahnyszorakarjuk.Belevehetjkegymsikfggvnydefincijba,
mintazalbbipldban:
>>> def tabla7tripla():
... print 'A 7-es szorztbla hrom pldnyban :'
... tabla7()
... tabla7()
... tabla7()
...
Hvjukeztafggvnyta:
>>> tabla7tripla()

utastsbegpelsvel.Akvetkezkirstkelleredmnykntkapnunk:
A 7-es szorztbla hrom pldnyban :
7 14 21 28 35 42 49 56 63 70
7 14 21 28 35 42 49 56 63 70
7 14 21 28 35 42 49 56 63 70

23 Egy fggvnynevet mindig zrjelnek kell kvetni, mg akkor is, ha a fggvny semmilyen paramtert sem
hasznl. Ez egy rsbeli konvencibl ered, ami kikti, hogy brmely szmtgp programozssal foglalkoz
szvegbenegyfggvnynevetmindigegyreszrjelprnakkellkvetni.
Eztakonvencitkvetjkebbenaknyvben.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 64.
Azelsfggvnytehthvhategymsodikat,amiegyharmadikathvhatsgytovbb.Talnmgnemltja
azolvasennekahasznt,dektrdekestulajdonsgotmrmegfigyelhet:
Egyjfggvnyltrehozsalehetsgetadegyutastscsoportelnevezsre.gyegymsodlagos,sszetett
algoritmusegyetlenparancsmgrejtsvelamineknagyonexplicitnevetadhatunkegyszersthetjka
programgerinct.
Egy j fggvny ltrehozsa az ismtld kdrszek kiszblse rvn a program egyszerstst
szolglhatja.Pldul,haugyanabbanaprogrambantbbszrkikellratnia7esszorztblt,akkornemkell
mindenalkalommaljrarniazalgoritmust,amielvgzieztamunkt.
Egy fggvny teht egy j testreszabott utasts, amit mi magunk szabadon adunk hozz a programozsi
nyelvnkhz.

65. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
7.1.2 Paramteresfggvny
Azutolspldinkbanegyfggvnytdefiniltunksalkalmaztunka7esszorztblatagjainakkiratsra.
Tegykfel,hogyugyaneztszeretnnkmegtennia9esszorztblval.Termszetesenrhatunkegyjfggvnyt
erre,dehaksbba13asszorztblravanszksgnk,akkormegintjrakezdhetjk.Nemvolnardemesebb
egyetlenolyanfggvnytdefinilni,amikrsreakrmelyikszorztbltkitudnratni?
Amikorhvjukafggvnyt,termszetesenmegkelltudnunknekiadni,hogymelyikszorztbltkvnjuk
kiratni.Aztazinformcit,amitafggvnynekahvsakoradunkt:argumentumnaknevezzk.Mrtbbszr
tallkoztunkolyanbeptettfggvnyekkel,amikargumentumothasznlnak.Asin(a)fggvnypldulazaszg
sinustszmolja.Asin(a)fggvnytehtazanumerikusrtkethasznljaargumentumknt.
Egy ilyen fggvny defincijban elre gondoskodnunk kell egy specilis vltozrl, ami az tadott
argumentumot fogadja. Ezt a specilis vltozt paramternek nevezzk. Ennek a vltoznak a szoksos
szintaktikai szablyoknak megfelelen vlasztunk nevet (nem tartalmazhat kezetes karaktereket, stb.) s a
fggvnydefincitkvetzrjelberjuk.
Aminketrdeklesetbenakvetkeztkapjuk:
>>> def tabla(alap):
... n = 1
... while n <11 :
... print n * alap,
... n = n + 1

Atabla()fggvny,ahogyaztfentdefiniltukazalapparamterthasznljaamegfelelszorztblaelstz
tagjnakakiszmolsra.
Azjfggvnytesztelshezelg,haaztegyargumentummalhvjuk.Pldk:
>>> tabla(13)
13 26 39 52 65 78 91 104 117 130

>>> tabla(9)
9 18 27 36 45 54 63 72 81 90

Ezekbenapldkbanafggvnyhvsakorzrjelbenmegadottrtk(azargumentum)automatikusanaz
alapnevparamterhezvanrendelve.Afggvnytrzsbenazalapugyanaztaszerepetjtsza,mintbrmelyms
vltoz.Amikorberjukatabla(9)utastst,jelezzkagpnek,hogyatabla()fggvnytakarjukvgrehajtatniaz
alapnevvltozhozrendelt9rtkkel.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 66.
7.1.3 Vltozargumentumknttrtnhasznlata
Azelzktpldbanatabla()fggvnyargumentumamindegyikesetbenegykonstans(13illetve9)volt.Ez
egyltalnnemktelez. Fggvnyhvsbanhasznltargumentumvltozislehet,mintazalbbipldban.
Elemezze a pldt, prblja ki s rja le a fzetbe amit kaptott. Magyarzza el a sajt szavaival, hogy mi
trtnik!Ennekapldnakazalapjnkell,hogylegyenelkpzelsearrl,hogymilyenhasznosakafggvnyek
azsszetettfeladatokvgzsesorn:
>>> a = 1
>>> while a <20:
... tabla(a)
... a = a +1
...

Fontosmegjegyzs:
Afentipldbanatabla()fggvnynektadottargumentumazavltoztartalma.Afggvnybelsejbenez
azargumentumhozzvanrendelveazalapparamterhez,amiegyteljesenmsvltoz.Jegyezzkjlmeg:

Egy argumentumknt tadott vltoz nevnek semmi kze sincs a fggvnybeli megfelel paramter
nevhez.
Haakarjuk,ezekanevekazonosakislehetnek,demegkell,hogyrtsk,hogynemugyanaztadolgotjellik
(annakellenre,hogyazonosrtkettartalmazhatnak).

(7) Gyakorlat:

7.1. Importljaaturtlemodult,hogyegyszerrajzokattudjonkszteni.

Klnbzsznegyenloldalhromszgeksorozattkellelkszteni.
Ehhezdefiniljonegyharomszog()fggvnyt,amiegymeghatrozottsznhromszget
tudrajzolni(ezaztjelenti,hogyafggvnydefincijnakegyparamtertkelltartalmazni,
amiasznnevtfogadja).

Alkalmazza ezt a fggvnyt gy, hogy ugyanazt a hromszget klnbz helyeken


reproduklja,mikzbenmindenalkalommalmegvltoztatjaasznt.

67. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
7.1.4 Fggvnytbbparamterrel
A tabla() fggvny biztosan rdekes, de mindig csak a szorztbla els tz tagjt ratja ki, pedig azt is
kvnhatjuk, hogyrasson kimstagokat.Hacsakezabaj.gy javtunk rajta, hogya szorzoTabla() nak
nevezettjverzibantovbbiparamterekkelegsztjkki.:
>>> def szorzoTabla(alap, kezdete, vege):
... print 'Az', alap, '-s szorztbla :'
... n = kezdete
... while n <= vege :
... print n, 'x', alap, '=', n * alap
... n = n +1

Ezazjfggvnyhromparamterthasznl:azelzpldabeliszorztblaalapszmt,azelssazutols
kirandtagindext.
Prbljukkiafggvnyt,pldul:
>>> szorzoTabla(8, 13, 17)

tberva,amiazalbbikirsteredmnyezi:
A 8-as szorztbla rszlete :
13 x 8 = 104
14 x 8 = 112
15 x 8 = 120
16 x 8 = 128
17 x 8 = 136

Megjegyzsek:
Tbbparamteresfggvnydefinilshozelg,haaparamtereketvesszvelelvlasztvaberjukazrjelbe.
A fggvny hvsakor az argumentumokat ugyanabban a sorrendben kell megadni, mint a megfelel
paramtereket (szintn vesszvel elvlasztva). Az els argumentum az els paramterhez, a msodik
argumentumamsodikparamterhezleszrendelvesgytovbb.
Gyakorlatkppenprbljakiakvetkezutastssorozatotsrjaleafzetbeakapotteredmnyt:
>>> t, d, f = 11, 5, 10
>>> while t<21:
... szorzoTabla(t,d,f)
... t, d, f = t +1, d +3, f +5
...

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 68.
7.2 Loklisvltozk,globlisvltozk
Haegyfggvnytrzsbendefinilunkvltozkat,akkorezekhezavltozkhozcsakmagaafggvnyfrhet
hozz.Aztmondjuk,hogyezekavltozkafggvnyrenzveloklisvltozk.Ezahelyzetpldulazelz
gyakorlatbelialap,kezdete,vegesaznvltozkesetben.

Mindenalkalommal,amikoraszorzoTabla()fggvnythvjukaPythonaszmtgpmemrijbanegyj
nvteret(namespace)24tfoglalneki.Azalap,kezdete,vegesaznvltozktartalmtebbenanvtrbentrolja,
amiafggvnyenkvlhozzfrhetetlen.gypldulhargtnazelzgyakorlatutnmegprbljukkiratniaz
alapvltoztartalmt,egyhibazenetetkapunk:
>>> print alap
Traceback (innermost last):
File "<pyshell#8>", line 1, in ?
print alap
NameError: alap

A gp vilgosan jelzi, hogy az alap szimblum szmra ismeretlen, jllehet a szorzoTabla() fggvny
korrektenrtaaztki. Az alap szimblumottartalmaznvtrszigorancsaka szorzoTabla() belsmkdse
szmravanfenntartvasautomatikusanmegsznikmihelytafggvnybefejeztefeladatt.
Fggvnyenkvldefiniltvltozka globlisvltozk. Tartalmuklthata fggvny belsejbl,dea
fggvnynemtudjaketmdostani.Plda:
>>> def maszk():
... p = 20
... print p, q
...
>>> p, q = 15, 38
>>> maszk()
20 38
>>> print p, q
15 38

Elemezzkfigyelmesenapldt:
Egynagyonegyszerfggvnydefinilsvalkezdjk(amineknincsparamtere).
Ennekabelsejbendefinilunkegypvltozt20kezdrtkkel.Mivelezapvltozegyfggvnybelsejben
vandefinilva,ezrtazegyloklisvltoz.

A fggvny definilst befejezve visszatrnk a fprogram szintjre, hogy ott kt vltozt p t s q t


definiljuk,amikheza15s38tartalmakatrendeljk.Ezaktvltozafprogramszintjnvandefinilva,teht
globlisvltozklesznek.

gyugyanaztavltoznevetptktszerhasznltuk,ktklnbzvltozdefinilsra:azegyikgloblis,a
msikloklis.Agyakorlatsornmagllapthatjuk,hogyezaktvltozegymstlklnbz,fggetlenvltoz,
melyek egy prioritsi szablynak tesznek eleget, ami azt parancsolja, hogy egy fggvny belsejben (ahol
versenghetnnek)aloklisandefiniltvltozknakvanprioritsa.

24 Anvtr(namespace)fogalmtfokozatosanfogomkifejteni.Ugyancsakaksbbiekbenfogjukmegtanulni,hogya
fggvnyekvaljbanobjektumok,amiknekmindenegyeshvsakoregyjpldnythozzukltre.

69. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Megllaptjuk,hogyamikoramaszk()fggvnytelindtjuk,aqgloblisvltozelrhet,merteztkorrekten
rjaki.Apvltozesetbenviszontaloklisanhozzrendeltrtketrjaki.

Elszrazthihetnnk,hogyamaszk()fggvnyegyszerenmdostottaagloblispvltoztartalmt(mivel
azhozzfrhet).Akvetkezsorokaztigazoljk,hogyeznemigaz:amaszk()fggvnyenkvlapgloblis
vltozmegrzikezdetirtkt.
Elsremindezbonyolultnaktnhet.Mgishamarmegfogjukrteni,hogymennyirehasznos,hogyavltozk
egyfggvnybelsejbenloklisvltozkkntvannak definilva, amiaztjelenti, hogy valamilyen mdonbe
vannakzrvaafggvnybelsejbe. Valjbanezaztjelenti,hogya fggvnyeketmindiggyhasznlhatjuk,
hogy a legcseklyebb mrtkben sem kell foglalkoznunk a bennk hasznlt vltoznevek vilgval: ezek a
vltozksohasemtkznekazokkalavltozkkal,amiketmsholdefiniltunk.
Eztahelyzetetazonbanmdosthatjuk,haakarjuk.Megtrtnhetpldul,hogydefinilnikellegyfggvnyt,
ami mdostani tud egy globlis vltozt. Ahhoz, hogy ezt elrjk a global utastst kell alkalmazni. Ez az
utasts lehetv teszi, hogy egy fggvnydefinci belsejben jelezzk, mely vltozkat kell globlis
vltozkkntkezelni.
Az albbi pldban a novel() fggvny belsejben hasznlt a vltoz nemcsak hozzfrhet, hanem
mdosthat is, mert explicit mdon jeleztk, hogy ez egy olyan vltoz, amit globlisknt kell kezelni.
sszehasonltsul prblja kiugyanezt agyakorlatot gy, hogy trli a global utastst:az a vltoz nem
inkrementldiktbbetafggvnymindenegyeshvsakor.

>>> def novel():


... global a
... a = a+1
... print a
...
>>> a = 15
>>> novel()
16
>>> novel()
17
>>>

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 70.
7.3 Igazifggvnyekseljrsok
A pontossg kedvrt: az eddig lert fggvnyek szigoran vve nem fggvnyek, hanem eljrsok25
(procedurk). Egy (szigor rtelemben vett) igazi fggvnynek egy rtket kell visszaadni, amikor
befejezdik. Egy igazi fggvnyt az olyan kifejezsekben, mint az y = sin(a) az egyenlsgjel
jobboldalnhasznlhatunk.Knnyenbeltjuk,hogyebbenakifejezsbenasin()fggvnyegyrtketadvissza
(azaargumentumsinust)amitkzvetlenlazyvltozhozvanrendelve.
Kezdjkegyrendkvlegyszerpldval:
>>> def cube(w):
... return w*w*w
...

A return utasts azt definilja, hogy mi legyen a fggvny ltal visszaadott rtk. Jelen esetben a
fggvnyhvskortadottargumentumkbrlvansz.Plda:
>>> b = cube(9)
>>> print b
729

Egykicsitkidolgozottabbpldakntmostmdostanifogjuknmilega tabla() fggvnyt,aminmrsokat


dolgoztunkazrt,hogyegyvisszatrsirtketadjonmeg.Ezazrtkjelenesetbenegylistalesz(akivlasztott
szorztblaelstzeleme).gymegintalkalmunkvan alistkrlbeszlni.Eztarrahasznlomki,hogymenet
kzbenmegtantokmgegyjfogalmat:
>>> def tabla(alap):
... eredmeny = [] # result el szr egy res lista
... n = 1
... while n < 11:
... b = n * alap
... eredmeny.append(b) # hozzad egy tagot a listhoz
... n = n +1 # (lsd a magyarzatott lentebb)
... return eredmeny
...

Afggvnytesztelshezberhatjukpldul:
>>> ta9 = tabla(9)

gyata9vltozhozlistaformjbanhozzrendeljka9esszorztblaelstiztagjt.:
>>> print ta9
[9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
>>> print ta9[0]
9
>>> print ta9[3]
36
>>> print ta9[2:5]
[27, 36, 45]
>>>

(Ismtls:egylistaelselemea0indexnekfelelmeg.)

25 Bizonyosprogramozsinyelvekbenafggvnyeketsazeljrsokatklnbzutastsokkaldefiniljk.APython
ugyanaztadefutaststhasznljamindkettre.

71. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Megjegyzsek:
Mintaztazelzpldbanlttuk,areturnutastsdefinilja,hogymilegyenafggvnyltalvisszaadott
rtk.Jelenesetbenaresultvltoztartalmrlvansz,vagyisafggvnyltalgenerltszmoklistjrl.26.

A result.append(b) utasts a msodik pldnk egy fontos fogalom alkalmazsra, amire ksbb mg
hosszabban visszatrnk: ebben az utastsban az append() metdust alkalmazzuk a result objektumra.

Fokozatosanfogjukpontostani,hogymitkellrteniaprogramozsbanobjekumalatt.Mostfogadjukel,hogy
ezegynagyonltalnosfogalom,amiaPythonlistkraisrillik.
Egymetdusvaljbannemmsmintegyfggvny(amitegybkntazrjelekjelenltrlismerhetnkfel),
deegyolyanfggvny,amiegyobjektumhozvanktve.
Rsztkpeziezenobjektumdefincijnak,pontosabbanazonspecilisosztly(class)defincijnak,amihez
ezazobjektumtartozik(aclassfogalmtksbbfogjuktanulni).

Egy objektumhoz kapcsold metdus hasznlata ezen objektum valamilyen specilis mdon trtn
mkdtetsblll.Pldulazobjektum3objektummetodus4()metdustegyobjektum3.metodus4()
tpusutastssalhasznljuk,vagyisazobjektumnevtkvetiametdusneve,aketttpontktissze.Eza
pontfontosszerepetjtszik:egyigaziopertornaktekinthetjk.

Pldnkban az append() metdust alkalmazzuk a result objektumra. A Pythonban a listk egy specilis
objektumtpustalkotnak,amireegyegszsormetdusalkalmazhat.Jelenesetbenaz append() metdusa
listk egy specilis fggvnye, ami arra val, hogy a lista vghez hozzkapcsoljunk egy elemet. A
hozzkapcsolandelemet,mintmindenargumentumot,zrjelbenadjukmegametdusnak.

Megjegyzs:
Hasonleredmnytkaphattunkvolna,haehelyettazutastshelyettaresult=result+[b]kifejezst
hasznltukvolna.Ezazeljrskevsbsszershatkony,mertaciklusmindenlefutsakoregyjresult
listtkelldefinilni,amibemindenalkalommal,amikoregykiegsztelemetkapcsolunkalisthoz,azegsz
elzlisttbekellmsolni.
Viszont az append() metdus hasznlatakor a szmtgp egy mr ltez lista mdostshoz fog hozz
(anlkl, hogy azt egy j vltozba msoln t). Ez az ajnlott technika, mert ez kevsb terheli le a
szmtgperforrsait(klnsenhanagymretlistkrlvansz).

Egyltalnnemszksges,hogyegyfggvnyvisszatrsirtkehozzlegyenrendelveegy
vltozhoz(ahogyanazteddigazrthetsgkedvrttettk).gyazalbbiparancsokatberva
tesztelhettkvolnaacube()stabla()fggvnyeket:
>>>printcube(9)
>>>printtabla(9)
>>>printtabla(9)[3]
vagymgegyszerbben:
>>>cube(9) ... stb.

26 A returnt argumentum nlkl is alkalmazhatjuk egy fggvny belsejben, hogy elidzzk az azonnali
visszatrstahvprogramba.EbbenazesetbenavisszatrsirtkaNoneobjektum(egyspecilisobjektum,ami
a''semmi''nekfelelmeg).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 72.
7.4 Fggvnyekhasznlatascriptben
AfggvnyekezenelskzeltshezeddigcsakaPythoninterpreterinteraktvmdjthasznltuk.
Nyilvnval,hogyafggvnyekscriptekbenishasznlhatk.Prbljukkiazalbbiprogramot,amiegygmb
4
trfogattszmoljakiazismertformulasegtsgvel: V = R3
3
def cube(n):
return n**3

def gombTerfogat(r):
return 4 * 3.1416 * cube(r) / 3

r = input('rja be a sugr rtkt : ')


print 'A gmb trfogata :', gombTerfogat(r)

Megjegyzsek:
Nzzkjlmeg,aprogramnakhromrszevan:aktfggvny: cube() s gombTerfogat(),valaminta
programtrzse.
Aprogramtrzsbenvanegyfggvnyhvs:gombTerfogat().

AgombTerfogat()fggvnybelsejbenvanacube()fggvnyhvs.
Figyeljk meg, hogy a program hrom rsze bizonyos sorrendben van elrendezve: elszr a
fggvnydefincikjnnek,majdaprogramtrzsekvetkezik.Azrtkellezazelrendezs,mertazinterpreter
a program utastssorait egyms utn abban a sorrendben hajtja vgre, ahogyan azok a forrskdban
megjelennek.Tehtascriptbenafggvnydefinciknakmegkellelzniafggvnyekhasznlatt.
Fordtsukmegeztasorrendet,hogymeggyzdjnkerrl(tegykelreaprogramtrzst),sjegyezzkmeg
azilymdonmdostottscriptvgrehajtsakorkirthibazenettpust.
ValjbanegyPythonprogramnakatrzseegyspecilisentitstkpez,amitazinterpreterabelsmkdse
sornmindiga __main__ foglaltszalattismerfel(amainjelentse:f.Kettsalhzskarakterveszi
krl, hogy elkerljk ms szimblumokkal val sszetvesztst.) Egy script vgrehajtsa mindig ennek a
__main__ entitsnak az els utastsval kezddik, brhol is legyen az a listban. A kvetkez utastsokat
egymsutnsorbanhajtjavgreazinterpreteregszenazelsfggvnyhvsig.Egyfggvnyhvsolyan,mint
egykerlavgrehajtsmenetben:akvetkezutastsravalttrshelyettazinterpreterahvottfggvnyt
hajtjavgre,majdvisszatrahvprogramba,hogyfolytassaamegszaktottmunkt.Hogyezamechanizmus
mkdnitudjon,azkell,hogyazinterpretera__main__entitseltteltudjaolvasniafggvnydefincit,tehta
__main__ltalbanascriptvgrevantve.

Pldnkbana __main__ entitshvegyfggvnyt,amiegymsikfggvnythv.Ezegynagyongyakori


helyzetaprogramozsban.Haelfogadhatmdonszeretnnkmegrteni,hogymitrtnik egyprogramban,
akkormegkelltanulnunkscriptetolvasni,denemazelssortlazutolsig,haneminkbbegyolyantvonalat
kvetve,mintaminascriptvgrehajtsatrtnik.Ezkonkrtanaztjelenti,hogygyakranazutolssoraivalkell
elkezdeniegyscriptelemzst!

73. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
7.5 Fggvnymodulok
Annakrdekben,hogymgjobbanmegrtskegyfggvnydefincijasprogrambelihasznlatakztta
klnbsget,aztajnlom,hogygyakranhelyezzkelafggvnydefinciinkategyPythonmodulbansazazokat
hasznlprogramotegymsikmodulban.
Plda:
Aturtlemodulsegtsgvelszeretnnkazalbbirajzokatelkszteni:

rjabesmentseelegyteknos_rajz.pynevfilebaakvetkezkdsorokat:
from turtle import *

def negyzet(meret, szin):


"meghatrozott mret s szn ngyzetet rajzol fggvny"
color(szin)
c =0
while c <4:
forward(meret)
right(90)
c = c +1

Bizonyra szrevette, hogy a negyzet() fggvny egy karakterlnccal kezddik. Ennek a


stringnek semmilyen funkcionlis szerepe sincs a scriptben: a Python gy kezeli, mint egy
egyszer kommentet, azonban ez automatikusan klnel vantrolva egy bels dokumentcis
rendszerben, amit azutn egyes felhasznli programok s ''intelligens'' szvegszerkesztk
hasznlhatnak.
Ha pldul az IDLE krnyezetben dolgozunk, amikor lymdon dokumentlt fggvnyeket
hvunk,mindigegyhelpbuborkbanfogjukltnifeltnnieztadokumentcisstringet.
APythonegy__doc__nev(a"doc"sztketts''_''karakterveszikrl)specilisvltozban
helyezieleztastringet,ami afggvnyobjektumhozvanktve,lvnannakegyikattribtuma.
(Amikorrtrnkazobjektumokosztlyaira,tbbetfogunkerrltanulni.Lsd155.oldalon).
gybrmelyfggvnydokumentcisstringjtennekavltoznakakiratsvaltallhatjukmeg.
Plda:

>>>defproba():
..."Ezafggvnyjlvandokumentlva,deszintesemmitsemcsinl."
...print"semmijeleznivalsincs"

>>>proba()
semmijeleznivalsincs

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 74.
>>>printproba.__doc__
Ezafggvnyjlvandokumentlva,deszintesemmitsemcsinl.

Vegyk a fradtsgot s a jvben valamennyi fggvnydefincinkban helyezznk el ilyen


magyarzstringeket:ezegykvetendgyakorlat.
AzltalunkltrehozottfilemostantlfogvaegyvaldiPython fggvnymodulugyangy,mintamr
ismertturtlesmathmodulok.gybrmilyenscriptbenhasznlhatjuk,mintpldulebben,amelyik
akrtrajzolstelvgzi:
from teknos_rajz import *

up() # flemeli a ceruzt


goto(-150, 50) # balra felmegy

# tz piros, sorbarendezett ngyzetet rajzol:


i = 0
while i < 10:
down() # leteszi a ceruzt
negyzet(25, 'red') # egy ngyzetet rajzol
up() # flemeli a ceruzt
forward(30) # tvolabb megy
i = i +1

a = input() # vr

Megjegyzs:

A priori gy nevezhetjk el a fggvnymoduljainkat, ahogy tetszik. De tudnunk kell, hogy


lehetetlenimportlniegymodult,haanevea23.oldalonmegadott29foglaltPythonszegyike;
mertazimportltmodulneveascriptnkbenegyvltoznvvvlna,safoglaltszavakatnem
lehet vltoznevekknt hasznlni. Arra is emlkezznk vissza, hogy kerlni kell, hogy egy mr
ltezPythonmodulnevtadjukamoduljainknaksltalbanascriptjeinknek,ellenkezesetben
tkzsekre kell szmtanunk. Pldul ha a turtle.py nevet adjuk egy gyakorlatnak, amiben
elhelyeztkaturtlemodultimportlutastst,akkormagtagyakorlatotfogjukimportlni!

75. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 76.
Gyakorlatok:
7.2. DefiniljonegykarakterSor(n,ca)fggvnyt,amindarabcakarakterblllstringetadvissza.

7.3. DefiniljonegykorTerulet(R)fggvnyt.Afggvnynekegykrterlettkellvisszaadni,aminekaz
Rsugartargumentumkntadjukmeg.
Pldula:printkorTerulet(2.5)utastseredmnynek19.635nekkelllenni

7.4. Definiljonegy dobozTerfogat(x1,x2,x3) fggvnyt,amiegyparallelepipedontrfogattadjavissza,


aminekamreteitazx1,x2,x3argumentumokbanadjukmeg.
Pldul a: printdobozTerfogat((5.2, 7.7, 3.3) utasts vgrehajtsakor eredmnyl
132.13atkellkapnunk.

7.5. Definiljonegymaximum(n1,n2,n3)fggvnyt,amiazargumentumkntmegadottn1,n2,n3szmok
kzl alegnagyobbat adja vissza. Pldul a: print maximum(2,5,4) utasts vgrehajtsakor
eredmnyl5tkellkapnunk.

7.6. Fejezzebea73.oldalonlertteknos_rajz.pygrafikusfggvnymodult.
Adjongyegyszogparamtertanegyzet()fggvnyhez,hogyangyzeteketklnbzorientcikban
lehessenkirajzolni.
Utna definiljon egy haromszog(meret, szin, szog) fggvnyt, ami meghatrozott mret, szn,
orientcijegyenloldalhromszgettudrajzolni.
Ellenrizzeamodultegyprogramsegtsgvel,amiklnbzargumentumokkalfogjahvniezeketa
fggvnyeket,hogyegysorozatngyzetetshromszgetrajzoljon:

7.7. Adjonazelzgyakorlatmoduljhozegycsillag5()fggvnyt,amiegytgcsillagottudrajzolni.A
fprogrambaillesszenbeegyciklust,amivzszintesen9klnbzmretkiscsillagotrajzol:

77. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
7.8. Adjonazelzgyakorlatmoduljhozegycsillag6()fggvnyt,amiegyhatgcsillagottudrajzolni.Ez
ktegymsrarajzoltegyenoldalhromszgblll.Ennekazjfggvnynekazelzlegdefinilt
haromszog()fggvnytkellhvni.Afprogramegycsillagsorozatotfograjzolni:

7.9. Definiljonegy karakterSzam(ca,ch) fggvnyt,amivisszaadjaa ch stringbenelfordul ca


karakterekszmt.
Pldul a : print karakterSzam('e','Cette phrase est un exemple')
utastsvgrehajtsakoreredmnyl7etkellkapnunk.

7.10. DefiniljonegyindexMax(lista)fggvnyt,amiazargumentumkntmegadottlistalegnagyobbrtk
elemnekazindextadjavissza.
Alkalmazsiplda:

sorozat = [5, 8, 2, 1, 9, 3, 6, 7]
print indexMax(sorozat)

7.11. Definiljonegy honapNeve(n) fggvnyt,amiazvnedikhnapjnaknevtadjavissza.Pldula:


printhonapNeve(4)utastsnakazpriliseredmnytkelladni.

7.12. Definiljonegy inverse(ch) fggvnyt,ami brmilyenstringbenmegfordtjaakaraktereksorrendjt.


(Azinvertltstringetfogjavisszaadniahvprogramnak.)

7.13. Definiljonegy szavakSzama(mon) fggvnyt,ami a mon mondatbantallhatszavakszmtadja


vissza.(Szavaknakolyankaraktercsoportokattekintnk,amikkzttbetkzvan).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 78.
7.6 Paramterektpusadsa
Megtanultuk,hogyatpusadsaPythonbandinamikus.Ezaztjelenti,hogyegyvltoznakatpusaabbana
pillanatban van definilva, amikor hozzrendelnk egy rtket. Ez a mechanizmus mkdik a
fggvnyparamterekreis.Aparamtertpusamegfogegyezniafggvnynektadottargumentumtpusval.
Plda:
>>> def kiir3szor(arg):
... print arg, arg, arg
...

>>> kiir3szor(5)
5 5 5

>>> kiir3szor('zut')
zut zut zut

>>> kiir3szor([5, 7])


[5, 7] [5, 7] [5, 7]

>>> kiir3szor(6**2)
36 36 36

Ebbenapldbanmegllapthatjuk,hogyugyanaza kiir3szor() fggvnymindegyikesetbenelfogadjaaz


tadottargumentumot,legyenazegyszm,egystring,egylistavagyppenegykifejezs.Ezutbbiesetbena
Pythonakifejezskirtkelsvelkezdisazeredmnytadjatargumentumkntafggvnynek.

7.7 Alaprtelmezettrtkekadsaaparamtereknek
Egyfggvnydefinciban lehetsges (sgyakran kvnatos) mindegyik paramternek egy alaprtelmezett
rtketdefinilni. gyegyolyanfggvnytkapunk,amigyishvhat,hogyavrtargumentumoknakcsak
egyrsztadjukmeg.Pldk:
>>> def udvarias(nev, megszolitas ='r'):
... print "Fogadja ", nev, " ", megszolitas, " jkvnsgaimat."
...

>>> udvarias('Dupont')
Fogadja Dupont r jkvnsgaimat.

>>> udvarias('Durand', 'Kisasszony')


Fogadja Durand Kisasszony jkvnsgaimat.

Haeztafggvnytcsak azelsargumentumamegadsvalhvjuk,akkoramsodikegy alaprtelmezett


rtket vesz fel. Ha mindkt argumentumot megadjuk, akkor a msodik argumentum alaprtelmezett rtkt
figyelmenkvlhagyja.
Definilhatunk minden paramternek, vagy csak egy rszknek alaprtelmezett rtket.Ebben az esetben
azonbanazalaprtelmezettrtknlkliparamtereknekmegkellalistbanelzniatbbieket.Pldulazalbbi
definciinkorrekt:
>>> def udvarias( megszolitas='r', nev):

79. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Msikplda:

>>> def kerdes(uzenet, kiserlet =4, kerem ='Igen vagy nem ?'):
... while kiserlet >0:
... valasz = raw_input(uzenet)
... if valasz in ('i', 'igen','I','Igen','IGEN'):
... return 1
... if valasz in ('n','nem','N','Nem','NEM'):
... return 0
... print kerem
... kiserlet = kiserlet-1
...
>>>

Eztafggvnytklnbzmdokonlehethvni,pldul:

rep = kerdes('Valban be akarja fejezni ? ') vagy:

rep = kerdes('Trlni kell ezt a filet ? ', 3) vagy:

rep = kerdes('Megrtette ? ', 2, 'Vlaszoljon igennel vagy nemmel !')

(Vegyeafradsgotselemezzeeztapldt!)

7.8 Argumentumokcmkvel
Aprogramozsinyelvektbbsgbenafggvnyhvskormegadottargumentumokatpontosanugyanabban
asorrendbenkellmegadni,mintamiafggvnydefincibannekikmegfelelparamtereksorrendje.
A Python viszont jval nagyobb rugalmassgot enged meg. Ha a fggvnydefinciban a paramterek
mindegyikeafentebblertformbankapegyalaprtelmezettrtket,akkorhvhatjukgyafggvnyt,hogyaz
argumentumaittetszlegessorrendbenadjukmeg,feltve,hogyamegfelelparamtereketnvszerintadjukmeg.
Plda:

>>> def madar(volts=100, state='lefagyott', action='java-t tncolni')


... print 'A papagj nem tudna ', action
... print 'ha rkapcsoln a', volts, 'V-ot !'
... print "E mondka szerz je teljesen", state
...

>>> madar(state='t zbejtt', volts=250, action='helyeselni')


A papagj nem tudna helyeselni
ha rkapcsoln a 250 V-ot !
A szerz teljesen t zbejtt

>>> madar()
A papagj nem tudna java-t tncolni
ha rkapcsoln a 100 V-ot !
A szerz teljesen lefagyott

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 80.
Gyakorlatok:
7.14. Mdostsa azegyik elzpldban definilt dobozTerfogat(x1,x2,x3) fggvnytgy, hogy 3,2,1
argumentummal,vagyakrargumentumnlklislehessenhvni.Alaprtelmezsbenazargumentum
rtkelegyen10.
Pldul:
printdobozTerfogat() azeredmny:1000
printdobozTerfogat(5.2) azeredmny:250
printdobozTerfogat(5.2,3) azeredmny:156.0

7.15. Mdostsaafenti dobozTerfogat(x1,x2,x3) fggvnytolymdon,hogy3,2vagy1argumentummal


lehessenhvni.Haegyargumentumothasznlunk,akkoradoboztkocknaktekintjk(azargumentuma
kockaoldala).Haktargumentumothasznlunk,akkoradoboztngyzetalapprizmnaktekintjk.
(Ebbenazesetbenazelsargumentumangyzetoldalasamsodikaprizmamagassga).Hahrom
argumentumothasznlunk,akkoradoboztparallelepipedonnaktekintjk.
Pldul:
print dobozTerfogat() azeredmny:1 (hibajelzs)
print dobozTerfogat(5.2) azeredmny:140.608
print dobozTerfogat(5.2, 3) azeredmny:81.12
print dobozTerfogat(5.2, 3, 7.4) azeredmny:115.44

7.16. DefiniljaakarakterCsere(ch,ca1,ca2,kezdo,vegso)fggvnyt,amiachkarakterlncbanvalamennyi
ca1 karaktert a kezdo indextl kezdve a vegso indexig a ca2 karakterrel helyettesti, az utols kt
argumentum elhagyhat (ebben az esetben a karakterlnc elejtl a vgig helyettestend a ca1
karakter.)Pldkavgrehajtsra:

>>> mondat = 'Ceci est une toute petite phrase.'


>>> print karakterCsere(mondat, ' ', '*')
Ceci*est*une*toute*petite*phrase.
>>> print karakterCsere(mondat, ' ', '*', 8, 12)
Ceci est*une*toute petite phrase.
>>> print karakterCsere(mondat, ' ', '*', 12)
Ceci est une*toute*petite*phrase.
>>> print karakterCsere(mondat, ' ', '*', vegso = 12)
Ceci*est*une*toute petite phrase.

7.17. Definilja az maxElem(lista,kezdo,vegso) fggvnyt, ami a paramterknt tadott lista listbl


megadjalegnagyobbrtk elemet.A kezdo s vegso argumentumok adjk megaztaktindexet,
melyek kztt vgre kell hajtani a keresst. Kzlk brmelyik elhagyhat (az elz gyakorlathoz
hasonlan).Pldaavrtfggvnyvgrehajtsra:

>>> serie = [9, 3, 6, 1, 7, 5, 4, 8, 2]


>>> print maxElem(serie)
9
>>> print maxElem(serie, 2, 5)
7
>>> print maxElem(serie, 2)
8
>>> print maxElem(serie, vegso =3, kezdo =1)
6

81. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.Fejezet: Azablakoksagrafikahasznlata
EddigaPythontkizrlagszvegmdbanhasznltuk.Azrtjrtunkgyel,merttisztznikellettnhny
elemi fogalmat s a nyelv alapszerkezett, mieltt komplexebb objektumokat (ablakok, kpek, hangok, stb.)
ignyelksrleteketterveznk.Mostmegengedhetnkmagunknakegykiskiruccanstagrafikusinterfaceek
vilgba.Ezcsakzeltlesz.Mgsokalapvetdologvan,amitmegkelltanulniskzlksoknakaszveges
megkzeltsalegmegfelelbb.

8.1 Grafikusinterfaceek(GUI)
Haazolvasmgnemtudja,gymosttapasztalnifogja,hogygrafikusinterfaceek(vagyGUI:Graphical
User Interface) terlete rendkvl komplex. Minden opercis rendszer tbb grafikus alap
fggvnyknyvtrat knlhat, amihez gyakran trsul mg szmos kiegszt, tbbkevsb specilis
programozsi nyelv. ltalban ezek a komponensek objektumosztlyokknt jelennek meg, amiknek az
attribtumaitsmetdusaitkellmajdtanulmnyozni.
A Pythonnal leginkbb aTkinter grafikus knyvtrathasznljk,ami a kezdetben aTcl nyelv szmra
fejlesztettTkknyvtregyadaptcija.Sokmsigenrdekesgrafikusknyvtratajnlottak aPythonhoz:
wxPython,pyQT,pyGTK,stb.LehetsgvanaJavawidgeteksaWindowsMFCkhasznlatrais.
EbbenajegyzetbenaTkinterrefogunkszortkozni,aminekszerencsrehasonl(singyenes)verziivannak
Linux,WindowssMacplatformokra.

8.2 ElslpsekaTkinterrel
Amagyarzathozfelttelezem,hogya Tkinter modulmrteleptvevan.Ahhoz,hogyafunkciithasznlni
tudjuk,ascriptvalamelyikelssornakegyimportutaststkelltartalmazni:
from Tkinter import *

APythonbannemmindigszksgesscriptetrni. Interaktv mdbanelindtva


szmos ksrletet vgezhetnk kzvetlenl parancssorban. A kvetkez pldban
egyegyszerablakothozunkltreskttipikuswidget27etkapcsolunkhozz:egy
cmkt(label)segynyomgombot(button).
>>> from Tkinter import *
>>> abl1 = Tk()
>>> tex1 = Label(abl1, text='J napot kvnok!', fg='red')
>>> tex1.pack()
>>> gomb1 = Button(abl1, text='Kilp', command = abl1.destroy)
>>> gomb1.pack()
>>> abl1.mainloop()

27 A "widget" a "window gadget" kifejezs sszevonsbl ered. Bizonyos programozi krnyezetekben ezeket
inkbb"control"nakvagy"grafikuskomponens"neknevezik.gynevezikazalkalmazsablakokbanelhelyezhet
objektumokat,amikpldulnyomgombok,checkboxok,kpek,stb.lehetnek,snhamagtazablakotis.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 82.
Megjegyzs:APythonverzijtlfggenazalkalmazsablakotvagykzvetlenlamsodiksor,vagycsaka
hetediksorbeviteleutnltjukmajdmegjelenni.28.
Mostvizsgljukmegrszletesebbenaparancssorokat:
1. Mint mr emltettem, knny olyan Python modulokat ltrehozni, amik scripteket, fggvnydefincikat,
objektumosztlyokat,stb.tartalmaznak.Ezeketamodulokatvagyteljesegszkben,vagyrszbenbrmely
programba,vagymagbaazinteraktv mdbanmkdinterpreterbe(vagyiskzvetlenlaparancssorba)
importlhatjuk. Ezttesszk pldnk els sorban:from Tkinterimport*importlja a Tkinter
modulbanlvvalamennyiosztlyt.
Egyregyakrabbankell osztlyokrl (classokrl)beszlnnk.Aprogramozsbangynevezzkazobjektum
genertorokat,amikjrafelhasznlhatprogramrszletek.
Nemteszekksrletetazobjektumoksazosztlyokvglegesspreczdefincijnakmegadsra,inkbbazt
ajnlom,hogyhasznljunknhnyat.Menetkzbenlpsrllpsrefogjukfinomtaniameghatrozsukat.
2. Pldnkmsodiksorban:abl1=Tk()ban,aTkintermodulTk()osztlythasznljuksannakegy
pldnyt(egyobjektumt)hozzukltreazabl1et.

Egy objektum ltrehozsa egy osztlybl a mai programozsi technikkban melyek egyre gyakrabban
folyamodnak az objektum orientlt programozsnak (vagy OOP: Object Oriented Programming)
nevezettmdszerhezalapvetmvelet.

Az osztly egy ltalnos model (vagy minta), amibl a gp krsnkre egy specilis szmtstechnikai
objektumothozltre.Defincikatsklnbzopcikattartalmaz,amiknekcsakegyrszthasznljuka
belleltrehozottobjektumban.gyaTkinterknyvtregyiklegalapvetbbosztlya,aTk()osztlymindent
tartalmaz, ami klnbz tpus, mret s szn, mensoros vagy anlkli, stb. alkalmazsablakok
ltrehozshozszksges.

Ezt hasznljuk fel a grafikus alapobjektumunk, egy ablak ltrehozsra, ami a tbbi objektumot fogja
tartalmazni. A Tk() zrjelben klnbz opcikat adhatnnk meg, deezt egy kicsit ksbbre hagyom.

Az objektumot ltrehoz utasts egy egyszer rtkadshoz hasonlt. Azonban itt kt dolog trtnik
egyszerre:
egyjobjektumjnltre,(amisszetettlehetsezrttekintlyesmennyisgmemritfoglalhatle)

rtketadunkegyvltoznak,amiettlfogvaazobjektumhivatkozskntfogszolglni29.

28 Ha Windows alattvgezzkezt agyakorlatot,akkorazt ajnlom,hogyinkbbDOSablakban,vagyIDLEben


hasznljunkstandardPythont,mint PythonWint. Jobbanmegfigyelhetjk,hogymitrtnikazegyesutastsok
bersautn.
29 Anyelvnekezatmrsgeannakazegyikkvetkezmnye,hogyaPythonbanavltozktpusadsadinamikus.
Msnyelvekspecilisutastst(mintamilyenanew)hasznlnakegyjobjektumltrehozsra.
Plda:enAutom=newCadillac(aCadillacclasseegyobjektumthozzukltre,amireazenAutomvlozval
hivatkozunk.)

83. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
3. Aharmadiksorban:tex1=Label(abl1,text='Jnapot!',fg='red')egymsikobjektumot(egywidget
et)hozunkltre,ezalkalommalaLabel()osztlybl.
Amint a neve is jelzi, ez az osztly mindenfle cmkt definil. Ezek szvegtredkek, amik arra
hasznlhatk,hogyklnbzinformcikatrjunkazablakbelsejbe.
Akorrektkifejezsretrekedveaztfogjukmondani,hogyatex1objektumotaLabel()osztlyblhoztukltre
(instanciltukvagypldnyostottuk).

Itt jegyzem meg, hogy ugyangy hvunk egy osztlyt, mint egy fggvnyt: vagyis zrjelben
argumentumokatadunkmeg.Majd megltjuk,hogyegyosztlyegyfajtakontner,amibenfggvnyeks
adatokvannaksszegyjtve.

Milyenargumentumokatadtunkmegehhezazinstancilshoz?
Azelsargumentum(abl1)aztadjameg,hogyamostltrehozottjwidgetetegymrltezmsik
widgetfogjatartalmazni.Azutbbitazjwidgetmasterwidgetjneknevezzk,azabl1widgeta
tex1objektumtulajdonosa.(Aztismondhatjuk,hogyatex1objektumazabl1objektumslavewidget
je).
A kvetkez kt argumentum a widget pontosalakjnak meghatrozsraval. Ez kt kezdrtk,
mindegyikkstringformjbanvanmegadva:elsacmkeszvege,msodikazeltr(foreground
rvidtvefg)szne.Esetnkbenakiratnikvntszvegszntpirosnakdefiniltuk.
Egybjellemzketismegtudnnkmghatrozni,pldul:abettpust,vagyahttrsznt.Ezekneka
jellemzknek azonban van egy alaprtelmezett rtkk a Label() osztly bels definciiban. Csak
azoknakajellemzknekkellrtketadnunk,melyeketastandardmodeltleltrnekakarunk.
4. A negyedik sorban: tex1.pack(), a tex1 objektumhoz tartoz pack() metdust aktivljuk. Mr
tallkoztunkametduskifejezssel(alistknl).Ametdusegyobjektumbabeptett(aztisfogjukmondani,
hogy egy objektumba bezrt) fggvny. Nemsokra megtanuljuk, hogy egy objektum valjban egy
programkdrszlete,amimindigtartalmaz:
klnbz tpus vltozkban trolt adatokat (numerikusokat vagy msflket): ezeket az objektum
attribtumainak(vagytulajdonsgainaknevezzk).

eljrsokatvagyfggvnyeket(ezektehtalgoritmusok):ezeketazobjektummetdusainaknevezzk.

A pack() metdusrszeegymetduscsoportnak,aminekatagjainemcsaka Label() osztly widget jeire


alkalmazhatk,hanemmsTkinterwidgetekreis.Awidgetekablakbeligeometriaielrendezsrehatnak.Ha
egyesvelrjukbeapldaparancsait,meggyzdhetnkrla,hogyapack()metdusautomatikusanakkorra
cskkenti a master ablak mrett, hogy az elg nagy legyen az elre definilt slave widget ek
tartalmazshoz.
5. Aztdiksorban:gomb1=Button(abl1,text='Kilp',command=abl1.destroy) ltrehozzukmsodik
slavewidgetnket:egynyomgombot.
Ahogyanazelzwidgetesetntettnk,aButton()classthvjukzrjelekkzttaparamtereketmegadva.
Mivelezalkalommalegyinteraktvobjektumrlvansz,ezrtacommandopcivalmegkelladnunk,hogy
mitrtnjen,amikorafelhasznlanyomgombrakattint. Ebbenazesetbenaz abl1 objektumhoztartoz
destroymetdusthozzukmkdsbe,amitrliazablakot.

6. A6.sorbanapack()metdusazablakgeometrijtazimntbeptettjobjektumhozigaztja.

7. Ahetediksor:abl1.mainloop()nagyonfontos,mertezindtjaelazablakhozkapcsoltesemnyfogadt,

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 84.
amiarrakell,hogyazalkalmazsunkfigyeljeazegrkattintsokat,billentyletseket,stb.Ezazazutasts,
amelyikvalamilyenmdonelindtjaazalkalmazst.

Mint a neve (mainloop = fhurok) mutatja, az abl1 objektum egyik metdusrl van sz, ami egy
programhurkotaktivl.Ezaprogramhurokhttrprogramkntfolyamatosanmkdiksvrjaazopercis
rendszer ltal kldtt zeneteket. Folyamatosan lekrdezi a krnyezett:a bemeneti perifrikat (egr,
billentyzet,stb.).Valamilyenesemnydetektlsakorazillet esemnytlerzeneteketkldazoknaka
programoknak,amiknekszksgkvanarra,hogytudjanakazilletesemnybekvetkezsrl.Nzzkmeg
eztegykicsitrszletesebben.

85. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.3 Esemnyvezreltprogramok
Azelsgrafikusinterfaceprogramunkkalksrleteztnkazimnt.Azilyentpusprogrammshogyanvan
struktrlva,mintazelzekbentanulmnyozottszvegesscriptek.
Minden szmtgpprogram mkdsnek nagyjbl hrom f szakasza van:
inicializlsi szakasz: ez az elvgzend munkra felkszt utastsokat tartalmazza (a
szksges kls modulok hvsa, fileok megnyitsa, adatbzis serverhez vagy az
internethez kapcsolds, stb.); lnyegi mkdsi szakasz: itt sszpontosul a lnyegi
mkds (vagyis mindaz, amit a program tesz: adatokat r a kpernyre, szmtsokat
vgez, mdostja egy file tartalmt, nyomtat, stb.); vgl a befejez szakasz: ez a
mveletek megfelel lezrsra szolgl (vagyis a nyitva maradt fileok lezrsa, kls
kapcsolatokbontsa,stb.)
Szvegmdprogrambanezahromszakaszaszemkztibralinerisszervezst
kveti. Ennek az a kvetkezmnye, hogy ezeket a programokat nagyon korltozott
interaktivits jellemzi. A felhasznlnak gyakorlatilag semmilyen szabadsga sincs: a
program idrlidre megkri, hogy rjon be adatokat, de mindig a programutastsok
sorrendjnekmegfelel,elremeghatrozottsorrendben.
Egygrafikusinterfaceprogramnakettleltrabelsszervezse.Aztmondjuk,hogy
azilyenprogram esemnyvezrelt.Az inicializlsiszakaszutnazilyentpusprogram
vrakozsbamegytsrbzzamagtegymsik,tbbkevsbmlyenaszmtgpopercisrendszerbe
integrltsllandanmkdprogramra.
Ezazesemnyfogadllandnfigyeliaperifrikat(billentyzetet,egeret,rt,modemet,stb.)sazonnal
reaglr,haegyesemnytrzkel.
Egyilyenesemnylehetbrmilyenfelhasznliakci:azegrelmozdtsa,billentylenyomsa,stb.,deegy
belsesemny,vagyegyautomatizmusislehet(pldulrajel).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 86.
Amikorazesemnyfogadrzkelegyesemnyt,akkoregyspecifikusjeletkldaprogramnak30,aminekazt
felkellismerni,hogyreagljonr.
Egy grafikus user interface program inicializlsi szakasza olyan utastsokbl ll, amik az interface
klnbzinteraktv komponenseithelyezik el(ablakokat,gombokat,check boxokat, stb.).Ms utastsoka
kezelendzeneteketdefiniljk:eldnthetjk,hogyaprogramcsakbizonyosesemnyekrereagljonsatbbit
hagyjafigyelmenkvl.
Mgegyszvegesprogrambanamkdsiszakaszolyanutastssorozatblll,amielrelerjaazta
sorrendet,ahogyanagpnekaklnbzfeladataitvgrekellhajtania(mghaklnbzvgrehajtsiutakrl
gondoskodunk is vlaszul a vgrehajts sorn add klnbz felttelekre), addig egy grafikus interface
programmkdsifzisbancsakfggetlenfggvnyekettallunk.Ezeketaprogramspecifikusanakkorhvja,
amikoregymeghatrozottesemnytrzkelazopercisrendszer:vagyisaztafeladatotvgzikel,amiterreaz
esemnyrevlaszulvrunkaprogramtlssemmimst31.
Fontos, hogy megrtsk: ez alatt az esemnyfogad folyamatosan mkdik s esetleges ms esemnyek
bekvetkezsrevr.
Hamsesemnyekkvetkeznekbe,akkormegtrtnhet,hogyegymsodik(vagyegy3.,egy4.)fggvny
aktivldik s az elsvel, ami mg nem fejezte be mkdst32, prhuzamosan kezd el mkdni. A modern
opercisrendszereksnyelveklehetvteszikeztaprhuzamossgot,amitmultitaskingnakisneveznk.
Az elz fejezetben mr emltettem, hogy a programszveg struktrja nem adja meg kzvetlenl az
utastsokvgrehajtsisorrendjt.Ezamegjegyzsmginkbbigazagrafikusinterfaceprogramokra,mivela
fggvnyekhvsnaksorrendjemrseholsincslervaaprogramban.Azesemnyekvezrelnek!
Ezbiztosanbonyolultnaktnik.Nhnypldvalfogomillusztrlni.

30 Ezeket azzeneteket gyakranWMmel jelljk(Windowmessages: Windowzenetek)egy(reaktvznkat :


gombokat, checkboxokat, legrdl menket, stb. tartalmaz) ablakokbl ll grafikus krnyezetben. Az
algoritmusoklersakorgyakranelfordul,hogysszekeverjkezeketazzeneteketmagukkalazesemnyekkel.

31 Szgoran vve az olyan fggvnyeket, amik nem kldenek vissza semmilyen rtket sem, eljrsnak
(procedurnak)nevezzk.(lsd54.oldallbjegyzett).

32 Azonosesemnyekmegjelensrevlaszultbbszrmeghvhatugyanazafggvny,vagyisugyanaztafeladatot
tbbkonkurens pldnyhajtjavgre. Aksbbiekben majd megltjuk, hogyeznemkvnatos mellkhatsokat
eredmnyezhet.

87. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.3.1 Grafikusplda:vonalakrajzolsavszonra
Az albbi script egy ablakot hoz ltre, ami hrom
nyomgombot s egy vsznat tartalmaz. A Tkinter
terminolgijaszerintavszonegytglalapalakfellet,
amibe specilis metdusokkal33 klnbz rajzokat s
kpeketlehetelhelyezni.
A Vonalat rajzol gombra kattintva a vsznon
megjelenikegyj,sznesvonal,amimindenalkalommal
elhajlikazelztl.
HaaMsszngombrakattintunk,akkoregyvges
sznkszletbl vletlenszeren egy j sznt vlaszt a
script.Ezleszakvetkezegyenesszne.
AKilpgombazalkalmazsbefejezsresazablakzrsraval.

# Tkinter grafikus knyvtrat alkalmaz gyakorlat

from Tkinter import *


from random import randrange

# --- az esemnykezel fggvnyek defincija : ---


def drawline():
"Vonal rajzolsa a can1 canvasra (vszonra)"
global x1, y1, x2, y2, color
can1.create_line(x1,y1,x2,y2,width=2,fill=color)

# a koordintk mdostsa a kvetkez egyenes szmra :


y2, y1 = y2+10, y1-10

def changecolor():
"a rajz sznnek vletlenszer megvltoztatsa"
global color
pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
c = randrange(8) # => vletlenszm generlsa 0 s 7 kztt
color = pal[c]

#------ F program -------

# a kvetkez vltozkat globlis vltozkknt hasznljuk :


x1, y1, x2, y2 = 10, 190, 190, 10 # az egyenes koordinti
color = 'dark green' # az egyenes szne

# A f -widget ltrehozsa ("master") :

abl1 = Tk()
# a "slave" widget-ek ltrehozsa :
can1 = Canvas(abl1,bg='dark grey',height=200,width=200)
can1.pack(side=LEFT)

33 Ezekarajzokesetlegegyksbbifzisbananimltaklehetnek(lsdksbb)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 88.
gomb1 = Button(abl1,text='Kilp',command=abl1.quit)
gomb1.pack(side=BOTTOM)
gomb2 = Button(abl1,text='Vonalat rajzol',command=drawline)
gomb2.pack()
gomb3 = Button(abl1,text='Ms szn',command=changecolor)
gomb3.pack()

abl1.mainloop() # esemnyfogad indtsa

abl1.destroy() # az ablak (destruction) zrsa

Aprogrammkdstazelzoldalakmagyarzatnakmegfelelenktfggvnybiztostja:adrawline()
sachangecolor(),amiketazinicializlsiszakaszbandefiniltesemnyekaktivljk.

AzinicializlsiszakaszateljesTkintermodulsarandommodulegyfggvnynekamivletlenszmokat
lltelazimportlsvalkezddik.EzutnaTk(),Canvas()sButton() osztlyokblwidgetekethozunk
ltre.
Azinicializls azesemnykezeltindt abl1.mainloop() utastssalfejezdikbe.APythonakvetkez
utastsokatcsakakkorhajtjavgre,amikorkilpebblahurokbl.Akilpstazabl1.quit()metdusindtjael
(lsdalbb)
A gombokat ltrehoz utastsban a command opcival adhatjuk meg azt a fggvnyt, amit egy <bal
egrgomb kattints a widgetre> esemny bekvetkezsekor kell hvni. A Tkinter, hogy megknnytse a
dolgunkat, ezt a megoldst knlja, mivel ezt az esemnyt kapcsoljuk termszetes mdon egy gomb tpus
widgethez. A ksbbiekben meg fogjuk ltni, hogy vannak ms, ltalnosabb technikk, amikkel brmilyen
esemnythozzkapcsolhatunkbrmelyikwidgethez.
A script fggvnyei a fprogramban definilt vltozk rtkeit megvltoztathatjk. Ezt a
fggvnydefincikbanhasznlt global utaststeszilehetv.Egydarabiggyjrunkel(decsakazrt,hogy
hozzszokjunkaloklissgloblisvltozkviselkedsekzttiklnbsghez),azonbanaksbbiekbenmeg
fogjukrteni:ennekatechniknakazalkalmazsaegyltalnnemjavasolt,klnsenakkornem,hanagymret
programokatrunk.Amikorrtrnkazosztlyoktanulmnyozsra,egyjobbtechniktfogunkmegtanulni(a
154.oldaltl).
A Kilp gombhoz kapcsolt parancs az abl1 ablak quit() metdust hvja. Ez az ablakhoz kapcsolt
esemnyfogadbl(mainloop)valkilpsreszolgl.Aktivlsakoraprogramvgrehajtsamainloopotkvet
utastsokkalfolytatdik.Pldnkbanezazablaktrlsbl(destroy)ll.

89. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
(8) Gyakorlatok:azelzVonalrajzolprogrammdostsai.
8.1. Hogyankellmdostaniaprogramot,hogytbbnelegyencian,maroonsgreen(cin,barnaszld)
vonal?

8.2. Hogyankellmdostaniaprogramot,hogymindenvonalvzszintessprhuzamoslegyen?

8.3. Nagytsafelavsznat.Legyenaszlessge500,ahosszsga650egysg.Vltoztassamegavonalak
hossztisgy,hogyavszonszligrjenek.

8.4. Adjonaprogramhozegydrawline2fggvnyt,amiegyvrskeresztetrajzolavszonkzepre.
Adjon egy Keres nev gombot is a programhoz. A gombra val kattintssal kell kirajzolni a
keresztet!

8.5. Azeredetiprogrambanhelyettestskadrawline(rajzoljegyenest)metdustadrawrectangle
(rajzoljtglalapot)metdussal.Mitrtnik?
Ugyangy prblja ki a drawarc (rajzolj krvet) drawoval (rajzolj ellipszist)
drawpolygon(rajzoljsokszget)metdust.
Mindegyikmdszernladjameg,hogymitjellnekazrjelbenmegadottparamterek!
(Megjegyzs:asokszgesetbenaprogramonmdostanikell!)

8.6. Trljeaglobalx1,y1,x2,y2sortazeredetiprogramdrawlinefggvnyben.Mitrtnik?
Mirt?
Ha a drawline fggvnyt definil sorban az x1, y1, x2, y2 t zrjelbe teszi,
fggvnyparamterknttadvaezeketavltozkat,fogemgmkdniaprogram?(Nefelejtskel
mdostaniafggvnyhvprogramsortsem!)
Mi trtnik, ha x1, y1, x2, y2 = 10, 390, 390, 10 rtkad utasts van a global x1,
y1,...utastshelyn?Mirt?Milyenkvetkeztetsttudebbllevonni?

8.7. a)rjonegyrvidprogramot,amiegyfehrhtter(white)tglalapbarajzoljaaz5olimpiaikarikt.Egy
Kilpsgombnakkellbezrniazablakot.
b) Mdostsa a fenti programot gy, hogy hozztesz 5 gombot. Minden egyes gomb rajzoljon egy
karikt.

8.8. Ksztsen a fzetben egy ktoszlopos tblzatot. A baloldali oszlopba rja be a mr megismert
osztlyokdefinciit(aparamterlistjukkalegytt)sajobboldalioszlopbaazosztlyokmetdusait(a
paramterlistjukkalegytt).Hagyjonhelyetaksbbikiegsztsnek.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 90.
8.3.2 Grafikusplda:rajzokkzttivlts
Ezapldaaztmutatjabe,hogyanlehetfelhasznlniaprogramhurkokrl,listkrlsfggvnyekrlszerezett
ismereteket arra, hogy nhny kdsor segtsgvel tbb rajzot hozzunk ltre. Az alkalmazsunk a vlasztott
gombtlfggenfogjamegjelenteniazalbbirajzokkzlazegyiket.

from Tkinter import *

def circle(x, y, r, color ='black'):


"r sugar (x,y) kzppont lr rajzolsa"
can.create_oval(x-r, y-r, x+r, y+r, outline=color)

def figure_1():
"celtablat rajzol"
# el szr a meglv rajz trlse :
can.delete(ALL)
# a kt egyenes rajzolsa (fgg. s vizsz.) :
can.create_line(100, 0, 100, 200, fill ='blue')
can.create_line(0, 100, 200, 100, fill ='blue')
# tbb koncentrikus kr rajzolsa :
radius = 15
while radius < 100:
circle(100, 100, radius)
radius += 15

def figure_2():
"egyszer stett arc rajzolsa"
# el szr minden meglv rajz trlse :
can.delete(ALL)
# minden kr jellemz jt listk listjba
# tesszk :
cc =[[100, 100, 80, 'red'], # fej
[70, 70, 15, 'blue'], # szem
[130, 70, 15, 'blue'],
[70, 70, 5, 'black'],
[130, 70, 5, 'black'],
[44, 115, 20, 'red'], # arc
[156, 115, 20, 'red'],
[100, 95, 15, 'purple'], # orr
[100, 145, 30, 'purple']] # szj
# az osszes kort egy ciklus segitsegevel rajzoljuk meg :
i =0
while i < len(cc): # a lista bejrsa
el = cc[i] # minden elem maga is lista
circle(el[0], el[1], el[2], el[3])
i += 1

##### F programm : ############

window = Tk()
can = Canvas(window, width =200, height =200, bg ='ivory')
can.pack(side =TOP, padx =5, pady =5)
b1 = Button(window, text ='1. bra', command =figure_1)
b1.pack(side =LEFT, padx =3, pady =3)
b2 = Button(window, text ='2. bra', command =figure_2)
b2.pack(side =RIGHT, padx =3, pady =3)
window.mainloop()
Kezdjkascriptvgnlvfprogramelemzsvel:LtrehozunkaTk()osztlyblegyablakobjektumota

91. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
windowvltozban.
Utnaltrehozunkebbenazablakban3widgetet:egyvsznat(canvas)acansktgombot(button)ab1sb2
vltozkba.Awidgeteketmintazelzscriptbenapack()metdusukkalpozcionljukazablakban,demost
ametdustopcikkalhasznljuk:
asideopciaTOP,BOTTOM,LEFTsRIGHTrtkeketfogadjael.Awidgetetamegfeleloldalratesziaz
ablakban.
apadxspadyopcikegysvottartanakszabadonawidgetkrl.Eztasvotpixelekbenadjukmeg:apadx
awidgetbalsjobboldaln,apadyawidgetalattsflttfoglaljaleazemltettsvot.

Agombokvezrlikaktbrakirajzolstafigure_1()sfigure_2()fggvnyekhvsval.Miveltbbkrt
kell rajzolni a vszonra, ezrt gy gondolom, hasznos lenne elszr egy specializlt circle() fggvnyt rni.
Valsznleg az olvas mr tudja, hogy a Tkinter canvasnak van egy create_oval() metdusa, amivel
akrmilyenellipszist(gykrketis)rajzolhatunk.Azonbaneztametdustngyargumentummalkellhvni.Az
argumentumokegyfiktvtglalap balfelssjobbalssarknakakoordintitadjkmeg,amibebelefogjuk
rajzolniazellipszist.Akrspecilisesetbeneznemtlpraktikus.Termszetesebbnektnikarajzolstakr
kzppontjnakssugarnakmegadsvalvezrelni.Eztacircle()fggvnynkkelrjkel,amiakoordintk
konverzijt elvgezve hvja a create_oval() metdust. Vegyk szre, hogy a fggvny egy opcionlis
argumentumotvr,amiarajzolandkrsznrevonatkozik(ezalaprtelmezettenfekete).
A figure_1() fggvnyben vilgosan szembetnik ennek a megkzeltsnek a hatkonysga. Egy
programhurokvanbenne,amia(zazonoskzppont,nvekvsugar)krksorozatnakkirajzolsraszolgl.
Figyeljk meg a += incrementl opertorhasznlatt (pldnkban azr vltozrtkt nveli 15 egysggel
mindeniterrciban).
Amsodikrajzegykicsitsszetettebb,mertvltozmret,klnbzkzppontkrkblvansszelltva.
Az sszes krt ugyangy, egyetlen programhurok segtsgvel rajzolhatjuk meg, ha felhasznljuk a listkrl
szerzetttudsunkat.
Ngyjellemzklnbztetimegegymstlamegrajzolandkrket:akzppontxsykoordinti,asugr
saszn. Mindegyikkrnekeztangyjellemzjtsszegyjthetjkegyegylistbansezeketalistkategy
msik listban trolhatjuk. gy egy egymsba gyazott listnk lesz, amit elg lesz egy ciklus segtsgvel
bejrnunkamegfelelrajzokelksztshez.

Gyakorlatok:
8.9. Irjonegyscriptetazelzalapjn,amiegysakktblt(fehr
alaponfeketengyzeteket)jelentmeg,amikoregygombra
kattintunk:

8.10. Az elz gyakorlatba ptsnk be mg egy gombot, ami


korongokatjelentmegvletlenszerenasakktbln(agomb
mindenmegnyomsraegyjkorongjelenjenmeg).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 92.
8.3.3 Grafikusplda:egyegyszerszmolgp
Br a kvetkez script nagyon rvid, mgis egy komplett szmolgpet
implementl,amivelzrjeleketstudomnyosfggvnyekettartalmazszmtsokat
vgezhetnk.Semmirendkvlitnemltunk.Ezekafunkcikcsakannakatnyneka
kvetkezmnyei, hogy a program vgrehajtsra interpretert, nem pedig
fordtprogramothasznlunk.
Tudjuk, hogy a fordtprogram csak egyszer mkdik azrt, hogy vgrehajthat kdra fordtsa le a
forrskdot. A szerepe teht mg a programvgrehajts eltt befejezdik. Az interpreter viszont aktv a
programvgrehajts alatt srendelkezsrell,hogybrmilyenjforrskdotmintpldulafelhasznlltal
bertmatematikaikifejezstlefordtson.
Az interpretlt nyelveknek mindig vannak olyan fggvnyei, amik lehetv teszik egy stringnek a nyelv
utastssoraknt trtn kirtkelst. gy dinamikus programstruktrkat hozhatunk ltre nhny sorban. Az
albbipldbanazeval()beptettfggvnythasznljukafelhasznlltalazerreaclraszntmezbebert
matematikaikifejezselemzsresutnanincsmsdolgunk,mintkiratniazeredmnyt.

# A Tkinter grafikus knyvtrat s a math modult alkalmaz gyakorlat

from Tkinter import *


from math import *

# annak az akcinak a defincija, amit akkor kell vgrehajtani, ha a


# felhasznl az adatbeviteli mez szerkesztse utn Enter -t nyom:

def kiertekel(event):
chain.configure(text = "Eredmny = " + str(eval( mezo.get())))

# ----- F program : -----

ablak = Tk()
mezo = Entry( ablak)
mezo.bind("<Return>", kiertekel)
mezo.pack()
chain = Label( ablak)
chain.pack()

ablak.mainloop()

AscriptelejnaTkintersamathmodulokatimportljuk.Azutbbiraazrtvanszksg,hogyazemltett
szmolgpnek valamennyi hasznlatos matematikai s tudomnyos fggvny (sin, cos, ngyzetgyk, stb.)
rendelkezsrelljon.
Ezutndefiniljuka kiertekel() fggvnyt.Eztaprogramakkorfogjavgrehajtani,amikorafelhasznla
Return (vagy Enter) gombra kattint, miutn a ksbbiekben lert adatbeviteli mezbe bert valamilyen
matematikaikifejezst.

93. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ez a fggvny a chain34 widget configure() metdust hasznlja a text attribtum mdostsra. Az
attribtum j rtkt az hatrozza meg, amit az egyenlsgjel jobboldalra rtunk. A Pythonba beptett kt
fggvny, az eval() s a str() valamint egy Tkinter widgethez kapcsold get() metdus segtsgvel
dinamikusankonstrultstringrlvansz.
Az eval() az interpretert hvja az argumentumknt egy karakterlncban tadott Pythonkifejezs
kirtkelshez.Akirtkelseredmnyeazeval()visszatrsirtke.Plda:
chain = "(25 + 8)/3" # chan egy matematikai kifejezst tartalmaz
res = eval(chain) # chan-ben lev kifejezs kirtkelse
print res +5 # => a res vltoz tartalma numerikus

A str() egy numerikus kifejezst alakt karakterlncc. Azrt kell ezt a fggvnyt hvni, mert az elz
fggvny(azeval())egynumerikusrtketadvissza,amitjrakarakterlnccalaktunk,hogyaEredmny=
zenetbebeletudjukfoglalni.
Aget()metdusazEntryclasswidgetjeihezkapcsoldik.Programunkbanegyilyentpuswidgetteltesszk
lehetvafelhasznlnak,hogybrmilyennumerikuskifejezstberhassonabillentyzetsegtsgvel.A get()
metdussallehetkiszedniamezowidgetblafelhasznlltalmegadottkarakterlncot.

Afprogramtartalmazzaazinicializlsiszakaszt,amiazesemnyfigyel(mainloop)indtsvalvgzdik.A
fprogrambanltrehozunkegyTk()ablakot,amiaLabel()classblltrehozottchainsazEntry()classbl
ltrehozottmezowidgetettartalmazza.

Figyelem:azrt,hogyamezowidgetvalbantennitudjaadolgt,vagyishogyaprogramnakttudjaadni
aztakifejezst,amitafelhasznlbert,abind()35metdussegtsgvelhozzkapcsolunkegyesemnyt:
mezo.bind("<Return>",kiertekel)

Ez az utasts a kvetkezt jelenti: Ksd a <Return> billenty lenyomsnak esemnyt a <mezo>


objektumhozskezeljeeztazesemnyta<kiertekel>fggvny
Akezelendesemnytegyspeciliskarakterlncrjale(pldnkbana<Return>string).Szmosesemny
ltezik (egrmozgsok s kattintsok, billentylenyoms, ablakok elhelyezse s tmretezse, stb.). Minden
esemnyspecilisstringjemegtallhataTkinterrelfoglalkozreferenciamvekben.
Hasznljuk ki az alkalmat arra, hogy mgegyszer megfigyeljk egy objektum metdushvsnak a
szintaxist:

objektum.metdus(argumentumok)
Elszrlerjukaz objektum nevt,aztkvetiegypont(amiopertorkntmkdik),majdahvott metdus
neve,vglzrjelbenazargumentumok.

34 Aconfigure()metdusbrmelymrltezwidgetrealkalmazhatatulajdonsgokmdostsra.

35 Abindszjelentse:sszekt

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 94.
8.3.4 Grafikusplda:egrkattintsdetektlsashelynekazonostsa
Az elz plda kiertekel fggvnynek defincijnl megjegyeztem, hogy az event (esemny)
argumentumotadtukmegzrjelben.
Ezazargumentumktelez.Amikoregyesemnykezelfggvnytdefinilunk,amitvalamelyikwidgethez
ktnkannakbind()metdusval,akkormindigmegkelladniargumentumkntazesemnyt.Egyautomatikusan
ltrehozottstandardPythonobjektumrlvansz,amilehetvteszi,hogyazesemnykezelnektadjukennek
azesemnynekazattribtumait:
azesemnytpust:azegrelmozdulsa,azegrgomboklenyomsavagyelengedse,egybillentylenyomsa
aklaviatrn,akurzoregyelredefiniltznbakerlse,egyablakmegnyitsavagyzrsa,stb.
azesemnytulajdonsgait:azesemnykeletkezsnekpillanata,koordinti,azrintettwidget(ek)jellemzi,
stb.
Nemfogunknagyonbelemerlniarszletekbe.Haazolvasberjaazalbbiscriptetsksrletezikvele,
akkorgyorsanmegfogjarteniazelvet.

# Egrkattints szlelse s helynek meghatrozsa egy ablakban :

from Tkinter import *

def mutato(event):
chain.configure(text = "Kattints detektlva: X =" + str(event.x) +\
", Y =" + str(event.y))

ablak = Tk()
keret = Frame(ablak, width =200, height =150, bg="light yellow")
keret.bind("<Button-1>", mutato)
keret.pack()
chain = Label(ablak)
chain.pack()

ablak.mainloop()

Ascriptegyhalvnysrgakeretet(frame)tartalmazablakotjelent
meg,amibeafelhasznlnakazegrrelbelekellkattintani.
A <kattints az egr els gombjval> esemnyt a frame widget
bind()metdusakapcsoljaamutatoesemnykezelhz.

EzazesemnykezelaPythonltalautomatikusanltrehozottevent
objektum x s y attribtumait hasznlhatja annak a stringnek a
megkonstrulsra,amiazegrpozcijtfogjatartalmazniakattints
pillanatban.

Gyakorlat:
8.11. Mdostsagyafentiscriptet,hogyazegypiroskrtjelentsenmegakattintshelyn(elszraFrame
widgetetegyCanvaswidgettelkellhelyettesteni).

95. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.4 ATkinterwidgetosztlyai
Megjegyzs: A tanfolyam a sorn aprnknt bemutatom nhny widget hasznlatt. Azonban nem ll
szndkombanegykomplettTkinterkziknyvetrni.Azokraawidgetekrefogokszortkozni,amikmdszertani
szempontblalegrdekesebbnektnnek,vagyisamiksegthetnekmegrteniolyanfontosfogalmat,mintamilyen
azosztly(class)fogalma.Akitbbetakartudni,azszveskedjenazirodalomban(lsd8.oldal)utnanzni.
ATkinterwidgeteknek15alaposztlyaltezik:

Widget Lers
Button Klasszikusnyomgomb,valamilyenutastsvgrehajtsnakazelidzsre
hasznljk.
Canvas Klnbzgrafikuselemekelhelyezsreszolglfellet.Rajzolsra,grafikus
szerkesztkltrehozsrastestreszabottwidgetekimplementlsrais
hasznlhatjuk.
Checkbutton Egyjellngyzet,aminekktklnbzllapotalehet(angyzetkivanjellve
vagynincskijellve).Egyklikkelsawidgetenllapotvltozstidzel.
Entry Adatbevitelimez,amibeafelhasznlbrmilyenszvegetberhat.
Frame Egytglalapalakfelletazablakban,ahovamswidgetekettehetnk.Eza
felletszneslehet.Szeglyeislehet.
Label Valamilyenszveg(vagycmke)(esetlegegykp).
Listbox Afelhasznlnakltalbanvalamilyendobozformjbanfelajnlott
vlasztklista.AListboxotgyiskonfigurlhatjuk,hogyvagyegyrdigomb
vagyegyjellngyzetsorozatottartalmazzon.
Menu Men.Lehetcmsorhozkapcsoldlegrdlmen,vagyegykattintsutn
akrholfeljvszpopupmen.
Menubutton Mengomb,amitlegrdlmenkimplementlsrahasznlnak.
Message Szvegkirstteszilehetv.ALabelwidgetegyvltozata,amilehetvteszi,
hogyakirtszvegautomatikusanegybizonyosmrethez,vagy
szlessg/magassgarnyhozigazodjon.
Radiobutton (Egyfeketepontegykiskrben.)Egyvltozlehetsgesrtkeitreprezentlja.Az
egyikrdigombravalkattintsazannakmegfelelrtketadjaavltoznak.
Scale Egykurzornakegysklamentnvalmozgatsvalteszilthatvegyvltoz
rtknekavltoztatst.
Scrollbar Agrgetsortmswidgetekhez(Canvas,Entry,Listbox,Text)kapcsolva
hasznlhatjuk.
Text Formzottszvegkirsa.Afelhasznlnakislehetvtesziakirtszveg
formzst.Kpeketisbelehetszrni.
Toplevel Egykln,fellrekirtablak.

Mindegyik widgetosztlynak szmos beptett metdusa van. Kapcsolhatunk hozzjuk esemnyeket is,
amintaztazelzoldalakonlttuk.Tbbekkzttmegfogjuktanulni,hogyezeketawidgeteketa grid(), a
pack()saplace()metdusoksegtsgvelpozcionlhatjukazablakokban.

Ezeknekamdszereknekahasznaakkorvliknyilvnvalv,amikormegprblunkportbilisprogramokat
rni(vagyisolyanokat,amikkpesekklnbzopercisrendszerekenmintaUnix,MacOSvagyWindows
futni),amiknekazablakaitmretezhetek.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 96.
8.5 Agrid()metdusalkalmazsawidgetekpozcionlsra
Eddigmindigapack()metdussegtsgvelhelyeztkelawidget
eketazablakukban.Ennekametdusnakarendkvliegyszersgaz
elnye, azonban nem ad tl sok szabadsgot a widgetek kedvnk
szerintielrendezshez.Mitkellpldulcsinlni,hogymegkapjukaz
brnlthatelrendezst?
Tehetnnknhnyksrletet,mintamilyeneketazelzekbentettnk,hogyapack()metdusnakside=
tpusargumentumokatadunk,deeznemvezetnemesszire.Prbljukmegpldul:
from Tkinter import *

abl1 = Tk()
txt1 = Label(abl1, text = 'Els mez :')
txt2 = Label(abl1, text = 'Msodik :')
mezo1 = Entry(abl1)
mezo2 = Entry(abl1)
txt1.pack(side =LEFT)
txt2.pack(side =LEFT)
mezo1.pack(side =RIGHT)
mezo2.pack(side =RIGHT)

abl1.mainloop()

...azeredmnynemigaznaz,amitkerestnk!!!:

Hogyjobbanmegrtskapack()metdusmkdst,megprblhatjukmgaside=TOP,side=BOTTOM
opcikklnbzkombinciitangywidgetmindegyikre.Azonbanbiztosannemfogjukmegkapniakvnt
elrendezst.Ktkiegszt Frame() widgetdefinilsvalsa Label() s Entry() widgetekezekbentrtn
elhelyezsveltalnsikerlneeljutniakvntelrendezshez,azonbaneznagyonbonyolultlenne.

97. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ittazideje,hogymegtanuljukaproblmaegymsikmegkzeltst.Elemezzkazalbbiscriptet:(ezmr
majdnemamegolds):

from Tkinter import *

abl1 = Tk()
txt1 = Label(abl1, text = 'Els mez :')
txt2 = Label(abl1, text = 'Msodik :')
mezo1 = Entry(abl1)
mezo2 = Entry(abl1)
txt1.grid(row =0)
txt2.grid(row =1)
mezo1.grid(row =0, column =1)
mezo2.grid(row =1, column =1)
abl1.mainloop()

Ebbenascriptbena pack() metdusta grid()delhelyettestettk.Lthat,hogyazutbbihasznlataigen


egyszer.Ezazablakotegytblzatnak(rcsnak)tekinti.Elg,hamegadjukneki,hogyatblzatmelyiksorba
(row)smelyikoszlopba(column)akarjukelhelyezniawidgeteket.Asorokatsoszlopokatgyszmozhatjuk,
ahogyakarjuk: kezdhetjk nulltl, vagy egytl, vagy akrmilyen szmtl. A Tkinter figyelmen kvl fogja
hagyniazressorokatsoszlopokat.Jegyezzkmeg,hanemadunkmegsemmilyensorvagyoszlopszmot,
akkorazalaprtelmezettrtknullalesz.
A Tkinter automatikusan meghatrozza a szksges sorok s oszlopok szmt. De ez nem minden: ha
figyelmesenmegvizsgljukafentiscripttelltrehozottablakot,ltnifogjuk,hogymgnemrtkelakitztt
clunkat. Az ablak baloldaln megjelen karakterlncok centrltak, mg mi jobbra igaztva szeretnnk ket.
Ahhoz,hogyeztelrjk,elga grid() metdusnakegyargumentumotmegadni.A sticky opcingyrtket
vehetfel:N,S,W,E(angygtjangolrvidtst).Ettlazrtktlfggenlesznekawidgetekfntre,lentre,
balra,vagyjobbraigaztva.Helyettestskascriptbenaktelsgrid()utaststakvetkezkkel:
txt1.grid(row =0, sticky =E)
txt2.grid(row =1, sticky =E)

...spontosanakvntelrendezstfogjukmegkapni.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 98.
Elemezzkmostakvetkezablakot:

Azablak3oszlopottartalmaz:azelsben3string,amsodikban3adatbevitelimez,aharmadikbanegykp
van.Azelsktoszlopoban33sorvan,viszontaharmadikoszlopbanlvkpvalamilyenmdonlefedia
hromsort.
Akvetkezakdja:

from Tkinter import *

abl1 = Tk()

# a 'Label' s 'Entry' widgetek ltrehozsa:


txt1 = Label(abl1, text ='Els mez :')
txt2 = Label(abl1, text ='Msodik :')
txt3 = Label(abl1, text ='Harmadik :')
mezo1 = Entry(abl1)
mezo2 = Entry(abl1)
mezo3 = Entry(abl1)

# egy bitmap kpet tartalmaz 'Canvas' widget ltrehozsa :


can1 = Canvas(abl1, width =160, height =160, bg ='white')
photo = PhotoImage(file ='Martin_p.gif')
item = can1.create_image(80, 80, image =photo)

# laptrdels a'grid' metdus segtsgvel :


txt1.grid(row =1, sticky =E)
txt2.grid(row =2, sticky =E)
txt3.grid(row =3, sticky =E)
mezo1.grid(row =1, column =2)
mezo2.grid(row =2, column =2)
mezo3.grid(row =3, column =2)
can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)

# indts :
abl1.mainloop()

99. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ahhoz, hogy az olvas futtatni tudja a scriptet, valsznleg a kpfile nevt (Martin_p.gif) a vlasztsa
szerintikpnevvelkellhelyettestenie.Figyelem:astandardTkinterknyvtrcsakkevsfileformtumotfogad
el.VlasszalehetsgszerintaGIFformtumot.

Nhnydolgotmegjegyezhetnkascriptbl:
1. Akpbeszrsraalkalmazotttechnikt:
ATkinternemteszilehetv,hogykzvetlenlszrjunkbekpetazablakba.Elszregyvsznat(canvas)
kellazablakbaelhelyeznisakpeterrekelltenni.Avszonnakfehrszntvlasztottamazrt,hogymeg
lehessenklnbztetniazablaktl.Haaztakarjuk,hogyavszonlthatatlannvljon,akkora bg='white'
paramteretbg='gray'velhelyettestsk.Miveltbbflekptpusltezik,ezrtaPhotoImage()36classbana
kpobjektumotGIFtpusbitmapkpnekkelldeklarlnunk.

2. Akpvszonrahelyezsnekmdjt:
item=can1.create_image(80,80,image=photo)
Pontos szhasznlattal azt mondjuk, hogy a can1 objektumhoz (amely objektum a Canvas osztly egy
pldnya) kttt create_image() metdust hasznljuk. A kt els argumentum (80, 80) adja meg a
vszonnakaztazxsykoordintjt, ahovakpkzppontjtkelltenni.(Mivel avszon160x160as
mret,ezrtakpetavszonkzeprecentrljaakoordintavlasztsunk).

3. Asoroksoszlopokszmozstagrid()metdusban:
Megllapthatjuk,hogyezalkalommalagrid()metdusbanasoroksoszlopokszmozsa1gyelkezddik
(nempedignullval,mintazelzscriptben).Amintmrfeljebbemltettem,aszmozsvlasztsateljesen
szabad.
Szmozhatnnkgyis:5,10,15,20...mertaTkinterfigyelmenkvlhagyjaazressorokatsoszlopokat.
Az1tlkezddszmozsvalsznlegakdunkolvashatsgtjavtja.

4. Agrid()delavszonelhelyezsrehasznltargumentumokat:
can1.grid(row=1,column=3,rowspan=3,padx=10,pady=5)
Az els kett azt jelenti, hogy a vszon a harmadik oszlop els sorban lesz elhelyezve. A harmadik
(rowspan=3)aztjelenti,hogyhromsorrafogkiterjedni..
Aktutols(padx=10,pady=5)annakafelletnekamreteitjelenti,amitawidgetkrlkelllefoglalnunk
(magassgbansszlessgben).

5. shamritttartunk,hasznljukkieztajlkiveszettpldtarra,hogymegtanuljukegykicsitegyszersteni
akdunkat...

36 APhotoImageosztlystandardimplementcijaGIFsPGM/PPMkpekettudbeolvasni.(ford.megjegyzse)
Lteznekmskpclassok,deazokhasznlathozmsgrafikusmodulokatkellimportlniascriptbe.Pldula
PIL(PythonImagingLibrary)lellehetksrletezni.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 100.
8.6 Utastsokkomponlsaatmrebbkdrdekben
Abbl addan, hogy a Python magasszint programozsi nyelv, gyakran lehetsges (s kvnatos) azrt
tdolgozniegyscriptet,hogytmrebblegyen.
Pldul gyakran hasznlhatjuk az utastsok kombinlst arra, hogy a widgetekre ltrehozssuk
pillanatbana(grid(), pack() vagy place))pozcionlmetdusokatalkalmazzuk.Akdegyszerbbsnha
olvashatbbvlik.Pldulazelzscriptktsort:

txt1=Label(abl1,text='Elsmez:')
txt1.grid(row=1,sticky=E)

egyetlensorralgyhelyettesthetjk:
Label(abl1, text ='Elsmez :').grid(row =1, sticky =E)

Ezzel az j rsmddal megtakartjuk a txt1 kzbens vltozt. Ezt a vltozt arra hasznltuk, hogy
megknnytettkeljrsunkegymstkvetlpseit,denincsrfelttlenlszksg.ALabel()osztlyhvsra
mg akkor is ltrejn ennek az osztlynak egy objektuma, ha az objektum hivatkozst nem troljuk egy
vltozban.(ATkintermindenesetremegrzieztahivatkozstazablakbelsreprezentcijban.)Hagyjrunk
el, a hivatkozs elvsz a script htralv rsze szmra, de egyetlen egy sszetett utastsban az objektum
ltrehozsnakpillanatbanmgisalkalmazhatregyolyanpozcionlmetdus,mintagrid(). Nzzkmeg
eztegykicsitrszletesebben:
Eddiggyhoztunkltreklnbzobjektumokatvalamilyenosztlybl,hogyazokatmindenalkalommal
vltozkhozrendeltkhozz.Pldulamikoraztrtuk,hogy:
txt1=Label(abl1,text='Elsmez:')
akkoraLabel()osztlyegypldnythoztukltre,amitatxt1vltozhozrendeltkhozz.

A txt1 vltozvalerreapldnyrahivatkozhatunkascriptbenmindenhol.Valjbanazonbancsakegyszer
hasznljuk,mgpedigarra,hogyalkalmazzukragrid()metdust,mertaszbanforgwidgetnemegybmint
egyegyszercmke.Nemjavasolhatgyakorlatcsakazrtltrehozniegyjvltozt,hogyutnacsakegyszer(s
kzvetlenlaltrehozsautn)hivatkozzunkr,ugyanisavltozfeleslegesenfoglallememriaterletet.
Hailyenhelyzetllel,akkorblcsebb dolog sszetett utastsokatalkalmazni.Pldulakvetkez kt
utastst:
osszeg=45+72
printosszeg
inkbbegyetlensszetettutastssalhelyettestjk:
print45+72
gymegtakartunkegyvltozt.
Ugyangy,amikorolyanwidgetekethelyeznkel,amikreksbbnemkvnunkvisszatrni,amigyakran
elfordul a Label() osztly widgetjei esetben, akkor azok ltrehozsakor ltalban egyetlen sszetett
utastsbankzvetlenlalkalmazhatkapozcionlmetdusok(agrid(),pack()vagyplace()).

Ezcsakazokraa widgetekrevonatkozik,amikrealtrehozsukutntbbetnemhivatkozunk. Azsszes


tbbitvltozkhozkellrendelni,hogyascriptbenmsuttmghasznlnitudjukket.

101. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ez esetben kt kln utastst kell alkalmazni. Egyiket a widget ltrehozsra, a msikat a pozcionl
metdusalkalmazsra.Nemkpezhetnkolyansszetettutastst,mintazalbbi:
mezo = Entry(abl1).pack() # programozsi hiba !!!

Ennekazutastsnakltszlagegyjwidgetetkellettvolnaltrehozni,azthozzrendelniamezovltozhoz,
apack()metdussegtsgvelpozcionlniegyazonmveletenbell.
Avalsgbanazutasts ltrehoztaaz Entry() osztlyblazjwidgetetsa pack() metduselvgezteaz
ablakbeli pozcionlst, dea mezo vltozba a pack() metdus visszatrsirtkt trolta: ezpedig nema
widgethivatkozsa.Ezzelavisszatrsirtkkelsemmitsemtudunkkezdeni,ezegyresobjektum(None).
Hogywidgethivatkozstkapjunk,ktutaststkellhasznlnunk:
mezo=Entry(abl1) #awidgetltrehozsa
mezo.pack() #awidgetpozcionlsa

Megjegyzs : Ha a grid() metdust alkalmazzuk, akkor a sor s oszlopszmok elhagysval tovbb


egyszersthetjkaprogramunkat.Attlapillanattlkezdve,hogyawidgetekpozcionlsraagrid()metdust
hasznljuk, a Tkinter gy tekinti, hogy sorok s oszlopok37 vannak. Ha nem adunk meg egy sor vagy egy
oszlopszmot,akkoragrid()metdusamegfelelwidgetetazelsrescellbateszi.

Azalbbiscripttartalmazzaazemltettegyszerstseket:

from Tkinter import *


abl1 = Tk()

# Label(), Entry(), s Checkbutton() widget-ek ltrehozsa :


Label(abl1, text = 'Els mez :').grid(sticky =E)
Label(abl1, text = 'Msodik :').grid(sticky =E)
Label(abl1, text = 'Harmadik :').grid(sticky =E)
mezo1 = Entry(abl1)
mezo2 = Entry(abl1) # ezekre a widget-ekre ks bb
mezo3 = Entry(abl1) # hivatkozni fogunk :
mezo1.grid(row =0, column =1) # ezrt mindegyiket kln
mezo2.grid(row =1, column =1) # vltozhoz rendeljk
mezo3.grid(row =2, column =1)
chek1 = Checkbutton(abl1, text ='Checkbox a megjelentshez')
chek1.grid(columnspan =2)

# egy bitmap kpet tartalmaz 'Canvas' (vszon) widget ltrehozsa:


can1 = Canvas(abl1, width =160, height =160, bg ='white')
photo = PhotoImage(file ='Martin_p.gif')
can1.create_image(80,80, image =photo)
can1.grid(row =0, column =2, rowspan =4, padx =10, pady =5)

# indts :
abl1.mainloop()

37 Ugyanabbanazablakbannehasznljunktbbflepozcionlmetdust!
Agrid(),pack()splace()metdusokklcsnsenkizrjkegymst.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 102.
8.7 ObjektumtulajdonsgainakmdostsaAnimci
Ezenatudsszintenazolvasbizonyraszeretneolyanprogramotrni,amigomboksegtsgvelegyrajzot
mozgategyvsznon.
rjukbe,teszteljkselemezzkakvetkezscriptet:

from Tkinter import *

# ltalnos mozgateljrs :
def mozog(gd, hb):
global x1, y1
x1, y1 = x1 +gd, y1 +hb
can1.coords(oval1, x1, y1, x1+30, y1+30)

# esemnykezel k :
def mozdit_balra():
mozog(-10, 0)

def mozdit_jobbra():
mozog(10, 0)

def mozdit_fel():
mozog(0, -10)

def mozdit_le():
mozog(0, 10)

#------ F program -------

# a kvetkez vltozk globlisak :


x1, y1 = 10, 10 # kiindulsi koordintk

# A f ("master") widget ltrehozsa :


abl1 = Tk()
abl1.title("Animcis gyakorlat Tkinter-rel")

# "slave" widget-ek ltrehozsa :


can1 = Canvas(abl1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='red')
can1.pack(side=LEFT)
Button(abl1,text='Kilp',command=abl1.quit).pack(side=BOTTOM)
Button(abl1,text='Balra',command=mozdit_balra).pack()
Button(abl1,text='Jobbra',command=mozdit_jobbra).pack()
Button(abl1,text='Fl',command=mozdit_fel).pack()
Button(abl1,text='Le',command=mozdit_le).pack()

# esemnyfigyel (f hurok) indtsa :


abl1.mainloop()

103. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Aprogramszmosismertelemettartalmaz:ltrehozunkegy abl1 ablakot,ebbenelhelyeznkegyvsznat,
aminegyszneskr,stvezrlgombvan.Vegykszre,hogyanyomgomb widgeteketnemrendeljk
vltozkhoz(ezfeleslegeslenne,mertnemfogunkrjukhivatkozniaksbbiekben).Apack()metdustrgtn
ezeknekazobjektumoknakaltrehozsakorkellalkalmaznunk.
Azigazijdonsgascriptelejndefiniltmozog()fggvnybenvan.Afggvnymindenegyeshvsakort
fogjadefinilniavszonrahelyezettszneskrobjektumkoordintitsezidzielazobjektumanimcijt.
Ez az eljrs jellemz az objektum orientlt programozsra: Ltrehozunk egy objektumot, majd
metdusoksegtsgvelmdostjukatulajdonsgaikat.
Argimdiprocedurlis(azazazobjektumokhasznlattnlklz)programozsbangyanimljukaz
brkat.hogytrljkketegyadotthelyen,majdegykicsittvolabbjrarajzoljukket.Ezzelszembenaz
objektumorientltprogramozsbanezeketafeladatokatazokaclassokvgzikelautomatikusan,melyekbl
azobjektumokszrmaznaksezrtnemkellazidnketvesztegetniezekjraprogramozsra.

Gyakorlatok:
8.12. rjon egy programot, ami megjelent egy ablakot egy vszonnal. Legyen a vsznon kt (klnbz
mret s szn) kr, amik kt gitestet reprezentlnak. Egyegy gombbal lehessen ket mozgatni
minden irnyba. A vszon alatt a programnak ki kell rni: a) a kt gitest kztti tvolsgot; b) a
kzttk fellp gravitcis ert (rassuk ki az ablak fels rszreaz gitestek tmegt valamint a
tvolsgsklt).EbbenagyakorlatbanNewtongravitcistrvnytkellalkalmazni(lsda62.oldalon
a42.gyakorlatotsafizikatanknyvet).

8.13. Avsznonazegrkattintstdetektlprogramtlettfelhasznlvamdostsaafentiprogramotgy,
hogycskkentseagombokszmt:egygitestelmozdtshozlegyenelgazgitestetkivlasztaniegy
gombbal,majdavszonrakattintani,hogyakivlasztottgitestarraahelyrekerljn,ahovkattintott.
8.14. Azelzprogrambvtse.Jelentsenmegegyharmadikgitestetsmindigrassaki mindenegyes
gitestreahateredkerjt(mindegyikgitestmindigamsikkett ltalkifejtett gravitciser
hatsaalattll!).
8.15. Ugyanazagyakorlat,mintazelz,ktelektromostltssel(Coulombtrvny).Adjonlehetsgeta
tltseljelnekmegvlasztsra!
8.16. rjonegyprogramot,amimegjelentegyablakotktmezvel:azegyikrjakiahmrskletetCelsius
fokban,amsikugyanaztahfokotFahrenheitfokban.Akthmrskletbrmelyiktmegvltoztatva
amsikmegfelelenmdosuljon.Aztvltshoza T F =T C 1,8032 kpletethasznlja.Nzze
megazegyszerkalkultorosprogramotis!

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 104.
8.17. rjonegyprogramot,amimegjelentegyablakotegyvszonnal.Helyezzenelezenavsznonegylabdt
reprezentlkiskrt.Tegyenelavszonalegygombot.Agombontrtnmindenegyeskattintskor
alabdnakegykistvolsggaljobbrakellelmozdulnimindaddig,amgelnemriavszonszlt.Ha
tovbbfolytatjaakattintgatstalabdnakvisszafelekelljnniazellenkezirnybamindaddig,amgel
nemriavszonmsikszltsgytovbb.
8.18. Mdostsa gy a programot, hogy a labda egy kr vagy ellipszisplyt jrjon be a vsznon (ha
folyamatosan kattogtatunk). Megjegyzs: ahhoz, hogy a kiszmolt eredmnyhez jussunk, egy
segdvltoztkelldefinilni,amialertszgetfogjareprezentlnisasinusscosinusfggvnyeket
kellhasznlni,hogyennekaszgnekafggvnybenpozcionljukalabdt.
8.19. Mdostsagyazelzprogramot,hogyamozglabdahagyjamagamgttalertplyanyomt.
8.20. Mdostsa gy az elz programot, hogy a labda ms grbket rjon le. Krjen tletet a tanrtl
(Lissajousgrbk).
8.21. rjonegyprogramot,amimegjelentegyablakotegyvszonnalsegygombbal.Avsznonrajzoljon
egy sttszrke tglalapot, ami egy utat jell, fl pedig srga tglalapokat , amik egy
gyalogtkelhelyetreprezentlnak.Helyezzenelngyszneskrt,amikagyalogosoksajrmvek
kzlekedsi lmpit reprezentljk. A nyomgombra trtn minden egyes kattintsra a lmpknak
szntkellvltani:

8.22. rjonegyprogramot,amiegyvsznatjelentmeg,amireegyegyszerelektromosramkrvanrajzolva
(feszltsgforrs +kapcsol + ellenlls). Azablakban legyenekadatbeviteli mezk, amik lehetv
teszik mindegyik ramkri elem paramterezst (azaz az ellenlls s feszltsgrtkek
megvlasztst.) A kapcsolnak mkdkpesnek kell lenni. (Egy Ki/Be kapcsolgombrl
gondoskodjunk).Acmkknekafelhasznlvlasztsbladdfeszlsgsramerssgrtkeket
kellmegjelenteni.

105. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.8 AutomatikusanimciRekurzivits
A Tkinter grafikusinterfaceszelvalelstallkozsunksszegzsekntnzzkmegazutolsanimcis
pldt,amiezalkalommalazelindtsautnautonmmdonfogmkdni.

from Tkinter import *

# esemnykezel k
# definilsa

def move():
"a labda elmozdulsa"
global x1, y1, dx, dy, flag
x1, y1 = x1 +dx, y1 + dy
if x1 >360:
x1, dx, dy = 360, 0, 15
if y1 >360:
y1, dx, dy = 360, -15, 0
if x1 <10:
x1, dx, dy = 10, 0, -15
if y1 <10:
y1, dx, dy = 10, 15, 0
can1.coords(oval1,x1,y1,x1+30,y1+30)
if flag >0:
abl1.after(50, move) # 50 millisec utn ciklus

def stop_it():
"az animci lell"
global flag
flag =0

def start_it():
"az animci elindtsa"
global flag
if flag ==0: # azrt, hogy csak egy ciklust indtsunk
flag = 1
move()

#========== F program =============


# a kvetkez vltozkat globlis vltozkknt fogjuk hasznlni :
x1, y1 = 10, 10 # kezd koordintk
dx, dy = 15, 0 # nincs elmozduls
flag =0 # kapcsol

# A f -widget ltrehozsa ("master") :


abl1 = Tk()
abl1.title("Animcis gyakorlat Tkinter-rel")

# a "slave" widget-ek (canvas + oval, button) ltrehozsa:


can1 = Canvas(abl1,bg='dark grey',height=400,width=400)
can1.pack(side=LEFT)
oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='red')
Button(abl1,text='Kilp',command=abl1.quit).pack(side=BOTTOM)
Button(abl1,text='Indt',command=start_it).pack()
Button(abl1,text='Lellt',command=stop_it).pack()

# az esemnyfogad indtsa (f ciklus) :


abl1.mainloop()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 106.
A scriptben az egyetlen jdonsg a move() fggvny defincijnak vgn tallhat after() metdus
hasznlata. Ezt a metdust brmilyen ablakra alkalmazhatjuk. Egy fggvnyhvst fog kezdemnyezni egy
bizonyosideltelteutn.gypldulawindow.after(200,qqc)awindowwidgeten200msecsznetutnhvja
aqqc()fggvnyt.

Scriptnkbenazafter()metdusnmagtamove()fggvnythvja.Mostelszrhasznljukarekurzinak
nevezett igen hatkony programozsi technikt. Az egyszersg kedvrt azt fogjuk mondani, hogy akkor
trtnikrekurzi,amikoregyfggvnynmagthvja.Nyilvngyegyvgtelenciklustkapunk,hacsaknem
gondoskodunkelrevalamilyeneszkzrl,hogymegszaktsukazt.
Nzzk,hogyanmkdikezapldnkban:

A move() fggvnytelszrazIndtgombravalkattintskorhvjaaprogram.Afggvnyelvgzia
feladatt(vagyispozcionljaalabdt)majdegykissznetutnnmagthvja.Elvgzifeladatt,majdegykis
sznetutnjrahvjanmagtsezgymegytovbbavgtelensgig...
Legalbbiseztrtnne,haelvigyzatossgblnemtettnkvolnavalahovahurokbaegykilpsiutastst.
Egyegyszerfelttelvizsglatrlvansz:mindeniterrcisciklusbanmegvizsgljukegyifutastssegtsgvel
aflagvltoztartalmt.Haaflagvltoztartalmanulla,akkoraciklustbbetnemfutlesazanimcilell.
Mivela flag vltozegygloblisvltoz,ezrtmsfggvnyeksegtsgvelknnyenmegvltoztathatjukaz
rtkt.Azokkalafggvnyekkel,amiketazIndtsLelltgombokhozkapcsoltunk.
gyegyegyszermechanizmustkapunkazanimciindtsraslelltsra:
AzelskattintsazIndtgombraegynemnullartketrendelaflagvltozhoz,majdrgtnkivltjaa
move() fggvnyelshvst.Ezvgrehajtdiksezutnminden50secundumbanmindaddighvjanmagt,
amgaflagnullvnemvlik.HatovbbkattintgatunkazIndtgombra,aflagrtken,desemmiegyb
nemtrtnik,merta move() hvsracsakakkorkerlsor,haa flag rtke1.gyelkerljktbb,konkurrens
ciklusindtst.
ALelltgombvisszalltjaaflagrtktnullrasaciklusmegszakad.

Gyakorlatok:
8.23. Trljeastart_it()fggvnybenaz ifflag==0: utastst (sazaztkvet ktsort).Mi trtnik?
(KattintsontbbszrazIndtsgombra.)
Prbljamegelmagyarzni,hogymitrtnik.

8.24. Mdostsagyaprogramot,hogyalabdamindenfordulnlvltsaasznt..

8.25. Mdostsagyaprogramot,hogyalabdaferdemozgstvgezzen,mintamilyetabilirdasztalszlrl
visszapattanbilirdgoly(cikkcakk).

8.26. Mdostsagyaprogramot,hogymsmozgsokatkapjon.Prbljonmegpl.krmozgstkapni.(Mint
a 105 .oldal gyakorlatban.)Mdostsa gy a programot, vagy rjon egy msik hasonlt, hogy a
nehzsgierhatsraeslabdamozgstszimullja,amivisszapattanafldrl.Figyelem:ezesetben
gyorsulmozgsokrlvansz!

8.27. Azelzscriptekblmostmrtudrniegyjtkprogramot,amiakvetkezkppenmkdik:Kis
sebessggelvletlenszerenmozogegylabdaavsznon.Ajtkosnakmegkellprblniazegrrel
rkattintanialabdra.Hasikerlt,akkorkapegypontotdealabdaettlkezdveegykicsitgyorsabban
mozogsgytovbb.Bizonyosszmkattintsutnlltsaleajtkotsrassakiazelrtpontszmot.

107. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.28. Azelzjtkvltozata:mindenalkalommal,amikorajtkosnaksikerltelkapni,alabdamrete
kisebblesz(aszntismegvltoztathatja).

8.29. rjonegyprogramot,amibentbb,klnbzsznlabdamozog,amikegymsrlsazoldalfalakrl
visszapattannak.

8.30. Tkletestseazelzgyakorlatokjtkaitazelbbialgoritmusbeptsvel.Mostajtkosnakcsaka
piroslabdrakellkattintani.Egyhibskattintsra(mssznlabdaeltallsra)pontotveszt.

8.31. rjonegyprogramot,amiaNapkrlklnbzkrplynkeringgitestek(vagyazatommagkrl
keringktelektron)mozgstszimullja.

8.32. rjonegyprogramot,akgyjtkra:egykgy(egyngyzetekblllrvidvonal)angyirny:
fl, le, balra, jobbra valamelyikben mozog a vsznon. A jtkos a kgy haladsi irnyt a
nylbillentykkel brmikor megvltoztathatja. A vsznon zskmnyok is tallhatk (kis
vletlenszeren elhelyezett, mozdulatlan krk). gy kell a kgyt irnytani, hogy megegye a
zskmnyokat,denerjenavszonszleihez.Amikorakgymegeszikegyzskmnyt,egyngyzettel
hosszabbleszsegyjzskmnyjelenikmegvalahol.Ajtkakkorfejezdikbe,amikorakgy
megrintiazegyikfalatvagyelregybizonyosmretet.

8.33. Azelbbijtktkletestse:ajtkakkorismegszakad,haakgytmetszinmagt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 108.
9.Fejezet: Afileok
A programjaink eddig csak nagyon kevs adatot kezeltek. Ezeket minden alkalommal a programtestbe
kdolhatnnk(pldukegylistba).Ezazeljrsazonbanalkalmatlannagyobbtmegadatkezelsre.

9.1 Afileokhaszna
Azeddigiprogramjainkcsaknagyonkevsadatotkezeltek.gymindigkdolnitudtukket(pldulegy
listt)aprogramba.Ezazeljrsazonbanalkalmatlannagymennyisgadatkezelsre.
Kpzeljkpdulel,hogyegygyakorlprogramotakarunkrni,amiakpernyretbbvlasztsoskrdseket
rkisautomatikusankezeliafelhasznlvlaszait.Hogyanfogjuktrolniakrdsekszvegt?
Alegegyszerbbelkpzels:aprogramelejnrtkadutastsokkalmindegyikszvegetegyvltozban
troljuk.Pldul:
a = "Quelle est la capitale du Guatmala ?"
b = "Qui succd Henri IV ?"
c = "Combien font 26 x 43 ?"
... etc.

Sajnosezegynagyonleegyszerstelkpzels. Mindenbonyolulttfogvlni,amikormegprbljukmajd
folytatniaprogramot,vagyisazokatazutastsokatmegrni,amiknekvletlenszerenkellkivlasztaniegyik
vagymsikkrdst,hogyazokatkirjkafelhasznlnak.Nembiztos,hogyegyolyanhosszif...elif...elif...
utastssorozat,mintamiazalbbipldbanvanjmegolds(egybkntelgfrasztlennelerni:nefelejtsk
el,hogynagyszmkrdstakarunkkezelni!):
if choice == 1:
selection = a
elif choice == 2:
selection = b
elif choice == 3:
selection = c
... etc.

Ahelyzetsokkaljobbnaktnik,haegylisttksztnk:
lista= ["Qui a vaincu Napolon Waterloo ?",
"Comment traduit-on 'informatique' en anglais ?",
"Quelle est la formule chimique du mthane ?", ... etc ...]

Azindexesegtsgvelbrmelyikelemetkivehetjkebblalistbl.Plda:
printlista[2]===> "Quelle est la formule chimique du mthane ?"
(ismtls:azindexelsnulltlkezddik)

109. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Brezazeljrsazelznlsokkaljobb,mgistbbnemkvnatosproblmvaltallkozunk:
Aprogramolvashatsganagyongyorsanfogromlani,amikorakrdsekszmajelentsenmegn.Ennek
kvetkeztben megn a valsznsge annak, hogy egy vagy tbb szintaxishibt fogunk ejteni a hossz
listban.Azilyenhibkatnagyonnehzkikszblni.
jkrdsekhozzadsa,vagybizonyoskrdsekmdostsamindenalkalommalaprogramforrskdjnak
megnyitsvaljr.Ennekkvetkeztbenknyelmetlennvlikugyanannakaforrskdnakazjrarsa,mivel
nagyszmterjedelmesadatsortfogtartalmazni.
Azadatcseremsprogramokkal(amiketesetlegmsprogramozsinyelvekenrtak)teljesenlehetetlen,mert
azadatokaprogramrsztkpezik.
Ez utbbi megjegyzs sugallja a kvetend irnyt: itt az ideje, hogy megtanuljuk kln fileokba
sztvlasztaniazadatokatsazketkezelprogramokat.
Ahhoz, hogy ez lehetsges legyen, el kell lssuk a programjainkat klnbz mechanizmusokkal, amik
lehetvteszikafileokltrehozst,azokbaadatokmentst,ksbbazokvisszanyerst.
A programozsi nyelvek tbbkevsb kifinomult utastskszletet knlnak ezeknek a feladatoknak az
elvgzshez. Amikor az adatok mennyisge nagyon megn, akkor szksgess vlik a kzttk fennll
kapcsolatok struktrlsa. Ekkor relcis adatbzisoknak nevezett rendszereket kell kidolgozni, amiknek a
kezelse nagyon sszetett lehet. Ez olyan specializlt programoknak a feladata, mint az Oracle, IBM DB,
Adabas,PostgreSQL,MySQL,stb.APythontkletesenalkalmasazezekkelarendszervaldialgusra,azonban
eztaksbbiekrehagyom(lsd252.oldalt).
Jelenlegi ambciink sokkal szernyebbek. Nincsenek szzezres mennyisg adataink, egyszer
mdszerekkelismegelgedhetnk,melyekkelegykzepesmretfilebabejegyezhetjksaztnkinyerhetjk
onnanazokat.

9.2 Munkavgzsfileokkal
Egyfilehasznlatasokbanhasonltegyknyvhez.Ahhoz,hogyegyknyvethasznljunk,elszrmegkell
azttallni(acmesegtsgvel),utnakikellnyitni.Amikorbefejeztkahasznlatt,bekellzrni.Amgnyitva
vanklnbzinformcikatlehetbelleolvasnismegjegyzseketlehetbelerni,deltalbanaketttnem
tesszk egyszerre. Az oldalszmok segtsgvel minden esetben meg tudjuk hatrozni, hogy hol tartunk a
knyvben.Aknyvektbbsgtalapoknormlissorrendjtkvetveolvassuk,dednthetnkgyis,hogyegy
tetszlegesbekezdstolvasunkel.
Mindaz,amitaknyvekrlelmondtamafileokraisalkalmazhat.Egyfileamerevlemezre,floppydiscre
vagy egy CDROMra rgztett adatokbl ll. A neve segtsgvel frnk hozz (ami tartalmazhat egy
knyvtrnevet is). A file tartalmt mindig tekinthetjk egy karaktersorozatnak, ami azt jelenti, hogy ezt a
tartalmat,vagyannakbrmelyrsztakarakterlncokkezelsreszolglfggvnyeksegtsgvelkezelhetjk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 110.
9.3 FilenevekAktulisknyvtr
Amagyarzatokegyszerstsekedvrtcsakakezeltfiloknevtadommeg.APythonaszbanforgfile
okataz aktulisknyvtrban fogjaltrehozniskeresni.Ezszoksszerintazaknyvtr,aholmagaascript
tallhat, kivve ha a scriptet egy IDLE shell ablakbl indtjuk. Ez esetben az aktulis knyvtr az IDLE
indtsakor van definilva (Windows alatt ennek a knyvtrnak a defincija rszt kpezi az indt ikon
tulajdonsgainak).
HaazIDLEveldolgozunk,akkorbiztos,hogyaPythontazaktulisknyvtrnakmegvltoztatsraakarjuk
majdknyszerteniazrt,hogyazmegfeleljenazelvrsainknak. Ennekmegttelhezhasznljukakvetkez
utastsokat a session elejn. (Most felttelezem, hogy a hasznlni szndkozott knyvtr a
/home/jules/exercices ). Hasznlhatjuk ezt a szintaxist (vagyis szepartorknt a / karaktert nem pedig a \
karaktert:ezakonvencirvnyesaUnixvilgban).APythonautomatikusanelvgziaszksgeskonverzikat
annakmegfelelen,hogyMacOS,Linux,vagyWindows38bandolgozunk.
>>> from os import chdir
>>> chdir("/home/jules/exercices")

Azelsparancsazosmodulchdir()fggvnytimportlja.Azosmodulegysorfggvnyttartalmaz,amik
az opercis rendszerrel (os = operating system) val kommunikcit teszik lehetv, brmi is legyen az
opercisrendszernk.
Amsodikparancsaknyvtratvltoztatjameg(chdirchangedirectory).
Megjegyzsek:
Vagyezeketaparancsokatszrjukbeascriptelejre,vagypedigmegadjukafileoknevbenakomplett
elrsiutat,deezazzalaveszllyeljr,hogymegneheztjkaprogramjainkrst.
Rszestskelnybenarvidfileneveket.Mindenkppenkerljkazkezeteskarakterek,aszkzksa
specilistipogrfiaijelekhasznlatt.

9.4 Aktimportforma
Azimntalkalmazottutastssorokalkalmatadnakegyrdekesmechanizmusmagyarzatra.Tudjuk,hogy
azalapmodulbaintegrltfggvnyekkiegsztsekntaPythonnagyszm,specializltabbfggvnytbocsta
rendelkezsnkre,amikamodulokbanvannakcsoportostva.MrismerjkamathsaTkintermodulokat.
Ahhoz,hogyegymodulfggvnyeithasznlhassuk,importlnikellazokat.Ezktflemdontrtnhet,amita
kvetkezkbenfogunkmegnzni.Mindktmdszernekvannakelnyeishtrnyai.
Egypldaazelsmdszerre:
>>>>>> import os
>>> rep_cour = os.getcwd()
>>> print rep_cour
C:\Python22\essais

38 A Windows esetben bele lehet venni az elrsi tba annak a trol perifrinak a betjelt, ahol a file
megtallhat.Pldul:"D:/home/jules/exercices".

111. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Apldaelssora teljesegszben importljaaz os modult,amiszmosfggvnyttartalmazazopercis
rendszer elrshez. A msodik sor az os39modul getcwd() fggvnyt hasznlja. Megllapthat, hogy a
getcwd()fggvnyazaktulisknyvtrnevtadjavissza(getcwd=getcurrentworkingdirectory).
sszehasonltsulmeamsikimportlsimdothasznlplda:
>>> from os import getcwd
>>> rep_cour = getcwd()
>>> print rep_cour
C:\Python22\essais

Ebbenapldbanaz os modulbl egyedla getcwd() fggvnytimportltuk.Ezenamdonimportlvaa


getcwd()fggvnygyplbeakdunkba,minthaaztmimagunkrtukvolna.
Azokbanasorokban,aholhasznljuk,nemkellmegismtelni,hogyazosmodulrsze.
Ugyangyimportlhatjukugyanannakamodulnaktbbfggvnyt:
>>> from math import sqrt, pi, sin, cos
>>> print pi
3.14159265359
>>> print sqrt(5) # ngyzetgyk 5
2.2360679775
>>> print sin(pi/6) # sinus 30
0.5

Stakvetkezmdonazsszesfggvnytimportlhatjukegymodulbl:
from Tkinter import *

Ezaz importlsimdmegknnytiakdrst.Ahtrnyaaz(klnsenazutbbiformnak,amelyikegy
modulsszesfggvnytimportlja),hogyazaktulisnvteretblokkolja.Elfordulhat,hogybizonyosimportlt
fggvnyeknevemegegyezikegyltalunkdefiniltvltoznevvel,vagymsmodulblimportltfggvnyek
nevvel.(Haeztrtnik,akkorakttkznvegyikenyilvnvalanmrtbbnemleszhozzfrhet).
Az olyan programokban, melyek nagyszm, klnbz eredet modult hvnak mindig inkbb az els
mdszertrdemeselnybenrszesteni,vagyisamelyikaminstettnevekethasznlja.
ltalbanezallaszablyallkivtelttesznkaTkintermodulspecilisesetben,mertazokatafggvnyek,
amiketezamodultartalmaznagyongyakranhvjuk(mrhaennekamodulnakahasznlatamellettdntnk).

39 Aszepartor pont itt tartalmazsi relcit fejez ki.Egy minstett nvmegadsiformrl van sz, amit egyre
gyakrabbanfogunkalkalmazni.Nevekpontokkalvalsszekapcsolsvalegyrtelmenjelezzk,hogyazelemek
csoportok rszeit alkotjk, amik maguk mg nagyobb csoportok rszeit alkothatjk, stb. Pldul a
systeme.machin.truccmkeatrucelemetjelli,amiamachincsoportrsztkpezi,amimagaasystemecsoport
rsztkpezi.Erreajellsitechnikraszmospldtfogunkltniazobjektumosztlyoktanulmnyozsakor.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 112.
9.5 Szekvencilisrsfileba
APythonbanafileokhozvalhozzfrstegykzbensfileobjektum biztostja,amitaz open() bels
fggvny segtsgvel hozunk ltre. Ennek afggvnynek ahvsa utn afileobjektum specilis metdusait
hasznlvaolvasnisrnitudunkafileban.
Azalbbipldabemutatja,hogyannyitunkmegegyfiletrsra,jegyznkbektkarakterlncot,majd
zrjukleafilet.Jegyezzkmeg,hogyhaafilemgnemltezik,akkorautomatikusanltreleszhozva.Ha
viszontanvegymrltezsadatokattartalmazfileravonatkozik,akkorabejegyzendkarakterekethozz
fogjafzniameglvekhez.Eztagyakorlatotparancssorblvgrehajthatjuk:
>>> fileObjektum = open('sajatFile','a')
>>> fileObjektum.write('Bonjour, fichier !')
>>> fileObjektum.write("Quel beau temps, aujourd'hui !")
>>> fileObjektum.close()
>>>

Megjegyzsek:
Az els sor egy fileObjektum nev fileobjektumot hoz ltre. Ez egy valdi filera hivatkozik (a
merevlemezenvagyahajlkonylemezen),aminekanevesajatFilelesz.Nekeverjksszeafilenevta
fileobjektum nevvel, amin keresztl hozzfrnk a filehoz. A gyakorlat sorn ellenrizhetjk, hogy a
rendszernkben (az aktulis knyvtrban) egy sajatFile nev filet (aminek a tartalmt brmelyik
szvegszerkesztvelmegnzhetjk)hozottltreaprogram.
Az open() fggvny kt string tpus argumentumot vr. Az els amegnyitand file neve, a msodik a
megnyitsmdja.Azaaztjelenti,hogyhozzfzs(append)mdbankellafiletmegnyitni,azaza
bejegyzend adatokat a file vghez, a mr esetleg ott lv adatokhoz kell fzni. A w (rsra)
filemegnyitsimdotishasznlhattukvolna,dehaeztamdothasznljuk,aPythonmindigegyj(res)file
thozltresazadatokrsaennekazresfilenakazelejtlkezddik.Hamrltezikegyazonosnevfile,
akkoraztelbbtrli.
A write() metdus vgzi a fileba rst. A kirand adatokat argumentumknt kell megadni. Ezeket az
adatokatsorbanegymsutnrjakiafileba(ezrtbeszlnk szekvencilis hozzfrsfilerl).A write()
mindenjhvsaamrrgztettadatokutnfolytatjaazrst.
Aclose()metduslezrjaafilet.Ettlkezdveazmindenflehasznlatrarendelkezsrell.

113. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.6 Fileszekvencilisolvassa
jra megnyitjuk a filet, de ez alkalommal olvassra, hogy vissza tudjuk olvasni az elz fejezetben
rgztettinformcikat:
>>>ofi=open('sajatFile','r')
>>>t=ofi.read()
>>>printt
Bonjour,fichier!Quelbeautemps,aujourd'hui!
>>>ofi.close()

Amint az vrhat a read() metdus kiolvassa a filebeli adatokat s egy karakterlnc (string) tpus
vltozbateszi.Haargumentumnlklhasznljukeztametdust,akkorazegszfiletartalmatbeolvassa.

Megjegyzsek:
sajatFileannakafilenakaneve,amitolvasniakarunk.Afiletmegnyitutastsnak szksgszeren
hivatkoznikellerreanvre.Hanemltezikafile,akkoregyhibazenetetkapunk.Plda:

>>>ofi=open('sajatFile','r')
IOError:[Errno2]Nosuchfileordirectory:'sajatFile'

Viszontsemmilyenkiktstsemtettnkafileobjektumnevnekmegvlasztsravonatkozan.Ezegy
tetszlegesvltoznv.gyazelsutastsunkbanegyofinevfileobjektumothoztunkltre,amiazolvassra
(rargumentum)megnyitottsajatFilevaldifilerahivatkozik.
Aktbertstringmostegyetlenstringkntvanafileban.Ezgytermszetes,mivelsemmilyenelvlaszt
karaktertsemadtunkmeg,amikorbertukketafileba.Aksbbiekbenmajdmegltjuk,hogyhogyankell
klnllszvegsorokatrgzteni.
Aread()metdustargumentummalishasznlhatjuk.Azargumentumaztadjameg,hogyhnykaraktertkell
beolvasniafilebanmrelrtpozcitl:
>>>ofi=open('sajatFile','r')
>>>t=ofi.read(7)
>>>printt
Bonjour
>>>t=ofi.read(15)
>>>printt
,fichier!Quel

Haafilebannincsannyikarakterhtra,mintamennyitazargumentummegad,akkorazolvassafilevgn
egyszerenlell:
>>>t=ofi.read(1000)
>>>printt
beautemps,aujourd'hui!

Haafilevgnvagyunk,akkoraread()metdusegyresstringetkld
vissza:
>>>t=ofi.read()
>>>printt

>>>ofi.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 114.
9.7 Aciklusblvalkilpsreszolglbreakutasts
Magtlrtetdik,hogyprogramhurkokravanszksgnk,amikoregyolyanfiletkellkezelnnk,aminek
nemismerjkelreatartalmt.Azalapelkpzelsaz,hogyrszletekbenolvassukafiletmindaddig,amgelnem
rjkafilevgt.
A kvetkez fggvny illusztrlja ezt az elkpzelst. Az egsz filet brmekkora is legyen a mrete
tmsoljaegymsikfileba50karakteresrszletekben:
def copyFile(source, destination):
"filemsols"
fs = open(source, 'r')
fd = open(destination, 'w')
while 1:
txt = fs.read(50)
if txt =="":
break
fd.write(txt)
fs.close()
fd.close()
return

Haellenrizniakarjukafggvnymkdst,ktargumentumotkellmegadni:azelsazeredetifileneve,a
msodikamsolatneve.Plda:
copyFile('sajatFile','idegenFile')

Megjegyzemawhileciklusebbenafggvnybenmshogyanvanmegszerkesztve,mintamilyenformbanaz
elzekbentallkoztunkvele.Tudjuk,hogyawhileutaststmindigegykirtkelendfelttelkveti.Amgeza
feltteligaz,addigfogawhileutaststkvetutastsblokkvgrehajtdni.Ittpedigakirtkelendfeltteltegy
llandhelyettesti.Aztistudjuk40,hogyaPythonmindennulltlklnbznumerikusrtketigaznaktekint.
Azgymegalkotott while ciklusvgtelenciklus,mertafolytatsnakafelttelemindigigaz.Ezazonban
megszakthat a break utasts hvsval, ami tbbfle kilpsi mechanizmus elhelyezst teszi lehetv
ugyanabbaaprogramhurokba:
while <felttel 1> :
--- klnbz utastsok ---
if <felttel 2> :
break
--- klnbz utastsok ---
if <felttel 3>:
break
stb.

Knnybeltni,hogyacopyFile()fggvnynkbenabreakutastscsakakkorfogvgrehajtdni,haelrtk
afilevgt.

40 Lsd:Egykifejezsigaz/hamisrtke(58.oldal)

115. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.8 Szvegfileok
Egy szvegfile egy olyan file, ami nyomtathat karaktereket s betkzket tartalmaz egymst kvet
sorokba rendezve. A sorokat egy nem nyomtathat specilis karakter a sorvge karakter41 vlasztja el
egymstl.
APythonnalnagyonknnyenkezelhetkazilyenfajtafileok.Akvetkezutastsokegyngysoros
szvegfilethoznakltre:
>>> f = open("szovegfile", "w")
>>> f.write("Ez az elso sor\nEz a masodik sor\n")
>>> f.write("Ez a harmadik sor\nEz a negyedik sor\n")
>>> f.close()

Vegyk szre,hogy a stringekbe \nsorvge jelzseket szrunk be azokraa helyekre, aholelakarjuk


egymstlvlasztaniaszvegsorokat.Enlklamarkernlklakaraktereketegymsutnrnnkkiafileba,
mintazelzpldkban.
Azolvassimveletekalattaszvegfilesoraiklnklnnyerhetkvissza.A readline() metduspldul
egyszerrecsakegysortolvas(belertveasorvgekaraktertis):
>>> f = open('szovegfile','r')
>>> t = f.readline()
>>> print t
Ez az elso sor
>>> print f.readline()
Ez a masodik sor

Areadlines()metdusazsszesmaradksortegystringekbllllistbateszi:
>>> t = f.readlines()
>>> print t
['Ez a harmadik sor\012', 'Ez a negyedik sor\012']
>>> f.close()

41 Azopercisrendszertlfggenasorvgejelzskdolsaeltrlehet.Windowsalattpldulegyktkarakteres
szekvencia(kocsivisszassoremels),aUnixtpusrendszerekben(mintamilyenaLinux)egyetlensoremels,a
MacOS alatt egyetlen kocsi vissza karakter jelzi a sorvgt. Elvileg nem kell ezekkel a klnbsgekkel
foglalkoznunk.AzrsmveleteksornaPythonazopercisrendszernkbenrvnyeskonvencikatalkalmazza.
OlvasskoraPythonmindhromkonvencitkorrekteninterpretlja(tehtezeketegyenrtknektekinti).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 116.
Megjegyzsek:
Fentalistanyersformbanjelenikmeg,akarakterlncokathatrolaposztrofokkalsnumerikuskdformj
speciliskarakterekkel.Termszetesenvgigmehetnkezenalistn(pldulegywhileciklussegtsgvel),
hogykinyerjkbelleazegyeskarakterlncokat.
Areadlines()metduslehetvteszi,hogyegyetlenutastssalovassunkelegyegszfilet.Ezazonbancsak
akkorlehetsges,haazolvasandfilenemtlnagy.(Mivelteljesegszbenbefogjamsolniegyvltozba,
vagyisaszmtgpoperatvmemrijba.ezrtamemriamretnekmegfelelennagynakkelllenni.)Ha
nagyfileokatkellkezelnnk,inkbbareadline()metdusthasznljukegyprogramhurokban,ahogyanazta
kvetkezpldamutatja.
Jljegyezzkmeg,hogyareadline()metdusegykarakterlncotadvissza,mgareadlines()metdusaegy
listt.Afilevgnareadline()egyresstringet,mgareadlines()egyreslisttadvissza.

Akvetkezscriptaztmutatjabe,hogyanlehetegyolyanfggvnytdefinilni,amivelegyszvegfileon
bizonyosfeldolgozsimveletet lehet vgrehajtani. Jelen esetben arrlvan sz,hogy gy msolunktegy
szvegfiletegymsikfileba,hogymindenolyansortkihagyunk,ami'#'karakterrelkezddik:
def filter(source,destination):
"filemsols a jelzett sorok kihagysval"
fs = open(source, 'r')
fd = open(destination, 'w')
while 1:
txt = fs.readline()
if txt =='':
break
if txt[0] != '#':
fd.write(txt)
fs.close()
fd.close()
return

Afggvnyhvshozktargumentumotkellmegadni:azeredetifilenevtsannakafilenakanevt,amia
szrtmsolatotfogjatartalmazni.Plda:
filter('test.txt', 'test_f.txt')

117. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.9 Klnbzvltozkmentsesvisszalltsa
A write() metdusargumentumnakegykarakterlncnakkelllenni.Amiteddigtanultunk,azzalatudssal
csakgytudunkmsrtktpusokatelmenteni,hogyazokatelszrstringekkalaktjuk.
Eztabeptettstr()fggvnysegtsgveltehetjkmeg:
>>> x = 52
>>> f.write(str(x))

Meg fogjuk ltni, hogy ms lehetsgek is lteznek arra, hogy numerikus rtkeket karakterlncokk
alaktsunk (e trgykrben lsd: Karakterlncok formzsa,130. old.) Igazbl nem ez a krds. Ha a
numerikusrtkeketelszrkarakterlnccalaktjuksgymentjkelket,akkoraztkockztatjuk,hogytbb
nemfogjuktudniazokathelyesenvisszaalaktaninumerikusrtkekkamikormajdafiletolvassuk.Plda:
>>> a = 5
>>> b = 2.83
>>> c = 67
>>> f = open('sajatFile', 'w')
>>> f.write(str(a))
>>> f.write(str(b))
>>> f.write(str(c))
>>> f.close()
>>> f = open('sajatFile', 'r')
>>> print f.read()
52.8367
>>> f.close()

Hrom numerikus rtket mentettnk fileba. De hogyan fogjuk tudni ket megklnbztetni a
karakterlncban,amikorafiletolvassuk?Ezlehetetlen!Semmisincs,amijelezn,hogyafilebanhromvagy
egyetlenegy,vagy2,vagy4rtkvan...
Azilyenfajtaproblmkratbbflemegoldsvan.Azegyiklegjobbmegoldsaz,hogyimportlunkegy
specializltPythonmodult:apickle42modult.Akvetkezkppenhasznljuk:
>>> import pickle
>>> f = open('sajatFile', 'w')
>>> pickle.dump(a, f)
>>> pickle.dump(b, f)
>>> pickle.dump(c, f)
>>> f.close()
>>> f = open('sajatFile', 'r')
>>> t = pickle.load(f)
>>> print t, type(t)
5 <type 'int'>
>>> t = pickle.load(f)
>>> print t, type(t)
2.83 <type 'float'>
>>> t = pickle.load(f)
>>> print t, type(t)
67 <type 'int'>
>>> f.close()

42 Angolul a pickle kifejezs jelentse "megrizni". Azrt neveztk el gy a modult, mert arra szolgl, hogy az
adatokatatpusukatmegrizvementseel.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 118.
Ennek a gyakorlatnak a kedvrt gy tekintjk, hogy az a, b, c vltozk ugyanazokat az rtkeket
tartalmazzk, mintazelz pldban. A pickle modul dump() fggvnyektargumentumot vr: azelsa
mentendvltozneve,amsodik afileobjektum,amibementenifogjukavltozrtkt.A pickle.load()
fggvnyafordtottirnymveletetvgziel,vagyisvisszalltmindenvltoztatpusval.
Knnyenmegrthetjk,hogypontosanmitcsinlnakapicklemodulfggvnyei,hapldularead()metdus
segtsgvelelvgezzkazeredmnyfileklasszikusolvasst.

9.10 Kivtelkezels.Atryexceptelseutastsok
Akivtelek(exceptions)azokamveletek,amiketazinterpretervagyacompilerakkorhajtvgre,amikora
programvgrehajtssornhibtdetektl.ltalnosszablykntaprogramvgrehajtsmegszakadsegytbb
kevsbexplicithibazenetjelenikmeg.
Plda:
>>> print 55/0
ZeroDivisionError: integer division or modulo

(Egyb kiegszt informcik is megjelennek, amik megadjk, hogy a script mely rszn trtnt a hiba
detektlsa,deezeketmostnemreproduklom.)
Ahibazenetktrszblll,amit : vlasztel.Ellvanahibatpusa,utnaegyahibravonatkoz
specifikusinformcikvetkezik.
Szmosesetbenelrelehetltni,hogybizonyoshibklphetnekfelaprogramegyikvagymsikrszben.
Ezekbeaprogramrszekbebepthetnkolyanspecilisutastsokat,amikcsakakkoraktivldnak,haezeka
hibk fellpnek. Az olyan magasszint nyelvekben, mint amilyen a Python, lehetsg van arra, hogy egy
felgyel mechanizmust kssnk egy egsz utastscsoporthoz s gy egyszerstsk azoknak a hibknak a
kezelst,melyekezenutastsokbrmelyikbenfellphetnek.
Az ilyen mechanizmust ltalnosan kivtelkezel mechanizmusnak nevezik. A Python kivtelkezel
mechanizmusaatryexceptelseutastscsoportothasznlja,amilehetvteszi egyhibaelfogstsegy
erreahibranzvespecifikusscriptrszvgrehajtst.Ezakvetkezmdonmkdik:
AtrytkvetutastsblokkotaPythonfelttelesenhajtjavgre.Haazegyikutastsvgrehajtsakorhiba
lp fel, akkor a Python trli a hibs utastst s helyette az except et kvet kdblokkot hajtja vgre. Ha
semmilyenhibasemlpfelatryutniutastsokban,akkorazelseetkvetkdblokkothajtjavgre(haezaz
utastsjelenvan).Aprogramvgrehajtsamindegyikesetbenaksbbiutastsokkalfolytatdhat.
Tekintsnkpldulegyscriptet,amiarrakriafelhasznlt,hogyadjamegegyfilenevt,amitolvassrakell
megnyitni. Nem akarjuk, hogy a program kiakadjon, ha a file nem ltezik. Azt akarjuk, hogy rjon ki egy
figyelmeztetstsafelhasznlesetlegmegprblhassonberniegymsikfilenevet.
filename = raw_input("Irjon be egy filenvet : ")
try:
f = open(filename, "r")
except:
print "A file", filename, "nem ltezik"

Hagyltjuk,hogyezafajtatesztalkalmasarra,hogyaprogrammsrszeinisfelhasznljuk,akkoregy

119. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
fggvnybegyazhatjuk:
def existe(fname):
try:
f = open(fname,'r')
f.close()
return 1
except:
return 0

filename = raw_input("Irjon be egy filenevet : ")


if existe(filename):
print "Ez a file ltezik."
else:
print "A file", filename, "nem ltezik."

Azislehetsges,hogyatryttbbexceptblokkkvesse,melyekmindegyikeegyspecifikushibatpustkezel,
azonban ezt a kiegsztst nem fejtem ki. Amennyiben szksges, gy az olvas nzzen meg egy Python
referenciamvetezgyben.

(9) Gyakorlatok:
9.1. rjonegyscriptet,amilehetvtesziegyszvegfileknyelmesolvasst.Aprogramelszrkrjea
felhasznltlafilenevt.Ezutnajnljaflakvetkezvlasztst:vagyjszvegsorokatrgzt,vagy
kirjaafiletartalmt.Afelhasznlnakbekelltudniarniazegymstkvetszvegsorokat,az<Enter>
thasznlvaasorokelvlasztsra.Abersbefejezsekntelgegyressortbevinni(vagyiselg
magbanmegnyomniaz<Enter>t)Atartalomkirsakorasoroknaktermszetesmdonkellegyms
utnkvetkezni(asorvgekdoknaknemkellmegjelenni).

9.2. Tegykfel,hogyrendelkezsrellegyszvegfile,amiklnbzhosszsgmondatokattartalmaz.
rjonegyscriptet,amimegkeresiskirjaaleghosszabbmondatot.

9.3. rjon egy scriptet, ami automatikusan ltrehoz egy szvegfilet, ami a 2 30 as szorztblkat
tartalmazza(mindegyikszorztblacsak20tagottartalmazzon).

9.4. rjonegyscriptet,amigymsoltegyfilet,hogyaszavakkzttmeghromszorozzaaszkzk
szmt.Rendelkezsre ll egy szvegfile, aminek minden sora egy vals tpus numerikus rtk
reprezentcija(exponensnincs).Pldul:
14.896
7894.6
123.278
stb.
rjon egy scriptet, ami ezeket az rtkeket egsz szmra kerektve egy msik fileba msolja (a
kerektsnekkorrektnekkelllenni).

9.5. rjonegyscriptet,amisszehasonltjaktfiletartalmtsjelziazelseltrst.

9.6. AzAsBmrltezfileokblkonstruljonegyharmadikCfilet,amifelvltvatartalmazegyegy
elemetazAilletveBfilebl.Amikorelrteazegyikeredetifilevgt,akkoregsztsekiaCfileta
msikfilemaradkelemeivel.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 120.
9.7. rjonegyscriptet,amilehetvtesziegyolyanszvegfilekdolst,melynekmindensoraklnbz
szemlyekvezetknevt,keresztnevt,cmt,postaiirnytszmtstelefonszmtfogjatartalmazni
(gondoljonpldularra,hogyegyklubtagjairlvansz).

9.8. rjonegyscriptet,amiazelzgyakorlatbanhasznltfiletmsoljatgy,hogyaszemlyekszletsi
dtumtsnemthozzfzi(aszmtgpnekegyesvelkellkirniasorokatsafelhasznltlkrni
mindenegyeskiegsztadatberst).

9.9. Tegykfel,hogymegcsinltaazelzgyakorlatotsmostvanegyolyanfileja,amibizonyosszm
szemlyadataittartalmazza.rjonegyscriptet,amilehetvteszi,hogykiszedjeebblafileblazokata
sorokat,amikegyadottpostaiirnytszmnakfelelnekmeg.

9.10. Mdostsa az elz gyakorlat scriptjt gy, hogy azokat a sorokat tallja meg, melyek azoknak a
szemlyeknekfelelnekmeg,akiknevnekkezdbetjeazFsMkzttvanazABCben.

9.11. rjon fggvnyeket, amik ugyanazt csinljk, mint a pickle modul fggvnyei (lsd a 118. oldalt).
Ezeknekafggvnyekneklehetvkelltennikklnbzvltozkrgztstegyszvegfilebagy,
hogyazokatszisztematikusankvetikaformtumukravonatkozinformcik.

121. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.Fejezet: Azadatstruktrkmlyebbtrgyalsa
Eddigmegelgedtnkazegyszermveletekkel.Mostnagyobbsebessgrekapcsolunk.
A mr hasznlt adatstruktrknak van nhny olyan jellemzje, amiket mg nem ismer az
olvas.Ms,sszetettebbadatstruktrkmegismersnekiselrkezettazideje.

10.1 Akarakterlncoklnyege
Az 5. fejezetben mr tallkoztunk a karakterlncokkal. A numerikus adatoktl eltren, amik klnll
egysgek,akarakterlncok(vagystringek)egysszetettadattpustkpeznek.Ezalattegyjldefiniltegysget
rtnk,amimagakisebbegysgekegyttesblll:ezekakarakterek.
Akrlmnyektlfggenegyilyensszetettadatotholmintegyetlenobjektumot,holmintelemekrendezett
sorozattfogjukkezelni.Azutbbiesetbenvalsznlegegyenkntakarunkmajdhozzfrniazelemeihez.
A karakterlncok a Pythonobjektumok szekvenciknak nevezett kategrijnak kpezik rszt, aminek a
listk s tuplekisrszei.A szekvencikonegysorhasonlmveletetvgezhetnk.Ezekkzlmrismernk
prat.Akvetkezfejezetekbenlefogokrninhnyjabbat.

10.1.1 Konkatenci,ismtls
Astringeket+opertorrallehetkonkatenlnisa*opertorrallehetismtelni:
>>> n = 'abc' + 'def' # konkatenci
>>> m = 'zut ! ' * 4 # ismtls
>>> print n, m
abcdef zut ! zut ! zut ! zut !

Vegyk szre, hogy a + s * opertorokat sszeadsra s szorzsra is hasznlhatjuk, amikor numerikus


argumentumokra alkalmazzuk ket. Az egy nagyon rdekes jelensg, hogy ugyanazok az opertorok attl
fggen,hogymilyenkrnyezetbenhasznljukketklnbzkppenmkdhetnek.Amechanizmustoperator
overloadingnaknevezik.Msnyelvekbennemmindiglehetsgesaz operatoroverloading: ezrtpldulaz
sszeadsraskonkatenciraklnbzszimblumokatkellhasznlnunk.

10.1.2 Indexels,kivgs,hossz
Astringekkaraktersorozatok.Aszekvencibanmindegyikkarakternekpontoshelyevan.APythonbanmindig
ugyangyindexeljk(sorszmozzuk)egyszekvenciaelemeit: nulltlkezdden.Ahhoz,hogyastringegy
karakterhezhozzfrjnk,elgszgleteszrjelbenmegadniazindext:
>>> nom = 'Cdric'
>>> print nom[1], nom[3], nom[5]
r c
Amikoregystringgeldolgozunk,azisnagyongyakranmegtrtnik,hogykiakarunkvenniegyhosszabb
stringblegykisebbdarabot.APythonerreaslicing (darabols/kivgs)naknevezettegyszertechnikt
knlja.Ezabblll,hogy szgleteszrjelekkzttmegkelladniaszeletelejtsvgt,amihezhozz
szeretnnkfrni:
>>> ch = "Juliette"
>>> print ch[0:3]
Jul
Az[n,m]szeletbeaznedikkarakterbelertend,deazmediknem.Haszeretnnkknnyenmegjegyezniezt

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 122.
amechanizmust,akkorgykellelkpzelnnk,hogyazindexekakarakterekkzttihelyekremutatnak,mintaz
albbibrn:

Eztazelrendezstltvanemnehzmegrteni,hogyach[3:7]aziettetvgjaki.
A vgsi indexek alaprtelmezett rtkei: a definilatlan els indexet nullnak tekinti a Python, mg az
elhagyottmsodikindexateljeskarakterlnchossznakrtktveszifl:
>>> print ch[:3] # az elso 3 karakter
Jul
>>> print ch[3:] # az elso 3-tol eltekintve az osszes tobbi karakter
iette

(10) Gyakorlatok
10.1. Hatrozzameg,mitrtnikamikorazegyikvagyamsikvgsiindexhibssrjaeztleminljobban.
(Pldul,haamsodikindexkisebb,mintazels,vagyhaamsodikindexnagyobb,mintastring
hossza).
10.2. Vgjon fl egy hossz stringet 5 karakter hossz darabokra. Rakja ssze a darabokat fordtott
sorrendben.

10.3. Trblja megrni a megtalal() fggvnyt, ami az ellenkezjt csinlja, mint amit az indexopertor
(vagyisa[])tesz.Ahelyett,hogyegymegadottindexhezmegtalljaazannakmegfelelkaraktert,ennek
afggvnynekegyadottkarakterheztartozindexetkellmegtallni.
Mshogyan fogalmazva, egy olyan fggvnyt kell rni, ami kt argumentumot vr: a kezelend
karakterlncnevtsakeresendkaraktert.Afggvnynekvisszatrsirtkkntazelsilyenkarakter
stringbeliindextkellmegadniakarakterlncban.gypldul:printmegtalal("Juliette&
Romo","&") eredmnye:9

Figyelem : Gondolni kell minden lehetsges esetre. Arra is szmtanunk kell, hogy a fggvny
visszatrsi rtkknt egy specilis rtket (pldul 1 et) ad, ha a keresett karakter nincs a
karakterlncban.

10.4. Tkletestse az elz gyakorlat fggvnyt gy, hogy egy harmadik paramtert ad hozz: azt az
indexet,amelyiktlkezdvekeresnikellakarakterlncban.gypldulakvetkezutastsnak:15t
kellkirni(snem4et!)
printmegtalal("Csar&Cloptre","r",5)

10.5. rjonegy karakterszam() fggvnyt,amimegszmolja,hogyegykarakterhnyszorfordulelegy


stringben.gyakvetkezutastsnak4etkellkirni:
printkarakterszam("ananasaujus","a")

123. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.1.3 Szekvenciabejrsa.Afor...in...utasts
Nagyon gyakran elfordul, hogy egy egsz stringet az els karaktertl az utolsig karakterenknt kell
kezelnnk azrt, hogy mindegyik karakteren valamilyen mveletet vgezznk. Ezt a mveleletet bejrsnak
fogjuknevezni.Amrismertwhileutastssegtsgvelmegrhatjukegyilyenbejrskdjt:
nev = 'Jacqueline'
index = 0
while index < len(nev):
print nev[index] + ' *',
index = index +1

A ciklus bejrja a nev stringet. Egyenknt vesz el minden karaktert, amiket aztn egy csillag
kzbeiktatsvalkinyomtat.Figyeljkmeg,hogyawhileutastssalalkalmazottfelttel:index<len(nev).
Ezaztjelenti,hogyaciklustaddigkellfuttatni,amga9esindexrtkheznemrnk(astring10karakterblll).
Astringvalamennyikaraktertkezelnifogjuk,ugyanisazoknulltl9igvannakindexelve.
Egyszekvenciabejrsanagyongyakorimveletaprogramozsban.
APythonafor...in...:utastspronalapulciklusszerkezetetknljaamegvalstshoz:
Afentiprogramezekkelazutastsokkalakvetkezalakvvlik:
nom = 'Jacqueline'
for caract in nom:
print caract + ' *',

Ez a struktra tmrebb. Elkerlhet vele egy specilis vltoz (egy szmll) definilsa s
incrementlsa,amibenaziterrcislpsbenrsztvevkarakterindexttrolnnk.A caract vltozegyms
utnfogjatartalmazniastringmindenegyeskaraktertazelstlazutolsig.
A for utasts teht olyan ciklusok rst teszi lehetv, melyekben az iterrci az adott szekvencia
valamennyi elemt egyms utn kezeli. A fenti pldban a szekvencia egy string volt. A kvetkez plda
szemllteti,hogyugyaneztazeljrstalkalmazhatjukalistkra(valamintatuplekre,amikrlaksbbiekben
fogunktanulni):
lista = ['kutya','macska','krokodil']
for allat in lista:
print allat,'karakterlanc hossza', '=', len(allat)

Ascriptvgrehajtsnakeredmnye:
kutya karakterlanc hossza= 5
macska karakterlanc hossza= 4
krokodil karakterlanc hossza= 8

Aforutastsegyjpldaazsszetettutastsokra.Nefelejtskelaktelezkettspontotasorvgrlsa
rkvetkezblokkbehzst.
Azinfoglaltsztakezelendszekvencianevekveti.Aforfoglaltsztkvetnvazanv,amitannaka
vltoznak vlasztunk, ami egyms utn fogja tartalmazni a szekvencia minden egyes elemt. Ez a vltoz
automatikusanvandefinilva(vagyisflslegeselzetesendefinilni)stpusaautomatikusanazppenkezelt
szekvenciaelemtpusnakfelelmeg(ismtls:egylistaesetbennemfelttlenlazonostpusmindenelem).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 124.
Plda:
divers = ['cheval', 3, 17.25, [5, 'Jean']]
for e in divers:
print e

Ascriptvgrahajtsnakeredmnye:
cheval
3
17.25
[5, 'Jean']

Bradiverslistaelemeimindklnbztpusak(string,egsz,vals,lista),egymsutnhozzrendelhetjk
tartalmukatazevltozhozanlkl,hogyabblhibaszrmazna(ezaPythonvltozkdinamikustpusadsnak
ksznhet).

Gyakorlatok:
10.6. Egyamerikaimesbennyolckiskacstrendre:Jack,Kack,Lack,Mack,Nack,Oack,PacksQacknak
hvnak.rjonegyscriptet,amiezeketaneveketakvetkezktstringbllltjael:
prefixes='JKLMNOP' s suffixe='ack'
Haegyfor...in...utaststalkalmaz,akkorascriptjnekcsakktsortkelltartalmazni.

10.7. Hatrozzamegegyadottmondatbanaszavakszmt.

10.1.4 Szekvencihoztartozs.Amagbanalkalmazottinutasts
Az in utasts a for tl fggetlenl felhasznlhat annak igazolsra, hogy egy adott elem rsze e egy
szekvencinak.Pldulfelhasznlhatjuk az in tannakigazolsra,hogy valamilyen bet egy meghatrozott
csoporthoztartozike:
car = "e"
maganhangzo = "aeiouyAEIOUY"
if car in maganhangzo:
print car, "maganhangzo"

Hasonlmdonlehetigazolni,hogyegyelemegylisthoztartozike:
n = 5
primek = [1, 2, 3, 5, 7, 11, 13, 17]
if n in primek:
print n, "resze a primszamlistanknak"

Megjegyzs:Ezazigenhatkonyutastsmagbanaszekvenciatnylegesbejrstvgziel.Gyakorlsknt
rjonolyanutastsokat,amikawhileutaststhasznlvaegyklasszikusprogramhuroksegtsgvelugyanezta
feladatotvgeznkel.

125. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:
Megjegyzs:akvetkezfeladatokbanhagyjafigyelmenkvlazkezetesvagyspeciliskaraktereket.
10.8. rjon egy nagybetu() fggvnyt, aminek a visszatrsi rtke akkor igaz, ha az argumentuma
nagybet.

10.9. rjonegyfggvnyt,aminekavisszatrsirtkeakkorigaz,haazargumentumaszm.

10.10. rjonegyfggvnyt,amiegymondatotszavakbllllistvalaktt.

10.11. Hasznlja fel az elz gyakorlatokban definilt fggvnyeket egy olyan script rsra, ami ki tudja
szedniegyszvegblazsszesnagybetvelkezddszt.

10.1.5 Astringeknemmdosthatszekvencik
Egyltezstringtartalmtnemlehetmegvltoztatni.Mskntfogalmazva,nemhasznlhatjuka[]opertort
egyrtkadutastsbaloldaln.Prbljukmegpldulvgrehajtaniakvetkezscriptet(amimegprblegy
bettkicserlniastringben):
salut = 'bonjour tous'
salut[0] = 'B'
print salut

A Bonjour tous kirsa helyett a script egy TypeError: object doesn't support item
assignment tpus hibazenetet generl. Ezt a hibt a script msodik sora vltja ki. Abban
prbljukmegkicserlniastringegyikbetjtegymsikra,deaznemmegengedett.
Viszontazalbbiscriptmkdik:
salut = 'bonjour tous'
salut = 'B' + salut[1:]
print salut

Ebbenamsikpldbanvaljbannemasalutstringetmdostjuk.Ltrehozunkegyujstringetugyanazzala
nvvelascriptmsodiksorban(azelzstringegydarabjbl,deamialnyeg:ittegyjkarakterlncrlvan
sz).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 126.
10.1.6 Akarakterlncoksszehasonlthatk
Akarakterlncokesetbenismkdikmindegyikrelcisopertor,amelyikrlaprogramvgrehajtstvezrl
(if...elif...else)utastsoknlbeszltnk.Eznagyonhasznosleszaszavaknvsorbarendezsnl:
szo = raw_input("rjon be egy tetsz leges szt : ")
if szo < "limonade":
place = "megel zi"
elif szo > "limonade":
place = "kveti"
else:
place = "fedi"
print "A", szo, "sz", place, "a 'limonade' szt a nvsorban"

Ezekazsszehasonltsokazrtlehetsgesek,mertastringeketalkotalfabetikuskaraktereketaszmtgp
binris szmok formjban trolja memrijban, amiknek az rtke a karaktereknek az abcben elfoglalt
hellyvelvansszekapcsolva.AzASCIIkdrendszerbenpldulA=65,B=66,C=67,stb.43

10.1.7 Akarakterekosztlyozsa
Sokszorhasznos,haegykarakterlncblkivettkarakterrlmegtudjukllaptani,hogyaznagybet,
vagykisbet,vagymgltalnosabban,hamegtudjukhatrozni,hogyegyszmrl,vagyms
tipogrfiaikarakterrlvansz.
Termszetesentudunkrniolyanfggvnyeket,amikelvgzikeztafeladatot.Azelslehetsgazinutasts
hasznlata,amintaztazelzfejezetbenlttuk.Mivelmostmrtudjuk,hogya karakterekazASCIIkdban
egyrendezettsorozatotalkotnak,ezrtfeltudunkhasznlnimsmdszereketis. Pldulazalbbi
fggvnynekakkorigazavisszarsirtke,haazargumentumakisbet:
def kisbetu(ch):
if 'a' <= ch <= 'z' :
return 1
else:
return 0

43 Tbbfle kdolsi rendszer ltezik: a legismertebbek az ASCII s az ANSI, melyek egymshoz elg kzeli
rendszerek,eltekintveattlamiazangoltleltrnyelvekspecifikuskaraktereit(kezeteskarakterek,cdille,stb.)
illeti.Nhnyveavilgvalamennyinyelvneksszesspeciliskaraktertintegrljkdolsirendszerjelent
meg.Eztaunicodenaknevezettrendszertfokozatosanalkalmaznikell.A2esverzijtlkezdveeztintegrljaa
Python.

127. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:
Megjegyzs:akvetkezgyakorlatokbanhagyjafigyelmenkvlazkezetessspeciliskaraktereket.
10.12. rjon egy nagybetu() fggvnyt, aminek akkor igaz a visszarsi rtke, ha az argumentuma
nagybet(hasznljonazelzekbenalkalmazottleltrmdszert).

10.13. rjonegyfggvnyt,aminekakkorigazavisszarsirtke,haazargumentumaegyalfabetikus
karakter(nagyvagykisbet).Alkalmazzaebbenazjfggvnybenazelzekbendefiniltkisbetu()
snagybetu()fggvnyeket.

10.14. rjonegyfggvnyt,aminekakkorigazavisszarsirtke,haazargumentumaegyszm.

10.15. rjonegyfggvnyt,amiazargumentumakntmegadottmondatbanlvnagybetkszmtadjameg
visszarsirtkknt.

APythonszmoselredefiniltfggvnytbocstarendelkezsnkre,hogyknnyebbentudjunkmindenfle
karaktermveletetvgezni:
Az ord(ch) fggvny brmilyen karaktert elfogad argumentumknt. Visszatrsi rtkknt a karakternek
megfelelASCIIkdotadjameg.Tehtord('A')visszatrsirtke65.

Achr(num)fggvnyennekpontosanazellenkezjtteszi.Azargumentumnak0s255kzesszmnak
kelllenni,a0ts255tisbelertve.Visszatrsirtkknta megfelelASCIIkaraktertkapjukmeg:teht
chr(65)azAkaraktertadjavissza.


Gyakorlatok:
Megjegyzs:akvetkezgyakorlatokbanhagyjafigyelmenkvlazkezetessspeciliskaraktereket.
10.16. rjonegyegyASCIIkdtbltkirscriptet.Aprogramnakmindenkaraktertkikellrni.Atblzat
alapjn llaptsa meg a nagybets s kisbets karaktereket sszekapcsol relcit minden egyes
karakterre.

10.17. Az elz gyakorlatban megtallt relci alapjn rjon egy fggvnyt, ami egy mondat valamennyi
karaktertkisbetrerjat.

10.18. Ugyanennekarelcinakazalapjnrjonegyfggvnyt,amivalamennyikisbettnagybetvalaktt
sviszont(azargumentumkntmegadottmondatban).

10.19. rjonegyfggvnyt,amimegszmolja,hogyazargumentumkntmegadottkarakterhnyszorfordulel
egyadottmondatban.

10.20. rjonegyfggvnyt,amivisszatrsirtkkntmegadjaegyadottmondatbanamagnhangzkszmt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 128.
10.1.8 Akarakterlncokobjektumok
Azelzfejezetekbenmrsokobjektummaltallkoztunk.Tudjuk,hogyazobjektumokonmetdusok(vagyis
ezekhezazobjektumokhozkapcsoltfggvnyek)segtsgvelvgezhetnkmveleteket.APythonbanastringek
objektumok. A megfelel metdusok hasznlatval szmos mveletet vgezhetnk rajtuk. me nhny a
leghasznosabbakkzl44:

split():egystringetalakttsubstringeklistjv.Miadhatjukmegargumentumkntaszepartorkaraktert.
Hanemadunkmegsemmitsem,akkorazalaprtelmezettargumentumrtkegyszkz:
>>> c2 ="Votez pour moi"
>>> a = c2.split()
>>> print a
['Votez', 'pour', 'moi']
>>> c4 ="Cet exemple, parmi d'autres, peut encore servir"
>>> c4.split(",")
['Cet exemple', " parmi d'autres", ' peut encore servir']

join(lista): egyetlenkarakterlnccegyestegystringlistt.(Ezametdusazelzinverze.)Figyelem:a
szepartorkaraktert(egyvagytbbkaraktert)azastringfogjamegadni,amelyikreametdustalkalmazzuk,
azargumentumaazegyestendstringeklistja:
>>> b2 = ["Salut","les","copains"]
>>> print " ".join(b2)
Salut les copains
>>> print "---".join(b2)
Salut---les---copains

find(sch):megkeresiazschsubstringpozcijtegystringben:
>>> ch1 = "Cette leon vaut bien un sajt, sans doute ?"
>>> ch2 = "sajt"
>>> print ch1.find(ch2)
25

count(sch):megszmoljaaschsubstringelfordulsainakszmtastringben:
>>> ch1 = "Le hron au long bec emmanch d'un long cou"
>>> ch2 = 'long'
>>> print ch1.count(ch2)
2

lower():kisbetssalaktegystringet:
>>>ch="ATTENTION:Danger!"
>>>printch.lower()
attention:danger!

44 Csaknhnypldrlvansz.Ezeknekametdusoknakatbbsgemsparamterekkelishasznlhat,amiket
nemmindadokittmeg(pldulbizonyosparamtereklehetvteszik,hogyegystringnekcsakbizonyosrszt
kezeljk).Adir()beptettfggvnysegtsgvelmegkaphatjukazobjektumhozkapcsoldvalamennyimetdus
teljeslistjt.Akitbbetakartudni,nzzenmegegyreferenciamvet(vagyazonlinedokumentcit).

129. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
upper():nagybetssalaktjaakarakterlncot:
>>> ch = "Merci beaucoup"
>>> print ch.upper()
MERCI BEAUCOUP

capitalize():akarakterlncelsbetjtnagybetvalaktja:
>>> b3 = "quel beau temps, aujourd'hui !"
>>> print b3.capitalize()
"Quel beau temps, aujourd'hui !"

swapcase():mindennagybettkisbetvalaktsvisszont:
>>> ch5 = "La CIGALE et la FOURMI"
>>> print ch5.swapcase()
lA cigale ET LA fourmi

strip():eltvoltjaastringelejnsvgnlvbetkzket:
>>> ch = " Monty Python "
>>> ch.strip()
'Monty Python'

replace(c1,c2):Astringbenvalamennyic1karaktertc2velhelyettesti:
>>> ch8 = "Si ce n'est toi c'est donc ton frre"
>>> print ch8.replace(" ","*")
Si*ce*n'est*toi*c'est*donc*ton*frre

index(c):megadjaackarakterstringbelielselfordulsnakindext:
>>> ch9 ="Portez ce vieux whisky au juge blond qui fume"
>>> print ch9.index("w")
16

Ezeknek a metdusoknak a tbbsgben kiegszt argumentumokkal pontosan meg lehet adni, hogy a
karakterlncmelyikrsztkellkezelni.Plda:
>>> print ch9.index("e") # a string elejet l keresi
4 # s megtallja az els 'e'-t
>>> print ch9.index("e",5) # csak az 5-os indext l keres
8 # s megtallja a masodik 'e'-t
>>> print ch9.index("e",15) # a 15-dik karaktert l keres
29 # s megtallja a negyedik 'e'-t

stb.,stb.
Ekurzuskeretbennemlehetazsszesmetdustsaparamterezsketlerni.Haazolvastbbetakar
tudni,akkorazonlinePythondokumentcit(Libraryreference),vagyegyjreferenciamvetkellmegnzni
(mintpldulFredrikLundhPythonStandardLibraryjtEditionsO'Reilly).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 130.
Beptettfggvnyek
Akarakterlncokraszmosolyanfggvnytalkalmazhatunk,amikmagbaanyelvbevannakbeptve:
len(ch)megadjachstringhosszt(vagyisakaraktereinekaszmt)

float(ch) vals szmm (float) alaktja a ch stringet (termszetesen ez csak akkor fog mkdni, ha a
karakterlncegyilyenszmotreprezentl):
>>> a = float("12.36")
>>> print a + 5
17.36

int(ch)egszszmmalaktjaachstringetr:
>>> a = int("184")
>>> print a + 20
204

10.1.9 Karakterlncokformzsa
A karakterlncokkalkapcsolatosfggvnyekvilgbantettkalandozsunkbefejezseknthasznosnaktnik
mgaformzsnaknevezetttechnikabemutatsa.Ezatechnikamindenolyanesetbennagyonhasznos,amikor
klnbzvltozkrtkeiblkellegykomplexkarakterlncotkonstrulni.
Tegykfelpldul,hogyrtunkegyprogramot,amiegyvizesoldatszntshmrsklettkezeli.Aszntegy
szinnevvltozbantroljuksahmrskletetegyhomersnevvltozban(floattpusvltoz).Aztakarjuk,
hogyaprogramunkegyjkarakterlncothozzonltreezekblazadatokbl.Pldulegyilyenmondatot:Az
oldatsznepirossvltozottshmrskleteelria12,7Ct.
Ezta karakterlncotakonkatenciopertor(a+szimblum)segtsgvelsszellthatjukrszekbl,dea
str()fggvnytishasznlnunkkellene,hogyafloattpusvltozbantroltnumerikusrtketstringgalaktsuk
(Csinljamegagyakorlatot!).
APythonegymsiklehetsgetisknl.Akarakterlnca%opertorsegtsgvelelllthatktelembl:a
baloldalon egy formz stringet adunk meg (valamilyen mintt) ami konverzis markereket tartalmaz s
jobboldalon(zrjelben)egyvagytbbobjektumotami(ke)taPythonnakakarakterlncbaamarkerekhelyre
kellbeszrni.
Plda:
>>> szin ="zld"
>>> homers = 1.347 + 15.9
>>> print "A szne %s s a hmrsklete %s C" % (szin,homers)
A szne zld s a h mrsklete 17.247 C

Ebbenapldbanaformzstringkt%skonverzismarkerttartalmaz,amiketaPythonaszinsahomers
vltozktartalmvalhelyettest.
A%smarkerbrmilyenobjektumotelfogad(stringet,egszet,floatot,...).Msmarkereketalkalmazvams
formzssal lehet ksrletezni. Prbljuk meg pldul a msodik markert %s t %dvel helyettesteni, vagy
pldul %8.2gvel. A %d markeregyszmotvrsaztegsszalaktjat;a %f s %g markerekvals
szmokatvrnaksmegtudjkhatrozniakirsszlessgtspontossgt.
Azsszesformzsilehetsglersameghaladjaeknyvkereteit.Haegyspecilisformzsravanszksge,
nzzemegaPythononlinedokumentcijt,vagyegyspeciliskziknyvet.

131. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:
10.21. rjonegyscriptet,amimegszmoljaegyszvegfilebananumerikuskarakterekettartalmazsorokat.

10.22. rjonegyscriptet,amiegyszvegfilebanmegszmoljaaszavakat.

10.23. rjonegyscriptet,amitmsolegyszvegfilet,mikzbengyelarra,hogymindensornagybetvel
kezddjn.

10.24. rjonegyscriptet,amigymsoltegyszvegfilet,hogyazokatasorokat,amikkisbetvelkezddnek
sszeolvasztjaazelzsorral.

10.25. Van egy numerikus rtkeket tartalmaz file. Tegyk fel, hogy ezek az rtkek egy gmbsorozat
tmri. rjon egy scriptet, ami arra hasznlja fl ennek a filenak az adatait, hogy egy msik
szvegsorokba rendezett filet hoz ltre, ami ezeknek a gmbknek ms jellemzit fejezi ki (fkr
terlete,fellet,trfogat)akvetkezformban:

d 46.20 cm Ft = 1676.39 cm Fel. = 6705.54 cm. Tf. = 51632.67 cm


d. 120.00 cm Ft = 11309.73 cm Fel. = 45238.93 cm. Tf. = 904778.68 cm
d. 0.03 cm Ft = 0.00 cm Fel. = 0.00 cm. Tf. = 0.00 cm
d. 13.90 cm Ft = 151.75 cm Fel. = 606.99 cm. Tf. = 1406.19 cm
d. 88.80 cm FT = 6193.21 cm Fel. = 24772.84 cm. Tf. = 366638.04 cm
stb.

10.26. Van egy szvegfileja, aminek a sorai vals tpus (exponens nlkli) numerikus rtkeket
reprezentlnak (s string formjban vannak kdolva). rjon egy scriptet, ami tmsolja ezeket az
rtkeketegymsikfilebagy,hogykzbenadecimlisrszketgykerekti,hogyazcsakegytizedes
jegyettartalmazatizedesvesszutn(akerektsnekkorrektnekkelllenni).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 132.
10.2 Alistklnyege
Az5.fejezetbelirvidbemutatsuktamrtbbszrtallkoztunkalistkkal.Alistkrendezettobjektumok
gyjtemnyei. A stringekhez hasonlan a szekvenciknak nevezett ltalnos adattpus rszei. Ahogyan egy
stringbenakaraktereket,gyalistbanelhelyezettobjektumokatisegyindexszelrhetjkel(ezegyszm,ami
azobjektumszekvenciabelihelytadjameg).

10.2.1 EgylistadefincijaHozzfrsazelemeihez
Mrtudjuk,hogyalisttszgleteszrjellelhatroljuk:
>>> szamok = [5, 38, 10, 25]
>>> szavak = ["sonka", "sajt", "lekvr", "csokold"]
>>> stuff = [5000, "Brigitte", 3.1416, ["Albert", "Ren", 1947]]

Az utols pldban egy egszet, egy stringet, egy vals szmot s egy listt gyjtttem ssze, hogy
emlkeztessek r: egy listban brmilyen adattpusokat kombinlhatunk, belertve listkat, tupleket s
sztrakat(ezekrlksbbfogunktanulni).
Egy lista elemeihez ugyanazokkal a mdszerekkel (index, rszekre vgs) frnk hozz, mint amikkel a
stringekkaraktereihez:
>>> print szamok[2]
10
>>> print szamok[1:3]
[38, 10]
>>> print szamok[2:3]
[10]
>>> print szamok[2:]
[10, 25]
>>> print szamok[:2]
[5, 38]
>>> print szamok[-1]
25
>>> print szamok[-2]
10

Afentipldkfelhvjkafigyelmetarraatnyre,hogyegylistblkivgottrszmagaismindiglista(mg
haegyolyanrszrlisvansz,amicsakegyelemettartalmaz,mintaharmadikpldban),azizolltelempedig
brmilyenadattpusttartalmazhat.Eztamegklnbztetstakvetkezpldksornelfogjukmlyteni.

133. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.2.2 Alistkmdosthatk
A stringekkel szemben a listk mdosthat szekvencik. Ez lehetv teszi, hogy a ksbbiekben
dinamikusan(azazvalamilyenalgoritmussal)hozzunkltrerszekblnagymretlistkat.

Pldk:
>>> szamok[0] = 17
>>> szamok
[17, 38, 10, 25]

Afentipldbanazegyenlsgjelbaloldalnalkalmazvaa[]opertort(indexopertort)aszamoklistaels
elemthelyettestettkmselemmel.
Hahozzakarunkfrniegylistaelemhez,amimagaegymsiklistbanvan,elghaaktindexetegymsutn
lvszgleteszrjelekbetesszk:
>>> stuff[3][1] = "Isabelle"
>>> stuff
[5000, 'Brigitte', 3.1415999999999999, ['Albert', 'Isabelle', 1947]]

Mindenszekvenciraigaz,hogyazelemekszmozsanullvalkezddik.gyafentipldbanegylista1es
szmelemthelyettestjk,melylistaegymsiklistnak(astuffnak)a3asszmeleme.

10.2.3 Alistkobjektumok
APythonbanalistkvaldiobjektumoksgyklnsenhatkonymetdusokatalkalmazhatunkrjuk:
>>> szamok = [17, 38, 10, 25, 72]
>>> szamok.sort() # listarendezs
>>> szamok
[10, 17, 25, 38, 72]
>>> szamok.append(12) # hozzf z egy elemet a vghez
>>> nombres
[10, 17, 25, 38, 72, 12]
>>> szamok.reverse() # az elemek sorrendjnek megfordtsa
>>> szamok
[12, 72, 38, 25, 17, 10]
>>> szamok.index(17) # elem indexnek meghatrozsa
4
>>> szamok.remove(38) # elem trlse
>>> szamok
[12, 72, 25, 17, 10]

Ezekenametdusokontlmgrendelkezsnkrellabeptett del utasts,amivelazindexealapjnegy


vagytbbelemettrlhetnk:
>>> del szamok[2]
>>> szamok
[12, 72, 17, 10]
>>> del szamok[1:3]
>>> szamok
[12, 10]

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 134.
Jl jegyezzk meg a remove() s a del utastsok kztti klnbsget: a del egy indexszel vagy egy
indextartomnnyalmkdik,mga remove() egy rtket keres(haalistbantbbelemnekazonosazrtke,
akkorazelsttrli).

Gyakorlatok:
10.27. rjonegyscriptet,amia20tl40igterjedszmokngyzeteitskbeitlltjael.

10.28. rjon egy scriptet, ami 5onknt automatikusan ellltja a 0 s 90 kz es szgek sinusait.
Figyelem:amathmodulsin()fggvnyegytekinti,hogyaszgekradinbanvannakmegadva(360
=2radin)

10.29. rjonegyscriptet,amia2,3,5,7,11,13,17,19es(ezeketaszmokategylistbafogjukelhelyezni)
szorztblkels15tagjtlltjkelakpernynakvetkeztblzathozhasonlan:
24681012141618202224262830
369121518212427303336394245
51015202530354045505560657075
stb.

10.30. Legyenadottakvetkezlista:
['JeanMichel','Marc','Vanessa','Anne','Maximilien','AlexandreBenot','Louise']
rjonegyscriptet,amikirjaaneveketsanevekbenlvkarakterekszmt.

10.31. Vanegyegszszmokattartalmazlista,amibenegyesszmoktbbszriselfordulnak.rjonegy
scriptet, ami a listt gy msolja t egy msik listba, hogy figyelmen kvl hagyja a tbbszri
elfordulsokat.Avgslistnakrendezettnekkelllenni.

10.32. rjonegyscriptet,amimegkeresiegyadottmondatbanaleghosszabbszt(aprogramfelhasznljnak
bekelltudniarniegyltalavlasztottmondatot).

10.33. rjonegyscriptet,amikiratjaegycstrtkinappalkezddkpzeletbelivnapjainakalistjt.A
scriptbenhromlistalesz:azegyik ahtnapjainakaneveitfogjatartalmazni, amsikahnapok
neveit,aharmadikpedighogyhnynaposakahnapok(aszkveketnemvesszkfigyelembe).

Plda:
Janur1cstrtkJanur2pntekJanur3szombatJanur4vasrnap
...sgytovbbDecember31cstrtkig.

10.34. Vanegyfile,amibentanulkneveitallhatk.rjonegyscriptet,amirendezettenmsoljateztafilet.

10.35. rjonegyfggvnyt,amivelrendeznilehetegylistt.AfggvnynehasznljaaPythonbeptettsort()
metdust:tehtegyrendezsialgoritmustkelldefinilni.

(Megjegyzs:eztakrdstazosztlybankellmegbeszlni)

135. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.2.4 Listamdostsraszolglhaladslicing(szeletelsi)technikk
Amintemltettem,egybeptettutastssal(del)trlhetnkegyelemetegylistbl,illetveegybeptett
metdussal(append())hozzfzhetnkegyelemetalisthoz.Hajlelsajttottukaszeletels(slicing)elvt,
akkora[]opertorralugyaneztazeredmnytkaphatjuk.Ennekazopertornakahasznlataegykicsitnehezebb,
mintazerreafeladatraszolglutastsokvagymetdusok,detbbrugalmassgotengedmeg:

a) Egyvagytbbelembeszrsaegylistatetszlegeshelyre
>>> szavak = ['sonka', 'sajt', 'lekvr', 'csokold']
>>> szavak[2:2] =["mz"]
>>> szavak
['sonka', 'sajt', 'mz', 'lekvr', 'csokold']
>>> szavak[5:5] =['kolbsz', 'ketchup']
>>> szavak
['sonka', 'sajt', 'mz', 'lekvr', 'csokold', 'kolbsz', 'ketchup']

Ennekatechniknakahasznlathozakvetkezsajtossgokatkellfigyelembevenni:

Ha a [] opertort az egyenlsgjel baloldaln hasznljuk, hogy eleme(ke)t szrjunk be a listba vagy


trljnk alistbl,akkorktelezmegadniacllistaegyszelett(azazktindexetazrjelben);nem
pedigegyelszigeteltelemetalistban.
Az egyenlsgjel jobboldaln megadott elemnek magnak is egy listnak kell lenni. Ha csak egy elemet
szrunk be, akkor azt szgletes zrjelek kz kell tenni, hogy elszr egy egyelem listv alaktsuk.
Jegyezzkmeg,hogya szavak[1] elem nemlista(eza sajt karakterlnc),mga szavak[1:3] elem egy
lista.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 136.
Amostkvetkezkelemzsveljobbanmegfogjukrteniezeketakorltozsokat:

b) Elemektrlse/helyettestse
>>> szavak[2:5] = [] # [] res listt jell
>>> szavak
['sonka','sajt','kolbsz', 'ketchup']
>>> szavak[1:3] = ['salta']
>>> szavak
['sonka', 'salta', 'ketchup']
>>> szavak[1:] = ['majonz', 'csirke', 'paradicsom']
>>> szavak
['sonka', 'majonz', 'csirke', 'paradicsom']

Apldaelssorbana[2:5]szeletetegyreslistvalhelyettestjk,amiegytrlsnekfelelmeg.
Anegyediksorbanegyetlenelemmelhelyettestnkegyszeletet.(Mgegyszerjegyezzkmeg,hogyennekaz
elemneklistaformjbankellmegjelenni).
A7iksorbanegyktelemszeletetegyhromelemlistvalhelyettestnk.

137. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.2.5 Szmokbllllistaltrehozsaarange()fggvnnyel
Haszmsorokatkellkezelnnk,akkorazokatnagyonknnyenltrehozhatjukakvetkezfggvnnyel:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

A range() fggvny nvekv rtk egsz szmokbl ll listt generl. Ha a range() et egyetlen
argumentummalhvjuk,akkoralistaazargumentummalmegegyezszmrtketfogtartalmazni,deazrtkek
nulltlfognakkezddni(vagyisarange(n)a0tln1gterjedegszszmokathozzaltre).
Jegyezzkmeg,hogyamegadottargumentumsohasemszerepelaltrehozottlistban.
Arange()etktvagyhrom,vesszvelelvlasztottargumentummalishasznlhatjukspecilisabbszmsorok
ltrehozsra:
>>> range(5,13)
[5, 6, 7, 8, 9, 10, 11, 12]
>>> range(3,16,3)
[3, 6, 9, 12, 15]

Ha az olvas nehezen fogadja el a fenti pldt, akkor gondoljon arra, hogy a range() mindig hrom
argumentumotvr,amiketFROM,TO&STEPneknevezhetnnk.AFROMazelsrtk,amitltrekellhozni,
a TO azutols(vagyinkbbazutols+1),sa STEP anvekmnyakvetkezrtkig. Hanemadjukmega
FROMsSTEPparamtereket,akkorazoka0s1rtketveszikfelalaprtelmezetten.

10.2.6 Listabejrsaafor,range()slen()segtsgvel
Aforutastsidelisegylistabejrshoz:
>>> mondat =
['La','raison','du','plus','fort','est','toujours','la','meilleure']
>>> for szo in mondat:
print szo,
La raison du plus fort est toujours la meilleure

Egyszekvencia(listavagykarakterlnc)indexeinekautomatikusellltshoznagyonpraktikusarange()s
alen()fggvnyekkombinlsa.Plda:
mese = ['Matre','Corbeau','sur','un','arbre','perch']
for index in range(len(mese)):
print index, mese[index]

Ascriptvgrehajtsnakeredmnye:
0 Matre
1 Corbeau
2 sur
3 un
4 arbre
5 perch

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 138.
10.2.7 Adinamikustpusadsegykvetkezmnye
Amint mr fntebb jeleztem (a 124.oldalon), afor utastssal hasznlt vltoz tpusa a bejrs folyamn
folyamatosanjravandefinilva.Mgakkoris,haegylistaelemeiklnbztpusak,aforsegtsgvelgy
jrhatjukbeeztalistt,hogynemkapunkhibazenetet,mertaciklusvltoztpusaautomatikusanalkalmazkodik
azadatolvassasornannaktpushoz.Plda:
>>> divers = [3, 17.25, [5, 'Jean'], 'Linux is not Windoze']
>>> for item in divers:
print item, type(item)

3 <type 'int'>
17.25 <type 'float'>
[5, 'Jean'] <type 'list'>
Linux is not Windoze <type 'str'>

Afntipldbanabeptett type() fggvnytarrahasznlom,hogymegmutassamaz item vltoztnyleg


megvltoztatjaatpustmindeniterrciban(eztaPythondinamikustpusadsateszilehetv)

10.2.8 Mveleteklistkon
A+(konkatenci)s*(szorzs)opertorokatalkalmazhatjukalistkra:
>>> gyumolcsok = ['narancs','citrom']
>>> zoldsegek = ['prhagyma','hagyma','paradicsom']
>>> fruits + legumes
['narancs','citrom','prhagyma','hagyma','paradicsom']
>>> fruits * 3
['narancs','citrom','narancs','citrom','narancs','citrom']

A*opertorklnsenhasznosnazonoselembllllistaltrehozsakor:
>>> het_nulla = [0]*7
>>> het_nulla
[0, 0, 0, 0, 0, 0, 0]

Pldulttelezzkfel,hogyegyolyanBlisttakarunkltrehozni,amiugyanannyielemettartalmaz,mintegy
msikAlista.Eztklnbzmdonrhetjkel,deazegyiklegegyszerbbmegoldsa:B=[0]*len(A)

10.2.9 Tartalmazsigazolsa
Azinutastssegtsgvelknnyenmeghatrozhatjuk,hogyegyelemrszeeegylistnak:
>>> v = 'paradicsom'
>>> if v in zoldsegek:
print 'OK'
OK

139. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.2.10 Listamsolsa
Tegykfel,hogyvanegy fable nevlistnk, amittszeretnnkmsolnia phrase nevjvltozba.Az
olvaselstletebizonyraegyegyszerrtkads:
>>> phrase = fable

Hagyjrunkel,nemhozunkltrevaldimsolatot.Azutaststkvetenmgmindigcsakegyvltozvana
szmtgpmemrijban.Amitltrehoztunkazcsakegyjhivatkozsalistra.Prbljukkipldul:
>>> fable = ['Je','plie','mais','ne','romps','point']
>>> phrase = fable
>>> fable[4] ='casse'
>>> phrase
['Je', 'plie', 'mais', 'ne', 'casse', 'point']

Haaphrasevltozvalbanalistamsolatttartalmazn,akkorazamsolatfggetlenlenneazeredetitl.
Akkor viszont nem tudn mdostani egy olyan utasts, mint amit a harmadik sorban a fable vltozra
alkalmaztunk.Ksrletezhetnkmgakrafable,akraphrasetartalmnakmsmdostsaivalis.Mindegyik
esetbenmegllapthatjuk,hogyazegyiklistamdostsatkrzdnifogamsiklistbansviszont.
Valjbanmindaktnvugyanaztazobjektumotjelliamemriban.Erreahelyzetreazinformatikusokazt
mondjk,hogyaphrasenvafablenvaliasa.

Aksbbiekbenltnifogjukazaliasokhasznt.Mostaztszeretnnk,havolnaegyolyaneljrsunk,amivel
ltre tudunk hozni egy valdi listamsolatot. Az elzekben bemutatott fogalmak segtsgvel az olvasnak
magnakistudniakelltallniilyet.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 140.
Megjegyzs:
APythonmegengedi,hogyegyhosszutaststbbsorraterjedjenki,haazt(),[],{}zrjelekhatroljk.
gykezelnitudjukazrjeleskifejezseket,illetveahosszlista,tuple,illetvesztrdefincikat(lsdksbb).
Abehzsmrtkneknincsjelentsge:azinterpreterottrzkeliazutastsvgt,aholazrjelzrdik.
Ezatulajdonsglehetvtesziaprogramolvashatsgnakajavtst.Plda:
szinek = ['fekete', 'barna', 'piros',
'narancs', 'srga', 'zld',
'kk', 'ibolya', 'szrke', 'fehr']

Gyakorlatok:

10.36. Legyenekadottakakvetkezlistk:

t1=[31,28,31,30,31,30,31,31,30,31,30,31]
t2=['Janur','Februr','Mrcius','prilis','Mjus','Jnius',
'Jlius','Augusztus','Szeptember','Oktber','November','December']

rjunk egy kis programot, ami a msodik listba gy szrja be az els lista sszes elemt, hogy
minegyik hnap nevt az illet hnap napjainak szma kveti: ['Janur',31,'Februr',
28,'Mrcius',31,stb...].

10.37. HozzunkltreegyAlistt,amitartalmaznhnyelemet.Hozzukltreennekegyvaldimsolattazj
B vltozban.tlet:elszrhozzunkltreegycsupanullkattartalmaz B listt,aminekamrete
megegyezikazAlistamretvel.EzutnhelyettestskanullkatazAelemeivel.

10.38. Ugyanazaproblma,demsaztlet:elszrhozzunkltreegyresBlistt.Ezutntltskaztfelaz
Aelemeineksegtsgvel.

10.39. Ugyanazaproblma,demegintmsaztlet:aBlistaltrehozshozazAlistbanvgjunkegyolyan
szeletet,amiazsszeselemettartalmazza(a[:]opertorsegtsgvel.)

10.40. Egy primszm olyan szm, ami csak eggyel s nmagval oszthat. rjon programot, ami az
eratosztensziszitamdszernekalkalmazsvalazsszes1s1000kzttiprmszmotellltja:

Hozzonltreegy1000elembllllistt,mindenlistaelemkezdrtke1legyen.

Jrjabeeztalistta2indexelemtlkezdve:
haavizsgltelemrtke1,akkortegyenullvalistaazonelemeit,melyeknekindexeegszszm
tbbszrseazaktulisindexnek
amikor gy bejrta az egsz listt, akkor azoknak az elemeknek az indexei lesznek a keresett
prmszmok,melyelemekrtke1maradt.

Valbant:A2esindextlkezdvemindenelemetnullzunk,aminekazindexekettegsz szm
tbbszrse:4,6,8,10,stb.A3asindexxelnullzzuka6,9,12,15,stb.,indexelemeketsgy
tovbb.
Csakazoknakazelemeknekmarad1azrtkeamiknekazindexeprmszm.

141. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.2.11 VletlenszmokHisztogrammok
A szmtgp programok tbbsge pontosan ugyanazt a dolgot csinlja minden futtatskor. Az ilyen
programokat determinisztikusaknak nevezzk.A determinizmusbiztosanjdolog:nyilvnaztakarjuk,hogy
ugyanazokra a kiindulsi adatokra alkalmazott azonos szmtsi sorozat mindig ugyanazt az eredmnyt
szolgltassa.Bizonyosalkalmazsoknlazonbanaztszeretnnk,hogyaszmtgp nelegyenkiszmthat.A
jtkoknyilvnvalpldkerre,demspldkisvannak.
Altszatellenreegyltalnnemknnyolyanalgoritmustrni,amivalbannemdeterminisztikus(vagyis
ami teljesen kiszmthatatlan eredmnyeket ad). Viszont vannak olyan matematikai eljrsok, amik lehetv
teszikavletlentbbkevsbj szimulcijt.Knyveketrtakazokrlazeszkzkrl,amikavletlentj
minsgben produkljk. Nyilvn nem fogom most ezt a krdst kifejteni, de az olvast semmi sem
akadlyozzamegabban,hogyetrgykrbenkonzultljonamatematikatanrval.
APython random moduljaegszsorklnbzeloszlsvletlenszmokatgenerl fggvnytknl.
Csaknhnyatfogunkmegvizsglnikzlk.Azonlinedokumentcibanlehetatbbitmegnzni.Amodul
sszesfggvnytimportlhatjukakvetkezutastssal:
>>> from random import *

Azalbbifggvnynullasegyrtkekkzesvletlenvalsszmokathozltre.Argumentumkntalista
mrettkellmegadni:
>>> def veletlen_lista(n):
s = [0]*n
for i in range(n):
s[i] = random()
return s

Elszregynullkblllnelemlistthoztunkltre,majdanullkatvletlenszmokkalhelyettestettk.
Gyakorlatok:
10.41. rjajraafentiveletlen_lista()fggvnytazappend()metdusalkalmazsvalgy,hogyalisttegy
reslistbllpsrllpsrehozzaltre(azazneegymrmeglvlistanullaelemeithelyettestse,
ahogyanaztazelbbtettk).

10.42. rjonegylista_nyomtatas()fggvnyt,amisoronkntrjakiegytetszlegesmretlistasszeselemt.
Alistanevtargumentumkntkellmegadni.Hasznljaeztafggvnytaveletlen_lista()fggvnnyel
generltvletlenszmokkinyomtatsra.gypldulaz lista_nyomtatas(veletlen_lista()) utastsnak
egy8vletlenszmbllloszlopotkellkiratni.

Valban vletlen szmok az gy ltrehozott szmok ? Ezt nehz megmondani. Ha csak kevs szmot
generlunk,akkorsemmitsemtudunkigazolni.Haviszontarandom() fggvnytsokszoralkalmazzuk,akkor
aztvrjuk,hogyazellltottszmokfele0.5nlnagyobblesz(samsikfelekisebblesz).
Finomtsuk ezt az rvelst. A kisorsolt rtkek mindig a 01 intervallumban vannak. Osszuk fel ezt az
intervallumotngyegyenlrszre:00.25,0.250.50,0.50.75,0.751.
Ha vletlenszeren sorsolunk nagyszm rtket, akkor azt vrjuk, hogy a 4 intervallum mindegyikbe
ugyanannyifogesni.Eztazrvelsttetszlegesszmintervallumraltalnosthatjuk,amgazokegyenlek.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 142.
Gyakorlat:
10.43. Egyprogramotkellrni,amivelaPythonvletlenszmgenertornakmkdstlehetltesztelniafent
bemutatottelmletalkalmazsval.Tehtaprogramnak:
Megkellkrdezniafelhasznltlarandom()fggvnnyelsorsolandvletlenszmokszmt.Fontos,
hogyaprogramjavasoljonegyalaprtelmezettszmot(pldul1000).
Megkellkrdezniafelhasznltl,hogyhnyrszreakarjafelosztanialehetsgesrtkekintervallumt
(vagyis a 01 intervallumot). Itt is javasolni kell egy alaprtelmezett rtket (pldul 5t). A
felhasznlvlasztstkorltozhatjuk2sakisorsoltvletlenszmok1/10eekzttirtkre.
Ltre kell hozni egy N szmllbl ll listt (N a vlasztott intervallumok szma). Nyilvn
mindegyikkkezdrtkenulla.
Arandom()fggvnnyelkikellsorsolniakrtszmvletlenszmotsazrtkeketegylistbankell
trolni.
Vgigkellmenniavletlenrtkeklistjn(ciklus),smegkellnzni,hogya01intervallummelyik
rszintervallumbaesik.Amegfelelszmllrtkteggyelmegkellnvelni.
Amikorezvgetrt,mindegyikszmllllapottkikellratni.

Pldaegyilyentpusprogrameredmnylistjra:
A hzand vletlen szmok szma (dfaut = 1000) : 100
Rszintervallumok szma a 0-1 intervallumban (2 s 10 kztt, dfaut =5) : 5
100 rtk sorsolsnak eredmnye...
Az rtkek szma az 5 rszintervallumban ...
11 30 25 14 20
A hzand vletlen szmok szma (dfaut = 1000) : 10000
Rszintervallumok szma a 0-1 intervallumban (2 s 1000 kztt, dfaut =5) :
5
10.000 rtk sorsolsnak eredmnye....
Az rtkek szma az 5 rszintervallumban ...
1970 1972 2061 1935 2062
Egy ilyen fajta problma j megkzeltse abbl ll, hogy megprbljuk elkpzelni, milyen egyszer
fggvnyekettudnnkrniegyik,vagymsikrszproblmamegoldsra,majdezeketegynagyobbegyttesben
hasznlni.
Pldulelszrmegprblhatnnkdefinilniegy numeroFraction() fggvnyt,miannakamegllaptsra
szolglna,hogymelyikrszintervallumbaesikegykisorsoltszm.Ennekafggvnynekktargumentumalenne
(a kihzott szm s a felhasznl ltal vlsztott rszintervallumszm) s visszatrsi rtkknt az
inkrementlandszmllindextadnmeg(vagyisamegfelelrszintervallumsorszmt). Talnvanolyan
egyszer matematikai okfejts, ami lehetv teszi, hogy ebbl a kt argumentumbl meghatrozzuk a
rszintervallum indext. Gondoljunk az int() beptett fggvnyre, ami a decimlis rsz kikszblsvel
lehetvteszivalsszmokegszekktrtnalaktst.
Hanemtallilyet,akkoregymsikrdekesgondolattalnazlenne,hogyelszrltrehoznnkegylistt,ami
rszintervallumokvgpontjaittartalmazza(pldul4rszintervallumesetn00,250,50,751).Ezeknek
azrtkeknekazismeretetalnegyszerstenanumeroFraction()fggvnymegrst.
Haelgidejevan,akkormegcsinlhatjaennek aprogramnak agrafikusvltozatt, amiazeredmnyeket
hisztogram(oszlopdiagram)formjbanmutatjabe.

143. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Egszszmokvletlensorsolsa
Amikorazolvassajtprojekteketfogfejleszteni,gyakranelfogfordulni,hogyegyolyanfggvnyrelesz
szksge, amivel bizonyos hatrok kz es vletlen egsz szmokat tud generlni. Pldul ha egy
jtkprogramotakarrni,amibenakrtykatvletlenszerenkellhzni(egy52laposkszletbl),akkorbiztosan
hasznoslenneegyolyanfggvny,amikpeslenne1s52kztt(az1ets52tisbelertve)egyvletlen
szmotsorsolni.
Errearandommodulrandrange()fggvnyehasznlhat.
Ezafggvny1,2,3argumentummalhasznlhat.
Egyetlen argumentummal hasznlva: nulla s az argumentum eggyel cskkentett rtke kz es egsz
szmotadvisszatrsirtkl.Pldul:randrange(6)egy0s5kzesszmotadvisszatrsirtknek.
Ktargumentummalhasznlvaavisszatrsirtkeazelsargumentumsazeggyelcskkentettmsodik
argumentum rtke kz es szm. Pldul : randrange(2, 8) egy 2 s 7 kz es szmot ad visszatrsi
rtknek.
Haegyharmadikargumentumotismegadunk,akkorazaztadjameg,hogyavletlenszerensorsoltegszeket
egymstlaharmadikargumentummaldefiniltintervallumvlasztjael.Pldularandrange(3,13,3)a3,6,9,
12sorozatelemeitfogjavisszatrsirtkkntadni.:
>>> for i in range(15):
print random.randrange(3,13,3),

3 12 6 9 6 6 12 6 3 6 9 3 6 12 12

Gyakorlatok:
10.44. rjonegyscriptet,amivletlenszerenhzkrtyalapokat.Akihzottkrtyanevtkorrektenkell,hogy
megadja.Aprogrampldulkirja:

Nyomjon<Enter>tegylaphzshoz:
Treff10
Nyomjon<Enter>tegylaphzshoz:
Krsz
Nyomjon<Enter>tegylaphzshoz:
Piknyolc
Nyomjon<Enter>tegylaphzshoz:
stb...

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 144.
10.3 Atuplek
Eddigktsszetettadattpusttanulmnyoztunk:astringeket,amikkarakterekblllnaksalistkat,amik
tetszlegestpusadatokblllhatnak.Egymsikklnbsgreisemlkeznnkkell:egystringbenakaraktereket
nemlehetmegvltoztatni,mgegylistaelemeimegvltoztathatk.Mshogyfogalmazva,alistkmdosthat
szekvencik,migakarakterlncoknemmdosthatszekvencik.Plda:
>>> lista=['sonka','sajt','mz','lekvr','csokold']
>>> lista[1:3] =['salta']
>>> print lista
['sonka', 'salta', 'lekvr', 'csokold']
>>> karakterlnc ='Romo prfre Juliette'
>>> karakterlnc[14:] ='Brigitte'
***** ==> Erreur: object doesn't support slice assignment *****

Megprbltukmdostaniakarakterlncvgt,deaznemment.Aclunkelrsreazegyetlenlehetsg,
hogyltrehozunkegyjkarakterlncotsodatmsoljukazt,amitmegakarunkvltoztatni:
>>> karakterlnc = karakterlnc[:14] +'Brigitte'
>>> print karakterlnc
Romo prfre Brigitte

A Python egy tuple45 nek nevezett adattpust knl, ami nagyon hasonlt egy listhoz, de nem lehet
mdostani.
Aszintaxisszempontjblatupleelemekvesszkkelelvlasztottgyjtemnye:
>>> tuple = 'a', 'b', 'c', 'd', 'e'
>>> print tuple
('a', 'b', 'c', 'd', 'e')

Brnemszksges,deajnlatoszrjelbetenniatuplet,ahogyanaPythonprintutastsamagaismegteszi
azt.
(Csakakdolvashatbbttelrlvansz,detudjuk,hogyezfontos):
>>> tuple = ('a', 'b', 'c', 'd', 'e')

Atuplekenvgrehajthatmveletekszintaktikailaghasonltanakalistkonvgrehajthatmveletekhez,csak
atupleknemmdosthatk:
>>> print tuple[2:4]
('c', 'd')
>>> tuple[1:3] = ('x', 'y') ==> ***** error *****

>>> tuple = ('Andr',) + tuple[1:]


>>> print tuple
('Andr', 'b', 'c', 'd', 'e')

Vegykszre,hogyegytupledefincijhozmindiglegalbbegyvesszrevanszksg(afentiutolsplda
egy egyelem tuplet hasznl: 'Andr'). Az olvas fokozatosan fog rjnni a tuplek hasznra. A listkban
mindenttelnybenrszestjkketott,aholbiztosakakarunklenniabban,hogyazadatokatnemmdostjuk
tvedsbl a programban. Radsul kevsb veszik ignybe a rendszer erforrsait. (kevesebb memrit
foglalnakle).

45 Eznemangolsz,egyinformatikaimsz.

145. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.4 Asztrak
Az eddig tanulmnyozott adattpusok (stringek, listk, tuplek) mind szekvencik, vagyis
rendezettelemsorozatokvoltak.Egyszekvencibanegyindex(egszszm)segtsgvelbrmelyik
elemhezegyszerenhozzfrhetnk,azzalafelttellel,hogyismerjkahelyt.
Asztrakegymsiksszetettadattpustkpeznek.Bizonyosfokigalistkraemlkeztetnek
(mdosthatkmintalistk),denemszekvencik.Abejegyzettelemeknemmegvltoztathatatlan
sorrendbenlesznekelrendezve.Egykulcsnaknevezettspecilisindexszelamilehetalfabetikus,
numerikusvagybizonyosfelttelekmellettegysszetetttpusbrmelyikkhzhozzfrhetnk.
Egy sztrban, a listkhoz hasonlan, brmilyen tpus elemeket trolhatunk. Az elemek
lehetnek:numerikus,string,lista,tuple,sztrrtkek,defggvnyek,classok,vagyobjektumok
is(lsdksbb).

10.4.1 Sztrltrehozsa
Pldakntegynyelvisztrathozunkltre,amiangolinformatikaikifejezsekmagyarrafordtsraszolgl.
Ebbenasztrbanazindexekkarakterlncoklesznek.
Mivelasztrtpusegymdosthattpus,kezdhetjkegyressztrltrehozsval,amitmajdaprnknt
tltnkfel.Szintaktikaiszempontblannakalapjnismernkfelegyadatstruktrtsztrtpusknt,hogyaz
elemeikapcsoszrjelbevannakzrva.Tehta{}egyressztratfogjellni:

>>> dico = {}
>>> dico['computer'] = 'szmtgp'
>>> dico['mouse'] ='egr'
>>> dico['keyboard'] ='billenty zet'
>>> print dico
{'computer': 'szmtgp', 'keyboard': 'billenty zet', 'mouse': 'egr'}

Azelzsorbanmegfigyelhetjk:formailagegysztrelemekvesszvelelvlasztottsorozatakntjelenik
meg(amit kapcsos zrjelek vesznek krl).Mindegyik elem egy objektumprbl ll:egy indexbl s egy
rtkbl,amiketkettspontvlasztel.
Azindexeketkulcsnak,azelemeketpedigkulcsrtkproknakhvjuk.Megllapthatjuk,hogyazasorrend,
amibenazelemekazutolssorbanmegjelennek,nemfelelmegannakasorrendnek,amibenmegadtukket.
Ennek semmilyen komoly kvetkezmnye sincs: rtkhez sose fogunk numerikus indexszel hozzfrni a
sztrban.Ehelyettkulcsokatfogunkhasznlni:

>>> print dico['mouse']


egr

Haviszontegysztrhozjelemetakarunk hozzfzni, elg egy jkulcsrtk prtkpezni,szembena


listkkal,melyekesetnegyspecilismetdust(azappend()et)kellhvnunk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 146.
10.4.2 Mveleteksztrakkal
Mostmrtudjuk,egysztrhozhogyanadhatunkhozzelemeket.Elemtrlsrea del utaststhasznljuk.
Pldaknthozzunkltreegymsiksztrat,amimostegygymlcsraktrleltrtfogjatartalmazni.Akulcsok
(vagyindexek)agymlcsnevekleszneksazelemekrtkeiaraktrozottgymlcsktmegeilesznek(ez
alkalommalazrtkeknumerikustpusak).
>>> leltar = {'alma': 430, 'banan': 312, 'narancs' : 274, 'barack' : 137}
>>> print leltar
{'narancs': 274, 'alma': 430, 'banan': 312, 'barack': 137}

Haatulajdonosazalmakszletfelszmolsrldnt,akkorasztrbleltvolthatjukeztabejegyzst:
>>> del leltar['alma']
>>> print leltar
{'narancs': 274, 'banan': 312, 'barack': 137}

Alen()fggvnyhasznlhatsztrral:azelemekszmtadjameg.

10.4.3 Asztrakobjektumok
Asztrakraspecifikusmetdusokatalkalmazhatunk:
Akeys()metdusasztrbanhasznltkulcsoklistjtadjameg:
>>> print dico.keys()
['computer', 'keyboard', 'mouse']

Avalues()metdusasztrbantroltrtkeklistjtadjameg:
>>> print leltar.values()
[274, 312, 137]

Ahas_key()metdusmegadja,hogyasztrtartalmazeegymeghatrozottkulcsot.
Akulcsotargumentumbanadjukmegsametdusegyigazvagyhamisrtketadvissza(valjban1et
vagy0t),annakmegfelelen,hogyakulcsltezik,vagysem.:
>>> print leltar.has_key('banan')
1
>>> if leltar.has_key('alma'):
print 'van almank'
else:
print 'bocsanat, de nincs almank'

bocsanat, de nincs almank

Azitems()metdusasztrblegyveleegyenrtk,tuplekbllllisttkszt:
>>> print leltar.items()
[('narancs', 274), ('banan', 312), ('barack', 137)]

Acopy()metdussalasztrvaldimsolattkszthetjkel.Tudnunkkell,hogyegyltezsztrnakegyj
vltozhozvalhozzrendelsecsakegyjhivatkozsthozltreugyanarraazobjektumra,nempedigegyj
objektumot.Alistkkapcsnmrbeszltemerrlajelensgrl(aliasing).Pldulazalbbiutasts(altszat
ellenre)nemdefiniljsztrat:

147. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
>>> keszlet = leltar
>>> print keszlet
{'narancs': 274, 'banan': 312, 'barack': 137}

Ha mdostjuk az leltar at, akkor a keszlet is mdosul, s viszont (ez a kt nv valjban ugyanazt a
sztrobjektumotjelliaszmtgpmemrijban):
>>> del leltar['banan']
>>> print keszlet
{'narancs': 274, 'barack': 137}

Egymrltezsztrvaldi(fggetlen)msolatnakelksztshezacopy()metdustkellhasznlni:
>>> bolt = keszlet.copy()
>>> bolt['szilva'] = 561
>>> print bolt
{'narancs': 274, 'szilva': 561, 'barack': 137}
>>> print keszlet
{'narancs': 274, 'barack': 137}
>>> print leltar
{'narancs': 274, 'barack': 137}

10.4.4 Sztrbejrsa
Aforciklustfelhasznlhatjukasztrbanlvelemeketegymsutntrtnkezelsre,devigyzat:
Aziterrcisornakulcsoklesznekegymsutnhozzrendelveamunkavltozhoz,nempedigazrtkek.
Nemlehetelreltniazelemekhezvalhozzfrssorrendjt(mivelasztrnemszekvencia).
Plda:
>>> keszlet ={"narancs":274, "barack":137, "banan":312}
>>> for kulcs in keszlet:
... print kulcs

barack
banan
narancs

Haazrtkeketakarjukkezelni,akkoramegfelelkulcsoksegtsgvelfrnkhozzjuk:
for kulcs in keszlet:
print kulcs, keszlet[kulcs]

barack 137
banan 312
narancs 274

Ezazeljrsteljestmnybenkifejezvesem,sazolvashatsgszempontjblsemidelis.Inkbbazelz
fejezetbenlertitems()metdushvsaajavasolt.
for kulcs, ertek in leltar.items():
print kulcs, ertek

barack 137
banan 312
narancs 274

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 148.
10.4.5 Akulcsoknemszksgkppenstringek
Eddigolyan sztrakat mutattam be, amiknek akulcsai minden alkalommal string tpus rtkek voltak.
Hasonlmdon,kulcsknthasznlhatunkbrmilyen nemmdosthat adattpust:egszeket,valsszmokat,
karakterlncokat,sttupleketis.
Ttelezzk fel pldul, hogy szeretnnk lajstromba venni egy nagy terlet fit. Erre hasznlhatunk egy
sztrat,aminekakulcsaiazegyesfkx,ykoordintittartalmaztuplek:
>>> fa = {}
>>> fa[(1,2)] = 'nyarfa'
>>> fa[(3,4)] = 'platan'
>>> fa[6,5] = 'palma'
>>> fa[5,1] = 'cikasz'
>>> fa[7,3] = 'fenyo'

>>> print fa
{(3, 4): 'platan', (6, 5): 'palma', (5, 1):
'cikasz', (1, 2): 'nyarfa', (7, 3): 'fenyo'}
>>> print fa[(6,5)]
palma

szrevehet, hogy a harmadik sortl kezdve knnytettem az


rsmdon, kihasznlva azt a tnyt, hogy a tupleket hatrol zrjelek nem ktelezek (javaslom az
vatossgot!).
Az ilyen fajta konstrukciknl szben kell tartani, hogy a sztr csak bizonyos adatprokra tartalmaz
elemeket.Egybkntsemmitsemtartalmaz.Kvetkezsknt,haleakarjukkrdezniasztrat,hogytudjukmi
holvan,illetveholnincs,mintpldula(2,1)koordintkon,akkoregyhibazenetetfogunkelidzni:
>>> print fa[1,2]
nyarfa
>>> print fa[2,1]
***** Error : KeyError: (2, 1) *****

Aproblmamegoldsraaget()metdustalkalmazhatjuk:
>>> print fa.get((1,2),'semmi')
nyarfa
>>> print fa.get((2,1),'semmi')
semmi

Ametduselsargumentumaakeressikulcs,amsodikargumentumazazrtk,amitvisszatrsirtkknt
szeretnnkkapni,haakulcsnemltezikasztrban.

10.4.6 Asztraknemszekvencik
Fntebblttuk:asztrelemeinincsennekegybizonyossorrendbenelrendezve.Azolyanmveleteket,minta
konkatenci s az extrakci (folytonos elemcsoport) itt egyszeren nem lehet alkalmazni. Ha mgis
megprbljuk,akkoraPythonakdvgrehajtsakzbenhibazenetetkld:
>>> print fa[1:3]
***** Error : KeyError: slice(1, 3, None) *****

149. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Aztislttuk,hogyegyjbejegyzsksztshezelgegyjindexet(egyjkulcsot)alloklniasztrba.Ez
nemmentalistkkal46:
>>> leltar['cseresznye'] = 987
>>> print leltar
{'narancs': 274, 'cseresznye': 987, 'barack': 137}

>>> lista=['sonka', 'salata', 'lekvar', 'csoki']


>>> lista[4] ='szalami'
***** IndexError: list assignment index out of range *****

Abbl a tnybl addan, hogy nem szekvencik, a sztrak rendkvl rtkesek olyan adategyttesek
kezelsnl, melyekbegyakrankelltetszlegessorrendbenadatokatbeszrnivagytrlni. Jlhelyettestik a
listkat, amikor olyan sorszmozott adategytteseket kell kezelni, amiknek a sorszmai nem egymsra
kvetkezk.
Plda:
>>> client = {}
>>> client[4317] = "Dupond"
>>> client[256] = "Durand"
>>> client[782] = "Schmidt"

stb.

Gyakorlatok:
10.45. rjonegyscriptet,amiegysztrralmkdminiadatbzisthozltre,melybenabartainakanevt,
letkort, testmagassgt trolja. A scriptnek kt fggvnyt kell tartalmazni: az els a sztr
feltltsre,amsodikaztnzsreszolgl.Afeltltfggvnybenalkalmazzonegyprogramhurkota
felhasznlltalbertadatokelfogadsra.
Atanulkneveleszakulcssazrtkektuplekblfognakllni(letkor,testmagassg).Azletkor
vekben(egsztpusadat),atestmagassgmterben(realtpusadat)leszkifejezve.
Aztnzsreszolglfggvnyistartalmazegyprogramhurkot.Ebbenafelhasznlvalamilyennevet
ad meg, hogy visszatrsi rtkknt megkapja a megfelel letkortestmagassg prt. A krs
eredmnynekegyformzottszvegsornakkelllenni,mintpldul:Nv:JeanDhoutekor:15ves
magassg:1.74m.Aformzshozhasznljaa130.oldalonlertformzkarakterlncokat.

10.46. rjonegyfggvnyt,amifelcserliegysztrbanakulcsokatsazrtkeket(amipldullehetvteszi,
hogyegyangol/franciasztratfrancia/angolsztrralaktsunk).
(Felttelezzk,hogyasztrnemtartalmaztbbazonosrtket).

46 Emlkeztet: azokat a mdszereket, amik elemek hozzadst teszik lehetv egy listhoz, a 133. oldalon
beszltkmeg.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 150.
10.4.7 Hisztogramksztsesztrsegtsgvel
Asztrakahisztogramksztsnagyonelegnseszkzei.
Tegykfel,hogyegyhisztogramotakarunkkszteni,amiazabcbetinekegyadottszvegbelielfordulsi
gyakorisgtmutatjabe.Afeladatmegoldstleralgoritmusrendkvlegyszer,haegysztrraalapozzuk:
>>> szoveg ="les saucisses et saucissons secs sont dans le saloir"
>>> betuk ={}
>>> for c in szoveg:
betuk[c] = betuk.get(c, 0) + 1

>>> print betuk


{'t': 2, 'u': 2, 'r': 1, 's': 14, 'n': 3, 'o': 3, 'l': 3, 'i': 3, 'd': 1, 'e':
5, 'c': 3, ' ': 8, 'a': 4}

Ltrehozzuk a betuk nev res sztrat. Ezt, az abc betit kulcsoknak hasznlva feltltjk. Az egyes
kulcsokkaltroltrtkeklesznekamegfelelbetkszvegbelielfordulsigyakorisgai.Meghatrozsukhozbe
kelljrniaszovegkarakterlncot.Akaraktereketkulcsknthasznlvaaget()metdussalkrdezzkleasztrat,
ugyanisgykitudjukolvasniazadottkaraktereddigielfordulsainakszmt.Haakulcsmgnemltezika
sztrban,akkoraget()metdusnaknullavisszatrsirtketkelladni.Amegtalltelfordulsiszmotminden
esetbenmegnveljk1gyelsbejegyezzkasztrbaamegfelelkulccsal.
Afeladatfinomtsakntnvsorszerintrendezverathatjukkiahisztogramot.Amegvalstskorrgtna
sort()metdusragondolunk,ezazonbancsaklistkraalkalmazhat.Eznemproblma!Lttukfentebb,hogyan
alakthatunktegysztrattupleklistjv:
>>> rendezett_betuk = betuk.items()
>>> rendezett_betuk.sort()
>>> print rendezett_betuk
[(' ', 8), ('a', 4), ('c', 3), ('d', 1), ('e', 5), ('i', 3), ('l', 3), ('n',
3), ('o', 3), ('r', 1), ('s', 14), ('t', 2), ('u', 2)]

Gyakorlatok:
10.47. Rendelkezsre ll valamilyen (nem tl nagy) szvegfile. rjon egy scriptet, ami megszmolja a
szvegben az abc betinek az elfordulst (az kezetes karakterek problmjt nem vesszk
figyelembe).

10.48. Mdostsaazelbbiscriptetgy,hogyaszvegbenelfordulszavakblhozzonltreegytblzatot.
szrevtel: a szvegekben a szavakat nemcsak betkzk, hanem rsjelek is elvlaszthatjk
egymstl. A problma egyszerstse rdekben kezdhetjk az sszes nem alfabetikus karakter
betkzzel val helyettestsvel, majd az eredmnystringet a split() metdussal talakthatjuk
szavakbllllistv.

10.49. Rendelkezsrellvalamilyen(nemtlnagy)szvegfile.rjonegyscriptet,amielemziaszvegets
mindegyikszpontoshelyt(aszvegelejtlkarakterpozcibanszmolva)bejegyziegysztrba.
Ugyanannakasznakmindenelfordulstbekelljegyezni:vagyisasztrbanmindenrtkegylista,
amiazadottszelfordulsainakahelyttartalmazza.

151. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.4.8 Utastsfolyamvezrlssztrsegtsgvel
Gyakranelfordul,hogyegyvltozrtktlfggenmsfelkellirnytanunkegyprogramvgrehajtst.
Nyilvnval, hogy if elif else utastsok sorozatval kezelhet a problma, de ez nem elegns s elg
nehzkessvlhat,hanagyszmlehetsggelvandolgunk.Plda:

anyag = raw_input("Vlasszon anyagot : ")

if anyag == 'vas':
functionA()
elif anyag == 'fa':
functionC()
elif anyag == 'rez':
functionB()
elif anyag == 'ko':
functionD()
elif ... stb ...

Aprogramozsinyelvekgyakranspecilisutastsokatknlnakazilyentpusproblmkkezelsre,mint
amilyenekaswitchvagycaseaCvagyaPascalesetben.APythonegyiketsemajnljafel,deaproblmkj
rsztmegoldhatjukegylistavagyegysztrsegtsgvel(a225.oldalonadokrrszletespldt).Plda:
anyag = raw_input(" Vlasszon anyagot : ")

dico = {'vas':functionA,
'fa:functionC,
'rez':functionB,
'ko':functionD,
... stb ...}
dico[anyag]()

Afentiktutaststsszelehetsrteniegybe,deklnhagyomketamkdsmagyarzathoz:
Azelsutastsa dico sztratdefinilja.Akulcsokjelentikaklnbzlehetsgeketaz anyag vltoz
szmrasazrtkekamegfelelhvandfggvnyek.Jegyezzkmeg,hogycsakafggvnyekneveirlvan
sz, amiket nem kell ebben az esetben zrjeleknek kvetni (Klnben a Python mindegyik fggvnyt
vgrehajtanasztrltrehozsnakpillanatban).
A msodik utasts az anyag vltoz segtsgvel tett vlasztsunknak megfelel fggvnyt hvja. A
fggvnynevtakulcssegtsgbvelveszikiasztrbl,majdegyzrjelprttrsthozz.APythonegy
klasszikusfggvnyhvstismerfelsvgreishajtja.
Afentitechniktgytkletesthetjk,hogyamsodikutaststazalbbivltozatvalhelyettestjk,amia
get()metdushvsvalaztazesetetisfigyelembeveszi,amikorakulcsnemltezikasztrban(gyegyhossz
elifutastssorozatzrelseutastsnakamegfeleljtkapjukmeg):
dico.get(anyag, masFuggveny)()

(Haazanyagvltozrtkenemfelelmegasztregyikkulcsnaksem,akkoramasFuggveny()fggvnyt
fogjahvni).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 152.
Gyakorlatok:

10.50. Fejezzebea10.45gyakorlatot(miniadatbzisrendszer)ktfggvnyhozzadsval:azegyikasztr
filebatrtnkirsra,amsikasztrnakamegfelelfilebltrtnvisszalltsraszolgljon.

Afilemindensoraegysztrelembllljon.Legyenekjlelklntveazadatok:
akulcssazrtk(vagyisaszemlynvegyrszrlsazletkor+testmagassgmsrszrl.)
azletkor+testmagassgcsoportbanktnumerikusadatvan.
Ktklnbzelvlasztkarakterthasznljon,pldul@otakulcssazrtk,illetvea#otaz
rtketalkotadatokelvlasztsra:

Juliette@18#1.67
JeanPierre@17#1.78
Delphine@19#1.71
AnneMarie@17#1.63

stb.

10.51. Tkletestseazelzgyakorlatscriptjtegysztralkalmazsvalgy,hogyaprogramvgrehajtsta
fmenblirnytja.Aprogrampldulakvetkeztrjaki:

Vlasszon:
(V)isszatltegymrltezfilebamentettsztrat
(B)eszradatokatazaktulissztrba
()tnziazaktulissztrat
(M)entiazaktulissztrategyfileba
(B)efejezs:

A felhasznl vlasztsnak megfelelen teht a megfelel fggvnyt egy fggvnysztrbl


kivlasztvafogjukhvni.

153. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
11.Fejezet: Osztlyok,objektumok,attributumok
Az elz fejezetekben mr tbbszr kapcsolatba kerltnk az objektum fogalmval. Tudjuk, hogy az
objektum egy osztlybl (egyfajta kategribl vagy objektumtpusbl) ltrehozott entits. Pldul a Tkinter
knyvtrbanvanegyButton()osztly,amibltetszlegesszmgombothozhatunkltreegyablakban.

Mostaztvizsgljukmeg,mimagunkhogyandefinilhatunkjobjektumosztlyokat. Atmaviszonylag
nehz. Fokozatosan kzeltjk meg. Nagyon egyszer objektumosztlyok definciival kezdjk, amiket a
ksbbiekbentkletestnk.Szmtsonrazolvas,hogyatovbbiakbanegyresszetettebbobjektumokkalfog
tallkozni.
A relis vilg objektumaihoz hasonlan az informatikai objektumok is nagyon egyszerek, vagy igen
komplikltak lehetnek. Klnbz rszekbl llhatnak, amik maguk is objektumok. Az utbbiakat ms,
egyszerbbobjektumokalkothatjk,stb.

11.1 Azosztlyokhaszna
Azosztlyokazobjektumorientltprogramozs(ObjectOriented Programming vagyOOP)feszkzei.
Ezzel a fajta programozssal a komplex programokat egymssal s a klvilggal klcsnhat objektumok
egyttesekntstruktrlhatjuk.
A programozs ilyen megkzeltsnek az az egyik elnye, hogy a klnbz objektumokat (pldul
klnbz programozk) egymstl fggetlenl, az thatsok kockzata nlkl alkothatjk meg. Ez az
egysgbezrs(encapsulation)elvnekakvetkezmnye.Eszerint:azobjektumfeladatnakelltsrahasznlt
vltozk s az objektum bels mkdse valamilyen formban be vannak zrva az objektumba. Ms
objektumoksaklvilgcsakjldefinilteljrsokkalfrhetnekhozzjuk.
Azosztlyokalkalmazsaegyebekkzttlehetvtesziagloblisvltozkmaximlismrtkelkerlst.
A globlis vltozk hasznlata veszlyeket rejt, klnsen a nagymret programok esetben, mert a
programtestben az ilyen vltozk mindig mdosthatk vagy tdefinilhatk. (Ennek klnsen megn a
veszlye,hatbbprogramozdolgozikugyanazonaprogramon).
Azosztlyokalkalmazsbleredmsikelnyazalehetsg,hogymrmeglvobjektumokbllehetj
objektumokatkonstrulni.gyegsz,mrmegrtprogramrszeketlehetismteltenfelhasznlni(anlkl,hogy
hozzjuknylnnk!),hogyjfunkcionalitstkapjunk.Eztaleszrmaztatssapolimorfizmustesziklehetv.
A leszrmaztats mechanizmusval egy szl osztlybl gyermek osztlyt konstrulhatunk. A
gyermek rkli a felmenje minden tulajdonsgt, funkcionalitst, amikhez azt tehetnk hozz, amit
akarunk.
A polimorfizmus teszi lehetv, hogy klnbz viselkedsmdokkal ruhzzuk fel az egymsbl
leszrmaztatottobjektumokat,vagyakrlmnyektlfggennmagtazobjektumot.
AzobjektumorientltprogramozsopcionlisaPythonban.Sokprojektsikeresenvgigvihetazalkalmazsa
nlklolyanegyszereszkzkkel,mintafggvnyek.Viszonttudjunkrla,hogyazosztlyokpraktikuss
hatkony eszkzk. Megrtsk segteni fog a grafikus interfaceek (Tkinter, wxPython) megtanulsban s
hatkonyanksztelolyanmodernnyelvekalkalmazsra,mintaC++vagyaJava.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 154.
11.2 Egyelemiosztly(class)defincija
Aclassutastssalhozunkltrejobjektumosztlyt.Azutastshasznlattegyelemiobjektumtpusegyj
adattpusdefinilsntanuljukmeg.Azeddighasznltadattpusokmindbevoltakptveanyelvbe.Mostegy
j,sszetettadattpustdefinilunk:aPonttpust.
A matematikai pont fogalmnak felel meg. A skban kt szmmal jellemznk egy pontot (az x s y
koordintival).Matematikaijellsselazrjelbezrtxsykoordintivalreprezentljuk.Pldula (25,17)
pontrlbeszlnk.APythonbanapontreprezentlsra float tpus koordintkatfogunkhasznlni. Eztakt
rtketegyetlenentitssvagyobjektummszeretnnkegyesteni.EzrtegyPont()osztlytdefinilunk):
>>> class Pont:
"Egy matematikai pont defincija"

Azosztlyokdefinciibrhollehetnekaprogramban,deltalbanaprogramelejre(vagyegyimportland
modulba)tesszkket.Afentipldavalsznlegazelkpzelhetlegegyszerbbplda.Egyetlensorelgvoltaz
jPont()objektumtpusdefinilshoz.Rgtnjegyezzkmeg,hogy:

Aclassutastsazsszetettutastsokegyjpldja.Nefelejtskleasorvgrlaktelezkettspontots
az azt kvet utastsblokk behzst. Ennek a blokknak legalbb egy sort kell tartalmazni. Vgtelenl
leegyszerstettpldnkbanezasorcsakegyegyszerkomment.(Megllapodsszerint,haaclassutastst
kvetelssoregykarakterlnc,akkoraztkommentnektekintiaPythonsautomatikusan begyazzaaz
osztlyokdokumentcisszerkezetbe,amiaPythonintegrnsrsztkpezi.Vljonszoksunkk,hogyerrea
helyremindigazosztlytlerkarakterlncottesznk!).
Emlkezznk arra a konvencira, hogy az osztlyoknak mindig nagybetvel kezdd nevet adunk. A
szvegben egy msik konvencit is betartunk: minden osztlynvhez zrjeleket kapcsolunk, ahogyan a
fggvnynevekkelistesszk.
Definiltunk egy Pont() osztlyt, amit mostantl kezdve Pont tpus objektumok pldnyostssal
(instanciation)trtnltrehozsrahasznlhatunk.Hozzunkltrepldulegyjp947objektumot:
>>> p9 = Pont()

Ap9vltozegyjPont()objektumhivatkozsttartalmazza.Aztismondhatjuk,hogyap9egyjpldnyaa
Pont()osztlynak.

Figyelem: utastsban hvott osztlyt mindig zrjeleknek kell kvetnia fggvnyekhezhasonlan (mg
akkoris,hasemmilyenargumentumotsemadunkmeg).Aksbbiekbenmajdmegltjuk,hogyazosztlyok
hvhatkargumentumokkal.
Jegyezzk meg: egy osztlydefincinl nincs szksg zrjelekre (szemben a fggvny defincikkal)
kivve,haaztakarjuk,hogyadefiniltosztlyegymsikmrltezosztlyleszrmazottjalegyen(eztkicsit
ksbbfogomelmagyarzni).
Azjp9objektumunkonmostmrelvgezhetnknhnyelemimveletet.Plda:
>>> print p9.__doc__
Egy matematikai pont defincija

(Afggvnyekrevonatkozanemltettem(73.oldal),hogyaklnbzPythonobjektumokdokumentcis

47 APythonbanegyszerrtkadutastssalhozhatunkltreegyobjektumot.Msnyelvekegyspecilisutastst
vezetnekbe,amigyakrananewutasts,hogymegmutassk,egymintblhozzkltreazjobjektumot.Plda:
p9=newPoint()

155. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
stringjeiazelredefinilt__doc__attribtumhozvannakrendelve.)
>>> print p9
<__main__.Pont instance at 0x403e1a8c>

APythonzenetaztjelenti,hogyap9afprogramszintjndefiniltPont()osztlyegypldnya.Amemria
egyjldefinilthelynhelyezkedikel,aminekacmehexadecimlisanvanmegadva.(Haatrgykrbentovbbi
magyarzatravanszksge,nzzenutnaazltalnosinformatikatantrgyban.).

11.3 Pldnyattribtumokvagyvltozk
A ltrehozott objektum egy res kagylhj. A pont opertortoros minstett nvmegadsi rendszer48
alkalmazsvaladhatunkhozztartalmat:
>>> p9.x = 3.0
>>> p9.y = 4.0

Azgydefiniltvltozkap9objektumattribtumai,vagypldnyvltozi.
Be vannak gyazva, vagy inkbb zrva az objektumba. A szemkzti
llapotdiagram mutatja a memriafoglals eredmnyt: a p9 vltoz
tartalmazza a referencit az x s y attribtumokat tartalmaz j objektum
memriabelihelyre.
Egyobjektumattribtumaibrmelyikkifejezsbenugyangyhasznlhatk,mintatbbikznsgesvltoz:
>>> print p9.x
3.0
>>> print p9.x**2 + p9.y**2
25.0

Azobjektumbavalbezrtsgukmiattazattribtumokklnbznekmsazonosnevvltozktl.Pldulazx=
p9.xutastsjelentse:veddkiap9celhivatkozottobjektumblazxattribtumotsrendeldeztazrtketazx
vltozhoz.
Nincstkzsaz x vltozsa p9 objektum x attribtumakztt.A p9 objektumnaksajtnvterevan,ami
fggetlenazxvltozttartalmazfnvtrtl.

Fontosmegjegyzs:
Lttuk,hogyegyszerrtkadutastssalmintap9.x=3.0nagyonknnyhozzadniegyattribtumot
egyobjektumhoz.APythonbaneztmegengedhetjkmagunknak(ezavltozkdinamikusrtkadsnakegyik
kvetkezmnye),denemigaznjavasoltezagyakorlat.Ennekoktaksbbiekbenfogjukmegrteni.Pusztn
abblaclbljrokgyel,hogyapldnyattribtumokravonatkozmagyarzatotegyszerstsem.
Akorrekteljrstakvetkezfejezetbenfejtemki.

48 Ez a jellsi rendszer olyan, mint amit a modulok vltozinak jellsre hasznlunk, pl.: math.pi vagy
string.uppercase. A ksbbiekben lesz alkalmunk visszatrni erre. Mostmr tudjuk, hogy a modulok
fggvnyeket,osztlyokatsvltozkatistartalmazhatnak.Prbljukkipldul:
>>>importstring
>>>printstring.uppercase
>>>printstring.lowercase
>>>printstring.hexdigits

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 156.
11.4 Objektumokargumentumknttrtntadsafggvnyhvskor
Afggvnyekhasznlhatjk paramterekkntazobjektumokat(visszatrsirtkkntismegadhatnakegy
objektumot).Pldulakvetkezmdondefinilhatunkegyfggvnyt:
>>> def kiir_pont(p):
print "vzszintes koord. =", p.x, "fgg leges koord. =", p.y

AfggvnypparamternekegyPont()tpusobjektumnakkelllenni,mertakvetkezutastsap.xsp.y
pldnyvltozkathasznlja.Ezrt afggvnyhvsakorargumentumkntegy Pont() tpus objektumotkell
megadnunk.Prbljukkiap9objektummal:
>>> kiir_pont(p9)
vzszintes koord. = 3.0 fgg leges koord. = 4.0

Gyakorlat:
(11) rjonegytavolsag()fggvnyt,amikiszmoljaktponttvolsgt.
EnnekafggvnyneknyilvnktPont()objektumotkellargumentumkntmegadni.

11.5 Hasonlsgsegyedisg
HaktPont()objektumegyenlsgrlbeszlnk,akkorezaztjelenti,hogyaktobjektumugyanazokataz
adatokat (attribtumokat) tartalmazza, vagy pedig azt jelenti, hogy ugyanannak az objektumnak kt
hivatkozsrlbeszlnk?Tekintskpldulakvetkezutastsokat:
>>> p1 = Pont()
>>> p1.x = 3
>>> p1.y = 4
>>> p2 = Pont()
>>> p2.x = 3
>>> p2.y = 4
>>> print (p1 == p2)
0

157. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Az utastsok ltrehoznak egy p1 s egy p2 objektumot, amik mg akkor is klnbzek maradnak, ha
hasonlatartalmuk.Azutolsutastsennekaktobjektumnakazegyenlsgtteszteli(duplaegyenlsgjel).
Azeredmnynulla(amiaztjelenti,hogyazrjelbenlvkifejezshamis:tehtnemllfennegyenlsg).

Eztmgegymsikmdonigazolhatjuk:
>>> print p1
<__main__.Pont instance at 00C2CBEC>
>>> print p2
<__main__.Pont instance at 00C50F9C>

Azinformcivilgos:aktvltoz,p1sp2klnbzobjektumokrahivatkoznak.
Prbljunkmostkimst:
>>> p2 = p1
>>> print (p1 == p2)
1
Ap2=p1utastssalap1tartalmtp2hzrendeljk.Ezaztjelenti,hogymostantlkezdveezaktvltoz
ugyanarraazobjektumrahivatkozik.Ap1sp2vltozkaliasaik49egymsnak.
Akvetkezutastsbanazegyenlsgteszt1rtketad.Ezaztjelenti,hogyazrjelbenlevkifejezsigaz:p1
sp2ugyanarraazobjektumrahivatkoznak.Errlakvetkezmdongyzdhetnkmgmeg:
>>> p1.x = 7
>>> print p2.x
7
>>> print p1
<__main__.Pont instance at 00C2CBEC>
>>> print p2
<__main__.Pont instance at 00C2CBEC>

11.6 Objektumokblalkotottobjektumok
Ttelezzk most fel, hogy szeretnnk egy tglalapokat reprezentl osztlyt definilni. Az egyszersg
kedvrtgytekintjk,hogyezekatglalapokmindigvagyvzszintes,vagyfgglegesirnytsak,sohasem
llnakferdn.
Milyeninformcikravanszksgnkazilyentglalapokdefinilshoz?
Tbblehetsgvan.Pldulatglalapkzppontjttudnnkmegadni(ktkoordinta)samrett(hosszsgt
sszlessgt).Megadhatnnkabalfelssajobbalssarknakakoordintitis.Vagyabalfelssarknaka
pozcijtsatglalapmreteit.Tegykfel,hogyeztazutbbimdszertvlasztjuk.
Definiljukazjosztlyunkat:
>>> class Teglalap:
"egy tglalap osztly defincija"

...shasznljukiskirgtnegyjpldnyltrehozsra:
>>> doboz = Teglalap()
>>> doboz.szeles = 50.0
>>> doboz.magas = 35.0

49 Azaliasjelensgrevonatkozanlsda139.oldaltis:Listamsolsa

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 158.
gyltrehozunkegyjTeglalap()objektumotsktattribtumot.Abalfelssarokmegadshozazelbb
definiltPont()osztlyegyobjektumtfogjukhasznlni.gyegyobjektumothozunkltreegymsikobjektum
belsejben!
>>> doboz.sarok = Pont()
>>> doboz.sarok.x = 12.0
>>> doboz.sarok.y = 27.0

Egyobjektumbelsejbentallhatmsikobjektumhozapontopertorralltrehozotthierarchikusnvrendszer
amivelmrtbbszrtallkoztunkalkalmazsvalfogunkhozzfrni.A doboz.sarok.y aztjelentimenja
dobozvltozbanhivatkozottobjektumba.Ebbenazobjektumbankeresdmegasarokattribtumot,majdmenj
az ebben az attribtumban hivatkozott objektumba. Ha megtalltad ezt az objektumot, vlaszd ki az y
attribtumt.
Azalbbihozhasonldiagramoksegtsgveltalnjobbanelkpzelhetkazsszetettobjektumok:

A doboz nv a fnvtrben tallhat. Egy msik nvtrre hivatkozik, ami annak az objektumnak van
fenntartva, amiben a szeles, magas s sarok nevek vannak trolva. Ezek nevek vagy egy msik
nvtrrehivatkoznak(asaroknv),vagyjlmeghatrozottrtkekre.APythonmindenmodulnak,minden
osztlynak,mindenpldnynak,mindenfggvnynekklnnvteretfoglalle.Ezeketarszekretagoltnvtereket
robusztus programok (=olyan programok, amiknek a klnbz komponensei kztt nincsenek thatsok)
ltrehozsrahasznlhatjukki.

11.7 Azobjektumokmintfggvnyekvisszatrsirtkei
Lttukfntebb,hogyafggvnyekazobjektumokatparamterknthasznlhatjk.Visszatrsirtkkntis
megadhatnak egy objektumot. Pldul a kvetkez kozepMeghat() fggvnyt egy Teglalap() tpus
argumentummalkellhvni.AfggvnyvisszatrsirtkeegyPont()objektum,amiatglalapkzppontjnak
koordintittartalmazza.
>>> def kozepMeghat(doboz):
p = Pont()
p.x = doboz.sarok.x + doboz.szeles/2.0
p.y = doboz.sarok.y + doboz.magas/2.0
return p

Ennekafggvnynekahvshozargumentumknthasznlhatunkegydobozobjektumot:
>>> centre = kozepMeghat(doboz)
>>> print centre.x, centre.y
37.0 44.5

159. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
11.8 Azobjektumokmdosthatk
Egy objektum tulajdonsgait gy vltoztathatjuk meg, hogy az attribtumaihoz j rtkeket rendelnk.
Pldul egy tglalap mretei megvltoztathatk (a pozcija mdostsa nlkl), ha a magassgnak s a
szlessgnekjrtketadunk:
>>> doboz.magas = doboz.magas + 20
>>> doboz.szeles = doboz.szeles 5

APythonbanezmegtehet,mertazobjektumoktulajdonsgaimindigpublicok(legalbbisazaktulis2.0
verziban).Msnyelvekvilgosklnbsgettesznekapublic(azobjektumonkvlrlelrhet)saprivate
(csakmagbanazobjektumbanlvalgoritmusokkalelrhet)attribtumokkztt.
Mintmrfntebbemltettem(azegyszerrtkadssaltrtnattribtumdefincikapcsn),egyobjektum
attribtumainakmdostsakornemezakvetendgyakorlat. Ezugyanisellentmondazobjektumorientlt
programozs egyik alapvet clkitzsnek, miszerint: szigoran el kell vlasztani az objektum mkdst
(ahogyanazaklvilgbandeklarlvavolt)sahogyanezamkdsimplementlvavanazobjektumban(samit
aklvilgnaknemkellismerni).
Konkrtabban:mostantlkezdvegyelnnkkellr,hogyazobjektumainkcsakazebblaclbllrehozott
specilismetdusokkallegyenekmdosthatkgy,ahogyanaztakvetkezfejezetbenelmagyarzom.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 160.
12.Fejezet: Osztlyok,metdusok,rkls
Azelzfejezetbendefiniltosztlyokvglisnemegyebek,mintspecilisnvterek,melyekbeneddigcsak
vltozkat(apldnyattribtumokat)helyeztnkel.
Mostelkellltnunkezeketazosztlyokatfunkcionalitssal.Azobjektumorientltprogramozsalaptleteaz,
hogyugyanabbaazegysgbe(azobjektumba)kellbezrniniazadatokat(ezekapldnyattribtumok)sa
kezelskreszntazalgoritmusokat(ezekametdusok,vagyisabezrtfggvnyek).
Objektum=[attribtumok+metdusok]
Az, hogy egy kapszulban egyestjk egy objektum tulajdonsgait s azokat a fggvnyeket, amik
lehetvteszik,hogyhassunkezekreatulajdonsgokra,annakaprogramterveziszndknakfelelmeg,hogy
olyan informatikai entitsokat alkossunk, amiknek a viselkedse megkzelti a minket krlvev vilg
objektumainakaviselkedst.
Vegynkpldulegygomb widgetet. sszernektnikazakvnsg,hogyagombnevinformatikai
objektumviselkedsehasonltson egyigazinyomgombviselkedsre.Egyvalsgosnyomgombfunkcija
(egyelektromosramkrnyitsnakszrsnakakpessge)magbaazobjektumbavanbeptve(ugyangy,
mint ms tulajdonsgok: a mrete, szne, stb.). Ugyangy azt kvnjuk, hogy a programnyomgombunk
klnbzjellemzit(mrett,helyt,sznt,arajtalvszveget),deannakdefincijtis,hogymitrtnik
akkor,amikorklnbzegrakcikathajtunkvgreagombon,aprogrambelsejben egyjlmeghatrozott
entitstartalmazzagy,hogynelegyenkeveredsegymsikgombbalvagymsentitssal.

12.1 Ametdusdefincija
MondandmillusztrcijakntegyjTimeosztlytdefinilok,amimveletekvgrehajtstteszilehetv
idpontokon,idtartamokon,stb.:
>>> class Time:
"Egy id osztly defincija"

Hozzunkltreegyilyentpusobjektumotsadjunkhozzpldnyvltozkatazrk,perceksmsodpercek
trolsra:
>>> pillanat = Time()
>>> pillanat.ora = 11
>>> pillanat.perc = 34
>>> pillanat.masodperc = 25

Gyakorlskntrjonegykiir_ora()fggvnyt,amiahagyomnyosra:perc:msodpercformbanjelenti
mega Time() tpusobjektumtartalmt.Azimntltrehozott pillanat objektumraalkalmazvaafggvnynek
11:34:25tkellkirni:
>>> print kiir_ora(pillanat)
11:34:25
Azolvasfggvnyevalsznlegazalbbiformjlesz:
>>> def kiir_ora(t):
print str(t.ora) + ":" + str(t.perc) + ":" + str(t.masodperc)

(Figyeljk meg a numerikus adatok karakterlncc alaktsra szolgl str() fggvny hasznlatt.) Ha
gyakranhasznljaaTime()osztlyobjektumait,nagyonvalszn,hogygyakranfogjahasznlnieztafggvnyt
is.

161. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Valsznleg blcs dolog lenne a kiir_ora() fggvnyt a Time() osztlyba bezrni, hogy automatikusan
mindigrendelkezsnkrelljon,amikoraTime()osztlyobjektumaitkellkezelnnk.
Egyosztlybabezrtfggvnytmetdusnakneveznk.
Mr tbbszr tallkoztunk metdusokkal (gy tudjuk, hogy a metdus egy objektumosztlyhoz kttt
fggvny).

Egymetduskonkrtdefincija:
Egymetdustgydefinilunk,mintegyfggvnyt.Azonbanvanktklnbsg:
Ametdusdefincijtmindigegyosztlydefincijnakabelsejbenhelyezzkelgy,hogyametdustaz
osztlyhozktkapcsolatvilgosankimutathatlegyen.
Ametduselsparamternekmindigegypldnyhivatkozsnakkelllenni.

Elvbenennekaparamternekbrmilyenvltoznevetadhatnnk,deajnlatosaztakonvencitbetartani,hogy
mindigaselfnevetadjukneki.

Aselfparamteraztapldnytjelli,amihezametdusadefincirsztkpezutastsokbanhozzlesz
kapcsolva. (Ebbl a tnybl addan egy metdusnak mindig legalbb egy paramtere van, mg egy
fggvnydefinciparamternlkliislehet.)
Nzzk,hogymegyezagyakorlatban:
Ahhoz,hogyakiir_ora()fggvnytaTime()osztlymetdusakntrjuktafggvnydefincijtazosztly
belsejbekelltennismegkellvltoztatniaparamterenevt:
>>> class Time:
"j id osztly"
def kiir_ora(self):
print str(self.ora) + ":" + str(self.perc) \
+ ":" + str(self.masodperc)

Ametdusdefincijamostaclassutastsutnibeljebbigaztottutastsblokkrsztkpezi.Figyeljkmeg
jlaselffoglaltszhasznlatt,amitehtmindenebblazosztlyblltrehozhatpldnyrahivatkozik.
(Megjegyzs:A\kdteszilehetvegyhosszutastssorfolytatstakvetkezsorban).
Ametduskiprblsaegyobjektumban
MostmrltrehozhatjukazjTime()osztlyunkegyobjektumt:
>>> most = Time()

Hatlhamarprbljukmeghasznlniazjmetdusunkat,akkoraznemmkdik:
>>> most.kiir_ora()
AttributeError: 'Time' instance has no attribute 'ora'

Eznormlisdolog,hiszennemhoztunkltrepldnyattribtumokat.Pldulakvetkeztkellenetenni:
>>> most.ora = 13
>>> most.perc = 34
>>> most.masodperc = 21
>>> most.kiir_ora()
13:34:21

Mrtbbzbenemltettem,hogynemtancsosgyazobjektumonkvlpldnyattribtumokatltrehozni,
mertaz(egybkellemetlensgekmellett)olyanhibkhozvezet,mintamilyennelpldulazelbbtallkoztunk.
Nzzkmeg,hogyancsinlhatnnkjobban.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 162.
12.2 Aconstructormetdus
Elkerlheteazelbbihiba?Nemfordulnael,hagyintztkvolna,hogyakiir_ora()metdusmindigki
tudjonrnivalamitazjonnanltrehozottobjektumelzetesmanipulcijanlkl.Mskntfogalmazva, blcs
dologlenne,haapldnyvltozkatiselredefinilnnkazosztlybelsejbensmindegyikkneklenneegy
alaprtelmezettrtke.
Ehhez a constructornak nevezett specilis metdust fogjuk hvni. A constructor automatikusan hajtdik
vgre, amikor az osztlybl ltrehozunk egy j objektumot. Benne elhelyezhetjk mindazt, ami a objektum
automatikusinicializlshozszksges.APythonbanaconstructortktelez__init__(kt_karakter,azinit
sz,sjabbkt_karakter)nekhvni.
Plda:
>>> class Time:
"Mg egy j id osztly"
def __init__(self):
self.ora =0
self.perc =0
self.masodperc =0

def kiir_ora(self):
print str(self.ora) + ":" + str(self.perc) \
+ ":" + str(self.masodperc)

>>> tstart = Time()


>>> tstart.kiir_ora()
0:0:0

Ennekatechniknakajelentsgeakkorfogvilgosabbanmegmutatkozni,hamghozzteszekvalamit.Mint
mindenmetdus,gyaz __init__() metdusisellthatparamterekkel.Ezekfontosszerepetfognakjtszani,
mertlehetvteszik,hogyegyetlenlpsbenhozzunkltreegyobjektumotsinicializljukapldnyvltozit.
Mdostsukaplda__init__()metdustakvetkezkppen:
def __init__(self, hh =0, mm =0, ss =0):
self.ora = hh
self.perc = mm
self.masodperc = ss

Az __init__() metdusnak most 3 paramtere van. Mindegyikknek van egy alaprtelmezett rtke. A
constructornak gy adunk t argumentumokat, hogy az j objektum ltrehozsakor az osztly neve utni
zrjelberjukket.
AzjTime()objektumegyidejltrehozsasinicializlsapldulakvetkezkppentrtnik:
>>> szunet = Time(10, 15, 18)
>>> szunet.kiir_ora()
10:15:18

Mivel most a pldnyvltozknak vannak alaprtelmezett rtkeik, gy ltrehozhatk olyan Time()


objektumok,melyeknekegyvagytbbargumentumtelhagyjuk:
>>> becsengetes = Time(10, 30)
>>> becsengetes.kiir_ora ()
10:30:0

163. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
(12) Gyakorlatok:

12.1. DefiniljonegyDomino()osztlyt,amiveladominjtkkveitszimullobjektumokhozhatkltre.
AzosztlyconstructorainicializljaadominAsBfelnlvpontokrtkeit(azalaprtelmezett
rtkek=0).
Definiljonktmsikmetdust:
akiir_pontok()metdust,amikirjaaktoldalonlevpontokat
azertek()metdust,amiaktoldalonlvpontoksszegtadjameg.

Pldkazosztlyalkalmazsra:

>>>d1=Domino(2,6)
>>>d2=Domino(4,3)
>>>d1.kiir_pontok()
Aoldal:2Boldal:6
>>>d2.kiir_pontok()
Aoldal:4Boldal:3
>>>print"sszespont:",d1.ertek()+d2.ertek()
15
>>>lista_dominok=[]
>>>foriinrange(7):
lista_dominok.append(Domino(6,i))

>>>printlista_dominok

stb.,stb.

12.2. Definiljon egy BankSzamla() osztlyt, ami lehetv teszi a szamla1, szamla2, stb. objektumok
ltrehozst. Az osztly constructora kt pldnyattribtumot inicializljon: a nev s egyenleg
attribtumokata'Dupont's1000alaprtelmezettrtkekkel.

Definiljonhrommsikmetdustis:
betesz(osszeg) adottsszegetteszaszmlra
kivesz(osszeg) adottsszegetveszleaszmlrl
kiir() kirjaaszmlatulajdonosnevtsaszmljaegyenlegt.

Pdkazosztlyalkalmazsra:

>>>szamla1=BankSzamla('Duchmol',800)
>>>szamla1.betesz(350)
>>>szamla1.kivesz(200)
>>>szamla1.kiir()
Duchmolbankszlaegyenlege950euro.
>>>szamla2=BankSzamla()
>>>szamla2.betesz(25)
>>>szamla2.kiir()
Dupontbankszlaegyenlege1025euro.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 164.
12.3. Definiljon egy Auto() osztlyt, amivel autk viselkedst utnz objektumok hozhatk ltre. Az
osztlyconstructorahasznljaakvetkezattribtumokatamegadottalaprtelmezettrtkekkel:
marka='Ford',szin='piros',sofor='senki',sebesseg=0.
Egy j Auto() objektum ltrehozsakor meg fogjuk tudni vlasztani a mrkjt s a sznt, de a
sebessgtsavezetjenevtnem .
Definiljaakvetkezmetdusokat:
valaszt_sofort(nev)megadhatjuk(vagymegvltoztathatjuk)avezetnevt
gyorsit(gyorsulas,idotartam)megvltoztatjaazautsebessgt.Asebessgvltozsagyorsulsx
idtartam szorzattal egyenl. Pldul ha 20 son keresztl az aut 1.3 m/ s2 gyorsuls, akkor a
sebessgvltozs26m/slesz.Negatvgyorsulst(lassulst)iselfogadunk.Haavezet'senki,akkora
sebessgnemvltozhat.
kiir_mindent() kirjaazautaktulistulajdonsgait,azazamrkjt,sznt,avezetjenevt,a
sebessget.

Pldkazosztlyhasznlatra:

>>>a1=Auto('Peugeot','kk')
>>>a2=Auto(szin='zld')
>>>a3=Auto('Mercedes')
>>>a1.valaszt_sofort('Romo')
>>>a2.valaszt_sofort('Juliette')
>>>a2.gyorsit(1.8,12)
>>>a3.gyorsit(1.9,11)
Ennekazautnaknincssofre!
>>>a2.kiir_mindent()
zldFord,vezetiJuliette,sebessg=21.6m/s.
>>>a3.kiir_mindent()
pirosMercedes,vezetisenki,sebessg=0m/s.

12.4. Definiljonegy Muhold() osztlyt,amiblFldkrliplyrafellttmestersgesholdakatszimull


objektumokathozhatunkltre.Inicializljaazosztlyconstructoraamegadottrtkekkelakvetkez
pldnyattribtumokat:
tomeg=100,sebesseg=0.
EgyjMuhold()objektumltrehozsakormegtudjukvlasztanianevt,tmegtssebessgt.
Akvetkezmetdusokatkelldefinilni:
impulsion(ero, idotartam) meg vltoztatja az rszonda sebessgt. Ismteljk t fizikbl a
szksges ismereteket: t ideig F er hatsa alatt ll m tmeg test v sebessgvltozsa
Ft
v= .
m
Pldulegy10sig600Newtonerhatsnakkitett300kgtmegrszondasebessge20m/smaln
(vagycskken).
kiir_sebesseg()kirjaazrszondanevtspillanatnyisebessgt.
energia()kirjaazrszondakinetikusenergijnakrtkt.
2
Emlkeztet:akinetikusenergitakvetkezkplettelszmoljukki: E = mv
c
2

165. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Pldkazosztlyhasznlatra:

>>>s1=Muhold('Zo',tomeg=250,sebesseg=10)
>>>s1.impulsion(500,15)
>>>s1.kiir_sebesseg()
A(z)Zomholdsebessge=40m/s.
>>>prints1.energia()
200000
>>>s1.impulsion(500,15)
>>>s1.kiir_sebesseg()
A(z)Zomholdsebessge=70m/s.
>>>prints1.energia()
612500

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 166.
12.3 Osztlyoksobjektumoknvterei
Korbbanmegtanultuk(lsda68.oldalt),hogyegyfggvnybelsejbendefiniltvltozkloklisvltozk.
Ezekafggvnyenkvltallhatutastsokszmrahozzfrhetetlenek.Ezteszilehetv,hogyazonosnev
vltozkathasznlhassunkegyprogramklnbzrszeibenavltozktkzsnekveszlyenlkl.
Mshogyfogalmazva:mindenfggvnyneksajtnvterevan,amifggetlenafnvtrtl.
Azt is megtanultuk, hogy a fggvnyek belsejben lv utastsok hozzfrhetnek a fprogram szintjn
definiltvltozkhoz,decsakolvassra:hasznlhatjkezeknekavltozknakazrtkeit,denemmdosthatjk
ket(kivve,haaglobalutaststhvjk).
Teht a nvterek kztt ltezik egyfajta hierarchia. Ugyanezt fogjuk megllaptani az osztlyok s az
objektumokesetbenis.Valban:
Minden osztlynak sajt nvtere van. Azokat a vltozkat, amik ennek a nvtrnek kpezik a rszt
osztlyvltozknakvagyosztlyattribtumoknaknevezzk.
Minden objektumnak sajt nvtere van. Azokat a vltozkat, amik ennek a nvtrnek kpezik a rszt
pldnyvltozknaknevezzk.
Azosztlyokhasznlhatjk(denemmdosthatjk)afprogramszintjndefiniltvltozkat.
Azobjektumokhasznlhatjk(denemmdosthatjk)aosztlyokszintjnsafprogramszintjndefinilt
vltozkat.
TekintskpldulazelzekbendefiniltTime()osztlyt.A162.oldalonennekazosztlynakktobjektumt
hoztuk ltre: a szunetet s a becsengetest. Mindegyiket klnbz, fggetlen rtkekkel inicializltuk.
Mindegyik objektumban mdosthatjuk s jra kirathatjuk ezeket az rtkeket anlkl, hogy az a msik
objektumrahatssallenne:
>>> szunet.ora = 12
>>> becsengetes.kiir_ora()
10:30:0
>>> szunet.kiir_ora()
12:15:18

Kdoljuksellenrizzkazalbbipldt:
>>> class Nevterek: # 1
aa = 33 # 2
def kiir(self): # 3
print aa, Nevterek.aa, self.aa # 4

>>> aa = 12 # 5
>>> proba = Nevterek() # 6
>>> proba.aa = 67 # 7
>>> proba.kiir() # 8
12 33 67
>>> print aa, Nevterek.aa, proba.aa # 9
12 33 67

Apldbanugyanaztaz aa nevethasznljukhromklnbzvltozdefinilsra:azosztly(2.sor),a
fprogram(5.sor)sazobjektumnvterben(7.sor).
A4.sa9.sorbemutatja,hogyapontopertoralkalmazsvalhogyanfrhetnkhozzehhezahromnvtrhez
(egy osztly belsejbl, vagy a fprogram szintjn). Ismt figyeljk meg a self alkalmazst az objektum
megadsra.

167. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
12.4 rkls
Anapjainkleghatkonyabbprogramozsitechnikjnaktekintettobjektumorientltprogramozsnak(Object
OrientedProgrammingvagyOOP)azosztlyokafeszkzei.Ennekaprogramozsitpusnakazegyikfelnye
az, hogy mindig felhasznlhatunk egy mr meglv osztlyt egy j, nhny eltr vagy kiegszt
funkcionalitssalrendelkezosztlyltrehozsra.Azeljrst leszrmaztatsnak nevezzk.Egyltalnostla
specilisfelhaladosztlyhierarchiakialaktstteszilehetv.
Pldul definilhatunk egy az emls llatok jellemzit tartalmaz Emlos() osztlyt. Ebbl
leszrmaztathatjukaFoemlos(),aRagcsalo(),aRagadozo(),stb.osztlyokat.EzekrklnifogjkazEmlos()
osztlyvalamennyijellemzjtshozzadjkasajtjellemziket.
ARagadozo()osztlyblleszrmaztathatjukaMenyet(),aFarkas(),aKutya()stb.osztlyokat.Ezekmegint
rklnifogjkaszlosztlyukmindenjellemzjt,mieltthozzadjkasajtjaikat.Plda:
>>> class Emlos:
jellemzo1 = "tejjel tpllja a kicsinyeit ;"

>>> class Ragadozo(Emlos):


jellemzo2 = "a zskmnya hsval tpllkozik ;"

>>> class Kutya(Ragadozo):


jellemzo3 = "hangjt ugatsnak hvjk ;"

>>> mirza = Kutya()


>>> print mirza.jellemzo1, mirza.jellemzo2, mirza.jellemzo3
tejjel tpllja a kicsinyeit ; a zskmnya hsval tpllkozik ;
hangjt ugatsnak hvjk ;

Ltjuk,hogyamirzaobjektum,amiaKutya()osztlyegyobjektuma,nemcsakaKutya()osztlyszmra
definiltattribtumotrkli,hanemaszlosztlyokszmradefiniltattribtumokatis.
Apldabemutatjamitkelltenni,haegyszlosztlyblakarunkszrmaztatniegyosztlyt:aclassutastst
alkalmazzuk,amitazjosztlynevekvetsaszlosztlynevtzrjelekkztesszk.
Jljegyezzkmeg,hogyapldbanhasznltattribtumokosztlyattribtumok(nemobjektumattribtumok).
Amirzaobjektumhozzjukfrhet,denemmdosthatjaket:
>>> mirza.jellemzo2 = "testet szor boritja" # 1
>>> print mirza.jellemzo2 # 2
testet szor boritja # 3
>>> fido = Kutya() # 4
>>> print fido.jellemzo2 # 5
a zskmnya hsval tpllkozik ; # 6

Ebbenazjpldbanaz1.sornemmdostjaaRagadozo()osztlyjellemzo2attribtumt,ellenttbenazzal,
amita3.sorlttngondolhatnnk.Eztgyigazolhatjuk,hogyltrehozzukazjfidoobjektumot(46sor).
Haazolvasfeldolgoztaazelzfejezetet,akkormegfogjarteni,hogyaz1.soregyjobjektumvltozt
hoz ltre, ami csak a mirza objektummal van sszekapcsolva. Ettl apillanattl kezdve kt vltoznk van,
amiknekugyanaz jellemzo2 aneve:azegyika mirza objektumnvterben,amsikpediga Ragadozo()
osztlynvterbenvan.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 168.
Hogyankellinterpretlnia2.s3.sorbantrtnteket?Mintfntebblttuk,amirzaobjektumhozzfrheta
sajt nvterben tallhat vltozkhoz, de azokhoz is, amik a szlosztlyok nvtereiben vannak. Ha ezen
nvterek kzl tbben is lteznek azonos nev vltozk, melyik lesz kivlasztva egy olyan utasts
vgrehajtsakor,mintamilyena2.sorbanvan?
A konfliktus floldsra a Python egy nagyon egyszer prioritsi szablyt alkalmaz. Amikor pldul azt
krjktle, hogyegy alpha nev vltoz rtkthasznlja,akkoranevetaloklis nvtrben(avalamilyen
mdonlegbelsbbnvtrben)kezdikeresni.Hatallegyalphavltoztaloklisnvtrben,akkoreztfogja
hasznlni s a keress lell. Ha nem, akkor a Python megnzi a szlstruktra nvtert, majd a
nagyszlstruktranvtert,stb.egszenafprogramnvterig.
Pldnk2.sorbantehtazobjektumvltoztfogjahasznlni.Az5.sorbanviszontcsakanagyszlosztly
szintjntallhategyjellemzo2nevvltoz.gyezleszkirva.

12.5 rklsspolimorfizmus
Elemezzkgondosanakvetkezscriptet.Tbb,azelzekbenlertelgondolstmegvalst,egyebekkztt
azrklstis.
Ascriptmegrtshezelszrtkellismtelnnknhnyelemikmiaifogalmat.Akmiarnmegtanultuk,
hogy az atomok bizonyos szm protonbl (pozitv elektromos tlts rszecskk), elektronokbl (negatv
tltsek)sneutronokbl(semlegesek)llrszecskk.

Azatom(vagyelem)tpustaprotonokszmaa rendszm hatrozzameg.Alapllapotbanegyatom


azonosszmelektrontsprotonttartalmaz,ezrtelektromosansemleges.Vltozszmneutronjaisvan,de
ezeknembefolysoljkazelektromostltst.
Bizonyoskrlmnyekkzttazatomfelvehetvagyelveszthetelektronokat.Emiattelektromostltsretesz
szert,ionnalakul(negatvionn,haegyvagytbbelektrontveszfelspozitvionn,haelektron(oka)tveszt).
Azionelektromostltseaprotonjaiselektronjaiszmnakklnbsgvelegyenl.
Akvetkez script atom s ion objektumokat hoz ltre. Az elbb ismteltk t, hogy azionegy
mdostott atom. Programunkban az ion objektumokat definil osztly teht egy atom osztlybl
leszrmaztatottosztlylesz:azutbbimindenattribtumtsmetdustrklnifogjasezekhezadjaasajt
attribtumaitsmetdusait.
Azegyikilyenhozzadottmetdus(akiir()metdus)helyettestegyatomosztlytlrkltazonosnev
metdust.Azatomsionosztlyokmindegyiknekvanegykiir()metdusa,deezekklnbzmdon
mkdnek.Ebbenazesetbenpolimorfizmusrlbeszlnk.Aztismondhatjuk,hogyakiir()metdustfellrtuk
(overwriting).
Nyilvntetszlegesszmatomsionobjektumhozhatltreebblaktosztlybl.Kzlkazegyiknek
(az atom osztlynak) tartalmaznia kell az elemek peridusos rendszernek (Mengyelejevtblzat) egy
egyszerstettvltozattgy,hogymindenltrehozottobjektumhozhozztudjukrendelniegykmiaielemnevt
segyneutronszmot.Mivelnemkvnatos,hogymindenegyesobjektumbatlegyenmsolvaezatblzat,
ezrtegy osztlyattribtumban fogjukelhelyezni.gyatblzatcsakegyetlenmemriaterletenfogltezni,
amihezmindenebblazosztlyblltrehozottobjektumhozzfrhet.

169. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Nzzkmeg,hogyanilleszkednekegymshozezekafogalmak:
class Atom:
"""egyszer stett atomok, a Per.Rendszer els 10 eleme kzl vlasztva"""
table =[None, ('hidrogn',0), ('hlium',2), ('litium',4),
('berilium',5), ('br',6), ('szn',6), ('nitrogn',7),
('oxign',8), ('fluor',10), ('neon',10)]

def __init__(self, nat):


"a rendszm meghatrozza a protonok, elektronok s neutronok szmt"
self.np, self.ne = nat, nat # nat = rendszm
self.nn = Atom.table[nat][1] # neutronszm a tblzatbl

def kiir(self):
print
print "Az elem neve :", Atom.table[self.np][0]
print "%s proton, %s elektron, %s neutron" % \
(self.np, self.ne, self.nn)

class Ion(Atom):
"""az ionok atomok, amik elektronokat vettek fel vagy vesztettek"""

def __init__(self, nat, toltes):


"a rendszm s a tlts hatrozzk meg az iont"
Atom.__init__(self, nat)
self.ne = self.ne - toltes
self.toltes = toltes

def kiir(self):
"ez a metdus a szl osztlytl rklt metdust helyettesti"
Atom.kiir (self) # a szl osztly metdust is hasznlja !
print "Tlttt rszecske. Tlts =", self.toltes

### F program : ###

a1 = Atom(5)
a2 = Ion(3, 1)
a3 = Ion(8, -2)
a1.kiir()
a2.kiir()
a3.kiir()

Ascriptakvetkezketrjaki:
Az elem neve : br
5 proton, 5 electron, 6 neutron

Az elem neve : litium


3 proton, 2 electron, 4 neutron
Tlttt rszecske. Tlts = 1

Az elem neve : oxygn


8 proton, 10 electron, 8 neutron
Tlttt rszecske. Tlts = -2

Megllapthatjuk,hogyafprogrambanAtom()objektumokathozunkltrearendszmmegadsval(aminek
1s10kzttkelllenni).AzIon()objektumokltrehozshozviszontrendszmotselektromostltst(pozitv
vagynegatv)kellmegadni.Akratomokrl,akrionokrlvansz,ugyanazazkir()metdusazionokestben
egykiegsztsorral(polimorfizmus)ratjakiazobjektumoktulajdonsgait.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 170.
Magyarzatok:
AzAtom()osztlydefincijaatablevltozrtkadsvalkezddik.Egyebbenarszbendefiniltvltoz
az osztly nvternek kpezi rszt. Ez teht egy osztlyattribtum, amiben a Mengyelejevfle peridusos
rendszerels10elemrevonatkozinformciklistjtteszem.
A lista a rendszmnak megfelel indexen egy (elem neve, neutronszm) tuplet tartalmaz. Mivel nulla
rendszmelemnemltezik,ezrtalistanullaindexelemheza None specilisobjektumotrendeltem.(A
prioribrmilyenmsrtkethozzrendelhettemvolna,mivelnemfogomhasznlnieztazindexet.Szmomraa
Noneobjektumklnsenexplicitnektnik.).
Eztkvetiaktmetdusdefincija:
Az __init__() constructor hrom objektumattribtum ltrehozsra szolgl. Ezeknek az a rendeltetsk,
hogy minden egyes ebbl az osztlybl ltrehozott atomobjektumban kln troljk a protonok, az
elektronoksaneutronokszmt.(Azobjektumattribtumokaselfhezkapcsoltvltozk).
Jlfigyeljkmeg,hogymilyentechnikvalkapjukmeganeutronszmotazosztlyattribtumbl:azosztly
nevreapontopertorosminstettnvmegadsbanhivatkozunk.
A kiir() metdusegyszerrehasznljaazobjektumattribtumokatazaktulisobjektumproton, neutrons
elektronszmnak meghatrozsra s az osztlyattribtumot (amelyik kzs minden objektumra) a
megfelelelemnevnekmeghatrozsra.Figyeljkmegastringekformzsnaktechnikjtis.(lsd.130.
oldal).

Az Ion() osztly defincija zrjelet tartalmaz. Teht egy leszrmaztatott osztlyrl van sz, aminek a
szlosztlyatermszetesenazAtom()osztly.

MetdusaiazAtom()osztlymetdusainakavltozatai.Valsznleghvniukkellezutbbiakat.Egyfontos
megjegyzs:
Hogyanhvhategyosztlydefincijbanegymsikosztlybandefiniltmetdus?
Ne tvesszk szem ell, hogy egy metdus mindig ahhoz a pldnyhoz kapcsoldik, amit az osztlybl
fogunkltrehozni(apldnyta self reprezentljaadefinciban).Haegymetdusnakegymsikosztlyban
definiltmetdustkellhogyhvni,akkorezutbbinakmegkelladnunkannakapldnynakahivatkozst,
amelyikhezkapcsoldniakell.Hogyankelleztmegtenni?Nagyonegyszer:
Amikor egy osztly defincijban egy msik osztlyban definilt metdust akarunk hvni, els
argumentumkntapldnyhivatkozstkellnekitadnunk.

gypldulscriptnkbenaz Ion() osztly kir() metdusahvhatjaaz Atom() osztly kir() metdust:az


aktulisionobjektumadatailesznekkirva,mivelazparamtereitadtuktahvutastsban:
Atom.kiir(self)

(ebbenazutastsbanaselftermszetesenazaktulisobjektumhivatkozsa).

Ugyangy,azIon()osztlyconstructorahvjaaszlosztlyaconstructort:
Atom.__init__(self, nat)

(Szmosmspldtisltunkmajdaksbbiekben.)

171. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
12.6 Osztlyknyvtrakattartalmazmodulok

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 172.
Mr rgta tisztban vagyunk a Python modulok gyakorlati hasznval. Tudjuk, hogy osztly s
fggvnyknyvtrakcsoportostsraszolglnak.sszefoglalgyakorlatkntegyjosztlymodulthozunkltre
gy,hogyazalbbiutastssorokategyformes.pynevfilebakdoljuk:

class Teglalap:
"tglalap-osztly"
def __init__(self, hossz =30, szelesseg =15):
self.L = hossz
self.l = szelesseg
self.nev ="teglalap"

def kerulet(self):
return "(%s + %s) * 2 = %s" % (self.L, self.l,
(self.L + self.l)*2)
def terulet(self):
return "%s * %s = %s" % (self.L, self.l, self.L*self.l)

def meretek(self):
print "Egy %s x %s -as %s" % (self.L, self.l, self.nev)
print "terlete %s" % (self.terulet(),)
print "kerlete %s\n" % (self.kerulet(),)

class Negyzet(Teglalap):
"Ngyzet-osztly"
def __init__(self, oldal =10):
Teglalap.__init__(self, oldal, oldal)
self.nev ="ngyzet"

if __name__ == "__main__":
r1 = Teglalap(15, 30)
r1.meretek()
c1 = Negyzet(13)
c1.meretek()

Hamregyszertroltukamodult,akkorktflemdonhasznlhatjuk:vagygyindtjukelavgrehajtst,
mint egy kznsges programt, vagy az osztlyok hasznlathoz valamilyen scriptbe importljuk vagy
parancssorblindtjuk:

>>> import formes


>>> f1 = formes.Teglalap (27, 12)
>>> f1.meretek ()
Egy 27 -szer 12 -es tglalapnak
a fellete 27 * 12 = 324
s a kerlete (27 + 12) * 2 = 78

>>> f2 = formes.Negyzet (13)


>>> f2.meretek ()
Egy 13 -szor 13 -as ngyzetnek
a fellete 13 * 13 = 169
s a kerlete (13 + 13) * 2 = 52

173. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ltjuk, hogy a Negyzet() osztlyt a Teglalap() osztlybl aminek minden jellemzjt rkli
leszrmaztatssalhoztukltre.Mskntfogalmazva:aNegyzet()osztlyaTeglalap()osztlygyermeke.

Megintmegfigyelhetjk,hogya Negyzet() osztlyconstructoraapldnyhivatkozst(azaza selfet)els


argumentumkntmegadvahvjaaszlosztlyaconstructort(Teglalap().__init__()et).
Amodulvgnaz:
if __name__ == "__main__":

utastsarraval,hogymeghatrozza:amodultprogramknt(ezesetbenakvetkezutastsokatvgrekell
hajtani),vagyimportltosztlyknyvtrkntkellindtani.Utbbiesetbenezakdrszhatstalan.

Gyakorlatok:

12.5. DefiniljonegyKor()osztlyt.Azosztlyblltrehozottobjektumokklnbzmretkrklesznek.
Aconstructoronkvl(amiasugarparamtertfogjahasznlni)definilnikellegyterulet()metdust,
amiakrterlettadjamegvisszatrsirtkknt.

Definiljon egy Henger() osztlyt , ami a Kor() osztlybl van szrmaztatva. Az j osztly
constructornak kt paramtere legyen: a sugar s a magassag. Adjon hozz egy terfogat() nev
metdust,amiahengertrfogattadjamegvisszatrsirtkknt.
(Ismtls:ahengertrfogata=alapkrterletexhengermagassg).

Pldaazosztlyalkalmazsra:

>>> henger= Henger(5, 7)


>>> print henger.felszin()
78.54
>>> print henger.terfogat()
549.78

12.6. FejezzebeazelzpldtegyKup()osztlyhozzadsval,amitaHenger()osztlyblszrmaztatle
saconstructoraszintntartalmazzaasugarsamagassagparamtereket.Ennekazjosztlynaka
terfogat()leszasajtmetdusa,amiakptrfogattadjamegvisszatrsirtkknt.
(Ismtls:akptrfogata=amegfelelhengertrfogata/3).

Pldaazosztlyalkalmazsra:

>>> kup= Kup(5,7)


>>> print kup.terfogat()
183.26

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 174.
12.7. DefiniljonegyKartyaJatek() osztlyt,amiblolyankrtyaobjektumokatlehetltrehozni,amikneka
viselkedse az igazi krtykra hasonlt. Az osztlynak legalbb a kvetkez hrom metdust kell
tartalmazni:

constructormetdus:egy52elemlisttkellltrehozniskitlteni,aminekazelemeiaz52krtya
mindegyiknekjellemzittartalmaz2elemtuplekblllnak.
Mindegyikkrtyaesetnklnkelltrolniegyegszszmot,amimegadjaakrtyartkt(2,3,4,5,6,
7,8,9,10,11,12,13,14,azutolsngyrtkajunga,dma,kirlysazsz)segymsikegsz
szmot,amiakrtyaszntadjameg(azaz3,2,1,0takr,kr,atreffsapikszmra).
Egyilyenlistbana(11,2)elematrefjungtjelli.Akszlistnak[(2,0),(3,0),(3,0),(4,0), ......
(12,3),(13,3),(14,3)]tpusnakkelllenni.

kartya_neve()metdus:argumentumkntmegadvaalertuplet,ezametdusvisszatrsirtkknt
brmelyikkrtyramegadjaazaztazonostkarakterlncot.
Pldula:
printjatek.kartya_neve((14,3))
utastsnak:piksztkellkirni

kever()metdus:sszekeveriakrtykat.
Akrtykattartalmazlistaelemeineksszekeversreval,mindegyhnyelemblllalista.

huz() metdus : amikor ezt ametdust hvjuk, akkor egy krtyt hzunk. A sznt s az rtkt
tartalmaztupletadjamegvisszatrsirtkkntahvprogramnak.Mindig alistaelskrtyjt
hzzukki.Haakkorhvjukametdust,amikoregyetlenkrtyasemmaradtalistban,akkoraspecilis
Noneobjektumotkellmegadniavisszatrsirtkknt.

PldaaKartyaJatek()osztlyalkalmazsra:

jatek==KartyaJatek() #egyobjektumltrehozsa
jatek.kever() #krtykmegkeverse
forninrange(53): #52krtyahzsa:
c=jatek.huz()
ifc==None: #egykrtyasemmaradt
print'Vge!' #alistban
else:
printjatek.kartya_neve(c) #akrtyartkesszne

12.8. Az elz gyakorlat kiegsztse : Definilni kell kt jtkost, A t s B t. Ltre kell hozni kt
krtyajtkot(mindegyikjtkosnakegyet)smegkellketkeverni.Utnaegyciklussegtsgvel52
alkalommalegyegykrtytkellhznimindktkrtyakszletblssszekellhasonltaniazrtkeiket.
Haakettkzlezelsrtkeanagyobb,akkorazAjtkosnakadunkegypontot.Ellenkezesetbena
Bjtkosnakadunkegypontot.Haegyenlaktrtk,akkorakvetkezhzsratrnkt.Aciklus
vgnsszekellhasonltaniazAsBszmllit,hogymeghatrozzukanyertest.

175. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
13.Fejezet: Osztlyoksgrafikusinterfaceek
Azobjektumorientltprogramozsklnsenalkalmasgrafikusinterfacealkalmazsokfejlesztsre.Az
olyan osztlyknyvtraknak, mint a Tkinter vagy a wxPython szmos alapwidgetjk van, amiket
leszrmaztatssaligazthatunkignyeinkhez.EbbenafejezetbenmegintaTkinterknyvtratfogjukhasznlni,
deazelzfejezetbenlertfogalmakatalkalmazva.Arrafogoktrekedni,hogynyilvnvalvtegyemazokataz
elnyket,amiketazobjektumorientltsghozaprogramjainkba.

13.1 Sznkdok:egyegysgbezrtproject
Egy kis projekttel kezdnk, amit a kezd elektronika tanfolyam inspirlt. Az alkalmazssal gyorsan
megtallhategymeghatrozottrtkellenllshromsznkdja.
Emlkeztetl : az elektromos ellenlls funkcija az ramkorltozs. Az ellenllsok henger alak
alkatrszek,amikenkrbensznescskokvannak(ltalbanhrom).Ezekasznessvokadjkmegazellenlls
numerikusrtktakvetkezmdon:
Megllapodsszerintmindensznegy0s9kzttiszmnakfelelmeg:
fekete=0;barna=1;piros=2;narancs=3;srga=4;
zld=5;kk=6;ibolya=7;szrke=8;fehr=9.
gyfordtjukazellenllst,hogyasznessvokbaloldalonlegyenek.
Azellenllsohmokban( )kifejezettrtktgykapjukmeg,hogyasznsvokatbalrljobbraolvassukle:a
ktelssvjelentianumerikusrtkelsktszmjegyt;ezutnannyinulltkelltenni,amennyiaharmadikcsk
szmrtke.
Konkrtplda:
Tegykfel,hogybalrljobbrahaladvaacskok:srga,ibolyaszldsznek.
Ennekazellenllsnakazrtke4700000 ,vagy4700k,vagy4,7M..
Ez a rendszer nyivn csak kt szmjegy pontossggal teszi lehetv az ellenllsrtk meghatrozst.
Mindenesetreeztelgsgesnektekinthetjkaszoksoselektronikaialkalmazsoktbbsgeszmra(rdi,TV,
stb.).

a) Programunkfeladatmeghatrozsa:

Azalkalmazsunknakmegkelljelenteniegyablakot,ami
egy ellenllsrajzot s egy adatbeviteli mezt tartalmaz,
amibe a felhasznl berhat egy numerikus rtket. A
Mutatgombindtjaelazellenllsrajzmdoststgy,
hogy a hrom sznsvot megfelelteti a bert numerikus
rtknek.
Knyszer : a programnak minden egsz vagy vals
numerikusrtketelkellfogadni10tl1011 ig.Pldul
a4.78e6rtketelkellfogadniaskorrektenkellkerektenie,
vagyis4800000mkellalaktania.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 176.
b) Konkrtmegvalsts

Eztazegyszeralkalmazstegyosztlyformjbanksztjkel.Ennekpillanatnyilagazegyetlenhasznaaz,
hogyegykzsnvterethozltre,amibebezrhatjukavltozinkatsfggvnyeinket.Ezlehetvteszi,hogy
lemondjunkagloblisvltozkrl.Valban:
Azokat a vltozkat, amikhez mindenhonnan hozz szeretnnk frni objektumattribtumknt definiljuk
(mindegyiketaselfsegtsgvelkapcsoljukazobjektumokhoz).

Afggvnyeketmetduskntdefiniljuk,tehtazokisaselfhezvannakkapcsolva.
A fprogram szintjn megelgsznk az gy megkonstrult osztly egyetlen objektumnak ltrehozsval
(ennekazobjektumnakegyikmetdusasincsaktivlvaazobjektumonkvl).
1. class Application:
2. def __init__(self):
3. """A f ablak constructora"""
4. self.root =Tk()
5. self.root.title('Sznkdok')
6. self.drawResistor()
7. Label(self.root,
8. text ="rja be az ellenlls rtkt ohm-ban :").grid(row =2)
9. Button(self.root, text ='Mutat',
10. command =self.changeColours).grid(row =3, sticky = W)
11. Button(self.root, text ='Kilp',
12. command =self.root.quit).grid(row =3, sticky = E)
13. self.entry = Entry(self.root, width =14)
14. self.entry.grid(row =3)
15. # 0-9 rtkek sznkdjai :
16. self.cc = ['black','brown','red','orange','yellow',
17. 'green','blue','purple','grey','white']
18. self.root.mainloop()
19.
20. def drawResistor(self):
21. """Vszon ellenlls modellel, amin hrom szines csk van"""
22. self.can = Canvas(self.root, width=250, height =100, bg ='ivory')
23. self.can.grid(row =1, pady =5, padx =5)
24. self.can.create_line(10, 50, 240, 50, width =5) # fils
25. self.can.create_rectangle(65, 30, 185, 70, fill ='light grey', width =2)
26. # Hrom szines csk (indulskor feketk) :
27. self.line =[] # egy listban fogjuk trolni a hrom cskot
28. for x in range(85,150,24):
29. self.line.append(self.can.create_rectangle(x,30,x+12,70,
30. fill='black',width=0))
31.
32. def changeColours(self):
33. """A bert rtknek megfelel hrom szn kiratsa"""
34. self.v1ch = self.entry.get() # get() metdus egy stringet ad vissza
35. try:
36. v = float(self.v1ch) # talakts szmrtkk
37. except:
38. err =1 # error : nem numerikus adat
39. else:
40. err =0
41. if err ==1 or v < 10 or v > 1e11 :
42. self.reportError() # inkorrekt vagy tartomnyon kvli rtk
43. else:
44. li =[0]*3 # a 3 kirand kd listja
45. logv = int(log10(v)) # logaritmus egsz rsze
46. ordgr = 10**logv # nagysgrend
47. # az els szignifikns szmjegy el lltsa :
48. li[0] = int(v/ordgr) # egsz rsz
49. decim = v/ordgr - li[0] # tizedes rsz
50. # a msodik szignifikns szmjegy el lltsa :
51. li[1] = int(decim*10 +.5) # +.5 a korrekt kerektshez
52. # a 2 szignifikns szmjegyhez hozzteend nullk szma :
53. li[2] = logv -1

177. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
54. # A 3 szakasz sznezse :
55. for n in range(3):
56. self.can.itemconfigure(self.line[n], fill =self.cc[li[n]])
57.
58. def reportError(self):
59. self.entry.configure(bg ='red') # mez htternek sznezse
60. self.root.after(1000, self.emptyEntry) # 1 sec utn trlni
61.
62. def emptyEntry(self):
63. self.entry.configure(bg ='white') # fehr httr visszalltsa
64. self.entry.delete(0, len(self.v1ch)) # karakterek trlse
65.
66. # F program :
67. from Tkinter import *
68. from math import log10 # 10-es alap logaritmus
69. f = Application() # alkalmazs objektum ltrehozsa

Magyarzatok:
1.sor:Azosztlytgydefiniljuk,hogynemhivatkozunkszlosztlyra(nincszrjel).Egyj,fggetlen
osztlylesz.
2.14.sorok: Az osztly constructora ltrehozza a szksges widgeteket: a program olvashatsgnak
javtsa rdekben avszonobjektum ltrehozst (azellenllsrajzzal egytt) egy kln drawResistor()
(ellenllsrajzols)metdusbanhelyeztemel.Agomboksacmkenincsennekvltozkbantrolva,mert
nemakarokrjukhivatkozniaprogrammsrszben.
Awidgetekablakonbellipozcionlsraa97.oldalonlertgrid()metdusthasznljuk.
15.17.sorok:Asznkdokategyegyszerlistbantroljuk.
18.sor:Aconstructorutolsutastsaelindtjaazalkalmazst.
20.30.sorok:Azellenllsrajzegyegyenesblsegyvilgosszrketglalapblll,amikaktkivezetsts
az ellenllstestet alkotjk. Hrom msik tglalap fogja alkotni a sznes svokat, amit a programnak a
felhasznlltalmegadottadatnakmegfelelenkellmajd mdostani.Ezekasvokkezdetbenfeketk;a
self.linelistbanhivatkozunkrjuk.
32.53.sorok:Ezarsztartalmazzaaprogramfunkcionalitsnakalnyegt.
Afelhasznlltalmegadottrtketstringformjbanfogadjael.A36.sorbanmegprblomeztastringet
egyfloattpusnumerikusrtkktalaktani.Hanemsikerlaztalakts,akkortrolomahibt.Haegy
numerikusrtkemvan,akkorellenrzm,hogyazazengedlyezetttartomnyba(101011)esike.Haa
megadottrtkhibs,aztazadatbevitelimezamiutnaresleszhtternekpirosrasznezsveljelzema
felhasznlnak(55.61.sorok).
45.46.sorok: A matematikt hvjuk segtsgl, hogy a numerikus rtkbl meghatrozzuk a szm
nagysgrendjt (vagyis 10 legkzelebbi hatvnynak a kitevjt). A logaritmusra vonatkoz rszletes
magyarzatokatnzzetazolvasamatematikatanknyvben.
47.48.sorok: Ha mr ismerjk a hatvnykitevt, akkor viszonylag egyszer a kezelt szm els kt
szmjegynekmeghatrozsa.Plda:Tegykfel,hogyabertrtk31687.Ennekaszmnakalogaritmusa
4.50088,aminekazegszrsze(4)megadjaabertrtknagysgrendjt(esetnkbenez104).Aszmels
szmjegynek meghatrozshoz 104gyel, azaz 10000rel kell a szmot osztani s csak az eredmny
egszrszt(3)kellmegtartani.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 178.
49.51.sorok:Azelzszakaszbanelvgzettosztseredmnye:3.1687.
A49.sorbanennekaszmnakadecimlisrsztlltjukel,amipldnkban:0,1687.
Haeztmegszorozzuk10zel,akkorazeredmnyegszrszenemms,mintaszmnakamsodikszmjegye
(pldnkbanez1).
Knnyenhozzjuthatnnkehhezaszmjegyhez,azonbanmivelezazutols,aztakarjuk,hogy korrekten
legyen kerektve. Ehhez elg ha 0.5t hozzadunk a 10zel trtn szorozs eredmnyhez, mieltt az
egszrsztmeghatrozzuk.Pldnkbanaszmols 1,687+0,5=2,187etfogeredmnyezni,aminekaz
egszrsze(2)akeresettkerektettrtk.
53.sor:Aktszmjegyhezhozzadandnullkszmaanagysgrendnekfelelmeg.Elgegyetlevonnia
logaritmusbl.
56.sor:Azitemconfigure()metdustarrahasznljuk,hogyegyjszntrendelnkavszonramrfelrajzolt
objektumhoz.Eztametdustalkalmazzukmindenegyessznessvfillopcijnakamdostsragy,hogya
self.cclistblahromindexszel,li[1],li[2]sli[3]mal,amika3megfelelszmottartalmazzk,kivett
sznnevthasznljuk.

(13) Gyakorlatok:

13.1. Mdostsa a fenti scriptet gy, hogy a kp httere vilgoskk ('light blue'), az ellenllstest drapp
('beige')legyen,akivezetsekvkonyabbaksazrtketjelzsznessvokszlesebbeklegyenek.

13.2. Mdostsaafentiscriptetgy,hogyakirajzoltkpktszernagyobblegyen.

13.3. Mdostsaafentiscriptetgy,hogy1s10kzttiellenllsrtkeketisbelehessenrni.Ezeknlaz
rtkeknlazelssznessvnakfeketnekkellmaradni,amsikktsvfogjamegadnibanstized
banazellenllsrtkt.

13.4. Mdostsaafentiscriptetgy,hogyaMutatgombranelegyenszksg.Amdostottscriptben
legyenelgegy<Enter>tnyomniazellenllsrtkbersautn,hogyakirsaktivldjon.

13.5. Mdostsaafentiscriptetgy,hogyahromsznessvfeketvvljonabbanazesetben, amikora


felhasznlegyelfogadhatatlanrtketrbe.

179. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
13.2 Kisvast:rkls,osztlyokkzttiinformcicsere
Azelzgyakorlatbanazosztlyokegyetlenjellemzjthasznltamki:azegysgbezrst(encapsulation).
Ez olyan program rst tette lehetv, amiben a klnbz (metdusokk vlt) fggvnyek mindegyike
ugyanahhoz a vltozpoolhoz frhet hozz: a selfhez kapcsoltan definilt vltozkhoz. Az utbbiakat az
objektumbelsejbengloblisvltozknaktekinthetjk.
Fontos,hogymegrtsk:ezeknemvaldigloblisvltozk.Azobjektumbavannakbezrvasnemajnlotta
kvlrl trtn megvltoztatsuk50. Msrszt ha egy osztlybl tbb objektumot hozunk ltre, akkor
mindegyikkneksajtkszletevanezekblavltozkblazegyesobjektumokbabezrva.Emiatt objektum
attribtumoknaknevezzkket.

Mostnagyobbsebessgrekapcsolunksksztnkegytbbosztlyonalapulalkalmazst.Megvizsgljuk,
hogyantudnakaklnbzobjektumokametdusaikkzvettsvelinformcitcserlni.Aztisbemutatom,
hogy az rkls mechanizmust kihasznlva hogyan definilhatjuk leszrmaztatssal a grafikus
alkalmazsunkfosztlytegymrltezTkinterosztlybl.
Aprojektnagyonegyszer.Egyjtkprogrammegvalstsnakamireegybkntksbbegypldtfogok
adni(lsd229.oldalt)elslpselehet.Egyvsznatsktgombottartalmazablakrlvansz.Azelsgombra
kattintskoregyvonatjelenikmegavsznon.Amikoramsodikgombrakattintunk,nhnyszemlyjelenikmeg
avagonokbizonyosablakaiban.

a) Feladatmeghatrozs:

Azalkalmazsktosztlyttartalmaz:
Az Application() osztlyt a Tkinter egyik alaposztlybl leszrmaztatssal kapjuk meg: ezhelyeziel a
fablakot,avsznatsaktnyomgombot.
Egyfggetlen Wagon() osztly teszi lehetv4 hasonl vagonobjektum ltrehozst a vsznon, melyek
mindegyiknek van egy perso() metdusa. Az utbbit arra sznom, hogy a vagon hrom ablaknak
valamelyikbenmegjelentsenegyszemlyt.Eztametdustafalkalmazsklnbzmdonfogjahvnia
klnbzvagonokra,hogykirajzoljonnhnyszemlyt.

50 Mintmrkorbbanemltettem,aPythonapontopertortalkalmazminstettnvmegadssalteszilehetvaz
objektumattribtumokhoz val hozzfrst. Ms programozsi nyelvek ezt tiltjk vagy csak az attribtumok
specilisdeklarcijvaltesziklehetv(aprivatespublicattribtumokmegklnbztetse).
Mindenesetretudjunkrla,hogyezazeljrsnemjavasolt:ajobjektumorientltprogramozsigyakorlatkikti,
hogyazobjektumokattribtumaihozcsakspecilismetdusokkzvettsvellehethozzfrni.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 180.
b) Implementci:
1. from Tkinter import *
2.
3. def circle(can, x, y, r):
4. "a <can> vsznon egy <r> sugar kr rajza <x,y> -ban"
5. can.create_oval(x-r, y-r, x+r, y+r)
6.
7. class Application(Tk):
8. def __init__(self):
9. Tk.__init__(self) # a szl osztly constructora
10. self.can =Canvas(self, width =475, height =130, bg ="white")
11. self.can.pack(side =TOP, padx =5, pady =5)
12. Button(self, text ="Train", command =self.drawing).pack(side =LEFT)
13. Button(self, text ="Hello", command =self.kukucs).pack(side =LEFT)
14.
15. def drawing(self):
16. "4 vagon ltrehozsa a vsznon"
17. self.w1 = Wagon(self.can, 10, 30)
18. self.w2 = Wagon(self.can, 130, 30)
19. self.w3 = Wagon(self.can, 250, 30)
20. self.w4 = Wagon(self.can, 370, 30)
21.
22. def kukucs(self):
23. "szemlyek megjelense bizonyos ablakokban"
24. self.w1.perso(3) # 1. vagon, 3. ablak
25. self.w3.perso(1) # 3. vagon, 1. ablak
26. self.w3.perso(2) # 3. vagon, 2. ablak
27. self.w4.perso(1) # 4. vagon, 1. ablak
28.
29. class Wagon:
30. def __init__(self, canvas_, x, y):
31. "egy kis vagon rajza a <canvas_> vsznon <x,y> -ban"
32. # paramterek trolsa pldny-vltozkban :
33. self.canvas_, self.x, self.y = canvas_, x, y
34. # alap tglalap : 95x60 pixel :
35. canvas_.create_rectangle(x, y, x+95, y+60)
36. # 3 ablak 25x40 pixel, 5 pixel tvolsgra :
37. for xf in range(x+5, x+90, 30):
38. canvas_.create_rectangle(xf, y+5, xf+25, y+40)
39. # kt 12 pixel sugar kerk :
40. circle(canvas_, x+18, y+73, 12)
41. circle(canvas_, x+77, y+73, 12)
42.
43. def perso(self, wind):
44. "egy emberke megjelense a <wind> ablakban"
45. # minden egyes ablak kzepe koordintjnak a kiszmtsa :
46. xf = self.x + wind*30 -12
47. yf = self.y + 25
48. circle(self.canvas_, xf, yf, 10) # arc
49. circle(self.canvas_, xf-5, yf-3, 2) # balszem
50. circle(self.canvas_, xf+5, yf-3, 2) # jobbszem
51. circle(self.canvas_, xf, yf+5, 3) # szj
52.
53. app = Application()
54. app.mainloop()

Magyarzatok:
3.5.sorok:Kiskrkrajzolsttervezem.Ezafggvnyegyszersitenifogjaadolgomat,mertlehetv
teszi,hogyakrketakzppontjukkalsasugarukkaldefiniljam.
7.13.sorok: Az alkalmazs f osztlyt a Tkinter modulbl importlt Tk() ablakosztlybl
leszrmaztatssal hozom ltre.51 Az elz fejezetben elmondottak szerint, a leszrmaztatott osztly

51 A Tkinter azt ismegengedi, hogy azalkalmazs fablakt egy widgetosztlybl (leggyakrabban egy Frame()
widgetrl van sz) leszrmaztatssal hozzuk ltre. A widgetet magban foglal ablak automatikusan lesz

181. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
constructornak kell a szlosztly constructort aktivlni gy, hogy a pldnyhivatkozst els
argumentumkntadjameg.
A10.13.sorokavszonsagombokelhelyezsreszolglnak.
15.20.sorok: a 4 vagonobjektumot hozzk ltre a megfelel osztlybl. Egy ciklus s egy lista
segtsgvelelegnsabbanisprogramozhatnm,degyhagyom,mertnemakaromfeleslegesenmegnehezteni
ahtralvmagyarzatokat.
Avagonobjektumokatavszonmeghatrozotthelyeireakaromtenni.Ezrtnhnyinformcitmegkell
adnomazobjektumokconstructornak:avszonhivatkozstsakoordintkat.Ezekameggondolsok
sejtetik,hogymajda Wagon() osztlydefincijakoraconstructorbanezenargumantumokfogadsra
azonosszmparamterrlkellgondoskodni.
22.27.sorok:Ametdushvsraamsodikgombrakattintskorkerlsor.Klnbzargumantumokkal
hvja bizonyos vagonobjektumok perso() metdust, hogy az a megadott ablakokban kirajzolja az
emberkket.Ezanhnykdsormegmutatja,hogyantudegyobjektumegymsikkalkommuniklniazutbbi
egyikvagymsikmetdusnakhvsval.Azobjektumokkaltrtnprogramozsalapmechanizmusrlvan
sz:
Az objektumok olyan programegysgek, amik a metdusaik rvn cserlnek zeneteket s hatnak
egymsra.

Idelisesetbena kukucs() metdusnaknhnykiegsztutaststkellenetartalmazni.Ezeknekazrintett


vagonobjektumokltezstkelleneellenrizni,mielttvalamelyikmetdusukaktivlstengedlyeznnk.
Azegyszersgrdekbennemptettembeilyenvdelmet.Ennekazakvetkezmnye,hogyazelsgomb
elttnemmkdtethetamsodikgomb.(Kitudnegszteniametdustazellenrzssel?)
29.30.sorok: A Wagon() osztly egyik ltez osztlynak sem leszrmazottja. Mivel egy grafikus
objektumosztlyrl van sz, a constructort el kell ltnunk paramterekkel, hogy fogadja a vszon
hivatkozst, amire az brkat sznjuk, valamint az brk koordintit. Amikor az olvas a pldval
ksrleteziktermszetesenmsparamtereketishozzadhat:arajzmrett,irnytst,sznt,sebessget,stb.
31.51.sorok:Azutastsoknemignyelneksokmagyarzatot.Aperso()egyikparamteremegadja,hogy
melyikablakbankellmegjelenniazemberknek.Ittsemtettemvintzkedst:ametduspldulhvhata4
vagy5argumentumrtkkel,amiinkorrekthatsokatidzel.
53.54.sorok:Azalkalmazselindtshoznemelgaz Application() osztlyegyobjektumtltrehozni,
mintahogyazelzfejezetpldjbantettnk.Aszlosztlytlrkltmainloop()metdustishvnikell.
Viszontezaktsoregysorbasrthetssze:
Application().mainloop()

Gyakorlat:
13.6. Tkletestse a fenti scriptet gy, hogy a Wagon() osztly constructorhoz hozzad egy colour
paramtert,amiavagonflkjnekaszntfogjameghatrozni.Kezdetbenazablakoklegyenekfeketk
sakerekekszrkk(adjonegycolourparamtertacircle()fggvnyhezis) .
Adjon a Wagon() osztlyhoz egy light() metdust, ami a kezdetben fekete 3 ablak sznt srgra
vltoztatja.Ezzelszimulljukabelsvilgtsbekapcsolst.
Adjonafablakhozegyvilgtskapcsolgombot.Hasznljakiacircle()fggvnytkleteststarra,
hogyazemberkkarctrzsasznre(pink),szemketsszjukatfeketresznezi,sklnbzszn
vagonobjektumokathozltre.

hozzadva.(185.oldal).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 182.
13.3 OscilloGraphe:egytestreszabottwidget
A kvetkez projekt egy kicsit messzebbre vezet. Egy j widgetosztlyt konstrulunk, ami ugyangy
bepthetaksbbiprojektjeinkbe,mintbrmelystandardwidget.Azelzgyakorlatfosztlyhozhasonlan,
eztazosztlytisleszrmaztatssalhozzukltreegymrltezTkinterosztlybl.
Azalkalmazstafizikarainspirlta.Emlkeztetl:
Aharmnikusrezgmozgstgydefiniljuk,mintazegyenleteskrmozgsvetlettegyegyenesre.Egyilyen
tpusmozgstvgztmegpontpozcijtegykzpontihelyzethezszoktukviszonytaniskitrsneknevezzk.A
tmegpontkitrstidbenleregyenletmindig e = A sin 2 f t alak,ahol e atmegpont
kitrseatidpillanatban.AzA,fsllandkarezgmozgsamplitdjt,frekvencijtsfzistjellik.

Aprojektcljaaz,hogyegyolyanegyszereszkztadjon,
amivel kpszeren megjelenthetek ezek a fogalmak, azaz
egygrafikuskitrsidgrbtrajzolrendszertksztnk.A
felhasznl szabadon vlaszthatja meg az A, f s
paramterek rtkeit s megfigyelheti a nekik megfelel
grbket.
Azelswidgetakiratssalfogfoglalkozni.Utnams,az
A, f s paramterek berst megknnyt widgeteket
fogunkkszteni.
rjukbekvetkezscriptetsmentskegyoscillo.pynev
fileba. gy egy egyetlen osztlyt tartalmaz valdi modult
ksztnk(ksbbmsosztlyokatishozztehetnkamodulhoz,hagyakarjuk)

183. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1. from Tkinter import *
2. from math import sin, pi
3.
4. class OscilloGraphe(Canvas):
5. "kitrs/id grbe rajzolsra szolgl specializlt vszon"
6. def __init__(self, boss =None, width_=200, height_=150):
7. "A grafika constructora : tengelyek s vzszintes skla."
8. # a szl widget elksztse :
9. Canvas.__init__(self) # a szl osztly
10. self.configure(width=width_, height=height_) # constructornak hvsa
11. self.width_, self.height_ = width_, height_ # trols
12. # tengelyek megrajzolsa :
13. self.create_line(10, height_/2, width_, height_/2, arrow=LAST) # X tengely
14. self.create_line(10, height_-5, 10, 5, arrow=LAST) # Y tengely
15. # 8 oszts skla rajzolsa :
16. step = (width_-25)/8. # vzszintes skla intervallumai
17. for t in range(1, 9):
18. stx = 10 + t*step # +10, hogy az origtl eljjjnk
19. self.create_line(stx, height_/2-4, stx, height_/2+4)
20.
21. def drawCurve(self, freq=1, phase=0, ampl=10, colo='red'):
22. "1 sec id tartamra es kitrs/id grbe rajzolsa"
23. curve =[] # koordintk listja
24. step = (self.width_-25)/1000. # az X-skla 1 sec-nak felel meg
25. for t in range(0,1001,5): # amit 1000 ms-ra osztunk fel
26. e = ampl*sin(2*pi*freq*t/1000 - phase)
27. x = 10 + t*step
28. y = self.height_/2 - e*self.height_/25
29. curve.append((x,y))
30. n = self.create_line(curve, fill=colo, smooth=1)
31. return n # n = a rajz sorszma
32.
33. #### Kd az osztly tesztelsre : ####
34.
35. if __name__ == '__main__':
36. root = Tk()
37. gra = OscilloGraphe(root, 250, 180)
38. gra.pack()
39. gra.configure(bg ='ivory', bd =2, relief=SUNKEN)
40. gra.drawCurve(2, 1.2, 10, 'purple')
41. root.mainloop()

Ascripttrzsta35.41.sorokalkotjk.A174.oldalonelmondottakszerint,az
if__name__=='__main__':utastsutnikdsorokcsakakkorhajtdnakvgre,haascriptetfalkalmazsknt
indtjukel.Modulkntimportlvanemhajtdnakvgreezekasorok.
Ezazrdekesmechanizmusteszilehetv,hogyamodulokbelsejbetesztutastsokatpthessnkbemg
akkoris,haamodulokatmsscriptekbetrtnimportlsrasznjuk.
Indtsukelascriptvgrehajtstaszoksosmdon.Egyolyandisplaykpetkellkapnunk,mintamilyenaz
elzoldalonvan.

Ksrletezs:
A script lnyeges sorait egy kicsit ksbb fogom megmagyarzni. Elszr ksrletezznk egy kicsit az
osztlyunkkal.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 184.
Nyissunkegyterminlablakot(Pythonshell),saparancssorbarjukbeazalbbiutastsokat:
>>> from oscillo import *
>>> g1 = OscilloGraphe()
>>> g1.pack()

Azoscillomodulosztlyainakimportjautnltrehozzukaz
OscilloGraphe()osztlyelsobjektumtg1et.
Mivelsemmilyenargumentumotsemadunkmeg,ezrtaz
objektum mretei az osztly constructorban definilt
alaprtelmezettmreteklesznek.Vegykszre,nemknldtunk
masterablakdefinilsval,hogyutnaabbanhelyezzkela
widgetnket. A Tkinter megbocstja neknk ezt a
feledkenysgetsautomatikusanltrehozegyet!
>>> g2 = OscilloGraphe(height_=200, width_=250)
>>> g2.pack()
>>> g2.drawCurve()

Ezekkel az utastsokkal az OscilloGraphe() osztly egy


msik widgetjt hozzuk ltre. Ez alkalommal megadjuk a
mreteit(amagassgtsaszlessgt,asorrendtetszleges).
Utna a widgethez kapcsolt drawCurve() metdust
(grberajzols) aktivljuk. A megjelen sinusgrbe az
alaprtelmezett A, f s paramtereknek felel meg, mivel
semmilyenargumentumotsemadunkmeg.

>>> g3 = OscilloGraphe(width_=220)
>>> g3.configure(bg='white', bd=3, relief=SUNKEN)
>>> g3.pack(padx=5,pady=5)
>>> g3.drawCurve(phase=1.57, colo='purple')
>>> g3.drawCurve(phase=3.14, colo='dark green')

Aharmadikwidgetkonfigurcijnakmegrtshezvissza
kell arra emlkeznnk, hogy az OscilloGraphe() osztlyt a
Canvas() osztlyblleszrmaztatssalhoztukltre.Ezrtazelbbirkliazutbbimindentulajdonsgt.Ez
lehetv teszi, hogy ugyanazokat az argumentumokat hasznlva, mint amik egy vszon konfigurlsa sorn
llnakrendelkezsnkremivlasszukmegahtteret,akeretet,stb.
EzutnafzissasznargumentumokatmegadvaktgrbtjelentnkmegadrawCurve()(grberajzols)
metdus ktszeri hvsval. Termszetesen meg kell hvnunk a Tkinter mainloop() metdust is, hogy
megjelenjenekawidgetjeink.

Gyakorlat:
13.7. Hozzonltreegy400x300mret,srgahtternegyedikwidgetetsrajzoljonkitbb,klnbz
frekvencijsamplitdjgrbt.

185. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
ElemezzkazOscilloGraphe()osztlyszerkezett!Azosztlytazoscillo.pymodulbamentettk(lsda184.
oldalt).

a) Feladatmeghatrozs:

Egy olyan j widgetosztlyt akarunk definilni, ami kpes a klnbz harmnikus rezgmozgsoknak
megfelelkitrsidgrafikonokautomatikusmegjelentsre.
Awidgetnekltrehozsakormretezhetnekkelllenni.KtnylhegybenvgzdX,YDescarteskoordinta
tengelytkellmegjelentsen.AzXtengelyreprezentlja1seconbellazidmlsts8rszrelegyenosztva.

Egy drawCurve() (grberajzols) metduslegyena widgethezkapcsolva.Ezaharmnikusrezgmozgs


kitrsidgrafikonjtrajzoljaki.Miadjukmegafrekvencit(0.25s10Hzkztt),afzist(0et2 radin
kztt)sazamplitdt(1s10nknyessklaosztskztt).

b) Implementci:

4.sor:AzOscilloGraphe()osztlytaCanvas()osztlyblleszrmaztatssalhozzukltre.
Az utbbi osztly minden tulajdonsgt rkli: az j osztly objektumait a Canvas() osztly mr
rendelkezsrellopciinakfelhasznlsvalkonfigurlhatjuk.
6.sor: A constructor metdus 3 paramtert hasznl. Ezek azrt opcionlisak, mert mindegyikknek van
alaprtelmezettrtke.Abossparamtercsakegyesetlegesmasterablakhivatkozsnakafogadsraszolgl
(lsdakvetkezpldkat).Awidth_sheight_(szlessgsmagassg)paramterekarraszolglnak,hogy
azobjektumltrehozsnakpillanatbanaszlvszonwidthsheightopciihozrendeljnkrtkeket.
9.s10.sor:Azelsmvelet,amitegyleszrmaztatottosztlyconstructornakvgrekellhajtani:aktivlnia
kell a szlosztlya constructort. Csak akkor rklhet a szlosztly minden viselkedse, ha valban
implementltukezeketaviselkedseket.
Teht a 9. sorban aktivljuk a Canvas() osztly constructort s a 10. sorban az opcii kzl kettt
belltunk.Vegykszre,hogyeztaktsortsszesrthetnnkegyetlensorba:
Canvas.__init__(self,width=width_,height=height_)

Emlkeztet: a 170. oldalon elmagyarztam, az aktulis objektum hivatkozst (self) els


argumentumkntkellmegadnunkaszlosztlyconstructornak.
11.sor:A width_ s height_ (szlessgsmagassg)paramtereketobjektumvltozkbankelltrolnunk,
merthozzjukkelltudnunkfrniadrawCurve()(grberajzols)metdusban.

13.s14.sor:AzXsYtengelykirajzolshozawidth_sheight_(szlessgsmagassg)paramtereket
hasznljuk,gyezeketagrbketautomatikusanmretezzk. Az arrow=LAST opcimindenvonalvgn
nylhegyetjelentmeg.
16.19.sorok:Avzszintessklamegrajzolstarendelkezsrellhossz25pixellelvalcskkentsvel
kezdjk gy, hogy a skla kt vgn helyet hagyunk. Utna 8 intervallumra osztjuk fel, amiket 8 kis
fgglegesszakaszreprezentl.

21.sor:AdrawCurve()(grberajzols)metdustngyargumentummallehethvni.
Ezekmindegyiktelhagyhatjuk,mertmindegyiknekvanalaprtelmezettrtke.Arraislehetsgvan,hogy
az argumentumokat tetszleges sorrendben adjuk meg, ahogyan azt a 79. oldalon mr
magyarztam.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 186.
23.31.sorok:Agrbemegrajzolshoza t vltozegymsutnveszfelmindenrtket0tl1000igs
mindenalkalommalkiszmoljukamegfelel e kitrsrtketazelmletisszefggssegtsgvel(26.sor).
Azgymegtallt t s e rtkprokatsklzzuksa27.28.sorokbanx,ykoordintkkalaktjuk,majda
curve(grbe)listbansszegyjtjkket.

30.31.sorok:acreate_line()metdusegyetlenmveletbenmegrajzoljaamegfelelgrbtsvisszatrsi
rtkkntavszonongyltrehozottobjektumsorszmtadjameg(ezasorszmfogjalehetvtenni,hogy
utnaagrbhezhozzfrjnk:pldulazrt,hogytrljk).Asmooth=1opcisimtssaljavtjaavgs
grbealakot.

Gyakorlarok:
13.8. Mdostsa gy a scriptet, hogy afggleges referenciatengelyen is legyen azorig kt oldaln5
osztsosskla.

13.9. gy,mintaCanvas()osztlywidgetjei,amiblazolvaswidgetjeszrmazikazolvaswidgetje
is bepthet szveges jelzseket. Ehhez a create_text() metdust kell hasznlni. Ez a metdus
legkevesebb3argumentumotvr:annakahelynekazxsykoordintit,aholaszvegnketmeg
akarjukjelentenistermszetesenmagtaszveget.Msargumentumokatopcikformjbanlehet
megadni,pldulafontsakaraktermretdefinilshoz.Hogylssukamkdst,adjukideiglenesen
akvetkezsortazOscilloGraphe()osztlyconstructorhoz,majdindtsukjraascriptet:
self.create_text(130,30,text="Proba",anchor=CENTER)

Hasznljuk arra ezt a metdust, hogy a widgetben a referenciatengelyek vghez a kvetkez


jelzseketkapcsoljuk: e t(kitrs)afgglegestengelyhez,s t t(id)avzszintestengelyhez.Az
eredmnyabaloldalibrrahasonlthat:

13.10. Vz olvas befejezheti a widget jt egy referenciarcs megjelentsvel, amit a tengelyek mentn
elhelyezettszakaszokhelyettrajzoltathatki.Arcsvonalaitszrkresznezheti(fill ='grey'opci),
hogynelegyenekannyirafeltnek,gymintajobboldalibrn.

13.11. Egsztsekiawidgetjtsklaszmozssal.

187. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
13.4 Kurzorok:egykompozitwidget
Az elz gyakorlatban egy j widgettpust hoztunk ltre, amit az oscillo.py modulba mentettnk el.
Gondosanrizzkmegamodult,merthamarosanbeptjkegysszetettebbprojektbe.
Mostegymsik,interaktvabbwidgetetkonstrulunk.Egyvezrlpanelrlvansz,amihromcsszkts
egy checkboxot tartalmaz. Mint az elz widgetet, ezt is egy ksbbi sszetett alkalmazsban akarjuk jra
felhasznlni.

13.4.1 AScalewidgetbemutatsa
Kezdjk elszr egy eddig mg nem hasznlt alap widget
felfedezsvel.
AScalewidgetegysklaelttcsszcursorkntjelenikmeg.A
felhasznl gyorsan kivlaszthat vele egy tetszleges
paramterrtket.
Azalbbikisscriptmegmutatja,hogyhogyanparamterezzkshasznljukegyablakban:
from Tkinter import *

def updateLabel(x):
lab.configure(text='Aktulis rtk = ' + str(x))

root = Tk()
Scale(root, length=250, orient=HORIZONTAL, label ='Bellts :',
troughcolor ='dark grey', sliderlength =20,
showvalue =0, from_=-25, to=125, tickinterval =25,
command=updateLabel).pack()
lab = Label(root)
lab.pack()

root.mainloop()

Asorokatnemkell magyarzni.Tetszlegesmret (length opci),fekv(mintpldnkban)vagyll(


orient=VERTICALopci)Scalewidgeteketltrehozhatunk.
A from_ (figyelem: ne felejtsk el a '_' karaktert !) s to opcik definiljk a szablyozsi tartomnyt. A
sklartkekkzttiintervallumotatickintervalopcibandefiniljuk,stb.

Acursorelmozdulsakormindenalkalommalautomatikusansorkerlacommandopcibanmeghatrozott
fggvnyhvsra,sacursorsklhozviszonytottaktulispozcijaleszargumentumknttadva.Ezazrtk
brmilyenmveletheznagyonegyszerenfelhasznlhat.NzzkmegapldabeliupdateLabel()fggvnyx
paramtert.
A Scale widget egy nagyon intuitv s vonz interface, ami klnbz belltsokat knl aprogramunk
felhasznlinak.Tbbpldnybanfogjukbepteniegyjwidgetosztlyba:egyvezrlpanelbe,amivelegy
rezgmozgsfrekvencijt,fzistsamplitdjtlltjukbe,majdazelzoldalakonksztett oscilloGraphe
widgetsegtsgvelkifogunkratniarezgmozgskitrsidgrafikonjt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 188.
13.4.2 Hromcursorosvezrlpanelksztse
Azelzscripthezhasonlanakvetkezscriptetisegymodulbamentjk(acurseurs.pymodulba).Azgy
elmentettosztlyokategykomplexalkalmazsbanfogjuk(importlssal)jrafelhasznlni,amitaksbbiekben
rokle52. Felhvomafigyelmetarra,hogyazalbbikdtbbflemdonrvidthet.(Erremgvisszafogunk
trni.)Nincsoptimalizlva,mivelehhezegykiegsztfogalomra(a lambda kifejezsekre)lenneszksgnk,
amitmostinkbbmellzk.
Azt mr tudjuk, hogy a script vgre rt kdsorok a script mkdsnek tesztelst teszik lehetv. Az
albbirahasonltablakotkellenekapnunk:

1. from Tkinter import *


2. from math import pi
3.
4. class ChoiceVibra(Frame):
5. """Cursor-ok egy rezgs frekvencijnak, fzisnak s amplitdjnak kiv.hoz"""
6. def __init__(self, boss =None, colo ='red'):
7. Frame.__init__(self) # a szlosztly constructora
8. # Nhny pldny-attribtum inicializlsa :
9. self.freq, self.phase, self.ampl, self.colo = 0, 0, 0, colo
10. # A checkbox llapotvltozja :
11. self.chk = IntVar() # Tkinter 'objektum-vltoz'
12. Checkbutton(self, text='Rajzol', variable=self.chk,
13. fg = self.colo, command = self.setCurve).pack(side=LEFT)
14. # A 3 cursor-widget defincija :
15. Scale(self, length=150, orient=HORIZONTAL, sliderlength =25,
16. label ='Frekvencia (Hz) :', from_=1., to=9., tickinterval =2,
17. resolution =0.25,
18. showvalue =0, command = self.setFrequency).pack(side=LEFT)
19. Scale(self, length=150, orient=HORIZONTAL, sliderlength =15,
20. label ='Fzis (fok) :', from_=-180, to=180, tickinterval =90,
21. showvalue =0, command = self.setPhase).pack(side=LEFT)
22. Scale(self, length=150, orient=HORIZONTAL, sliderlength =25,
23. label ='Amplitd :', from_=1, to=9, tickinterval =2,
24. showvalue =0, command = self.setAmplitude).pack(side=LEFT)
25.
26. def setCurve(self):
27. self.event_generate('<Control-Z>')
28.
29. def setFrequency(self, f):
30. self.freq = float(f)
31. self.event_generate('<Control-Z>')
32.
33. def setPhase(self, p):
34. pp =float(p)
35. self.phase = pp*2*pi/360 # fok -> radin talakts
36. self.event_generate('<Control-Z>')
37.
38. def setAmplitude(self, a):
39. self.ampl = float(a)
40. self.event_generate('<Control-Z>')
41.

52 Nyilvnvalantbbosztlytismenthetnnkugyanabbaamodulba.

189. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
42. #### Kd az osztly tesztelshez : ###
43.
44. if __name__ == '__main__':
45. def showAll(event=None):
46. lab.configure(text = '%s - %s - %s - %s' %
47. (fra.chk.get(), fra.freq, fra.phase, fra.ampl))
48. root = Tk()
49. fra = ChoiceVibra(root,'navy')
50. fra.pack(side =TOP)
51. lab = Label(root, text ='test')
52. lab.pack()
53. root.bind('<Control-Z>', showAll)
54. root.mainloop()

Ezenavezrlpanelenafelhasznlknnyenbetudjalltaniamegadottparamterek(frekvencia,fzis,
amplitd)rtkeit,amikmajdazelzekbenkonstrult OscilloGraphe() classegywidgetjbenakitrsid
grafikonkirajzolsnakvezrlsreszolglhatnak.Eztmajdazsszetettalkalmazsbanbefogommutatni.

Magyarzatok:
6.sor:Aconstructormetdusacoloopcionlisparamterthasznlja.Ezaparamterlehetvfogjatenni,
hogyawidgetkontroljaalattlvgrafikonnakszntvlasszunk.A boss paramterszolglegyesetleges
masterablak(lsdksbb)referencijnakafogadsra.
7.sor:Aszlosztlyconstructornakaktivlsa(azrt,hogyagyermekosztlyrkljeaviselkedst).
9.sor: Nhny pldnyvltoz deklarlsa. A valdi rtkeiket a 2940.sorok metdusai (az
esemnykezelk)fogjkmeghatrozni.
11.sor: Az utasts ltrehoza az IntVar() osztly egy objektumt. Ez az osztly a Tkinter modul rsze
ugyangy, mint a hasonl DoubleVar(), StringVar() s BooleanVar() osztlyok. Ezek teszik lehetv
Tkintervltozkdefinilst,amikvaljbanobjektumok,devltozkkntviselkednekaTkinterwidgetek
belsejben.
gya self.chkbanhivatkozottobjektumegyegsztpusvltozekvivalensttartalmazzaa Tkinter ltal
hasznlhat formban. Hogy a Pythonbl hozzfrjnk az rtkhez, ennek az objekum osztlynak a
specifikusmetdusaitkellhasznlnunk:a set() metdussalrendelhetnkhozzrtket,a get() metdussal
kiolvashatjukkiazrtket(amita47.sorbantesznk).
12.sor: A checkbutton objektum variable opcija az elz sorban definilt Tkinter vltozhoz van
asszocilva.(EgyTkinterwidgetdefincijbannemtudunkkzvetlenlhivatkozniegykznsgesvltozra,
mivelmagaaTkinterolyannyelvenvanmegrva,aminemugyanazokatakonvencikathasznljaavltozi
formzsra,mintaPython.ATkintervltozosztlyokblkonstrultobjektumokazinterfacebiztostshoz
szksgesek.)
13.sor:Acommandopciaztametdustadjameg,amitakkorkellarendszernekhvni,amikorfelhasznl
azegrrelacheckboxbakattint.
1424.sor:Ezekasorokhromhasonlutastsbandefiniljkahromcursorwidgetet.Elegnsabblenne
ezeket egy programhurokban hromszor megismtelt utastssal programozni. Ehhez azonban a lambda
kifejezsek fogalomra volna szksg, amit mg nem magyarztam el. A widgetekkel asszocilt
esemnykezelk defincija is sszetettebb vlna. Hagyjuk meg ez alkalommal a kln utastsokat, a
ksbbiekbentrekednifogokennekaprogramrsznekatkletestsre.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 190.
26.40.sorok:Azelzsorokbandefinilt4widgetmindegyiknekvanegycommandopcija.Mindegyik
esetben eltr a command opciban hvott metdus: a checkbox a setCurve(), az els cursor a
setFrequency(),amsodikcursorasetPhase(),aharmadikcursorasetAmplitude()metdustaktivlja.Jl
jegyezzkmeg,hogyaScalewidgetekcommandopcijaazasszociltmetdusnaktadegyargumentumot
(az aktulis cursorpozcit), mg ugyanez a command opci semmit sem ad t a Checkbutton widget
esetben.

Mind a ngy metdus (amik a checkbox s a hrom cursor ltal elidzett esemnyek handlerei) az
event_generate()metdushvsvalegyjesemny53megjelenstidziel.
EnnekametdusnakahvsakoraPythonazopercisrendszernekpontosanugyanaztazzenetesemnyt
kldi, mint ami akkor keletkezne, ha a felhasznl egyszerre nyomn meg a <Ctrl>, <Shift> s <Z>
billentyket.
Teht egy specilis zenetesemnyt hozunk ltre, amit egy msik widgethez kapcsolt esemnykezelvel
tudunkdetektlniskezelni(lsdakvetkezoldalt).gy valdikommunikcisrendszerthozunkltrea
widgetek kztt: minden alkalommal, amikor a felhasznl a vezrl panelen vgrehajt egy akcit, egy
specifikusesemnytgenerl,amifigyelmeztetmswidgeteketerreazakcira.

Megjegyzs: ms billentykombincit is vlaszthattunk volna (vagy ppen egy ms esemnytpust). A


vlasztsunk azrt esett erre, mert kevs az eslye annak, hogy a felhasznl ezt a billentykombincit
hasznlja,mialattaprogramunkatvizsglja.Viszontmimagunkmajdltretudunkhozniilyentesztesemnyta
klaviatrn,amikoreljnazidejeazesemnykezelellenrzsnek,amitegyblntmegfogunktenni.

4254sorok:Mintazoscillo.pyt,eztazjmodultiskiegsztjkafprogramszintjnnhnykdsorral.
Ezekasoroktesziklehetvazosztlymkdsnektesztelst. Csakakkorhajtdnakvgre,haamodult
mintnllalkalmazstindtjukel.Alkalmazzaazolvasiseztatechniktasajtprogramjaiban,mertezegy
jprogramozsigyakorlat.Azgymegalkotottmodulokalkalmazja(amodulokvgrehajtsarvn)nagyon
knnyen(jra)felfedezhetiazokfunkciits(ennekanhny kdsornakazelemezsvel)ahasznlatuk
mdjt.

Ezekben a tesztsorokban egy root fablakot hozunk ltre, ami kt widgetet tartalmaz: a ChoiceVibra()
(rezgsvlaszts)saLabel()osztlyegyegywidgetjt.

Az53.sorbanafablakhozegyesemnykezeltkapcsolunk:ettlkezdvemindenspecifiklttpusesemny
az showAll() (mindentkir)fggvnythvstidziel.Ezafggvnyaspecilisesemnykezelnk,ami
mindenesetben,amikorazopercisrendszeregy<ShiftCtrlZ>tpusesemnytdetektlvgrahajtdik.

Ahogyan fntebb mr elmagyarztam, gy intztk, hogy az ilyen esemnyeket a ChoiceVibra()


(rezgsvlaszts) osztly objektumai hozzk ltre, amikor a felhasznl mdostja a hrom cursor
valamelyiknekvagyacheckboxnakazllapott.

53 Valjbanezt inkbbegyzenetnekkellenehvnunk(ami magaegyesemnynekajelzse).Szveskedjenjra


olvasnietrgykrbenazEsemnyvezreltprogramokcmfejezetmagyarzatta86.oldalon.

191. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
AzshowAll()(mindentkir)fggvnymivelcsaktesztelsretalltamkisemmimstnemcsinl,csaka
Label()osztlyegywidgetjnektextopcijt(jra)konfigurlva,angywidgetnkkelsszekapcsoltvltozk
rtkeitratjaki.

47.sor: az fra.chk.get() kifejezs: fntebb lttuk, hogy a checkbox llapott trol vltoz egy Tkinter
objektumvltoz.APythonnemtudjakzvetlenlolvasniazilyenvltoztartalmt,amiavalsgbanegy
interfaceobjektum.Ahhoz,hogyazrtketmegkapjuk,azosztlyegyspecilismetdustkellhasznlnunk:
aget()metdust.

Azesemnyekterjedse
Afntlertkommunikcismechanizmustiszteletbentartjaawidgetosztlyokhierarchijt.Jegyezzkmeg,
hogyazesemnytkivltmetdusa selffelahhoza widget hezvanktve,aminekazosztlytppenmost
definiljuk.ltalbanegyzenetesemnyegybizonyoswidgethezvanktve(pldulegygombrakattintsa
gombhoz van ktve), ami azt jelenti, hogy az opercis rendszer elszr megvizsglja, hogy vane
esemnykezelerreazesemnytpusra,amiszintnehhezawidgethezvankapcsolva.Havanilyen,akkorezaz,
amiaktivlvavansazzenetterjedselell.Hanincs,akkorazzenetesemnyhierarchikusrendbenegyms
utnjelenik mega master widget eknek mindaddig, mg egy esemnykezelt nemtall, vagy elnem ria
fablakot.
Abillentylenyomsoknakmegfelelesemnyek(amilyen apldban alkalmazott<ShiftCtrlZ>)viszont
mindigkzvetlenlazalkalmazsfablakhozvannakkldve.Pldnkbanennekazesemnynekahandlerta
rootablakhozkellkapcsolnia.

Gyakorlatok:
13.12. AznwidgeteaFrame()osztlytulajdonsgaitrkli.Tehtennekazosztlynakazalaprtelmezett
opciit a configure() metdussal mdostva megvltoztathatjuk a widget kinzett. Prbljon meg
pldulgytenni,hogyavezrlpaneltegy4pixelszlesmlyedsvegyekrl(bd=4,relief=
GROOVE).Hanemrti,hogymitkelltenni,mertsentletetazoscillo.pyscriptbl(10.sor).

13.13. HaaScale()widgetekshowvalueopcijnakaz1rtketadjuk,akkorllandankileszrvaacursor
sklhozviszonytottpontospozcija.Aktivljukeztafunkcitafzisparamtertvezrlcursor
szmra.

13.14. A Scale() widgetek troughcolor opcija lehetv teszi, hogy sznt definiljunk a csszkinknak.
Hasznljukeztazopcitgy,hogya3cursorszneazjwidgetltrehozsakorparamterknthasznlt
sznlegyen.

13.15. Mdostsaascriptetgy,hogyacursorwidgetektvolabblegyenekegymstl(a pack() metdus


padxspadyopcii).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 192.
13.5 Akompozitwidgetekbeptseegysszetettalkalmazsba
Az elz gyakorlatokban kt j widgetosztlyt hoztunk ltre: a sinusgrbk kirajzolsra specializlt
vsznat:azOscilloGraphe() widgetet;sarezgsparamtereinekkivlasztstlehetvtevhromcursoros
vezrlpanelt:aChoiceVibra()(rezgsvlaszts)widgetet.

Awidgetekazoscillo.pyscurseurs.py54modulokbanrendelkezsnkrellnak.

Egyfizikarnbemutathatsszetettalkalmazsbanfogjukketfelhasznlni:egyOscilloGraphe()widget
egy,kt,vagyhromklnbzszngrafikontrajzolkiegymsra,melyekmindegyiktegy ChoiceVibra()
(rezgsvlaszts)widgetvezrel:

Ascriptakvetkezoldalontallhat.
Figyelje meg a rajzok frisstsre hasznlt technikt ! Amikor a felhasznl a vezrl panelek egyikn
valamilyenakcithajtvgreegykzvettesemnykeletkezik.Ezidzielavsznonlvrajzfrisstst.
Emlkezznkr,hogyagrafikusinterfaceszelmkdalkalmazsokatesemnyvezreltprogramokknt
kellfejleszteni(lsd85.oldalt).

54 Magtlrtetdik,hogyazsszesltalunkkonstrultosztlytegyetlenmodulbanegyesthetnnk.

193. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Apldaelksztsekornknyesendntttemgy,hogyagrafikonkirstegyspecilisesemnyindtsael.
Ez tkletesen hasonlt azokra az esemnyekre, amiket az opercis rendszer akkor hoz ltre, amikor a
felhasznlvalamilyenakcithajtvgre.Alehetsgesesemnyek(igenszles)skljrlegyolyatvlasztottam,
a <ShiftCtrlZ> billenty kombinci lenyomst amit nem valszn, hogy a felhasznl a program
mkdsealattmsokblhasznlnifog.
A ChoiceVibra() (rezgsvlaszts) widgetosztlyba beptettem azokat az utastsokat, amik biztostjk,
hogyamikorafelhasznlmegmozdtjaazegyikcursortvagy megvltoztatja acheckboxllapottilyen
esemnyek jjjenek ltre. Definilni fogomaz esemnyheztartoz handlert s beptem azj osztlyunkba.
showCurves()(megmutatjaagrbt)leszanevesagrafikonfrisstseleszafeladata.Mivelazesemnytpusa
billentylenyoms,ezrtaztazalkalmazsfablaknakszintjnkelldetektlni.

1. from oscillo import *


2. from curseurs import *
3.
4. class ShowVibra(Frame):
5. """Harmnikus rezg mozgsok bemutatsa"""
6. def __init__(self, boss =None):
7. Frame.__init__(self) # a szl osztly constructora
8. self.colour = ['dark green', 'red', 'purple']
9. self.trace = [0]*3 # kirajzoland grbk listja
10. self.control = [0]*3 # kontrolpanelek listja
11.
12. # vszonpldny ltrehozsa az x s y koordinta-tengelyekkel :
13. self.gra = OscilloGraphe(self, width_ =400, height_=200)
14. self.gra.configure(bg ='white', bd=2, relief=SOLID)
15. self.gra.pack(side =TOP, pady=5)
16.
17. # 3 vezrl panel (cursorok) ltrehozsa :
18. for i in range(3):
19. self.control[i] = ChoiceVibra(self, self.colour[i])
20. self.control[i].pack()
21.
22. # Az brk kirajzolst indt esemnyek definilsa :
23. self.master.bind('<Control-Z>', self.showCurves)
24. self.master.title('Harmnikus rezg mozgsok')
25. self.pack()
26.
27. def showCurves(self, event):
28. """A hrom kitrs-id grafikon (jra)kirajzolsa """
29. for i in range(3):
30.
31. # El szr trljk az (esetleges) el z brt :
32. self.gra.delete(self.trace[i])
33.
34. # Aztn kirajzoljuk az j brt :
35. if self.control[i].chk.get():
36. self.trace[i] = self.gra.drawCurve(
37. colo = self.colour[i],
38. freq = self.control[i].freq,
39. phase = self.control[i].phase,
40. ampl = self.control[i].ampl)
41.
42. #### Kd az osztly tesztelshez : ###
43.
44. if __name__ == '__main__':
45. ShowVibra().mainloop()
46.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 194.
Magyarzatok:
1.2.sorok:KihagyhatjukaTkintermodulimportjt,mertaktmodulmindegyikegondoskodikrla.
4.sor:Mrismerjkajtechnikkat,ezrtgydntttem,hogyazalkalmazstegy Frame() osztlybl
leszrmaztatott osztlyknt konstrulom meg. gy a ksbbiekben teljes egszben bepthetjk ms
projektekbe,hagydntnk.
8.10.sorok:Nhnypldnyvltoz(3lista)defincija.Ahromkirajzoltgrbegrafikusobjektum.A
sznketa self.colour listbandefinilom.Ksztennkkellegy self.trace listtisarajzokhivatkozsainak
trolsrasegyself.controllisttahromvezrlpanelhivatkozsainaktrolsra.

13.15.sorok: A rajzol widget ltrehozsa. Mivel az OscilloGraphe() osztlyt a Canvas() osztlybl


szrmaztattamle,ezrta Canvas() osztlyspecifikusopciinakjradefinilsvalmindiglehetsgvana
rajzolwidgetkonfigurlsra(13.sor).
18.20.sorok:Ahromvezrlpaneltegyprogramhurokbanhozomltre.Ahivatkozsaikata10.sorbana
self.control listbantrolom.Avezrlpaneleketazaktuliswidgetslavewidgetjeiknthozomltrea self
paramtersegtsgvel.Amsodikparamteravezrlendrajzszntadjameg.
23.24.sorok: Ltrehozsa pillanatban mindegyik Tkinter widget automatikusan kap egy master
attribtumot,amiazalkalmazsfablaknakhivatkozsttartalmazza.Ezahivatkozsklnsenhasznos,ha
afablakotaTkinterimplicitmdonhoztaltre,mintebbenazesetben.
Emlkezznkr,amikorgyindtunkelegyalkalmazst,hogykzvetlenlegyolyanwidgetethozunkltre,
mintpldulaFrame(ezttettka4.sorban),akkoraTkinterautomatikusanltrehozennekawidgetnekegy
masterablakot(aTk()osztlyegyobjektumt).
Mivel ez az objektum automatikusan lett ltrehozva, ezrt a kdunkban a hozzfrshez semmilyen
hivatkozs sincs, erre csak a master attribtum rvn van mdunk, amit a Tkinter automatikusan trst
mindenwidgettel.
Ezt a hivatkozst a fablak cmsornak jradefinilsra hasznljuk (a 24. sorban) s arra, hogy egy
esemnykezeltktnkhozz(a32.sorban).
27.40.sorok: Ez a metdus a <ShiftCtrlZ> esemnyeket kezeli, amiket mindig akkor generlnak a
ChoiceVibra()(rezgsvlaszts)widgetjeink(vagyvezrlpaneljeink),amikorafelhasznlacursorral
vagyacheckboxszalcsinlvalamit.Elszrmindigtrliazesetlegjelenlvrajzokat(32.sor)a delete()
metdussegtsgvel.Az OscilloGraphe() widgetszlosztlytla Canvas() osztlytlrklteezta
metdust.
Utnamindenolyanvezrlpanelesetn,melynekazRajzolcheckboxtbejelltk,kirajzoljaazjgrbt.
Avsznon gy kirajzolt objektumok mindegyiknek van egy hivatkozsi szma, amiaz OscilloGraphe()
widgetnkdrawCurve()(grbtrajzol)metdusnakavisszatrsirtke.
Arajzainkhivatkozsiszmaitaself.tracelistbantroljuk.
Ezektesziklehetvarajzokegyeditrlst(vesdsszea32.sorutastsval).
36.40.sorok:AdrawCurve()(grbtrajzol)metdusnaktadottfrekvencia,fzissamplitdrtkekaz
egyes vezrl panelek objektumattribtumai, amiket a self.control listban trolunk. Ezekhez az
attribtumokhozapontopertorraltrtnminstettnvmegadssegtsgvelfrhetnkhozz.

195. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:
13.16. Mdostsagyascriptet,hogyazalbbikinzetetkapja(akpernynlegyenreferenciarcs,avezrl
panelmlyedssellegyenkrlvve):

13.17. Mdostsagyascriptet,hogyazhromhelyettngygrafikusvezrltjelentsenmeg.Anegyedikrajz
sznelegyenpldul:'blue','navy','maroon',..

13.18. A 38.40.sorokban a felhasznl ltal a kontrolpaneleken belltott frekvencia, fzis s amplitd


rtkeket kzvetlenl a megfelel pldnyattribtumokbl nyerjk ki. A Python megengedi ezt a
praktikus megoldst, azonban ez egy veszlyes technika. Megsrti ugyanis az objektum orientlt
programozsltalnoselmletnekegyikajnlst: azobjektumoktulajdonsgaitmindigspecilis
metdusokkalkellkezelni.Azajnlsbetartsardekbenadjunka ChoiceVibra() (rezgsvlaszts)
osztlyhozegy values() neknevezett kiegsztmetdust, amivisszatrsirtkkntegytupleban
fogjamegadniavlasztottfrekvencia,fzissamplitdrtkeket. Ascriptnk38.40.soraitteht
valamiolyasmivelkellhelyettesteni,mintakvetkezsor:
freq,phase,ampl=self.control[i].valeurs()

13.19. rjonegyalkalmazst,amimegjelentegyablakotegyvszonnalsegycursorwidgettel(Scale).A
vszonrarajzoljonegykrt,aminekamrettafelhasznlacursorsegtsgveltudjavltoztatni.

13.20. rjonegyscriptet,amiktosztlythozltre:egyFrame()blleszrmaztatott"Application"osztlyt,
aminekaconstructoraegy400x400pixelesvsznatfogltrehozni,valamintktgombot.Avsznona
ksbbiekbenlert"Visage"("Arc")osztlyegyobjektumtfogjukltrehozni
A "Visage" ("Arc") osztllyal egyszerstett emberi arcot reprezentl grafikai objektumokat

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 196.
definilunk. Ezek egy nagy krbl llnak, amiben hrom kisebb, a kt szemet s a nyitott szjat
reprezentlellipszisvan.A"bezar"metdusaszjellipszistegyvzszintesszakasszalhelyettesti.A
"kinyit"metduslltjavisszaaszjellipszist.
Az "Application" osztlyban definilt kt gomb fogja avszonratett Visage (Arc) objektumszjt
nyitniszrnini..
(A90.oldalpldjblmerthettletetakdegyrsznekmegrshoz).

13.21. sszegzgyakorlat:sznsztrksztse.

Cl: egy olyan script ksztse, amivel egyszeren sgyorsan hozhatunk ltre egy j sznsztrat,
mellyelbrmelyiksznhezamagyarnevvelfrhetnkhozz.

Krnyezet: A klnbz Tkinterrel sznezett objektumok kezelsekor megllaptottuk, hogy ez a


grafikus knyvtr elfogadja, hogy a legalapvetbb szneket az angol nevket tartalmaz stringek
formjbanadjukmegneki:'red','blue',stb.

Azt is tudjuk, hogy a szmtgp csak numerikus informcikat tud kezelni. Ez azzal jr, hogy
brmelyikszntelbbvagyutbbszmformjbankellkdolni.Erreakdolsratermszetesenelkell
fogadniegykonvencit,amirendszerrlrendszerrevltozhat.Azegyikleggyakoribbkonvenciszerint
a sznt hrom bytetal reprezentljuk, amik a vrs (Red), a zld (Green) s a kk (Blue)
komponensnekintenzitstadjkmeg.

EzakonvencibrmelysznrnyalatellltsraalkalmazhataTkinterrel.Brmilyengrafikuselem
szntmegadhatjukegyolyan7karakterblllstringgel,mintakvetkez:''#00FA4E''.A#karakter
azt jelenti, hogy egy hexadecimlis rtk kvetkezik. A kvetkez hat karakter az R, G, B
sznkomponensek3hexadecimlisrtktreprezentljk.
Egysznsakdjakzttimegfeleltetslthatvttelhezkilehetprblnia tkColorChooser.py
programot(ezltalbanaPython/libtkalknyvtrbantallhatmeg).

Mivelnehzmegjegyezniahexadecimliskdokat,ezrtaTkinternekvanegykonverzissztra,ami
lehetvteszi,hogyaleggyakoribbsznekkzlnhnynakazangolnevthasznljuk.

A cl egy olyan program ksztse, ami meg fogja knnyteni egy ekvivalens magyar sztr
kivitelezst,amitmajdbepthetaprogramjaiba.Amikorelkszlt,asztrakvetkezformjlesz:
{'zld':'#00FF00','kk':'#0000FF',...stb...}.

Feladatmeghatrozs:

Egyosztlyraplgrafikusalkalmazstkellmegvalstani.

Ezegyablakbl,adatbevitelimezkblsgombokblfogllni,hogyafelhasznlknnyenkdolhassa
azjszneket:azegyikmezbenasznmagyarnevt,amsikmezbenahexadecimliskdjtkell
megadni.
Amikorasztrbanmrvannakadatok,akkortesztelhetnekkelllennie,vagyisbekelltudnirniaszn
magyarnevtsegygombsegtsgvelmegkelltudnitallniamegfelelhexadecimliskdot(esetleg
egysznescskotrathatki).
Egygombballehessenszvegfilebamenteniasztrat.Egymsikgombballehessenrekonstrulnia
sztrategyszvegfilebl.

197. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
13.22. Az albbi script a kpernyre klnbz mdon elhelyezett jtkkocka csoportokat rajzol projekt
vzlata(ezavzlatazelsfzisaalehetegyjtkprogrammegvalstsnak).
A gyakorlat a script elemzsbl s kiegsztsbl ll. Bele kell kpzelnie magt annak a
programoznak a helybe, akinek folytatnia kell egy msik programoz munkjt, vagy egy olyan
informatikushelyzetbe,akitfelkrtek,hogyvegyenrsztegycsapatmunkjban.

A)Kezdjeascriptelemzsvelsrjonhozzkommenteket,flega#***galjelltsorokhoz,hogy
megmutassa,megrtettemitkellaprogramnaktenniajelzetthelyeken:
from Tkinter import *

class FaceDom:
def __init__(self, can, val, pos, size =70):
self.can =can
# ***
x, y, c = pos[0], pos[1], size/2
can.create_rectangle(x -c, y-c, x+c, y+c, fill ='ivory', width =2)
d = size/3
# ***
self.pList =[]
# ***
pDispo = [((0,0),), ((-d,d),(d,-d)), ((-d,-d), (0,0), (d,d))]
disp = pDispo[val -1]
# ***
for p in disp:
self.circle(x +p[0], y +p[1], 5, 'red')

def circle(self, x, y, r, colo):


# ***
self.pList.append(self.can.create_oval(x-r,y-r,x+r,y+r, fill=colo))

def erase(self):
# ***
for p in self.pList:
self.can.delete(p)

class Project(Frame):
def __init__(self, width_, height_):
Frame.__init__(self)
self.width_, self.height_ = width_, height_
self.can = Canvas(self, bg='dark green',width=width_,height=height_)
self.can.pack(padx =5, pady =5)
# ***
bList = [("A", self.buttonA), ("B", self.buttonB),
("C", self.buttonC), ("D", self.buttonD),
("Quit", self.buttonQuit)]
for b in bList:
Button(self, text =b[0], command =b[1]).pack(side =LEFT)
self.pack()

def buttonA(self):
self.d3 = FaceDom(self.can, 3, (100,100), 50)

def buttonB(self):
self.d2 = FaceDom(self.can, 2, (200,100), 80)

def buttonC(self):
self.d1 = FaceDom(self.can, 1, (350,100), 110)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 198.
def buttonD(self):
# ***
self.d3.erase()

def buttonQuit(self):
self.master.destroy()

Project(500, 300).mainloop()

B)Mdostsaascriptetgy,hogymegfeleljenakvetkezfeladatmeghatrozsnak:
Legyenavszonnagyobb:600x600pixelmret.
Azutastsgombokatjobboldalrakellthelyeznisnagyobbtvolsgotkellhagyni.
Adobkockafelsznnlvpontokmretnekafelsznnelarnyosankellvltozni.
1.vltozat:Csak2gombothagyjonmeg:azAtsaBt.AzAgombratrtnmindenegyeskattintsra
hromj(azonosmret,inkbbkicsi),egyoszlopbanelhelyezkedkockajelenjenmeg.Akockkonapontok
szmavletlenszerenessen1s6kz.Mindenjoszlopazelztljobbralegyenelhelyezve.Haa3kockna
pontok(brmilyensorrendben)4,2.1nekfelelnekmeg,akkoranyertszvegetkellkirniazablakba(vagya
vszonra).ABgombazsszeskirajzoltdobkockt(nemcsakapontokat!)trli.
2.vltozat:Csak2gombothagyjonmeg:azAtsaBt.AzAgomb5dobkocktrajzoltassonki.Akockk
gylegyenekelrendezve,mintaz5spontrtkpontjai.Avletlenszerensorsoltrtkek1s6kzesseneks
mindenrtk csak egyszer forduljon el. A Bgomb az sszes kirajzolt dobkockt (nemcsak a pontokat !)
trlje.
3.vltozat:Csak3gombothagyjonmeg:azA,BsCt.AzAgombkralakbanelrendezve13azonos
mret dobkockt rajzoltasson ki. Minden kattints a B gombon vltoztassa elszr meg az els, majd a
msodik,harmadik,stb.kockapontrtkt.Ajpontrtkekeggyelnagyobbaklegyenek,mintazelzrtk,
kivvehaazelzrtk6volt:ezesetbenazjrtk1legyen.ACgombazsszeskirajzoltdobkockt
(nemcsakapontokat!)trlje.
4.vltozat:Csak3gombothagyjonmeg:azA,BsCt.AzAgomb12azonosmretkocktrajzoltasson
kiktsorba,soronknt6ot.Azelssorbanapontrtkeksorrendje1,2,3,4,5,6legyen.MindenkattintsaB
gombonamsodiksorelskockjnakpontrtktmindaddigvletlenszerenvltoztassameg,amgazjrtk
az els sorbeli megfelel kocka pontrtktl eltr. Amikor a 2. sor 1. kockjnak pontrtke az 1. sorbeli
megfeleljnek a pontrtke lesz, akkor a 2. sor 2. kockjnak pontrtke vltozzon vletlenszeren, s gy
tovbb,egszenaddig,amgazals6kockapontrtkeimegnemegyeznekafelskockkpontrtkeivel.AC
gombazsszeskirajzoltdobkockt(nemcsakapontokat!)trlje.

199. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.Fejezet: smgnhnywidget...
Akvetkezoldalakontallhatkiegsztutalsokspldkhasznosaklehetnekazolvassajtprojekteinek
fejlesztsekor.Nyilvnnemegyteljes Tkinter referenciadokumentcirlvansz.Haazolvastbbetakar
tudni,akkorelbbvagyutbbspecilisknyveketkellmegnznie,mintamilyenpldulJohnE.Graysonkitn
knyve a: Python and Tkinter programming. A knyv teljes hivatkozsa megtallhat a 8. oldalon az
irodalomjegyzkben.

14.1 Ardigombok
A rdigomb widgetek egymst klcsnsen kizr lehetsgek felknlst teszik lehetv a
felhasznlnak. A rgi rdikszlkek svvlt gombjaival val analgia miatt kaptk nevket. Ezeket a
gombokatgyszerkesztettkmeg,hogyegyszerrecsakegyetlehetettbenyomni,azsszestbbiautomatikusan
kiugrott.
Ezeknekawidgetekneklnyegesjellemzje, hogy
mindig csoportokban hasznljuk ket. Az azonos
csoporthoz tartoz gombok ugyanahhoz a Tkinter
vltozhozvannakktve,demindegyikkhzkln
rtkvanrendelve.
Amikorafelhasznlkivlasztjaazegyikgombot,akkoragombhozrendeltrtkleszhozzrendelveakzs
Tkintervltozhoz.

1. from Tkinter import *


2.
3. class RadioDemo(Frame):
4. """Dem : a rdigomb widgetek hasznlata'"""
5. def __init__(self, boss =None):
6. """Egy adatbeviteli mez s 4 rdigomb ltrehozsa"""
7. Frame.__init__(self)
8. self.pack()
9. # Szveget tartalmaz adatbeviteli mez :
10. self.texte = Entry(self, width =30, font ="Arial 14")
11. self.texte.insert(END, "A programozs nagyszer ")
12. self.texte.pack(padx =8, pady =8)
13. # A 4 bet stlus magyar s technikai neve :
14. styleFontHu =["Norml", "Kvr", "D lt", "Kvr/D lt"]
15. styleFontTk =["normal", "bold", "italic" , "bold italic"]
16. # Az aktulis stlust egy Tkinter 'vltoz-objektumba mentjk' ;
17. self.choiceFont = StringVar()
18. self.choiceFont.set(styleFontTk[0])
19. # A 4 rdigomb ltrehozsa' :
20. for n in range(4):
21. bout = Radiobutton(self,
22. text = styleFontHu[n],
23. variable = self.choiceFont,
24. value = styleFontTk[n],
25. command = self.changeFont)
26. bout.pack(side =LEFT, padx =5)
27.
28. def changeFont(self):
29. """Az aktulis bet stlus helyettestse"""
30. font_ = "Arial 15 " + self.choiceFont.get()
31. self.texte.configure(font =font_)
32.
33. if __name__ == '__main__':
34. RadioDemo().mainloop()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 200.
Magyarzatok:
3.sor:AlkalmazsunkatmostisinkbbaFrame()osztlyblleszrmaztatottosztlykntkonstruljukmeg.
Ezlehetvteszi,hogyesetlegegynagyobbalkalmazsbanehzsgeknlklbepthessk.
8.sor: ltalban a widgetek ltrehozsa utn alkalmazzuk a pack(), grid(), vagy place() pozcionl
metdusokat,amikawidgetekmasterablakbelipozcijnakszabadmegvlasztsttesziklehetv.Azonban
lehetsgvanarrais,hogyawidgetconstructorbanelregondoskodjunkapozcinlsrl.Eztisbemutatom.
11.sor:Az Entry osztlywidgetjeinektbbmetdusavan,amikkelhozzlehetfrniabertstringhez.A
get()metdussalkapjukvisszaazegszstringet.Adelete()teltrlhetjkazegszstringet,illetveegyrszt
(vesd ssze a Sznkdok projekttel: 200. oldal). Az insert() tel brmelyik pozciba j karaktereket
szrhatunkbe(vagyisegyesetlegmrltezstringelejre,vgre,vagyabelsejbe).Eztametdustkt
argumentummalhasznljuk,azelsmegadjaabeszrshelyt(0tkellmegadni,haastringelejre,ENDet,
haavgre,vagyvalamilyennumerikusindexet,haegykzbenspozcibaakarunkbeszrni).
14.15.sorok: A ngy gombot nem kln utastsokkal, hanem inkbb egy ciklussal hozzuk ltre. Ezt
megelzenagombokspecilisopciita styleFontHu (fontstlus)sa styleFontTk listkbantroljuk:az
elbbibenagombokmellkirandszvegeket,azutbbibanagombokhozrendelendrtkekettroljuk.
17.18.sorok: Ahogyan az elz oldalon magyarztam, a ngy gomb egy kzs vltoz krl alkot
csoportot. Ez a vltoz a felhasznl ltal vlasztott rdigombhoz rendelt rtket fogja felvenni. Erre a
szerepreazonbannemhasznlhatunkkznsgesvltozt,mertaTkinterobjektumokbelsattribtumaicsak
specilismetdusokkalfrhetkhozz.Egystringtpus Tkinter objektumvltozthasznlunkitt,amita
StringVar()osztlyblhozunkltre,samineka18.sorbanegyalaprtelmezettrtketadunk.
20.26.sorok:Ltrehozzukangyrdigombot.Mindegyikhezklnbzcmktsrtketrendelnk,de
mindegyikgombugyanahhozakzs Tkinter vltozhoz (self.choiceFont)(vlasztottfont)vankapcsolva.
Amikor a felhasznl az egrrel rkattint valamelyikre, akkor ugyanannak a self.changeFont() (font
megvltoztatsa)metdusnakahvsrakerlsor.
28.31.sor:AbettpusmegvltoztatsaazEntrywidgetfontopcijnakazjrakonfigurlsvaltrtnik.
Ezazopciabettpusnevt,mrettsesetlegstlusttartalmaztupletvr.Haabettpusnevenem
tartalmazbetkzt,atupletegystringgellehethelyettesteni.
Pldk:
('Arial',12,'italic')
('Helvetica',10)
('TimesNewRoman',12,'bolditalic')
"Verdana14bold"
"President18italic"
Lsda.oldalplditis.

201. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.2 Ablaksszelltsakeretekbl(frameekbl)
A Frame() widgetosztlytmrsokszorhasznltuk
j,sszetettwidgetekltrehozsraleszrmaztatssal.
A kvetkez script bemutatja, hogy hogyan
hasznlhat ez az osztly widgetcsoportok
ltrehozsra s az utbbiaknak egy ablakban
meghatrozott mdon val elrendezsre. Bizonyos
dekoratv opcik (szeglyek, kiemelkeds, stb.)
hasznlattisbemutatja.
Aszemkztiablakelksztshezktkeretetf1s
f2 hasznltamgy,hogyktklnwidgetcsoportot
kpezzenek:azegyiketabal,amsikatajobboldalon.
gyszneztemakereteket,hogynyilvnvalvtegyem
ezt,deasznezsnyilvnnemfelttlenlszksges.
Az f1 keret 6 msik keretet tartalmaz, melyek
mindegyikeaLabel()osztlyegywidgetjttartalmazza.
Azf2keretegyCanvas()segyButton()widgetettartalmaz.Aszneksadekorcikegyszeropcik.

1. from Tkinter import *


2.
3. ablak = Tk()
4. ablak.title("Keretekkel ltrehozott ablak")
5. ablak.geometry("300x300")
6.
7. f1 = Frame(ablak, bg = '#80c0c0')
8. f1.pack(side =LEFT, padx =5)
9.
10. fint = [0]*6
15. for (n, col, rel, txt) in [(0, 'grey50', RAISED, 'Kiemelked fellet'),
16. (1, 'grey60', SUNKEN, 'Bemlyed fellet'),
11. (2, 'grey70', FLAT, 'Sk fellet'),
12. (3, 'grey80', RIDGE, 'Gerinc'),
13. (4, 'grey90', GROOVE, 'rok'),
14. (5, 'grey100', SOLID, 'Szegly')]:
15. fint[n] = Frame(f1, bd =2, relief =rel)
16. e = Label(fint[n], text =txt, width =15, bg =col)
17. e.pack(side =LEFT, padx =5, pady =5)
18. fint[n].pack(side =TOP, padx =10, pady =5)
19.
20. f2 = Frame(ablak, bg ='#d0d0b0', bd =2, relief =GROOVE)
21. f2.pack(side =RIGHT, padx =5)
22.
23. can = Canvas(f2, width =80, height =80, bg ='white', bd =2, relief =SOLID)
24. can.pack(padx =15, pady =15)
25. gomb =Button(f2, text='Gomb')
26. gomb.pack()
27.
28. ablak.mainloop()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 202.
3.5.sorok: A bemutatt a maximlis egyszersg rdekben nem fogom j osztlyknt programozni.
Vegykszreaz5.sorbanafablakmreteinekrgztsreszolglgeometry()metdusalkalmazst.

7.sor: A baloldali keretet hozzuk ltre. A httrsznt (a cinkk egy vltozatt) a bg (background)
argumentumhatrozzameg.Ezastringhexadecimlisrsmdbantartalmazzaannakasznnekapiros,zld
skkkomponenst,amitszeretnnkbelltani.A # karakterutn,amiaztjelenti,hogyegyhexadecimlis
rtk kvetkezik, hat alfanumerikus szimblumot tallunk. Ezek hrom darab ktjegy hexadecimlis
szmnakfelelnekmeg,melyekmindegyikeegy1s255kzesdecimlisrtketreprezentl.gya80nak
adecimlis128sac0nakadecimlis192rtkfelelmeg.Pldnkbanapiros,zldskksznkomponensek
decimlisrtkeirendre:128,192s192. .
Eztalertechniktalkalmazvaafekete:#000000,afehr:#ffffff,apiros:#ff0000,asttkk:#000050,
stb.
8.sor:Mivel a pack() metdustalkalmazzuk,ezrtakeretmreteitautomatikusan hatrozzamegannak
tartalma.Aside=LEFTopciakeretetbalrafogjapozcionlniamasterablakban.Apadx=5opcijobbs
baloldalonegy5pixelszlessvotfogszabaddtenni(padxetfordthatjukvzszintestvolsgnakis).
10.sor:Az f1 keretbenhatmsikkeretet,melyekmindegyikeegycmkttartalmazakarunkcsoportba
foglalni.Akdegyszerbbshatkonyabblesz,haezeketawidgeteketegylistbanhozzukltre,nempedig
fggetlenvltozkban.Ksztnkegy6elemlistt,amitmajdksbbtltnkfel.
11.16.sor:A6hasonlkeretelksztshezegy6tuplebllllisttkellbejrnunk.Atuplekazegyes
keretekjellemzittroljk.Mindentuple4elemblll:egyindexbl,egyakeretkiemelkedstdefinil
Tkinterkonstansblsktstringbl,amikacmkeszntsszvegtrjkle.
Aforciklus6iterrcithajtvgrea6elemlistabejrshoz.Mindegyikiterrcibanazn,col,relstxt
vltozkhozhozzrendeliazegyiktupletartalmt(sutnavgrehajtjaa17.20.sorokat).Egytuplekblll
lista for ciklussal val bejrsa rendkvl tmr konstrukcit alkot, ami nagyon kisszm utastssal sok
rtkadstteszlehetv.
17.sor:A6keretetafintlistaelemeiknthozzaltre.Mindegyiketegyktpixelszles,kiemelkedshatst
keltdekoratvszeglydszti.
18.20.sorok:Acmkkmindazonosmretek,deaszvegksahttrsznkklnbz.A pack()
metdusalkalmazsamiattacmkkmreteaz,amimeghatrozzaakiskeretekmrett.Ezutbbiakpedig
azketcsoportbafoglalkeret(f1)mretthatrozzkmeg.Apadxspadyopciktesziklehetv,hogyegy
kistvolsgottartsunkmindencmkesmindenkiskeretkrl.Aside=TOPopcia6kiskeretetegyms
fltthelyezielazf1kontnerkeretben.

22.23.sorok:Az f2 keretet (jobboldalikeret)ksztjk el.Aszneegy srgasznrnyalat lesz segy


bemlyedsbenyomstkeltszegllyelvesszkkrl.
25.28.sorok:Azf2keretegyvsznatsegygombotfogtartalmazni.Megintfigyeljkmega widgetek
krliressvbiztostsraszolglpadxspadyopcikhasznlatt.(Nzzkmegpldulaztagombot,
amirenemalkalmaztukeztazopcit:emiattagombhozzrakeretszlhez.)Ahogyanakeretekkeltettem,
ugyangy a vszon krl is elhelyeztem egy szeglyt. Tudjunk rla, hogy ms widgetek gombok,
adatbevitelimezk,stb.ishasonlandszthetk.

203. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.3 Hogyanmozgassunkazegrrelrajzokat
ATkintergrafikusknyvtregyikerssgeavszonwidget.Szmos,igenhatkonyeszkzvanbeleptvea
rajzok kezelsre. A kvetkez scriptben, nhny alaptechnikt akarok bemutatni. Ha az olvas tbbet akar
ezekrl megtudni, nevezetesen a tbb rszbl ll rajzok manipulsa vonatkozsban, akkor nzze meg
valamelyikTkinterrelfoglalkozreferenciamvet.
Alkalmazsunkazindtsakorvletlenszerenksztnhnyrajzotavsznon(nhnysznesellipszist).Az
egrrelmegragadvabrmelyikketeltudjukmozgatni.
Amikoregyrajzotmozgatunk,akkorazatbbirajzskjaeljnsaszlevastagabbleszamozgatsalatt.

Azalkalmazotttechnikamegrtshezemlkeznnkkellarra,hogyegygrafikusinterfacethasznlprogram
esemnyvezreltprogram(hamagyarzatravanszksgenzzeta85.oldalonlertakat)Azalkalmazsba
egy olyan mechanizmust fogok bepteni, ami reagl a: bal egrgomb lenyomsa, egr mozgatsa
lenyomottbalegrgombbal,balegrgombelengedseesemnyekre.
EzeketazesemnyeketazopercisrendszerhozzaltresaTkinterinterfacekezeli.Aprogramozsabbl
fog llni, hogy ezeket az esemnyeket klnbz esemnykezelkhz (fggvnyekhez vagy metdusokhoz)
kapcsoljuk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 204.
# A plda bemutatja, hogyan kell ahhoz eljrnunk, hogy az egrrel a vszonra
# rajzolt objektumokat manipullni tudjunk

from Tkinter import *


from random import randrange

class Draw(Frame):
"A program f ablakt definil osztly"
def __init__(self):
Frame.__init__(self)
# A vszon ltrehozsa 15 sznes ellipszis rajzolsa :
self.c = Canvas(self, width =400, height =300, bg ='ivory')
self.c.pack(padx =5, pady =3)
for i in range(15):
# Vletlenszer en kisorsolunk egy sznt :
coul =['brown','red','orange','yellow','green','cyan','blue',
'violet', 'purple'][randrange(9)]
# Vletlen koordintj ellipszis rajzolsa :
x1, y1 = randrange(300), randrange(200)
x2, y2 = x1 + randrange(10, 150), y1 + randrange(10, 150)
self.c.create_oval(x1, y1, x2, y2, fill =coul)
# Az <egresemnyek> hozzkapcsolsa a <canevas> (vszon) widget-hez :
self.c.bind("<Button-1>", self.mouseDown)
self.c.bind("<Button1-Motion>", self.mouseMove)
self.c.bind("<Button1-ButtonRelease>", self.mouseUp)
# A kilpsgomb ltrehozsa :
b_fin = Button(self, text ='Befejezs', bg ='royal blue', fg ='white',
font =('Helvetica', 10, 'bold'), command =self.quit)
b_fin.pack(pady =2)
self.pack()

def mouseDown(self, event):


"Balegrgomb lenyomsra vgrehajtand m velet"
self.currObject =None
# event.x s event.y tartalmazzk a kattints koordintit :
self.x1, self.y1 = event.x, event.y
# <find_closest> a legkzelebbi rajz referencijt adja meg :
self.selObject = self.c.find_closest(self.x1, self.y1)
# Mdostjuk a rajz krvonalnak a vastagsgt :
self.c.itemconfig(self.selObject, width =3)
# <lift> tviszi a rajzot az el trbe :
self.c.lift(self.selObject)

def mouseMove(self, event):


"Lenyomott balgombbal mozg egrrel vgrehajtand m velet"
x2, y2 = event.x, event.y
dx, dy = x2 -self.x1, y2 -self.y1
if self.selObject:
self.c.move(self.selObject, dx, dy)
self.x1, self.y1 = x2, y2

def mouseUp(self, event):


"A balegrgomb flengedsekor vgrehajtand m velet"
if self.selObject:
self.c.itemconfig(self.selObject, width =1)
self.selObject =None

if __name__ == '__main__':
Draw().mainloop()

205. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Magyarzatok:
AscriptlnyegbenegyFrame()blszrmaztatottgrafikusosztlydefincijttartalmazza.
A script f rsze, amint az az objektumokat hasznl programok esetben gyakran elfordul, egyetlen
sszetettutasts.Ebbenktegymstkvetmveletetvgznk:ltrehozzukazelzlegdefiniltosztlyegy
objektumtsaktivljukamainloop()metdust(amielindtjaazesemnyfigyelt).

A Draw() osztlyconstructornakstruktrjamrismerskell,hogylegyen:aszlosztlyconstructort
hvja,majdklnbzwidgetekethozltre.
Avszonwidgeten15rajzothozunkltre,denemfoglalkozunkazzal,hogyahvatkozsaikatvltozkban
troljuk.Azrtjrhatunkgyel,mertaTkinteregybelshivatkozstrizmegmindenegyesobjektumszmra.
(Ha ms grafikus knyvtrakkal dolgozunk, valsznleg gondoskodnunk kell ezeknek a hivatkozsoknak a
trolsrl.)
Arajzoksznesellipszisek.Asznketegy9sznttartalmazlistblvletlenszerenvlasztjukki,ugyanisa
kivlasztottsznindexearandommodulblimportltrandrange()fggvnnyelvanmeghatrozva.

Ezutn az interakcis mechanizmus belltsa kvetkezik: a vszonwidgethez tartoz <Button1>,


<Button1Motion> s <Button1ButtonRelease> esemny azonostkat sszekapcsoljuk a hrom
esemnykezelmetdusnevvel.(Ezeketaneveketmivlasztjukazesemnykezelmetdusoknak.)
Amikor a felhasznl lenyomja a bal egrgombot, a mouseDown() metdus aktivldik s az opercis
rendszeregyesemnyobjektumotadnekitargumentumknt,aminek x s y attribtumaitartalmazzkazegr
koordintitavszonrakattintspillanatban.
Ezeketakoordintkatkzvetlenlaself.x1sself.x2objektumvltozkbatroljuk,mertmsholszksgnk
lesz rjuk. Ezt kveten a vszonwidget find_closest() metdust alkalmazzuk, ami a legkzelebbi rajz
hivatkozst adja meg visszatrsi rtkknt. (Megjegyzs: ez a praktikus metdus mindig visszaad egy
hvatkozst,mgakkoris,hanemkattintottunkarajzbelsejbe.)
Atbbimregyszer:akivlasztottrajzhivatkozsteltroljukegypldnyvltozbashvhatjukavszon
widgetmsmetdusaitarajzjellemzinekmdostsra.Azitemconfig()slift()metdusokathasznljukarajz
krvonalnakvknytsrasarajzeltrbehozsra.
ArajzszlltstamouseMove()metdusvgzi,amimindenalkalommalvgrehajtdik,amikorazegr
mozog s a bal egrgomb le van nyomva. Az event objektum ez alkalommal is az egrcursor koordintit
tartalmazzaamozgsvgn.Ezthasznljukfelazjsazelzkoordintkkzttiklnbsgkiszmtsra,
amitavszonwidgetmozgatstvgzmove()metdusnakparamterkntadunkt.
Ezt a metdust azonban csak akkor tudjuk hvni, ha valban ki van vlasztva egy objektum s arra is
gyelnnkkell,hogymentskazjkoordintkat.
A mouseUp() metdusfejezibeamveletet.Amikoramozgatottrajzmegrkezikarendeltetsihelyre,
trlnikellakivlasztstsarajzkrvonalnakvastagsgtazeredetirekellvisszalltani.Termszetesenez
csakakkorkpzelhetel,havalbanvanegykivlaszts.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 206.
14.4 PythonMegaWidgetek
A Pmw modulok a Tkinter rdekes kiterjesztsei. Teljes egszkben Pythonban vannak megrva,
valamennyientartalmazzkaTkinteralaposztlyokblkonstrultsszetettwidgeteknekegyknyvtrt.Ezeka
rendkvl sokrt funkcionalitssal elltott widgetek sszetett alkalmazsok gyors fejlesztsekor nagyon
rtkeseklehetnek.Hahasznlniakarjukket,tudjunkrla,hogyaPmwmoduloknemkpezikrsztastandard
Pythonteleptsnek.Ezrtmindigellenriznnkkell,hogyrajtavannakeazonagpen,aminaprogramjaink
futnifognak.
Nagyszm megawidget ltezik. Csak nhnyat fogok bemutatni a leghasznosabbak kzl. A mega
widgeteketksrdemoscriptekkiprblsvalgyorsanfogalmatalkothatunksokflealkalmazsilehetsgkrl
(indtsukpldulela.../Pmw/demosknyvtrbanlvall.pyscriptet).

14.4.1 ComboBox
A megawidgeteket knny hasznlni. A kvetkez kis alkalmazs
bemutatja,hogyanlehetegy ComboBox tpuswidgetet(egyadatbeviteli
mezvel kombinlt adatlistt) hasznlni. A legmegszokottabb mdon
konfigurltam(egylegrdllistval).
Amikor a felhasznl a legrdl listbl egy sznt vlaszt (illetve
kzvetlenlbeisrhatjaegysznnevtazadatbevitelimezbe),ezaszn
automatikusanamasterablakhttrsznvvlik.
Ebbenamasterablakbanelhelyeztemegycmktsegygombot,hogy
megmutassam, hogyan lehet hozzfrni a ComboBox ban elzleg
eszkzlt kivlasztshoz (a gombra kattints az utoljra vlasztott szn
kiratstfogjaelidzni).

1. from Tkinter import *
2. import Pmw
3.
4. def changeColo(col):
5. fen.configure(background = col)
6.
7. def changeLabel():
8. lab.configure(text = combo.get())
9.
10. colours = ('navy', 'royal blue', 'steelblue1', 'cadet blue',
11. 'lawn green', 'forest green', 'dark red',
12. 'grey80','grey60', 'grey40', 'grey20')
13.
14. ablak = Pmw.initialise()
15. button_ = Button(ablak, text ="Test", command =changeLabel)
16. button_.grid(row =1, column =0, padx =8, pady =6)
17. lab = Label(ablak, text ='nant', bg ='ivory')
18. lab.grid(row =1, column =1, padx =8)
19.
20. combo = Pmw.ComboBox(ablak, labelpos = NW,
21. label_text = 'Vlasszon sznt :',
22. scrolledlist_items = colours,
23. listheight = 150,
24. selectioncommand = changeColo)
25. combo.grid(row =2, columnspan =2, padx =10, pady =10)
26.
27. ablak.mainloop()

207. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Magyarzatok:
1.s2.sor:AszoksosTkinterkomponenseksaPmwmodulimportjvalkezdnk.

14. sor: A master ablak ltrehozshoz inkbb a Pmw.initialise() metdust kell hasznlni, nem pedig
kzvetlenl a Tk() osztlybl ltrehozni egy objektumot. Ez a metdus gondoskodik arrl, hogy mindaz
installlva legyen, ami ahhoz szksges, hogy amikor ezt az ablakot megszntetjk, akkor a slave
widgetjeinek a megszntetse korrekten trtnhessen meg. Ez a metdus egy jobb hibazenet kezelt is
installl.
20.sor:A labelposopciazadatbevitelimeztksrcmkeelhelyezkedsthatrozzameg.Pldnkbana
mezfltthelyeztkel.Msholiselhelyezhetnnk,pldulameztlbalra(labelpos=W).Jegyezzkmeg,
hogyezazopcinlklzhetetlen,hacmkrevanszksgnk(alaprtelmezettrtkenincs).
24.sor: A selectioncommand opci egy argumentumot ad t a hvott fggvnynek: a listboxban
kivlasztottelemet.Eztavlasztsta get() metdussalismeglehettallni,ahogyana8.sorbantesszka
cmkeaktualizlsardekben.

14.4.2 kezeteskarakterekbersravonatkozmegjegyzs
Azelzekbenmremltettem,hogyaPythonkpesavilgvalamennyiabcjt(grg,ciril,arab,japn,stb.
lsda41.oldalt)kezelni.UgyanezllfnnaTkinterre.Magyaranyanyelvkntbiztos,hogyszeretnnk,haa
scriptjeinkfelhasznlitudnnak kezeteskaraktereketberni az Entry, Textwidgetekbe sleszrmazottaikba
(ComboBox,ScrolledText).
Jegyezzkmeg,hogyamikorezeknekawidgeteknekazegyikbeberunkegyvagytbbnemASCIIkaraktert
tartalmazstringet(pldulegykezeteskaraktert),aTkintereztastringetazUTF8normaszerintkdolja.Haa
szmtgpnk alaprtelmezetten inkbb a Latin1 kdolst hasznlja (leggyakrabban ez a helyzet), akkor a
kiratseltttkellkonvertlniastringet.
Ezabeptettencode()fggvnnyelnagyonknnyenmegtehet.Plda:

# -*- coding: Latin-1 -*-

from Tkinter import *

def nyomtat():
ch1 = e.get() # az Entry widget egy utf8 stringet ad vissz
ch2 = ch1.encode("Latin-1") # utf8 -> Latin-1 konverzi
print ch2

f = Tk()
e = Entry(f)
e.pack()
Button(f, text ="kirni", command = nyomtat).pack()
f.mainloop()

Prbljukkieztakisscriptetgy,hogyazadatbevitelimezbekezeteskarakterekettartalmazstringetrunk
be.
Tegynkmgegyprbtgy,hogyaprintch2utaststkicserljkaprintch1gyel.Vonjuklea
kvetkeztetst!

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 208.
14.4.3 ScrolledText
Ez a megawidget gy terjeszti ki a standard Text
widget lehetsgeit, hogy egy keretet, egy cmkt (a
cmet)sgrgetsvokatkapcsolhozz.
A kvetkez script bemutatja, hogy a
ScrolledText megawidget alapveten szvegek
kiratsra val, de formzhatjuk a szvegeket s
kpeketpthetnkbeljk.
A kirt elemeket (szvegeket vagy kpeket)
klikkelhetv tehetjk s arra hasznlhatjuk, hogy
mindenflemechanizmustelindtsunk.
A fenti brt ltrehoz alkalmazsban pldul a
JeandelaFontainenvrekattintvaaszvegautomatikusanaddiggrdl(scrolling),amglthatvnem
vlikebbenawidgetbenegyolyanrsz,amieztaszerztrjale.(Lsdakvetkezoldalonamegfelelscriptet).
Msfuncikisvannak,decsakalegalapvetbbeketfogomittbemutatni.Akiezekrltbbetakarmegtudni,
aznzzemegaPmwtksrdemkatspldkat.
Akirtszvegkezelse:ktkiegszteszkzazindexsatageksegtsgvellehethozzfrniakezelt
szvegbrmelyikrszhez:
Aszvegmindenegyeskirtkarakterreegyindexhivatkozik,aminekktegymssalponttalsszekapcsolt
numerikus rtkbl kpzett stringnek kell lenni (pl: ''5.2''). Ez a kt rtk jelenti azt a sorszmot s
oszlopszmot,aholakaraktervan.
A szveg brmely rszt sszekapcsolhatjuk egy vagy tbb taggel, ami(k)nek a nevt s tulajdonsgait
szabadonvlasztjukmeg.Ezektesziklehetvabettpus,azelshttrszn,azasszociltesemnyek,stb.
definilst.

209. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Megjegyzs:Azalbbiscriptjobbmegrtsheztegykfel,hogyakezelendszvegegyCorbRenard.txt
nevfilebanvan.
1. from Tkinter import *
2. import Pmw
3.
4. def action(event=None):
5. """a szveg grgetse a <target> tag-ig"""
6. index = st.tag_nextrange('target', '0.0', END)
7. st.see(index[0])
8.
9. # Egy ScrolledText widgetet tartalmaz ablak ltrehozsa :
10. fen = Pmw.initialise()
11. st = Pmw.ScrolledText(fen,
12. labelpos =N,
13. label_text ="A ScrolledText widget demja",
14. label_font ='Times 14 bold italic',
15. label_fg = 'navy', label_pady =5,
16. text_font='Helvetica 11 normal', text_bg ='ivory',
17. text_padx =10, text_pady =10, text_wrap ='none',
18. borderframe =1,
19. borderframe_borderwidth =3,
20. borderframe_relief =SOLID,
21. usehullsize =1,
22. hull_width =370, hull_height =240)
23. st.pack(expand =YES, fill =BOTH, padx =8, pady =8)
24.
25. # Tag-ek defincija, esemnykezel kapcsolsa az egrkattintshoz :
26. st.tag_configure('title_', foreground ='brown', font ='Helvetica 11 bold italic')
27. st.tag_configure('link', foreground ='blue', font ='Helvetica 11 bold')
28. st.tag_configure('target', foreground ='forest green', font ='Times 11 bold')
29. st.tag_bind('link', '<Button-1>', action)
30.
31. title_ ="""A rka s a holl
32. rta Jean de la Fontaine, francia szerz
33. \n"""
34. author ="""
35. Jean de la Fontaine
36. francia r (1621-1695)
37. Verses mesi s mindenek el tt,
38. 1668-tl 1694-ig publiklt llattrtnetei
39. tettk hress."""
40.
41. # A Text widget kitltse (2 technika) :
42. st.importfile('CorbRenard.txt')
43. st.insert('0.0', title_, 'title_')
44. st.insert(END, author, 'target')
45. # Kp beszrsa :
46. photo =PhotoImage(file= 'penguin.gif')
47. st.image_create('6.14', image =photo)
48. # tag dinamikus ltrehozsa :
49. st.tag_add('link', '2.4', '2.23')
50.
51. fen.mainloop()

Magyarzatok:
4.7.sor:Ezegyesemnykezel.Hvsraaszerznevretrtnkattitskorkerlsor(27.s29.sorok).A
6. sorban a widget tag_nextrange() metdust hasznljuk a target taghez asszocilt szvegrsz
indexeinek a megkeressre. Az indexek keresse a 2. s 3. argumentummal megadott tartomnyra
korltozdik (pldnkban a szveg elejtl a vgig keresnk). A tag_nextrange() metdus visszatrsi
rtkknt egy kt indexbl ll listt ad meg (a target taggal asszocilt szvegrsz els s utols
karakternekindext).A7.sorbanazindexekazegyikt(azelst)hasznljukasee()metdusaktivlsra.Ez
ametdusaszvegautomatikusgrgetst(scrolling)idzielgy,hogyamegadottindexnekmegfelel
karaktervliklthatvawidgetben(ltalbanaztkvetnhnykarakterrelegytt).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 210.
9.23.sorok:Egyetlenegywidgetkirsraszntablakltrehozsa.Awidgetobjektumotltrehozkdba
belevettemnhnyopcitazzalacllal,hogybemutassamaszmoskonfigurcislehetsgegyrszt.
12.sor:Alabelposopcimeghatrozzaacmke(cm)elhelyezkedstaszvegablakhozkppest.Azgtjak
jellsrehasznltbetketfogadjaelrtkknt(N,S,E,W,NE,NW,SE,SW).Hanemakarunkcmkt
kirni,akkoreztazopcitnemkellhasznlni.
13.15.sorok:Acmkenemms,mintegyazsszetettScrolledTextwidgetbebeptettstandardLabel
widget.Akvetkezszintaxissalmindenkonfigurcisopcijhozhozzfrhetnk:azelshttrszn,a
bettpus,amret,stawidgetkrlfenntartotttrkz(padyopci)egyszerdefinilshozalabel_prefixet
annakazopcinakanevhezkellkapcsolni,amitaktivlniakarunk.
16.17.sorok:AScrolledTextbebeptettTextwidgetkonfigurcisopciihozacmkrelerthozhasonl
technikthasznlvafrhetnkhozz.Mostatext_prefixetkellazopciknevhezkapcsolni.

18.20.sorok:A Text widgetkregykeretet(egy Frame widgetet)akaroktenni.A borderframe=1


opcivaljelenthetjkmeg.Akonfigurcisopciihozalabel_satext_relertakhozhasonlanfrhetnk
hozz.
21.22.sorok: Ezekkel az opcikkal globlisan rgzthetjk a widget mreteit. Egy msik lehetsg az
lenne,hogyinkbbaTextkomponensmreteitdefinilnnk(pldulatext_widthstext_heightopcikkal).
Ebbenazesetbenaztkockztatnnk,hogyawidgetgloblismreteiatartalmafggvnybenvltoznnak(a
grdtsvokautomatikusmegjelense/eltnse).Megjegyzs:ahullszaglobliskontnert,azazmagta
megawidgetetjelli.
23. sor:A pack() metdus expand =YES s fill =BOTH opcii azt jelentik, hogy az illet widgetet
vzszintesensfgglegesentlehetmretezni.
2629.sorok:Ezekasorokdefiniljkatitle_,linkstargettageketsazoknakaszvegekneka
formzst,amikhozzjuklesznekasszocilva.A29.sorradsulelrja,hogyalinktaghezasszocilt
szvegklikkelhetleszsmegadjaamegfelelesemnykezelt.
42.sor: Szveg importlsa egy filebl. Megjegyzs: Msodik argumentumknt egy indexet megadva
meghatrozhatapontoshely,ahovbekellszrniaszveget.
43.44.sorok: Ezek az utastsok gy szrjk be a szvegtredkeket (a mr ltez szveg elejhez s
vghez),hogymindegyikkhzegytagetasszocilnak.
49.sor: A tagek hozzkapcsolsa a szvegekhez dinamikus. Brmelyik pillanatban j asszocicit
aktivlhatunk (ahogy a link tagnak egy mr ltez szvegrszhez val kapcsolsval tesszk)
Megjegyzs:atag_delete()metdusthasznljukataglekapcsolsra.

211. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.4.4 ScrolledCanvas
AkvetkezscriptbemutatjahogyanlehetkihasznlniaScrolledCanvas(grgetettvszon)megawidgetet,
ami a standard Canvas (vszon) widget lehetsgeit terjeszti ki, grgetsvokat, egy cmkt s egy keretet
kapcsolvahozz.Apldaegyjtk,melybenafelhasznlnakrkellkattintaniegyllandanmozggombra.
(Megjegyzs:hanehzelkapniagombot,kezdjeelszrazablakmegnyjtsval)

A Canvas widgetnagyonsokoldal:lehetvteszi,rajzok, bitmap kpek,szvegrszek,stmswidgetek


kombinlstegytkletesenszthzhattrben.Havalamilyengrafikusjtkotakarunkrni,akkornyilvnval,
hogyezazawidget,amitelsdlegesenmegkelltanulniuralni.
Ajegyzetbenebbenatrgykrbenkzltismeretekszkgszerennagyonhinyosak.Aclomcsakaz,hogy
segtsekmegrteninhnyalapfogalmat,hogyaztnazolvaskpeslegyenaspecilisreferenciamvekben
informcitkeresni.
Az alkalmazsunk a Pmw.ScrolledCanvas() megawidget osztlybl szrmaztatott j FenPrinc()
osztlykntjelenikmeg.Egygrgetsvokkalelltottnagyvsznattartalmaz,amiben80sznes,vletlenszer
elhelyezkedssmretellipszisvan.
Egy kis bitmap formtum kpet tesznk r, amit mindenek eltt arra sznok, hogy az emlkezetnkbe
idzzem,hogyanleheteztatpuserforrstkezelni.
Vglegyvaldiwidgetet,jelenesetbenegygombotinstalllunkr,deakidolgozotttechniktbrmelyms
tpus widgetre alkalmazhatnnk, akr olyan nagy sszetett widgetekre is, mint amilyeneket az elzekben
fejlesztettnk. Ez anagy rugalmassg akomplex alkalmazsok fejlesztsben azegyik f nyeresg,amit az
objektumorientltprogramozsnyjt.
Az els pillanattl kezdve, hogy rkattintottunk, a gomb megelevenedik. A kvetkez scriptanalzisben
figyeljenazolvasazokraametdusokra,amiketegyltezobjektumtulajdonsgainakmdostsrahasznlok.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 212.
1. from Tkinter import *
2. import Pmw
3. from random import randrange
4.
5. Pmw.initialise()
6. colo =['sienna','maroon','brown','pink','tan','wheat','gold','orange','plum',
7. 'red','khaki','indian red','thistle','firebrick','salmon','coral']
8.
9. class MainWind(Pmw.ScrolledCanvas):
10. """F ablak : nyjthat vszon grget svokkal"""
11. def __init__(self):
12. Pmw.ScrolledCanvas.__init__(self,
13. usehullsize =1, hull_width =500, hull_height =300,
14. canvas_bg ='grey40', canvasmargin =10,
15. labelpos =N, label_text ='Kapd el a gombot !',
16. borderframe =1,
17. borderframe_borderwidth =3)
18. # Az albbi opcikat az inicializls utn meg kell adni :
19. self.configure(vscrollmode ='dynamic', hscrollmode ='dynamic')
20. self.pack(padx =5, pady =5, expand =YES, fill =BOTH)
21.
22. self.can = self.interior() # hozzfrs a vszon-komponenshez
23. # Dekorci : vletlen ellipszisek rajzolsa :
24. for r in range(80):
25. x1, y1 = randrange(-800,800), randrange(-800,800)
26. x2, y2 = x1 + randrange(40,300), y1 + randrange(40,300)
27. colour = colo[randrange(0,16)]
28. self.can.create_oval(x1, y1, x2, y2, fill=colour, outline='black')
29. # Kismret GIF kp hozzadsa :
30. self.img = PhotoImage(file ='linux2.gif')
31. self.can.create_image(50, 20, image =self.img)
32. # Annak a gombnak a kirajzolsa, amit el kell kapni :
33. self.x, self.y = 50, 100
34. self.but = Button(self.can, text ="Start", command =self.start)
35. self.fb = self.can.create_window(self.x, self.y, window =self.but)
36. self.resizescrollregion()
37.
38. def anim(self):
39. if self.run ==0:
40. return
41. self.x += randrange(-60, 61)
42. self.y += randrange(-60, 61)
43. self.can.coords(self.fb, self.x, self.y)
44. self.configure(label_text = 'Keress en %s %s' % (self.x, self.y))
45. self.resizescrollregion()
46. self.after(250, self.anim)
47.
48. def stop(self):
49. self.run =0
50. self.but.configure(text ="Restart", command =self.start)
51.
52. def start(self):
53. self.but.configure(text ="Kapj el !", command =self.stop)
54. self.run =1
55. self.anim()
56.
57. ##### F program ##############
58.
59. if __name__ == '__main__':
60. MainWind().mainloop()

213. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Magyarzatok:
6.sor: A Tkinter ezeket a sznneveket mind elfogadja. Nyilvn helyettesthetnnk ket hexadecimlis
rtkekkel,ahogya201.oldalonmagyarztam.
12.17.sorok:EzekazopciknagyonhasonltanakaScrolledTextwidgetnllertopcikra.Amegawidget
egy Frame, egy Label, egy Canvas skt Scrollbar komponenstegyest. Akomponensekkonfigurcis
opciihozolyanszintaxissalfrnkhozz,amiakomponenssazopcinevtegy_karakterrelkapcsolja
ssze.
19.sor:Ezekazopcikdefiniljkagrgetsvokmegjelensimdjt.Statikusmdbanagrgetsvok
mindig jelen vannak. Dinamikus mdban eltnnek, ha a vszon mretei az ablak mreteinl kisebb
vlnak.
22.sor:Azinterior()metdusaScrolledCanvasmegawidgetbeintegrltCanvaskomponenshivatkozst
adjavisszatrsirtkknt.Akvetkezsorok(23.35.sorok)elemekethelyeznekerreavszonra:rajzokat,
egykpetsegygombot.
25.27.sorok:A randrange() fggvnnyelllthatk elegymegadottintervallumbaesvletlenegsz
szmok.(Lsda142.laponlvmagyarzatot.).
35.sor:ACanvaswidgetcreate_window()metdusvalszrhatunkbebrmelymswidgetet(egysszetett
widgetetis).Abeszrandwidgetetazonbanelzlegmintavszonvagyavszonmasterablaknakslave
jt kell definilni. A create_window() metdus hrom argumentumot vr: annak a pontnak az X s Y
koordintit,ahovabeakarjukszrniawidgetetsabeszrandwidgethivatkozst.
36.sor:Aresizescrollregion()metdusjrabelltjaagrgetsvokhelyzettgy,hogyazokmegfeleljenek
azaktulisanmegjelentettvszonrsznek.
38.46.sorok:Ezametdusagombanimlsraszolgl.Miutnagombotazelzpozcijtlvalamilyen
tvolsgravletlenszerenthelyezte,250msecutnametdusjrahvjanmagt.Ezhurkolsmindaddig
megllsnlklfolyik,amgaself.runvltozrtkenemnulla.
48.55.sorok: Ez a kt esemnykezel felvltva van a gombhoz kapcsolva. Nyilvnvalan az animci
indtsraslelltsravalk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 214.
14.4.5 Eszkztrakbuborkhelppellambdakifejezsek
Sokprogramnakvanegyvagytbbkispiktogramokkal(ikonokkal)elltottgombokbllleszkztra
(toolbar).Azeszkztr(ak)bangyknlhatunkfelnagyszmspecializltparancsotafelhasznlnak,hogyazok
nemfoglalnakelnagyhelyetakpernyn(aztmondjk:egykisrajztbbetr,mintahosszbeszd).
Az ikonok jelentse azonban nem mindig nyilvnval, klnsen az j felhasznlknak. Ajnlatos ezrt
kiegszteni az eszkztrakat egy bubork helprendszerrel (tool tips), ami rvid magyarz zenetekbl ll,
melyekakkorjelennekmeg,amikorazegrkurzorazilletgombflkerl.
Akvetkezalkalmazsegyeszkztrblsegyvszonblll.Amikorafelhasznlazeszkztregyik
gombjrakattint,akkorascriptagombonlvikontavszonvletlenszerenkivlasztotthelyremsolja:

Pldnkban mindegyik gombot egy mlyeds veszi krl. A gombokat ltrehoz utastsban a relief
(domborzat) s a bd (border = szl) opcik megfelel megvlasztsval knnyen kaphatunk ms kinzet
gombokat.Arelief=FLATsbd=0vlasztssalskgombokatkapunk.

A help buborkok elhelyezse gyerekjtk. Az egsz alkalmazs szmra elg egyetlen Pmw.Balloon
objektumotltrehozni.UtnaennekaPmw.Balloonobjektumnakabind()metdustannyiszorhvvaahnyszor
szksges,mindegyikwidgethez,amelyikhezhelpbuborkotszeretnnkkapcsolni,szvegetasszocilunk.

1. from Tkinter import *
2. import Pmw
3. from random import randrange
4.
5. # az ikonokat tartalmaz file-ok nevei (GIF formtum ):
6. images =('floppy_2','papi2','pion_1','pion_2','help_4')
7. textes =('ments','pillang','jtkos 1','jtkos 2','Help')
8.
9. class Application(Frame):
10. def __init__(self):
11. Frame.__init__(self)
12. # Egy <bubork help> objektum ltrehozsa (egy elegend ) :
13. tip = Pmw.Balloon(self)
14. # Eszkztr ltrehozsa (ez egy egyszer keret) :
15. toolbar = Frame(self, bd =1)
16. toolbar.pack(expand =YES, fill =X)
17. # A ltrehozand gombok szma :

215. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
18. nBut = len(images)
19. # A gombok ikonjainak persistens vltozkban kell lenni.
20. # Egy lista megteszi :
21. self.photoI =[None]*nBut
22.
23. for b in range(nBut):
24. # Ikon ltrehozsa (PhotoImage Tkinter objektum) :
25. self.photoI[b] =PhotoImage(file = images[b] +'.gif')
26.
27. # Gomb ltrehozsa.:
28. # Egy "lambda" kifejezst hasznlunk arra hogy a hvott
29. # metdusnak parancsknt adjunk t egy argumentumot :
30. but = Button(toolbar, image =self.photoI[b], relief =GROOVE,
31. command = lambda arg =b: self.action(arg))
32. but.pack(side =LEFT)
33.
34. # egy gomb sszekapcsolsa egy helpszveggel :
35. tip.bind(but, textes[b])
36.
37. self.ca = Canvas(self, width =400, height =200, bg ='orange')
38. self.ca.pack()
39. self.pack()
40.
41. def action(self, b):
42. "a gomb ikonja a vszonra van msolva"
43. x, y = randrange(25,375), randrange(25,175)
44. self.ca.create_image(x, y, image =self.photoI[b])
45.
46. Application().mainloop()

Metaprogramozs.Lambdakifejezsek:
Azltalnosszably:mindegyikgombhozegyparancsotkapcsolunk,amiegymetdusvagyegyspecilis
fggvny. Ez felels a feladat elvgzsrt, amikor a gomb aktivlva van. Viszont ebben az alkalmazsban
mindengombnakmajdnemugyanaztkellcsinlni(egyrajzotkelltmsolniavszonra),azegyetlenklnbsg
kzttkazilletrajz.
Kdunkegyszerstserdekbenmindegyikgombunk command opcijtugyanazzalametdussal(ezaz
action() metdus) szeretnnk sszekapcsolni, de minden alkalommal gy akarjuk tadni a hasznlt specilis
gombreferencijt,hogymindegyikgombesetnklnbzlehessenavgrehajtottakci.
Felmerl egy nehzsg: a Button widget command opcija csak egy rtket vagy kifejezst fogad el,
utastst nem. Teht megadhat neki egy fggvnyhivatkozs, de nem hvhatja a fggvnyt esetleges
argumentumoktadsval(ezazokaamirtafggvnynevtzrjeleknlkladjukmeg).
Ezanehzsgktflekppenoldhatmeg:
Dinamikus jellegbladdanaPythonelfogadja,hogy egyprogrammdostanitudja nmagt pldul
gy,hogyavgrehajtsasornjfggvnyeketdefinil(eztjelentiametaprogramozsfogalma).

Teht futs kzben definilhat egy paramtereket hasznl fggvny gy, hogy a paramterek
mindegyiknekmegadunkegyalaprtelmezettrtket,majdeztafggvnythvjukargumentumoknlklott,
ahol az argumentumok megadsa nem megengedett. Mivel a fggvny a programvgrehajts sorn van
definilva, ezrt az alaprtelmezett rtkek lehetnek vltozrtkek. A mvelet eredmnye egy valdi
argumentumtads.

Etechnikaillusztrcijaknthelyettestskascript27.31.soraitakvetkezkkel:
# Gomb ltrehozsa.:

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 216.
# Futs kzben definilunk egy paramteres fggvnyt. A paramter
# alaprtelmezett rtke az tadand argumentum.
# Ez a fggvny hv egy argumentumot ignyl metdust :

def act(arg = b):


self.action(arg)

# A gombhoz kapcsolt parancs hvja a fenti fggvnyt :


bou = Button(toolbar, image =self.photoI[b], relief =GROOVE,
command = act)

Azelzeketegylambdakifejezshvsvalegyszersthetjk.EzafoglaltPythonszegyolyankifejezst
jell,amiegyfggvnyobjektumotadvisszaadefutastshozhasonlan.Aklnbsgaz,hogyalambdaegy
kifejezssnemutasts,ezrtinterfaceknttudjukhasznlniegyfggvny(argumentumtadssal)trtn
hvsraott,aholazaszoksosmdonnemlehetsges.Jegyezzkmeg,hogyazilyenfggvnyanonym
(nincsneve).

Pldula:

lambdaar1=b,ar2=c:akarmi(ar1,ar2)

utastsegyanonymfggvnyhivatkozstadjavisszatrsirtkl.Ezafggvnya b s c
argumentumokkal azokatafggvnyparamterek defincijban alaprtelmezett rtkekknt
hasznlvaazakarmi()fggvnytfogjahvni.

Ez a technika vgssoron ugyanazt az elvet hasznlja mint az elz. Az elnye, hogy tmrebb, ezrt
hasznlomascriptben.Viszontkicsitnehezebbmegrteni:

command=lambdaarg=b:self.action(arg)

Ebbenazutastsrszbenagombhozrendeltparancsegyanonym fggvnyrehivatkozik.Afggvny
argparamternekazalaprtelmezettrtkeabargumentumrtke.
Amikoraparancsargumentumnlklhvja,ezazanonymfggvnymgishasznlnitudjaaparamtert
(azalaprtelmezettrtkkel)a self.action() clfggvnyhvsrasgyegyvaldiargumentum
tadstrnkel.

Nemrszletezemalambdakifejezsekkrdst,mertezmeghaladjaennekabevezetmnekakereteit.Ha
tbbetszerenetudnirluk,akkornzzemegabibliogrfibanmegadottvalamelyikreferenciamvet.

217. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.5 Ablakokmenkkel
Klnbztpuslegrdlmenkkelelltottalkalmazsablakkonstrukcijtfogommostlerni.Mindegyik
mentlelehetvlasztaniafalkalmazsrl,hogyfggetlenablakokkvljon,mintazalbbiillusztrcin.
Ezakicsithosszabbgyakorlatttekintslisfogszolglni.Szakaszosanfogjukkivitelezniazinkrementlis
fejlesztsneknevezettprogramozsistratgiaalkalmazsval.
Amintmrazelzekbenmagyarztam55,ez
a mdszer abbl ll, hogy a programrst csak
egynhnysorblllvzzalkezdjk,deezmr
mkdik. Gondosan teszteljk, hogy
kikszbljk az esetleges hibkat. Amikor
korrekten mkdik, akkor hozzadunk egy
kiegszt funkcit. Addig teszteljk ezt a
kiegsztst, amg teljesen kielgt nem lesz,
majdhozzadunkavzhozegyjabbfunkcits
gytovbb...
Eznemjelentiazt,hogy aprojektelzetes,
komoly elemzse nlkl rgtn neki lehet a
kezdeniprogramozsnak. Aprojektetlegalbb
nagyvonalakbanmegfelelmdonlekellrniegyvilgosanmegfogalmazottfeladatmeghatrozsban.

Akidolgozssornakdmegfelelkommentezsreisszksgvan. Trekednikellajlmegfogalmazott
kommentekre,nemcsakazrt,hogyakdunkatknnyenlehessenolvasni(sksbbmsoknakvagymagunknak
knnyebb legyen karbantartani), hanem azrt is, hogy knyszertsk magunkat annak a kifejtsre, amit
szeretnnk,hogyagpvalbancsinljon.(V.Szemantikaihibk,16.oldal)

Feladatmeghatrozs:
Az alkalmazsunknak lesz egy mensora s egy vszna. A men klnbz rovatai s opcii csak arra
szolglnak, hogy szvegrszleteket jelentenek meg a vsznon vagy a dekorci rszleteit mdostjk s
mindenek eltt vltozatos pldk lesznek. Ezeknek az a rendeltetsk, hogy vzlatt adjk annak a sokfle
lehetsgnek,amitezawidgettpusknl,aminlklzhetetlentartozkamindenmodernalkalmazsnak.
Aziskvnalom,hogyagyakorlatsornellltottkdjlstruktrltlegyen.Ennekrdekbenktosztlyt
fogokhasznlni:egyikafalkalmazs,amsikamensor.Azrtakarokgyeljrni,hogymegvilgtsamegy
tbbinteraktvobjektumosztlyaitmagbafoglalalkalmazstpuskonstrukcijt.

55 Lsd:Hibakeresssksrletezs(16.oldal)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 218.
14.5.1 Aprogramelsvza:
Egyprogramvznakamegalkotsakorarrakelltrekedni,hogyalehetlegkorbbanjelentskmegateljes
struktrt a vgleges alkalmazst alkot f blokkok kztti relcikkal egytt. Erre treksznk az albbi
pldban:

1. from Tkinter import *


2.
3. class MenuBar(Frame):
4. """Legrdl menk sora"""
5. def __init__(self, boss =None):
6. Frame.__init__(self, borderwidth =2)
7.
8. ##### <File> menu #####
9. fileMenu = Menubutton(self, text ='File')
10. fileMenu.pack(side =LEFT)
11. # A "legrdl " rsz :
12. me1 = Menu(fileMenu)
13. me1.add_command(label ='Trls', underline =0,
14. command = boss.erase)
15. me1.add_command(label ='Befejezs', underline =0,
16. command = boss.quit)
17. # A men integrlsa :
18. fileMenu.configure(menu = me1)
19.
20. class Application(Frame):
21. """F alkalmazs"""
22. def __init__(self, boss =None):
23. Frame.__init__(self)
24. self.master.title('Ablak menkkel')
25. mBar = MenuBar(self)
26. mBar.pack()
27. self.can = Canvas(self, bg='light grey', height=190,
28. width=250, borderwidth =2)
29. self.can.pack()
30. self.pack()
31.
32. def erase(self):
33. self.can.delete(ALL)
34.
35. if __name__ == '__main__':
36. app = Application()
37. app.mainloop()

Kdoljukafentisorokatsellenrizzkavgrehajtst.Egy
ablakotkellkapnunkegyvilgosszrkevszonnal,amifltt
egymensorvan. Ebbenastdiumbanamensornakcsak
egyFilerovatavan.
Kattintsunk a File rovatra a megfelel men
megjelentshez : a Trls opci mg nem mkdik (a
vszontartalmt fogjatrlni), dea Befejezsopcinak
mrlehetvkelltenniazalkalmazsmegfelellezrst.
Mint a Tkinter ltal kezelt valamennyi men, gy az
ltalunk ltrehozott men is talakthat sz menv:
ehhez elg rkattintani a menfejben megjelen szaggatott
vonalra. gy egy kis szatellit ablakot kapunk, amit oda
pozcionlhatunk,ahovtetszik.

219. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ascriptelemzse:
A program struktrjnak mr ismersnek kell lenni. Hogy a scriptben definilt osztlyok esetleg ms
projektekbenimportlssaljrafelhasznlhatklegyenek,afprogramteste(35.37.sorok)tartalmazzaaz:if
56
__name__=='__main__':utastst .
Akvetkezktutastscsakegyappobjektumothozltreselindtjaazobjektummainloop()metdust.
Eztaktutaststsszesrthettkvolnaegyetlenutastsba.
Aprogramlnyegeazonbanazelzosztlyokdefinciibanrejlik:
AMenuBar()osztlytartalmazzaamensorlerst.Ascriptjelenlegillapotbanezegyconstructorvzat
zrmagba.
5.sor: A boss paramter a widget master ablaknak referencijt fogadja a MenuBar() objektum
ltrehozsnak pillanatban. Ez a referencia fogja lehetv tenni a master ablakhoz kapcsolt metdusok
hvsta14.sa16.sorban.
6.sor:Aszlosztlyconstructornakktelezaktivlsa.
9.sor:A Menubutton() osztlyegywidgetjthozzukltre,amia self (vagyisazsszetettmensor
objektum, aminek az osztlyt ppen most definiljuk) egy slavejeknt van definilva. Ahogyan a neve
mutatja, ez a widgettpus egy gombhoz hasonlan viselkedik: akkor kvetkezik be egy akci, amikor
rkattintunk.
12.sor:Ahhoz,hogyazakciegymenmegjelensbllljon,mgamentdefinilnikell.Amenumosta
Menu() osztly egy j widgetje lesz, amit a 9. sorban ltrehozott Menubutton widget slavejeknt
definilunk.
13.16.sorok: A Menu() osztly widgetjeire specilis metdusokat alkalmazhatunk, melyek mindegyike
szmosopcitfogadel.Azadd_command()metdushelyezielaTrlssBefejezsmenpontokat
amenben.Rgtnbeptjkazunderlineopcit,amiegybillentyrvidtsdefinilsraval.Ezazopci
adjameg,hogyamenpontmelyikbetjnekkellalhzvamegjelenniakpernyn.Afelhasznltudja,
hogy a menpontnak megfelel akci aktivlshoz elg lenyomni ezt a billentyt (mintha az egrrel
rkattintottvolnaamenpontra).
Egy menpont kivlasztsakor indtand akcit a command opci hatrozza meg. Scriptnkben mindkt
hvottparancs amasterablakmetdusa. Amasterablakreferencijta boss paramteradtatltrehozsa
pillanatban azaktulis widgetnek. Az erase() (trl) metdus, amit ksbb definilunk, fogja trlni a
vsznat.Azelredefiniltquit()metdusidzielakilpstamainloop()blsgyazalkalmazsablakhoz
kapcsoltesemnyfigyellelltst.
18.sor:Amikoramenpontokatdefiniltuk,utnaaMenubutton masterwidgetetjrakellkonfigurlnunk,
hogy a menu opcija arra a Menre mutasson, amit megkonstrultunk. Ezt az opcit nem tudtuk
kzelebbrlmeghatroznia Menubutton widgetdefincijakor,mertabbanastdiumbana Menu mgnem
ltezett.AMenuwidgetetsemtudtukelsnekdefinilni,mertaztaMenubuttonwidgetslavejekntkell
definilni. Hrom lpsben kell eljrnunk, ahogyan tettnk, s a configure() metdust kell hvni. (Ezt a
metdust brmelyik mr ltez widgetre alkalmazhatjuk a widget egyik vagy a msik opcijnak
mdostsra).

56 Lsd174:Osztlyknyvtrakattartalmazmodulok

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 220.
Az Application() osztly tartalmazza a program fablaknak a lerst, valamint a hozzkapcsolt
esemnykezelmetdusokat.
20.sor:Alkalmazsunkatinkbba Frame() osztlyblszrmaztatjuk,aminekszmosopcijavan,minta
Tk()sosztlybl.gyazalkalmazsteljesegszbenbevanzrvaegywidgetbe,amitesetlegksbbegy
nagyobbalkalmazsbalehetintegrlni.Mindenesetreemlkezznkr,hogyaTkinterautomatikusanltrehoz
egyTk()tpusmasterablakotennekaFramenekatartalmazsra.

23.24.sorok: A szlosztly constructornak ktelez aktivlsa utn a master attribtumot, amit a


Tkinter minden egyes widgettel automatikusan asszocil hasznljuk az alkalmazs fablakra (a master
ablakra,amirlazelzbekezdsbenbeszltem)valhivatkozsrasacmsorjradefinilsra.
25.29.sorok: Kt slave widget ltrehozsa a f Framenk szmra. A mensor nyilvn a msik
classbandefiniltwidget.
30.sor:Mintbrmelymswidgetet,aFramenketpozcionlnikell.
32.33.sorok:Avszontrlsreszolglmetdusebbenaz osztlyban van definilva (mert avszon
objektumennekarsze),deegymsik osztlybandefiniltslavewidget command opcijvalhvjuk.Eza
slavewidget,amintaztfntebbmagyarztam,abossparamterkzvettsvelveszitamasterwidgetjnek
areferencijt.Valamennyireferenciaapontopertorosminstettnvmegadssalvanhierarchibarendezve.

14.5.2 AZenszekmenhozzadsa
Folytassukprogramunkfejlesztstgy,hogyaMenuBar()classconstructorhozhozzrjuk(a18.sorutn)
akvetkezsorokat:
##### Menu <Zeneszek> #####
self.musi = Menubutton(self, text ='Zenszek')
self.musi.pack(side =LEFT, padx ='3')
# A <Zeneszek> menu legrdl rsze :
me1 = Menu(self.musi)
me1.add_command(label ='17. szzad', underline =1,
foreground ='red', background ='yellow',
font =('Comic Sans MS', 11),
command = boss.showMusi17)
me1.add_command(label ='18. szzad', underline =1,
foreground='royal blue', background ='white',
font =('Comic Sans MS', 11, 'bold'),
command = boss.showMusi18)
# A men integrlsa :
self.musi.configure(menu = me1)
38.
...sazApplication()classhozhozzrjuk(a33.sorutn)akvetkezmetdusdefincikat:
def showMusi17(self):
self.can.create_text(10, 10, anchor =NW, text ='H. Purcell',
font=('Times', 20, 'bold'), fill ='yellow')

def showMusi18(self):
self.can.create_text(245, 40, anchor =NE, text ="W. A. Mozart",
font =('Times', 20, 'italic'), fill ='dark green')

221. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Asorokhozzadsautnmentskscriptnketshajtassukvgre.
A mensorunk most egy kiegszt ment tartalmaz: a
Zenszekment.
Amegfelelmenktelemetknlfl,amikettestreszabott
sznnel s betkszlettel r ki. Ezekbl a dszt technikkbl
tletetmerthetnksajtprojektjeinkhez.Mrtkkelalkalmazzuk
ket!
Nyivnvalanazrt,hogyneneheztsemmegagyakorlatot,a
menpontokhoz kapcsolt parancsok egyszerek: rvid
szvegeketrunkkiavszonra.

Ascriptelemzse
Csaknhnyjdonsgvanezekbenasorokbanameghatrozottbetkszletek(fontopci),akirtszvegek
elshttrsznnek(foregroundsbackground)hasznlatravonatkozan.

Ismtfigyeljkmegazunderlineopcihasznlatt,amiabillentyrvidtseknekmegfelelkaraktertadja
meg(nefelejtskel,hogyastringekkaraktereinekszmozsanulltlkezddik),sklnsenazt,hogyezeknek
awidgetekneka command opcijaa boss attribtumbantroltreferenciasegtsgvelfrhozzmsosztly
metdusaihoz.
Avszoncreate_text()metdustktnumerikusargumentummalkellhasznlni,amikavsznonegypontX
sYkoordinti.Azargumentumkntmegadottszvegehhezaponthozkppestleszpozcionlvaaz anchor
opci vlasztott rtktl fggen. Ez az rtk hatrozza meg, hogyan kell a vsznon kivlasztott ponthoz
lehorgonyozni aszveget:a kzppontjnl, a balfels sarknl, stb. fogva. Azalkalmazott szintaxis az
gtjakmegadsvalanalg(NW=balfelssarok,SE=jobbalssarok,CENTRE=kzepe,stb.).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 222.
14.5.3 AFestkmenhozzadsa:
Ezazjmenazelzhznagyonhasonlmdonvanmegszerkesztve,viszonthozzadtunkegykiegszt
funkcit:akaszkdmenket.rjukaMenuBar()classconstructorhozakvetkezsorokat:
##### <Fest k> menu #####
self.pain = Menubutton(self, text ='Fest k')
self.pain.pack(side =LEFT, padx='3')
# A "legrdl " rsz :
me1 = Menu(self.pain)
me1.add_command(label ='klasszikusok', state=DISABLED)
me1.add_command(label ='romantikusok', underline =0,
command = boss.showRomanti)
# Almen az impresszionista fest knek :
me2 = Menu(me1)
me2.add_command(label ='Claude Monet', underline =7,
command = boss.tabMonet)
me2.add_command(label ='Auguste Renoir', underline =8,
command = boss.tabRenoir)
me2.add_command(label ='Edgar Degas', underline =6,
command = boss.tabDegas)
# Az almen integrlsa :
me1.add_cascade(label ='impresszionistk', underline=0, menu =me2)
# A men integrlsa :
self.pain.configure(menu =me1)

...sazApplication()classbaakvetkezdefincikat:
def showRomanti(self):
self.can.create_text(245, 70, anchor =NE, text = "E. Delacroix",
font =('Times', 20, 'bold italic'), fill ='blue')

def tabMonet(self):
self.can.create_text(10, 100, anchor =NW, text = 'Nymphas Giverny',
font =('Technical', 20), fill ='red')

def tabRenoir(self):
self.can.create_text(10, 130, anchor =NW,
text = 'Le moulin de la galette',
font =('Dom Casual BT', 20), fill ='maroon')

def tabDegas(self):
self.can.create_text(10, 160, anchor =NW, text = 'Danseuses au repos',
font =('President', 20), fill ='purple')

Ascriptelemzse:
Azalmenklncolsvalknnyenltrehozhatktetszlegesmlysgkaszkdmenk(ennekellenrenem
ajnlottaz5szintnlmlyebbegymsbagyazs:afelhasznlkelvesznekbenne).
Egy almen az elz menszint slave menjeknt van definilva (pldnkban me2 az me1 slave
menjekntvandefinilva).Abeillesztstaztnazadd_cascade()metdusbiztostja.

Azegyikmenpontinaktivvvantve(state =DISABLEDopci).Akvetkezpldamegfogjamutatni,
hogyhogyanlehetprogramblaktivlni,illetveinaktivlnimenpontokat.

223. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.5.4 AzOpcikmenbeillesztse:
Ennekamennekadefincijaegykicsitkomplikltabb,mert
Tkinterbelsvltozkhasznlattfogjukbelepteni.
Viszont ennek a mennek a funkcionalitsai jval
kifinomultabbak: a hozzadott opcik lehetv teszik a
ZenszeksFestkmenpontokszndkosaktivlsts
inaktivlst, s magnak a mensornak a kinzett is
mdosthatjuk.

rjukaMenuBar()classconstructorbaakvetkezsorokat:

##### Menu <Options> #####


optMenu = Menubutton(self, text
='Opcik')
optMenu.pack(side =LEFT, padx ='3')
# Tkinter vltozk :
self.relief = IntVar()
self.actPain = IntVar()
self.actMusi = IntVar()
# A menu "legrdl rsze" :
self.mo = Menu(optMenu)
self.mo.add_command(label = 'Aktivls :', foreground ='blue')
self.mo.add_checkbutton(label ='zenszek',
command = self.choiceActive, variable =self.actMusi)
self.mo.add_checkbutton(label ='fest k',
command = self.choiceActive, variable =self.actPain)
self.mo.add_separator()
self.mo.add_command(label = 'Domborzat :', foreground ='blue')
for (v, lab) in [(0,'nincs'), (1,'kiemelked '), (2,'besllyed '),
(3,'rok'), (4,'gerinc'), (5,'keret')]:
self.mo.add_radiobutton(label =lab, variable =self.relief,
value =v, command =self.reliefBarre)
# A men integrlsa :
optMenu.configure(menu = self.mo)

......valamintakvetkezmetdusokdefinciit(mgmindigaMenuBar()classba):
def reliefBarre(self):
choix = self.relief.get()
self.configure(relief =[FLAT,RAISED,SUNKEN,GROOVE,RIDGE,SOLID][choix])

def choiceActive(self):
p = self.actPein.get()
m = self.actMusi.get()
self.pein.configure(state =[DISABLED, NORMAL][p])
self.musi.configure(state =[DISABLED, NORMAL][m])

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 224.
Ascriptelemzse

a) Mencheckboxokkal

Azjlegrdlmennknekktrszevan.Hogyeztnyilvnvalvtegyem,beszrtamegyelvlasztvonalat,
valamintkthamismenpontot(Aktivls:sDomborzat:),amikcsakcmekkntszolglnak.Hogya
felhasznlnekeverjeketsszeazigaziparancsokkal,ezrtsznesenratomkiket.
Azelsrszmenpontjaicheckboxokkalvannakelltva.Amikorafelhasznlrkattintazegrrelazegyik,
vagy a msik menpontra, akkor a megfelel opcik aktivlva vagy inaktivlva vannak s ezeket az
aktv/inaktvllapotokatjelentimegegyx.Azilyentpusmenkelhelyezsreszolglutastsokelg
explicitek.Amenpontokatchekbuttontpuswidgetekkntjelentikmeg:
self.mo.add_checkbutton(label = 'zenszek', command = choixActifs,
variable = mbu.me1.music)

Fontos annak a megrtse, hogy ennek a widgettpusnak szksgszeren van egy bels vltozja, ami a
widgetactv/inactvllapotnaktrolsraszolgl.EznemlehetegykznsgesPythonvltoz,merta
Tkinter knyvtrosztlyaimsnyelvenvannakmegrva.Kvetkezskntegyilyenbelsvltozhozcsakegy
interfacenkeresztlfrhetnkhozz.EzaTkintervltoznaknevezettinterfacevaljbanegyobjektum,
amitegyspecilis osztlybl hozunkltre,amiugyangyrszea Tkinter modulnak,mintawidgetosztlyok.
Ezeknekazobjektumvltozknakviszonylagegyszerahasznlata:
AzIntVar()osztlyazegsztpusvltozkkalekvivalensobjektumokltrehozstteszilehetv.Tehtegy
vagy tbb ilyen objektumvltoznak a ltrehozsval kezdjk, amiket pldnkban j pldny
attribtumokknttrolunk:
self.actMusi=IntVar()
Ezutnazrtkads utna self.actMusi ban hivatkozottobjektumegyegsztpusvltoz
ekvivalenstfogjatartalmaznispecilisTkinterformtumban.
MajdacheckbuttonobjektumvariableopcijtsszekapcsoljukazgydefiniltTkintervltozval:
self.mo.add_checkbutton(label='zenszek',variable=self.actMusi)

Azrtkellgyktlpsbeneljrnunk,mertaTkinternemrendelhetkzvetlenlrtkeketPythonvltozkhoz.
Hasonl okbl a Python sem olvashatja kzvetlenl egy Tkinter vltoz tartalmt. Erre ennek az
objektumosztlynakegyegyspecilismetdustkellhasznlni:aget()57metdust:
m=self.actMusi.get()
EbbenazutastsbanazmkznsgesPythonvltozhozhozzrendeljkegyTkintervltoztartalmt(ami
magaegymeghatrozottwidgethezvankapcsolva).

Azelzekegykicsitbonyolultnaktnhetnekazolvasnak.Gondoljonegyszerenarra,hogymosttallkozik
elszrktklnbzprogramnyelvillesztsnekaproblmjvalegysszetettprojektben

57 EgyTkintervltozbavalrshozaset()metdustkellenehasznlni.
Plda:self.actMusi.set(45)

225. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
b) Menegymstkizrvlasztsokkal

AzOpcikmenmsodikrszelehetvtesziafelhasznlnak,hogyhatlehetsgkzlvlasszakia
mensor kinzett. Magtl rtetdik, hogy egyszerre csak egy lehetsget lehet aktivlni. Ennek a fajta
funkcionalitsnak a hagyomnyos megvalstsa a radiobutton (rdigomb) tpus widgetekkel trtnik.
Ezeknekfontosjellemzje,hogytbbwidgetetkellugyanahhoza Tkinter vltozhoz kapcsolnunk. Mindegyik
rdigombnakklnrtkfelelmegsezazazrtk,amiavltozhozvanrendelve,amikorafelhasznl
kivlasztjaagombot.
gyakvetkezutasts:
self.mo.add_radiobutton(label ='besllyed ', variable =self.relief,
value =3, command =self.reliefBarre)

azOpcikmenegymenpontjtgykonfigurlja,hogyazgyviselkedik,mintegyrdigomb.
Amikorafelhasznlkivlasztjaeztamenpontot,akkoraself.reliefTkintervltozhoza3rtketrendeli
(ez a widget variable opcijnak segtsgvel trtnik) s a reliefBarre() metdus hvsa trtnik meg. Ez
feladataelvgzshezkiolvassaaTkintervltozbantroltrtket.
Ennekamennekaspecilissszefggsben6klnbzlehetsgetakarunkfelknlniafelhasznlnak.
Tehthatradiobuttonravanszksg,amiknekafentihezhasonlhatutaststkdolhatnnk.Ezekcsaka
valueslabelopciikbanklnbznek.Ilyenhelyzetbenazajprogramozsigyakorlat,hogyazopcikrtkeit
egylistbantroljuk,majdeztalisttegyforciklussegtsgveljrjukbe,hogyawidgetobjektumokategyetlen
kzsutastssalhozzukltre:
for (v, lab) in [(0,'nincs'), (1,'kiemelked '), (2,'besllyed '),
(3,'rok'), (4,'gerinc'), (5,'keret')]:
self.mo.add_radiobutton(label =lab, variable =self.relief,
value =v, command =self.reliefBarre)

Alista6tuplebl(rtk,cmke)ll.A6iterrcislpsmindegyikbenegyjradiobuttonelemethozunk
ltre,melyekvalueslabelopciitavslabvltozkkzvettsvelszedjkkialistbl.

Azolvasgyakranfogjatapasztalniasajtprojektjeiben,hogyazilyenutastsoksorozataegytmrebb
programstruktrvalhelyettesthet(ltalbanegylistnaksegyprogramhuroknakakombincijval,minta
fentipldban).
Lassankntmstechnikkatisfelfogfedezni,amikakdmretetcskkentik.Akvetkezfejezetbenmg
egypldtfogokadnierre.Azonbanigyekezznkszbentartaniaztafontosszablyt,hogyegyjprogramnak
mindenekelttolvashatnakskommentezettnekkelllenni.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 226.
c) Utastsvgrehajtsvezrlselistval

MostvizsgljukmegareliefBarre()metdusdefincijt:

Azelssorbanaget()metdussalfrnkhozzegyTkintervltozhoz,amiafelhasznlDomborzat:
almenbelivlasztsnakaszmttartalmazza.
A msodik sorban a choice vltoz tartalmt hasznljuk arra, hogy egy hatelem listbl hozzfrjnka
minket rdekl elemhez. Pldul ha a choice tartalma 2, akkor ez a SUNKEN opci, amit a widget
jrakonfigurlsrafogunkhasznlni.
Achoicevltoztittegylistaelemetkijellindexknthasznljuk.Ennekatmrkonstrukcinakahelyna
kvetkezfelttelvizsglatotprogramozhattunkvolna:
if choice ==0:
self.configure(relief =FLAT)
elif choice ==1:
self.configure(relief =RAISED)
elif choice ==2:
self.configure(relief =SUNKEN)
...
etc.

Szigoranfunkcionlisnzpontblazeredmnyugyanazlenne.Azolvasazonbanbefogjaltni,hogyaz
ltalamvlasztottkonstrukciannlhatkonyabb,minljobbannavlasztsilehetsgekszma.Kpzeljkel,
hogyazegyikprogramunkbannagyonnagyszmelemkzlkellvlasztani:azelzkonstrukcivalesetleg
odajutnnk,hogytbboldalnyielifetkdolnnk!

UgyaneztatechnikthasznlomachoiceActive()metdusban.gya:
self.pain.configure(state =[DISABLED, NORMAL][p])

utasts a p vltoz tartalmt hasznlja indexknt annak megadsra, hogy a DISABLED, NORMAL
llapotokmelyiktkellkivlasztaniaFestkmenjrakonfigurlshoz.
Hvsakora choiceActive() metdus jrakonfigurljaamensorFestksZenszekmenit,hogy
normlkntvagyinaktivltkntjelentsemegketazmspvltozkllapotnakfggvnyben,amika
Tkintervltozktkrkpei.
Azmspkzbensvltozkigazblcsakascriptrthetvttelreszolglnak.Kikszblhetksascrip
mgtmrebbtehetazutastsokkompozcijval.Akvetkezktutastst:
m = self.actMusi.get()
self.musi.configure(state =[DISABLED, NORMAL][m])

pldulhelyettesthetnnkegyutastssal:
self.musi.configure(state =[DISABLED, NORMAL][self.actMusi.get()])

Jegyezzk meg, hogy amit a tmrsggel nyernk, azrt az olvashatsg bizonyos mrtk romlsval
fizetnk.

227. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
d) Egymenpontelvlasztsa

Gyakorlatunk befejezseknt nzzk mg meg, hogyan lehet elre meghatrozni bizonyos vlasztsokat,
illetveprogramblmdstaniazokat.
rjukazApplication()osztlyconstructorhozakvetkezutastst(pldulaself.pack()utastsel):
mBar.mo.invoke(2)

Azgymdostottscriptlefuttatsakormegllaptjuk,hogyindulskoramensorFestkmenpontjaaz
aktv, mg a Zenszek az inaktv. Ahogyan programozva vannak, gy alaprtelmezetten mindkt
menpontnakaktvnakkelllenni.svalbangyvan,hatrljka:

mBar.mo.invoke(2) utastst.

Azrtjavasoltamennekazutastsnakascriptbeillesztst,hogymegmutassam,hogyanlehet programmal
elrniugyanazt,amitnormlisanegyegrkattintssalkapunk.
AfentiutastsazmBar.mowidgetethvjaawidgetmsodikelemhezkapcsoltparancsotmkdsbehozva.
Alisttmegnzveigazolhatjuk,hogyezamsodikelemacheckbuttontpusobjektum,amiaktivlja/inaktivlja
aFestkment.(Ismtidzzkemlkezetnkbe,hogyaszmozsmindignullvalkezddik.)
Aprogramindtsakormindengytrtnik,minthaafelhasznlelszrazOpcikmenFestk
menpontjrakattintana,aminekahatsaamegfelelmeninaktivlsa.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 228.
15.Fejezet: Konkrtprogramokelemzse
Ebbenafejezetbenmegprblombemutatniegygrafikusprogramfejlesztsnekamenettazelsvzlatoktl
egszen egy viszonylag elrehaladott fejlesztsi stdiumig. gy szeretnm megmutatni, hogy az objektum
orientltprogramozsmennyireletudjaegyszerstenisfkntmilyen biztonsgoss tudjatenniajavasolt
inkrementlisfejlesztsistratgit58.
Akkor kell osztlyokat alkalmazni, amikor egy projekt a megvalstsa sorn lnyegesen sszetettebbnek
mutatkozik, mint ahogy a kiindulskor kpzeltk. Biztosan az olvas projektjei is az albbiakban lertakhoz
hasonlfejldsifokozatokonfognaktmenni.

15.1 gyprbaj
Eztaprojektet59avgzstanulkegyhasonlmunkjainspirlta.
Azilyenprojektekvzlattrajzokkalssmkkalrdemeskezdeni,amikaklnbzltrehozandgrafikus
elemeket s maximlis szm use caset rnak le. Ha viszolygunk a papr s ceruza hasznlattl, akkor
hasznlhatunkolyanrajzolprogramot,mintamilyenazOpenOffice.org 60Drawprogramja.nezthasznltamaz
albbismkelksztshez:
Aalaptletegyszer:ktjtkosllegymssalszembenegyegygyval.Mindegyiknekbekelllltania
lvsszgtsigyekeznikelleltallniazellenfelet.Alvedkekballisztikusplytrnakle.

58 Lsd:Hibakeresssksrletezs(16.oldal),valamint:Ablakokmenkkel(218.oldal)
59 Azrtbeszljkmegegyjtkprogramfejlesztst,mertegymindenkiszmrakzvetlenlhozzfrhetterletrl
vanszsakonkrtclokknnyenazonosthatk.Magtlrtetdenugyanezekatechnikkfelhasznlhatkms
komolyabbalkalmazsokesetnis.
60 EzazMSOfficeszalkompatibilis,komplett,szabad,ingyenes,irodaiprogramcsomag.Linux,Windows,MacOS,
Solaris...alattrendelkezsrell.Eztaknyvetteljesegszbenaszvegszerkesztjvelksztettem.
Letltheta:http://www.openoffice.orgwebsiterl.

229. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Azgykhelyeajtkelejnvletlenszerenvanmeghatrozva(legalbbismagassgban).Azgykminden
lvsutnelmozdulnak(azrt,hogyfokozzukajtkrdekessgt,mertazgykbelltsagynehezebb).A
tallatokatszmoljuk.
Az elz oldal bevezet rajza kpezheti az elemzs egyik formjt. Egy programprojekt fejlesztsnek a
megkezdseelttmindigtrekednnkkellegyrszletes feladatmeghatrozsksztsre.Ezazeltanulmny
nagyon fontos. A kezdk tbbsge tlsgosan gyorsan kezd el egy homlyos elkpzelsbl kiindulva
programot rni. Kzben elhanyagoljk a problma struktrjnak a kutatst. gy azt kockztatjk, hogy
programjukkaotikussvlik,mertastruktrtelbb,vagyutbbhelyrekelltenni.Gyakranazttapasztaljk,
hogytrlnikkellsjrakellrniukaprojektjktlmonolitikuss/vagyrosszulparamterezettrszeit.

Tlmonolitikus:ezaztjelenti,hogyelmulasztottakegykomplexproblmttbbegyszerbbrszproblmra
felbontani.Pldulfggvnyekvagyosztlyokhvsahelyetttbbegymstkvetsszetettutaststgyaztak
egymsba.
Rosszul paramterezett:ezaztjelenti, hogycsak egyspecilisesetetkezeltek azltalnoseset helyett.
Pldul egy grafikus objektumnak rgztettk a mreteit ahelyett, hogy az tmretezst lehetv tev
vltozkrlgondoskodtakvolna.
Egyprojektfejlesztstmindigalehetlegmlyebbrehatelemzsselkellkezdenisazelemzseredmnyt
egyolyandokumentumegyttesben(smk,tervek,lersok)kellkonkretizlni,amia feladatmeghatrozst
fogjaalkotni.Nagylptkprogramokszmraegybkntrendkvlkidolgozottanalitikusmdszereklteznek
(UML,Merise...).Ezeketnemrhatomittle,mertegszknyvektrgytkpezik.
Amikoreztmondom,sajnoselkellfogadjam,hogynagyonnehz(stvalsznleglehetetlen)megvalstani
egyprogramprojektkomplettanalzistakiindulstlkezdve.Egyprogramcsakakkormutatjamegagyengit,
amikor mkdni kezd. Ekkor llaptjuk meg, hogy maradtak olyan use caseek s knyszerek, amiket a
kiindulskor nem lttunk elre. Msrszt egy programprojektet gyakorlatilag arra sznunk, hogy fejldjn.
Gyakranelfogfordulni,hogyafejlesztssornmdostanikellafeladatmeghatrozstsnemfelttlenlazrt,

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 230.
mertakiindulsielemzshibsvolt,hanemegyszerencsakazrt,mertkiegsztfunkcionalitsokatakarunk
hozztenni.
mindigakvetkezktszablybetartsvalkzeltsnkegyjprogramprojekthez:
Azelskdsorokszerkesztseelttmlysgbenrjukleaprojektnket.Mindenernkkeltrekedjnkarra,
hogynyilvnvalvtegykmikafkomponenseismilyenrelcikkapcsoljkketssze(gondoljunka
programunkklnbzusecaseeinekalersra).
Amikorhozzkezdnkprogramunktnylegesmegvalstshoz,kerljkatlsgosannagyutastsblokkok
rst.Inkbbbontsukazalkalmazsunkatnagyobbszm,jlparametrizlhatzrtkomponensregy,hogy
brmelyikk knnyen mdosthat legyen a tbbi mkdsnek veszlyeztetse nlkl s esetleg jra
felhasznlhatlegyenklnbzsszefggsekben,haaszksggyhozza.
Ennekazignynekakielgtsretalltkkiazobjektumorientltprogramozst.
Tekintskpldulazelzoldalonlerajzoltvzlatot.
A kezd programoz ennek a jtknak az elksztst taln csak procedurlis programozssal fogja
megksrelni (vagyis elmulaszt j osztlyokat definilni). Egybknt magam is gy jrtam el vgig a 8.
fejezetbenagrafikusinterfaceekelsmegkzeltsesorn.Ezazeljrsazonbancsakanagyonkisprogramok
esetbenigazolhat(gyakorlatokselzetestesztekesetben).Amikoregynagyprojektbekezdnk,ajelentkez
problmkkomplexitsagyorsanmegnselkerlhetetlennvlikarszproblmkrabontsuk.
Ennekarszproblmkrabontsnakaprogrameszkzeazosztly(classe).
Talnjobbanmegrtjkahasznt,haegyanalgitalkalmazok:
Mindenelektomosberendezskisszmalapkomponensblll:tranzisztorokbl,didkbl,ellenllsokbl,
kondenztorokbl,stb.Azelsszmtgpeketkzvetlenlezekblazalkatrszekblptettk.Nagymretek,
drgkvoltak,radsulnagyonkevsfunkcijukvoltsgyakranmeghibsodtak.
Klnbz technikkat fejlesztettek ki arra, hogy ugyanabba a dobozba bizonyos szm alapkomponenst
integrljanak (zrjanak be). Ezeknek az j integrlt ramkrknek a hasznlathoz mr nem volt szksg a
pontos felptsk ismeretre: csak a globlis funkcijuk volt rdekes. Az els integrlt ramkrk mg
viszonylag egyszerek voltak: logikai ramkrk, kapcsolk, stb. Ezeket egymssal kombinlva olyan
bonyolultabb jellemzj ramkrket kaptak, mint amilyenek a regiszterek s a dekderek, amiket tovbb
lehetettintegrlnisgytovbbegszenamaimikroprocesszorokig.Ezektbbmillikomponensttartalmaznak,
samegbzhatsgukmgisigennagymarad.
Kvetkezsknt,egymodernvillamosmrnknek,akipldulegybinrisszmllt(ezegyolyanramkr,
amibizonyosszmkapcsolttartalmaz)akarkszteninyilvnjvalegyszerbb,gyorsabbsbiztosabbintegrlt
ramkrkblvlogatni,mintazzalfradni,hogytbbszztranzisztortsellenllstptsensszehibanlkl.
Analgmdon,amodernprogramozhaszntlthatjaeldeisszegyltmunkinak,amikoraPythonbanmr
rendelkezsrellnagyszmknyvtrbasosztlybaintegrltfunkcionalitsthasznlja.Mgjobb,hogyasajt
alkalmazsafkomponenseinekklnsenazoknak,amiktbbpldnybanjelennekmegazalkalmazsban
egysgbezrsra maga is knnyen ltre tud hozni osztlyokat. Az ilyen eljrs egyszerbb, gyorsabb s
biztosabb,mintahasonlutastsblokkokmegtbbszrzseegyegyrenagyobbmretsegyrekevsbrthet
monolitikusprogramban.
Vizsgljukmegpldulavzlatunkat.Ajtklegfontosabbkomponenseinyilvnazgyk,amiketklnbz
helyekensklnbzirnyokbakellmegrajzolni.Legalbbktpdnykellmajdbellk.
Ahelyett, hogy a jtk sorn alkotrszeikbl rajzolnnk fel a vszonra, az az rdeknk, hogy egysges
programobjektumoknak tekintsk ket, amiknek szmos tulajdonsga s reakcija (viselkedse) van. (Azt

231. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
akaromezzelkifejezni,hogyelkelllegyenekltvaklnbzmechanizmusokkal,amiketspecilis metdusok
segtsgvelprogramblaktivlhatunk.)Biztos,hogysszerrjuksznniegyspecilisosztlyt.

15.1.1 ACanon(gy)osztlyprototpusa
Egyilyenosztlydefinilsvaltbblegyettnkegycsapsra.Nemcsakegydobozbagyjtjksszea
rajznak s az gymkdsnek megfelel sszes kdot a program tbbi rsztl kln, hanem arra is
lehetsgetadunk,hogyajtkbanknnyenltrehozhassunktetszlegesszmgyt.Ezmegnyitjaaksbbi
fejlesztsektvlatt.
A Canon() (gy)osztly els implementcijnakelksztsestesztelsesornlehetsgnkleszarra,
hogykiegsztjellemzk hozzadsvalgy tkletestsk azosztlyt, hogy az interfacet(azalkalmazsi
mdjt,azazazokatazutastsokat,amikaklnbzalkalmazsokbanazosztlyobjektumainakltrehozshoz
sazokhasznlathozszksgesek)ne,vagycsakkismrtkbenmdostsuk.
Vgjunkadolgokkzepbe.
Azgynkrajztrendkvlleegyszersthetjk.Egykrsegytglalap
kombincijaknt foghatjuk fel. A tglalapot egy vastag, egyenes
szakasznaktekinthetjk.
Ha egy sznnel tltjk ki az brt (pldul feketvel), akkor gyra
emlkeztetalakotkapunk.
Meggondolsainksornaztfelttelezzk,hogyazgypozicijtakr
kzppontjaadjameg(azxsykoordintkarajzon).Ezapontadjamegaz h
gycs forgstengelyt is, valamint az gycsvet reprezentl szakasz a
egyikvgt.
b
Rajzunk befejezseknt mg meg kell hatrozni a szakasz msik
vgpontjnakkoordintit. Haemlksznkatrigonometribl asinussa
cosinusfogalmra,akkoreznemfognehzsgetokozni:
Egy derkszg hromszgben egy szggel szemkzti oldal s az tfog hnyadosa a szg sinusa.
Ugyanennekaszgnekacosinusaaszgmellettioldalsaztfoghnyadosa.

a b
gyaszemkztibrban: sin = s cos = .
h h
Azgycsreprezentlshoz,feltve,hogyismerjkazgycslhossztsalvsaszgt,akr(xsy
koordintj) kzppontjtl kellhznunkegyvastag szakaszt,aminekavzszinteshossza Dx= l.cos xa sa
D y=l.sina.
fgglegeshosszaH
sszefoglalvaakvetkezkblfogllniegygyrajzolsaazx,ypontba:
rajzolunkegyx,ykzppontfeketekrt

egyvastagfeketeszakasztrajzolunkazx,yponttlazx+l.cos,y+l.sin.pontig

MostelkezdhetnkgondolkodniaCanonosztlynakmegfelelprogramvzon.Ittmgnemvetdikfela
jtkprogramozsnakkrdse.Csakaztakarjukellenrizni,hogyazeddigielemzsnkazelsmkdkpes
prototpusmegvalstsnakirnybamutate.
A prototpus egy elgondols kiksrletezsre sznt programocska, amit azutn egy nagyobb mret
alkalmazsba szndkozunk bepteni. Az egyszersge s a tmrsge miatt a Python nagyon alkalmas

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 232.
prototpusok kidolgozsra. Sok programoz hasznlja klnbz programkomponensek fejlesztsre, amiket
aztnesetlegmsfajslyosabbprogramnyelven,mintpldulaC,jraprogramoznak.
ElsprototpusunkbanaCanon()osztlynakcsakktmetdusavan:egyconstructor,amiarajzalapelemeit
hozzaltresegymsikmetdus,amilehetvteszialvsszgnek(azgycsdlsszgnek)belltst.
Ahogyan ms pldkban gyakran megtettem, most is teszek a script vghez nhny kdsort, hogy rgtn
tesztelnilehessenazosztlyt:

1. from Tkinter import *


2. from math import pi, sin, cos
3.
4. class Canon:
5. """gyrajz"""
6. def __init__(self, boss, x, y):
7. self.boss = boss # a vszon hivatkozsa
8. self.x1, self.y1 = x, y # az gy forgstengelye
9. # az gycsvet vzszintesre rajzolja a kezdshez :
10. self.lagyucso = 50 # gycs hossza
11. self.x2, self.y2 = x + self.lagyucso , y
12. self.cso = boss.create_line(self.x1, self.y1, self.x2, self.y2,
13. width =10)
14. # utna az gy testt fellre rajzolja :
15. r = 15 # a kr sugara
16. boss.create_oval(x-r, y-r, x+r, y+r, fill='blue', width =3)
17.
18. def iranyzas(self, angle):
19. "az gycs szgnek kivlasztsa"
20. # rem : az <angle> paramtert stringknt kapja.
21. # vals szmm kell alaktani, utna radinn :
22. self.angle = float(angle)*2*pi/360
23. self.x2 = self.x1 + self.lagyucso*cos(self.angle)
24. self.y2 = self.y1 - self.lagyucso*sin(self.angle)
25. self.boss.coords(self.cso, self.x1, self.y1, self.x2, self.y2)
26.
27. if __name__ == '__main__':
28. # kd a Canon osztly tesztelsre:
29. f = Tk()
30. can = Canvas(f,width =250, height =250, bg ='ivory')
31. can.pack(padx =10, pady =10)
32. c1 = Canon(can, 50, 200)
33.
34. s1 =Scale(f, label='D lsszg', from_=90, to=0, command=c1.iranyzas)
35. s1.pack(side=LEFT, pady =5, padx =20)
36. s1.set(25) # kezd szg
37.
38. f.mainloop()

Magyarzatok:
6. sor: Abban a paramterlistban, amit az objektum ltrehozsakor a constructornak majd t kell adni,
megadjuk az gy helyzett a vsznon meghatroz x sy koordintkat, a vszon referencijt (a boss
vltoz).Ezareferencianlklzhetetlen:avszonmetdusainakhvsakorfogjukhasznlni.
Bevehetnnkmgegyparamtertalvskezdszgnekkivlasztshoz,demivelegyspecifikusmetdust
akarunkimplementlniazirnyzsszablyozsra,ezrtsszerbbleszaztakvntpillanatbanhvni.
7.s8.sor:Ezeketavltozkatazokbanametdusokbanfogjukhasznlni,amiketaksbbiekbenfogunk
kifejleszteniazosztlyhoz.Pldnyvltozkkkelltennnkket.
9.16.sorok:Elszrkirajzoljukazgycsvet,majdazgytestet.gyacsegyrszetakarvamarad.Ez
lehetvtesziazgytestesetlegessznezst.
18.25.sorok:Eztametdustegyangle(szg)paramterrelhvjuk,amifokokbanvanmegadva(sa
vzszintestlmrjk).HaaparamterrtktegyEntryvagyScalewidgetsegtsgvelhozzukltre,akkorazt

233. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
stringformjbanfogjuktadniametdusnak,ezrtmieltt(azelzoldalonlert)szmolsrahasznlnnk,
valsszmmkelltalaktanunk.
27.38.sorok:AzjosztlyunktesztelshezegyScalewidgetethasznlunk.Acursorakezdpozcijnak
definilshozsgyazgykezddlsszgnekmeghatrozshozaset()metdustkellhvni(36.sor).

15.1.2 Metdusokhozzadsaaprototpushoz
Prototpusunk mkdkpes, de nagyon kezdetleges.
Tkletestennkkell.Hozzkelladnunkalvedkekkilvsnek
kpessgt.
Alvedkeketgygolykkntkezeljk:egyszerkiskrk
lesznek, amik az gycsvel megegyez irnyban egy
kezdsebessggellpnekkiazgytorkbl.Ahhoz,hogyvalsgos
rpplyt rassunk le velk, most egy kicsit el kell mlyedjnk a
fizikban:
Hogyanhaladegymagrahagyotttest,haelhanyagolunkolyan
msodlagosjelensgeket,mintamilyenalevegkzegellenllsa?
A problma sszetettnek tnhet, de nagyon egyszer a
megoldsa:elghaelfogadjuk,hogyalvedkegyidejlegmozog
vzszintesen s fgglegesen s ez a kt mozgs egymstl
fggetlen.
Egy animcis ciklust fogunk rni, amiben szablyos
idkznkntjra szmoljuk a lvedk x sy koordintit, tudva
hogy:
Avzszintesirnymozgsegyenletes.MindeniterrcibanugyanaztaDxelmozdulstkellhozzadniazx
koordinthoz.
A fggleges irny mozgs egyenletesen gyorsul. Ez azt jelenti, hogy minden iterrciban az y
koordinthozegynvekvDyelmozdulstkelladnunk,amimindigugyanazzalamennyisggeln.
Nzzkmegeztascriptben:
A)Kezdskntakvetkezsorokatkellaconstructormetdusvghezrni.Ezekalvedkobjektumsegy
pldnyvltoz (ez az animci megszaktshoz kell) ltrehozsra valk. Kiindulskor minimlis mret
lvedkethozunkltre(egy1pixeleskrt)azrt,hogyszintelthatatlanmaradjon:
# lvedk rajzolsa (animci el tt egy pontra van reduklva) :
self.lovedek =boss.create_oval(x, y, x, y, fill='red')
self.anim =False # az animci megszaktja
# a vszon szlessgnek s magassgnak meghatrozsa :
self.xMax =int(boss.cget('width'))
self.yMax =int(boss.cget('height'))

Aktutolssoramasterwidget(esetnkbenezavszon)cget()metdusthasznljaawidgetjellemzinek
meghatrozsra. Azt akarjuk, hogy a Canon osztly ltalnos legyen, vagyis brmilyen krnyezetben jra
felhasznlhatlegyen.Ezrtnemszmolhatunkelreannakavszonnakamreteivelamineztazgythasznlni
fogjuk.
Megjegyzs:ATkinterezeketazrtkeketstringekformjbanadjavissza.Ezrtazokatnumerikustpusskell
alaktani,haaszmolsainkbanhasznlniakarjukket.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 234.
B) Utna kt j metdust kell hozzadnunk: egyet a kilvsre s egy msikat arra, hogy a kiltt golyt
animljuk:

1. def tuz(self):
2. "gygoly kilvse"
3. if not self.anim:
4. self.anim =True
5. # a goly indulhelyzete (az gycs vge) :
6. self.boss.coords(self.lovedek, self.x2 -3, self.y2 -3,
7. self.x2 +3, self.y2 +3)
8. v =15 # kezd sebessg
9. # ennek a sebbessgnek a vzszintes s fgg leges komponensei :
10. self.vy = -v *sin(self.angle)
11. self.vx = v *cos(self.angle)
12. self.animal_lovedek()
13.
14. def animal_lovedek(self):
15. "goly animcija (ballisztikus plya)"
16. if self.anim:
17. self.boss.move(self.lovedek , int(self.vx), int(self.vy))
18. c = self.boss.coords(self.lovedek ) # j koord. a mozgs utn
19. xo, yo = c[0] +3, c[1] +3 # lvedk kzppontjnak koord.
20. if yo > self.yMax or xo > self.xMax:
21. self.anim =False # animci lelltsa
22. self.vy += .5
23. self.boss.after(30, self.animal_lovedek)

Magyarzatok:
1.4.sorok:Eztametdustegygombratrtnkattintshvja.Elindtjaalvedkmozgstsigaz
rtketrendelazanimcimegszaktshoz(aself.animvltozhoz:lsdakvetkezket).Biztostanunk
kell,hogyazanimciidtartamaalattijabbkattintsagombraneaktivlhassonmsparazitaanimcis
ciklusokat. A 3. sorban vgrehajtott tesztnek ez a szerepe. Az utna kvetkez utastsblokk csak akkor
hajtdikvgre,haaself.animvltozrtkehamis,amiaztjelenti,hogyazanimcimgnemkezddtt
el.
5.7.sorok:ATkintervszonnakktmetdusavanagrafikaiobjektumokmozgatsra:
A coords() metdus abszolt pozcionlst vgez; viszont meg kell neki adni az objektum sszes adatt
(mintha jra rajzolnnk). A 17. sorban hasznlt move() metdus egy relatv elmozdtst vgez; csak kt
argumentumothasznl,akvntelmozdulsvzszintessfgglegeskomponenseit.
8.12. sorok: A lvedk kezdsebessgt a 8. sorban vlasztjuk meg. Amint azt az elz oldalon
magyarztam, a lvedk mozgsa egy vzszintes s egy fggleges mozgs eredje. Ismerjk a
kezdsebessgt s a szgt (a lvs szgt). A sebessg vzszintes s fggleges komponensnek a
meghatrozshozhasonltrigonometrikussszefggseketkellhasznlnunk,mintamilyeneketazgycs
rajzolsnlhasznltunk.A9.sorban ajelonnan ered,hogy afgglegeskoordintkatfellrllefel
szmoljuk.
A12.soraktivljaazanimcit.
1423.sorok:Ezazeljrsa23.sorbanhvottafter()metdusrvn30mseconkntjrahvjanmagt.Ez
mindaddigismtldik,amgaself.anim(animcimegszakts)vltozrtkeigaz.Ezazrtkmeg
fogvltozniamikoralvedkkoordintitlpikazelrthatrokat(20.sortesztje).
18.19. sorok: Ahhoz, hogy minden egyes elmozduls utn meghatrozzuk ezeket a koordintkat, mg
egyszer hvjuk a vszon coords() metdust: ha ennek egyetlen argumentuma van, ami egy grafikus
objektum referencija, akkor visszatrsi rtkknt egy tupleben megadja a grafikus objektum ngy
koordintjt.

235. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
17.s22.sorok:Alvedkvzszinteskoordintjamindigugyanannyivaln(egyenletesmozgs),mga
fgglegeskoordintjaegyolyanmennyisggelnvekszik,amimindenalkalommalmagaisnvekszika22.
sorban(egyenletesengyorsulmozgs).Azeredmnyegyparabolikusplya.
Emlkeztet:a+=opertoregyvltoztinkrementl:a+=3azonosa=a+3mal.
C)Vglegyindtgombotkellafablakhozadnunk.Akvetkezsor(atesztkdbakellbeszrni)tkletesen
megfelelerreaclra:
Button(f, text='T z !', command =c1.tuz).pack(side=LEFT)

15.1.3 Azalkalmazsfejlesztse
Mostmr,hogyvanegyelgjlkidolgozottcanon(gy)osztlyunk,fontolravehetjkazalkalmazs
kidolgozst.Mivelazobjektumorientltprogramozsmdszernekalkalmazsamellettdntttnk,ezrteztaz
alkalmazst olyan objekumok egytteseknt kell elksztennk, amik a metdusaik kzvettsvel hatnak
egymsra.

Termszetesenszmosobjektummrltezosztlyokblszrmazik:mintavszon,agombok,stb.Azelz
oldalakon lttuk, hogy az az rdeknk, hogy ezeknek az alapobjektumoknak jl meghatrozott egytteseit
minden olyan alkalommal j osztlyokk egyestsk, amikor ezeknek az egytteseknek a szmra specilis
funkcionalitsttudunkazonostani.Ezvoltahelyzetpldulakrksamozgvonalakcsoportjaesetben,
amikrlgydntttnk,hogycanonnak(gynak)fogjukhvni.
Tudunke mg azonostani az indul projektnkben ms komponenseket, amiket rdemes j osztlyokba
bezrni?Biztosan.Pldulottvanavezrlpult,amitszeretnnksszektnimindenegyesgyval:ezenlehet
sszegyjteni az gycs dlsszgt vezrl eszkzt, a tzgombot, a tallatszmllt s esetleg mg ms
kijelzseket,mintamilyenpldulajtkosneve.Azrtisrdemesnekiklnosztlytkrelni,mertelretudjuk,
hogyktvezrlpultraleszszksg.
Termszetesenottvanmagaazalkalmazs.Eztegyosztlybazrvaelksztjkafobjektumunkat,amiaz
sszestbbiobjektumotvezrelnifogja.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 236.
Mostpedigelemezzkazalbbiscriptet.Megtalljuk benneatovbbfejlesztett Canon() (gy)osztlyt:
hozzadtamnhnyattribtumotshromkiegsztmetdust,hogykezelnilehessenazgykelmozdulsts
atallatokat.

MostantlfogvaazApplication()osztlyhelyettestiazelzprototpusoktesztkdjt.KtCanon()skt
VezerloPult() objektumot hozunk ltre, amiket a ksbbi fejlesztst elre ltva sztrakba tesznk
(elkpzelhetazgyksgyavezrlpultokszmnaknvelse).Ajtkmostmkdkpes:azgykminden
lvsutnelmozdulnaksatallatokatszmlljk.

1. from Tkinter import *


2. from math import sin, cos, pi
3. from random import randrange
4.
5. class Canon:
6. """gyrajz"""
7. def __init__(self, boss, id, x, y, irany, szin):
8. self.boss = boss # vszon hivatkozsa
9. self.appli = boss.master # alkalmazsablak hivatkozsa
10. self.id = id # gy azonostja (chane)
11. self.szin = szin # gy szne
12. self.x1, self.y1 = x, y # gy forgstengelye
13. self.irany = irany # lvs irnya (-1:balra, +1:jobbra)
14. self.lagyucso = 30 # gycs hossza
15. self.angle = 0 # alaprtelm. d lsszg(lvs szge)
16. # vszon magassgnak s szlesgnek meghatrozsa :
17. self.xMax = int(boss.cget('width'))
18. self.yMax = int(boss.cget('height'))
19. # gycs rajzolsa (vzszintes) :
20. self.x2, self.y2 = x + self.lagyucso * irany, y
21. self.cso = boss.create_line(self.x1, self.y1,
22. self.x2, self.y2, width =10)
23. # gytest rajzolsan (sznes kr) :
24. self.rc = 15 # kr sugara
25. self.test = boss.create_oval(x -self.rc, y -self.rc, x +self.rc,
26. y +self.rc, fill =szin)
27. # rejtett lvedk el rajzolsa (pont a vsznon kvl) :
28. self.lovedek = boss.create_oval(-10, -10, -10, -10, fill='red')
29. self.anim = False # animci indiktor
30. self.explo = False # robbans indiktor
31.
32. def iranyzas(self, angle):
33. "gy d lsszgnek szablyozsa"
34. # megjegyzs: az <angle> paramtert stringknt kapja meg.
35. # vals rtkk, majd radinn kell alaktani :
36. self.angle = float(angle)*pi/180
37. # rem: inkbb a coords metdust hasznljuk egszekkel :
38. self.x2 = int(self.x1 + self.lagyucso * cos(self.angle) *
self.irany)
39. self.y2 = int(self.y1 - self.lagyucso * sin(self.angle))
40. self.boss.coords(self.cso, self.x1, self.y1, self.x2, self.y2)
41.
42. def elmozdit(self, x, y):
43. "j x, y pozciba viszi az gyt"
44. dx, dy = x -self.x1, y -self.y1 # elmozduls rtke
45. self.boss.move(self.cso, dx, dy)
46. self.boss.move(self.test, dx, dy)
47. self.x1 += dx
48. self.y1 += dy
49. self.x2 += dx
50. self.y2 += dy
51.
52. def tuz(self):
53. "goly kilvse csak ha az el z befejezte a rptt"

237. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
54. if not (self.anim or self.explo):
55. self.anim =True
56. # a jelenlv sszes gy lersnak sszegy jtse :
57. self.guns = self.appli.dictionnaireCanons()
58. # a lvedk kiindulsi pozcija (ez az gy torka) :
59. self.boss.coords(self.lovedek, self.x2 -3, self.y2 -3,
60. self.x2 +3, self.y2 +3)
61. v = 17 # kezd sebessg
62. # kezd sebessg vzszintes s fgg leges komponense :
63. self.vy = -v *sin(self.angle)
64. self.vx = v *cos(self.angle) *self.irany
65. self.animal_lovedek()
66. return True # => jelzi, hogy elindult a lvedk
67. else:
68. return False # => nem lehetett kil ni a lvedket
69.
70. def animal_lovedek(self):
71. "lvedk animcija (ballisztikus plya)"
72. if self.anim:
73. self.boss.move(self.lovedek, int(self.vx), int(self.vy))
74. c = self.boss.coords(self.lovedek) # k koordintk
75. xo, yo = c[0] +3, c[1] +3 # lvedk kzepnek koord.-ja
76. self.test_akadaly(xo, yo) # elrtnk egy akadlyt ?
77. self.vy += .4 # fgg leges gyorsuls
78. self.boss.after(20, self.animal_lovedek)
79. else:
80. # animci vge lvedk elrejtse s gyk elmozdulsa :
81. self.animacio_vege()
82.
83. def test_akadaly(self, xo, yo):
84. "teszteljk, hogy a lvedk elrt- egy clt, vagy a jtk hatrt"
85. if yo >self.yMax or xo <0 or xo >self.xMax:
86. self.anim =False
87. return
88. # megvizsgljuk az gyk sztrt annak eldntsre, hogy
89. # valamelyik gy nincs-e kzel a lvedkhez :
90. for id in self.guns: # id = kulcs a sztrban.
91. gun = self.guns[id] # megfelel rtk
92. if xo < gun.x1 +self.rc and xo > gun.x1 -self.rc \
93. and yo < gun.y1 +self.rc and yo > gun.y1 -self.rc :
94. self.anim =False
95. # lvedk robbanst rajzolja (srga ) :
96. self.explo = self.boss.create_oval(xo -12, yo -12,
97. xo +12, yo +12, fill ='yellow', width =0)
98. self.hit =id # eltallt cltrgy referencija
99. self.boss.after(150, self.robbanas_vege)
100. break
101.
102. def robbanas_vege(self):
103. "robbans trlse ; lvedk jrainicializlsa ; pontszm kezelse"
104. self.boss.delete(self.explo) # robbans trlse
105. self.explo =False # j lvs engedlyezse
106. # jelzi a sikert a master-ablaknak :
107. self.appli.goal(self.id, self.hit)
108.
109. def animacio_vege(self):
110. "vgrehajtand akcik, amikor a lvedk elrte a rpplyja vgt"
111. self.appli.agyuk_szetszorasa () # az gyk elmozdtsa
112. # lvedk elrejtse (a vsznon kvlre kldve) :
113. self.boss.coords(self.lovedek, -10, -10, -10, -10)
114.
115.
116. class VezerloPult(Frame):
117. """Egy gyhoz asszocilt vezrl pult"""
118. def __init__(self, boss, canon):
119. Frame.__init__(self, bd =3, relief =GROOVE)
120. self.score =0
121. self.appli =boss # az alkalmazs hivatkozsa
122. self.canon =canon # az asszocilt gy hivatkozsa
123. # A lvs szgt vezrl rendszer :

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 238.
124. self.beallitas =Scale(self, from_ =75, to =-15,
125. troughcolor= canon.szin, command =self.iranyzas)
126. self.beallitas.set(45) # a lvs kezd szge
127. self.beallitas.pack(side =LEFT)
128. # Az gyt azonost cmke :
129. Label(self, text =canon.id).pack(side =TOP, anchor =W, pady =5)
130. # T zgomb :
131. self.bTuz =Button(self, text ='T z !', command =self.tuzel)
132. self.bTuz.pack(side =BOTTOM, padx =5, pady =5)
133. Label(self, text ="pont").pack()
134. self.pontok =Label(self, text=' 0 ', bg ='white')
135. self.pontok.pack()
136. # az gy irnynak megfelel en balra vagy jobbra pozcionlni :
137. if canon.irany == -1:
138. self.pack(padx =5, pady =5, side =RIGHT)
139. else:
140. self.pack(padx =5, pady =5, side =LEFT)
141.
142. def tuzel(self):
143. "az asszocilt gy tzelsnek indtsa"
144. self.canon.tuz()
145.
146. def iranyzas(self, angle):
147. "az asszocilt gy d lsszgnek belltsa"
148. self.canon.iranyzas(angle)
149.
150. def pontHozzaadasa(self, p):
151. "a pontszm nvelse vagy cskkentse"
152. self.score += p
153. self.pontok.config(text = ' %s ' % self.score)
154.
155. class Application(Frame):
156. '''Az alkalmazs f ablaka'''
157. def __init__(self):
158. Frame.__init__(self)
159. self.master.title('>>>>> Bum ! Bum ! <<<<<')
160. self.pack()
161. self.jatek = Canvas(self, width =400, height =250, bg ='ivory',
162. bd =3, relief =SUNKEN)
163. self.jatek.pack(padx =8, pady =8, side =TOP)
164.
165. self.guns ={} # a jelen lev gyk sztra
166. self.pult ={} # a jelen lev vezrl pultok sztra
167. # 2 gy-objektum ltrehozsa (+1, -1 = ellenttes irnyok) :
168. self.guns["Billy"] = Canon(self.jatek, "Billy", 30, 200, 1, "red")
169. self.guns["Linus"] = Canon(self.jatek, "Linus", 370,200,-1, "blue")
170. # Ezekkel az gykkal asszocilt 2 vezrl pult ltrehozsa :
171. self.pult["Billy"] = VezerloPult(self, self.guns["Billy"])
172. self.pult["Linus"] = VezerloPult(self, self.guns["Linus"])
173.
174. def agyuk_szetszorasa(self):
175. "az gyk vletlenszer elmozdtsa"
176. for id in self.guns:
177. gun =self.guns[id]
178. # az gy irnytl fgg en balra vagy jobbra mozdts :
179. if gun.irany == -1 :
180. x = randrange(320,380)
181. else:
182. x = randrange(20,80)
183. # a tulajdonkppeni elmozdts :
184. gun.elmozdit(x, randrange(150,240))
185.
186. def goal(self, i, j):
187. "az <i> gy jelzi, hogy eltallta a <j> ellenfelet"
188. if i != j:
189. self.pult[i].pontHozzaadasa(1)
190. else:
191. self.pult[i].pontHozzaadasa(-1)
192.
193. def dictionnaireCanons(self):

239. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
194. "a jelen lev gykat ler sztrat adja meg"
195. return self.guns
196.
197. if __name__ =='__main__':
198. Application().mainloop()

Magyarzatok:
7.sor:Aprototpussalsszehasonltva,hromparamtertadtunkaconstructorhoz.Az id egytetszleges
nvvelazonostjaa Canon() osztlymindenobjektumt.A irany adjameg,hogyjobbra(irany=1)vagy
balra(irany=1)lazgy.Aszinhatrozzamegazgysznt.

9.sor:Tudnunkkell,hogymindenTkinterwidgetnekvanegymasterattribtuma,amiazesetlegesmaster
widgetjk (kontnerk) hvatkozst tartalmazza. Ez a hvatkozs teht esetnkben a falkalmazs
hivatkozsa. (Mimagunkegyhasonltechniktimplementltunka boss attribtumsegtsgvelavszonra
trtnhvatkozshoz).
42.50.sorok: Ez a metdus egy j pozciba viszi az gyt. Minden lvs utn vletlenszeren jra
pozcionljaazgykat,amifokozzaajtkrdekessgt.
Megjegyzs:a+=opertorralinkrementlhatjukegyvltozrtkt:
a+=3sa=a+3jelentseugyanaz.
56.s57.sorok:Megprbljukgymegkonstrulniacanon(gy)osztlyunkat,hogyjrafelhasznlhat
legyenolyannagyobbprogramokban,melyektetszlegesszmgyttartalmazhatnak,amikakzdelmek
sornmegjelenhetnekseltnhetnek.Ilyentvlatokblnzve,mindenjelenlvgyrlmindenegyeslvs
elttrendelkeznnkkellegyolyanlerssal,amiblmegtudjukhatrozni,hogyrteetallataclt.Ezta
lerst a falkalmazs egy sztrban kezeli, aminek egy msolatt a dictionnaireCanons() metdusa
hvsvalkrhetjk.
66.68.sorok: Ugyanebben az ltalnos perspektvban esetleg hasznos lehet a hv programot arrl
informlni,hogyalvedkvalbankilettelvevagysem.
76.sor:Alvedkanimcijtmostantlfogvaktkiegsztmetduskezeli.Akdtisztzsardekben
egyklnmetdusba(test_akadaly())tettemazokatazutastsokat,amikannakmeghatrozsraszolglnak,
hogyelrtnkeegycltrgyat.
79.81.sorok:Azelzekbenlttuk,hogyaself.animvltozhozhamisrtketrendelvemegszaktjuka
lvedkanimcijt.Azanimal_lovedek()metdustehtabbahagyjanmagahvstsvgrehajtjaa81.sor
kdjt.
83.100.sorok:Ezametdushatrozzameg,hogyazaktulislvedkkoordintimeghaladjkeazablak
szlnek a koordintit vagy egy msik gy kordintihoz vannak kzel. Mindkt esetben az animci
megszaktsaktivldik,deamsodikesetbenegysrgasznrobbanstrajzolunksazeltalltgy
hivatkozsttroljuk.Egykisidmlvaarobbanas_vege()metdusthvjaafeladatbefejezshez,hogya
robbansikrttrljesegytallatotjelzzenetetkldjnamasterablaknak.
115153.sorok:A VezerloPult() osztlya Frame() osztlyblleszrmaztatssaldefinilegyj widgetet
egyolyantechnikval,aminekmostmrismersnekkelllenni.Ezazjwidgetazgymegdntssatzels
parancsait, valamint egy meghatrozott gy tallatszmnak kiratst tartalmazza. Az gy s a
vezrlpanelkzttivzulismegfeleltetstazazonossznkbiztostja.Avezrlpaneltuzeles()siranyzas()
metdusaiakapcsoltCanon()objektummalazutbbimetdusairvnkommuniklnak.

155172.sorok:AzalkalmazsablakisegyFrame()blleszrmaztatottwidget.Aconstructoraktgyts
avezrlpaneljeikethozzaltre.Ezeketazobjektumokatktsztrbateszi:aself.gunssaself.pultba.Ez
aztnklnbzszisztematikusmveletekvgzsttesziminegyikknlehetv(mintpldulakvetkez

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 240.
metdus).Ezzelazeljrssalegybkntmegrizzkannakalehetsgt,hogyaprogramksbbifejlesztse
sorn,haszksges,mindennehzsgnlklnvelhetjkazgykszmt.
174.184.sorok:Mindenlvsutnennekametdusnakahvsrakerlsor.Vletlenszerenmozdtjaelaz
gykat,aminveliajtknehzsgt.

15.1.4 Kiegsztfejlesztsek
Programunkmostmrtbbkevsbmegfelelakiindulsifeladatmeghatrozsnak,denyilvnfolytathatjuka
tkletestst.
A)Jobbankellenepldulparamtereznnk.Ezmitjelent?Mostaniformjbanajtkunkvsznaelre
meghatrozott mret (400 x 250 pixel, lsd 161. sort) Ha mdostani akarjuk ezeket az rtkeket, akkor
gyelnnkkellr,hogyascriptnekazokatasoraitismdostsuk,melyekbenezekamretekszerepetjtszanak
(mintpldula168.169.,vagya179.184.sorokat).Hamgmsfunkcionalitsokkalegsztjkkiajtkunkat,
akkor azt kockztatjuk, hogy megn az ilyen egymstl fgg sorok szma. sszerbb lenne vltozkkal
mretezniavsznat,amiknekazrtktegyetlenhelyendefinilnnk.Ezeketavltozkataztnmindenolyan
utastssorbanhasznlnnk,aholavszonmreteszerepetjtszik.
Mrelvgeztkennekamunknakegyrszt:a Canon() (gy)osztlybanavszonmreteitegyelre
definiltmetdussalnyertkvissza(lsd1718.sorokat)solyanpldnyattribtumokbanhelyeztkel,amiket
azosztlybanmindentthasznlhatunk.
B)Mindenlvsutnazgykrandomelmozdulstakoordintikvletlenszerjradefinilsvalidzzk
el. Valsznleg valsghbb lenne valdi relatv elmozdulsokat kivltani, mint az abszolt pozcikat
vletlenszerenjradefinilni.EhheztkellalaktaniaCanon()osztlyelmozdit()metdust.Mgrdekesebb
lennegymegcsinlni,hogyezametdusegyargumentumbantadottrtkfggvnybenugyangytudjon
relatv,mintabszoltelmozdulstelidzni.
C)Atzparancsokrendszerttkletestenikellene:mivelcsakegyegrvan,megkellkrniajtkosokat,
hogyegymsutnljenek,desemmilyeneljrstsemdolgoztunkki,amivelerreknyszerthetnnkket.Azegy
jobb megkzelts lenne, ha az gydnts s tz parancsok bizonyos billentyk lenyomshoz lennnek
rendelve,amikaktjtkosesetbenklnbzeklennnek.

241. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
D)Biztos,hogyprogramunklegrdekesebbtovbbfejlesztseazlenne,hahlzatialkalmazssalaktannk.
Ajtktbbegymssalkommuniklgprelenneteleptve,mindegyikjtkosegygytirnytana.Egybknt
mg ltvnyosabb lenne, ha megengednnk, hogy kettnl tbb gyval jtsszk gy, hogy tbb jtkos
csatzhasson.
Azilyenfajtafejlesztsviszontaztfelttelezi,hogymrtkletesenmegtanultukaprogramozsktolyan
terlett,amikmeghaladjkennekakurzusnakakereteit:
asockettechnikt,amiktszmtgpkzttikommunikciltrehozstteszilehetv;

athreadtechnikt,amilehetvteszi,hogyugyanazaprogramtbbszimultnfeladatot(task)hajtsonvgre
(erre lesz szksgnk, ha olyan alkalmazst akarunk kszteni, ami egyidejleg tbb partnerrel akar
kommuniklni).
Szigoranvveezekatmakrknemkpezikennekakurzusnakatrgyt,atrgyalsuknmagbanegy
egsz fejezetet ignyel. Ezrt itt nem fogunk ezekbe belemenni. Azok megnyugtatsra, akik rdekldnek a
trgykr irnt: a knyv vgn kiegsztsknt megtallhat ez a fejezet (18. fejezet). Ott megtallhat az
gyprbajhlzativerzija.
Addigviszontnzzkmeg,hogyanfejleszthetjktovbbaprojektnketgy,hogyolyanjavtsokathajtunk
benne vgre, amik 4 szerepls jtkk alaktjk. Arra is trekedni fogunk, hogy programunk olyan jl
szegmentltlegyen,hogyazosztlyainkmetdusainagymrtkbenjrafelhasznlhatklegyenek.Menetkzben
megfogjukltni,hogyanvalsthatmegezafejlesztsamrltezkdmegvltoztatsanlklgy,hogyamr
megrtosztlyokblazrklsalkalmazsvaljakathozunkltre

Kezdjkazzal,hogyazelzmunknkatelmentjkegyfileba,aminekaneve:canon03.py.
gyvanegyPythonmodulunk,amitegyetlenutastssorralimportlhatunkegyjscriptbe.Eztatechnikt
kihasznlvafolytatjukalkalmazsunktkleteststgy,hogycsakazjdonsgokattartjukszemeltt:


1. from Tkinter import *
2. from math import sin, cos, pi
3. from random import randrange
4. import canon03
5.
6. class Canon(canon03.Canon):
7. """Tkletestett gy"""
8. def __init__(self, boss, id, x, y, irany, szin):
9. canon03.Canon.__init__(self, boss, id, x, y, irany, szin)
10.
11. def elmozdit(self, x, y, rel =False):
12. "relatv elmozduls, ha <rel> igaz; abszolt ha <rel> hamis"
13. if rel:
14. dx, dy = x, y
15. else:
16. dx, dy = x -self.x1, y -self.y1
17. # vzszintes hatrok :
18. if self.irany ==1:
19. xa, xb = 20, int(self.xMax *.33)
20. else:
21. xa, xb = int(self.xMax *.66), self.xMax -20
22. # csak ezek kztt a hatrok kztt mozdul el :
23. if self.x1 +dx < xa:
24. dx = xa -self.x1
25. elif self.x1 +dx > xb:
26. dx = xb -self.x1
27. # fgg leges hatrok :
28. ya, yb = int(self.yMax *.4), self.yMax -20
29. # csak ezek kztt a hatrok kztt mozdul el :

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 242.
30. if self.y1 +dy < ya:
31. dy = ya -self.y1
32. elif self.y1 +dy > yb:
33. dy = yb -self.y1
34. # az gycs s a test elmozdulsa :
35. self.boss.move(self.cso, dx, dy)
36. self.boss.move(self.test, dx, dy)
37. # az j koordintk visszaadsa a hv programnak :
38. self.x1 += dx
39. self.y1 += dy
40. self.x2 += dx
41. self.y2 += dy
42. return self.x1, self.y1
43.
44. def animacio_vege(self):
45. "vgrehajtand akcik, amikor a lvedk elrte a rpplyja vgt"
46. # annak az gynak az elmozdtsa, amelyik tzelt :
47. self.appli.agyu_veletlen_mozditasa(self.id)
48. # lvedk elrejtse (a vsznon kvlre kldjk) :
49. self.boss.coords(self.lovedek, -10, -10, -10, -10)
50.
51. def torol(self):
52. "az gy eltntetse a vszonrl"
53. self.boss.delete(self.cso)
54. self.boss.delete(self.test)
55. self.boss.delete(self.lovedek)
56.
57. class AppAgyuParbaj(Frame):
58. '''Az alkalmazs f ablaka '''
59. def __init__(self, larg_c, haut_c):
60. Frame.__init__(self)
61. self.pack()
62. self.xm, self.ym = larg_c, haut_c
63. self.jatek = Canvas(self, width =self.xm, height =self.ym,
64. bg ='ivory', bd =3, relief =SUNKEN)
65. self.jatek.pack(padx =4, pady =4, side =TOP)
66.
67. self.guns ={} # a jelen lev gyk sztra
68. self.pult ={} # a jelen lev vezrlpultok sztra
69. self.specificites() # klnb. objektumok a leszrm. oszt.okban
70.
71. def specificites(self):
72. "gyk s vezrl panelek ltrehozsa"
73. self.master.title('<<< gyprbaj >>>')
74. id_list =[("Paul","red"),("Romo","cyan"),
75. ("Virginie","orange"),("Juliette","blue")]
76. s = False
77. for id, szin in id_list:
78. if s:
79. irany =1
80. else:
81. irany =-1
82. x, y = self.veletlen_koord(irany)
83. self.guns[id] = Canon(self.jatek, id, x, y, irany, szin)
84. self.pult[id] = canon03.VezerloPult(self, self.guns[id])
85. s = not s # az oldal megvltozt. minden iterrciban
86.
87. def agyu_veletlen_mozditasa(self, id):
88. "vletlenszer en elmozdtja az <id> gyt "
89. gun =self.guns[id]
90. dx, dy = randrange(-60, 61), randrange(-60, 61)
91. # elmozdts (az j koordintk meghatrozsval) :
92. x, y = gun.elmozdit(dx, dy, True)
93. return x, y
94.
95. def veletlen_koord(self, s):
96. "vletlen koordintk, bal (s =1) vagy jobb (s =-1)"
97. y =randrange(int(self.ym /2), self.ym -20)
98. if s == -1:
99. x =randrange(int(self.xm *.7), self.xm -20)

243. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
100. else:
101. x =randrange(20, int(self.xm *.3))
102. return x, y
103.
104. def goal(self, i, j):
105. "la ni gy jelzi, hogy eltallta a nj ellenfelet"
106. # melyik tborhoz tartoznak ?
107. ti, tj = self.guns[i].irany, self.guns[j].irany
108. if ti != tj : # ellenkez irnyak :
109. p = 1 # 1-pontot kapunk
110. else: # azonos irnyban vannak :
111. p = -2 # szvetsgest talltunk el !!
112. self.pult[i].pontHozzaadasa(p)
113. # akit eltalltak veszt egy pontot :
114. self.pult[j].pontHozzaadasa(-1)
115.
116. def dictionnaireCanons(self):
117. "vissza adja a jelenlv gykat ler sztrat"
118. return self.guns
119.
120. if __name__ =='__main__':
121. AppAgyuParbaj(650,300).mainloop()

Magyarzatok:
6.sor:A4.sorbanalkalmazottimportlsiformalehetvtesziegyjCanon()(gy)osztlydefinilst,
amitazelz Canon() osztlyblszrmaztatunkle,megrizveazosztlynevt.gyazokatakdrszeket,
amikeztazosztlythasznljknemkellmegvltoztatni.(Eznemlettvolnalehetsges,hapldulafrom
canon03import*formthaszltukvolna.)
11.16sor:Azittdefiniltmetdusnakugyanazaneve,mintaszlosztlyegyik metdus.Tehtaz
elbbi az j osztlyban helyettesteni fogja a szlosztlytl rklt azonos nev metdust. (Azt fogjuk
mondani,hogyazelmozdit()metdusoverloadolvavan.)Amikorilyenfajtamdostsokatvgznk,akkor
ltalbanarratreksznk,hogyezeketgytegynk,hogyazjmetdusugyanaztcsinlja,mintargi,amikor
azjmetdustargivelmegegyezmdonhvjuk.gybiztostjukazt,hogyazokazalkalmazsok,amika
szlosztlythasznljk,agyermekosztlytistudjkmajdhasznlnianlkl,hogyazalkalmazstmdostani
kellene.
Eztaz eredmnytegy vagy tbb paramter hozzadsval rjkel, melyek alaprtelmezett rtkeia rgi
viselkedstidzikel.gyamikorarelparamterneknemadunkmegsemmilyenargumentumotsem,akkor
az xet s y tabszoltkoordintkknthasznlja(ametdusrgiviselkedse).Viszonthaa rel nekegy
igaz argumentumot adunk meg, akkor az x s y paramtereket relatv elmozdulsokknt kezeli (j
viselkeds).
17.33.sorok: A krt elmozdulsokat vletlenszeren lltjuk el. Ezrt gondoskodnunk kell egy
programkorltrl,amimegakadlyozza,hogyazobjektumkimenjenavszonrl.
42.sorok:Azeredmnylkapottkoordintkatvisszaadjukahvprogramnak.Lehet,hogyahvprogram
azgykezdpozcijnakismeretenlklvltjakiazgyelmozdulst.
44.49.sorok: Itt megint egy szlosztlytl rklt metdus overloadjrl van sz azrt, hogy eltr
viselkedstkapjunk:lvsutnmostmrnemmindegyikgyt,hanemcsakalvstleadtmozdtjukel.
51.55.sorok:Eztametdustolyanalkalmazsokszmrasznjuk,amikajtksorngykatteleptenek,
illetvetvoltanakel.
57.sakvetkezsorok:Mrakezdetekkezdetngytervezzkeztazosztlyt,hogyknnyenlehessen
bellemsosztlyokatleszrmaztatni.Ezrtszedjksztaconstructortktrszre:Az__init__()metdus
tartalmazzaaztakdot,amikzsmindenobjektumranzve,azokrais,amiketebblazosztlyblhozunk

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 244.
ltre s azokra is, amiket egy esetleg leszrmaztatott osztlybl hozunk ltre. A specificites() metdus
tartalmazza a specifikusabb kdrszeket:ezt a metdust arra sznjuk, hogy overloadoljuk az esetleges
leszrmaztatottosztlyokban.

15.2 APingjtk
Akvetkezoldalakonegykomplettprogramtallhat.Pldakntkzlm,amitazolvassajt,sszefoglal
projektjekntfejleszthet.Aprogramismteltenbemutatja,hogyankonstrulhatunktbbosztlyfelhasznlsval
egyjlstruktrltscriptet.

15.2.1 Azelv
Ajtkinkbbegyfajtamatematikaigyakorlat.Tblnjtszk,aminvltozmretngyzetrcsjelenik
meg.Arcsmindegyikngyzetbenegykorongvan.Akorongokmindegyiknekvanegyfehrsegyfekete
oldala(mintazOthello/Reversijtkban).Ajtkkezdetekormindegyiknekafehroldalavanfell.
Amikorazegrrelrkattintunkazegyikkorongra,a8szomszdoskorongtfordul.
Ajtkabblll,hogybizonyoskorongokrakattintvamegprbljukazsszeskorongottfordtani.
Agyakorlategy2x2esngyzetrccsalnagyonegyszer(elgmindegyikkorongrarkattintani). Nagyobb
rcsokkalnehezebbvlik,stbizonyosrcsokkallehetetlenmegoldaniafeladatot.Azolvasfeladataannak
meghatrozsa,hogymelyekkel!
(Nehanyagoljukelaz1xnesrcsesetnekvizsglatt!

Megjegyzs:APingjtkselmletnektrgyalsamegtallhata:Pourlasciencen298Aot2002,
p.98102*
*AScientificAmericanfranciaszerkesztse.Szerzijogiokblnemkzlhetemafordtst.Acikkazinterneten

245. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
15.2.2 Programozs
Egy programprojekt fejlesztsekor mindig trekednnk kell a problma megkzeltsnek a lehet
legvilgosabb lersra. Kezdjk egy rszletes feladat meghatrozssal s utna ne hanyagoljuk el a kdunk
gondoskommentezstakidolgozssorn(nempedigutna!)
Hagyjrunkel,akkorarraknyszertjkmagunkat,hogyaztfogalmazzukmeg,amitszeretnnk,hogya
programunkcsinljon.Ezsegtaproblmaelemzsbensakdmegfelelstruktrlsban.

Afejlesztendprogramfeladatmeghatrozsa

Azalkalmazstegyjtktbltsegymensorttartalmazfablakraalapozvafogjukmegkonstrulni.
Azegsznekbvthetnekkelllenniafelhasznlszndkaszerint;atblarekeszeinekngyzetalaknakkell
maradniuk.
Amenopciktegyklehetv:
arcsmreteinekmegvlasztst(angyzetekszmnakmegadsval)
ajtkjrainicializlst(vagyismindenkorongfehroldalvalflfelvanfordtva)
ajtkelvnekegyhelpablakbatrtnkirst
abefejezst(azalkalmazsbezrst)
Aprogramhromosztlytfoghvni:
egyfosztlyt
egymensorosztlyt
egytblaosztlyt
A jtktbla egy vszonra lesz rajzolva, ami egy keretben (frame) lesz. A felhasznl ltal elidzett
tmretezsfggvnybenakeretmindenalkalommalkifogjatlteniazegszrendelkezsrellfelletet:
azaz gy jelenik meg a programoznak, mint valamilyen tglalap, aminek a mretei kell, hogy alapul
szolgljanakakirajzolandrcsmreteinekaszmolshoz.
Mivelarcsrekeszeinekngyzetalaknakkellmaradni,ezrtamaximlismretkszmolsvalazegyszer
kezdeni,majdezekfggvnybenmeghatrozniavszonmreteit.
Az egrkattints kezelse: a vszonhoz fogunk kapcsolni egy metdust, ami a <balgombra kattints>
esemnyt kezeli. Az esemny koordinti annak meghatrozsra fognak szolglni, hogy a rcs melyik
rekeszbe (sorszm s oszlopszm) kattintottunk, brmilyen is legyen a rcs mrete. A szomszdos 8
rekeszbenlvkorongoktlesznekfordtva(afeketesfehrsznekcserje).

hozzfrhetfrancianyelven.(Afordt.)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 246.
###########################################
# Ping jtk #
# Irodalom : Lsd a <Pour la science> #
# folyirat, 2002 augusztusi szmt #
# #
# (C) Grard Swinnen (Verviers, Belgique) #
# http://www.ulg.ac.be/cifen/inforef/swi #
# #
# Verzi 2002/09/29 - Licenc : GPL #
###########################################

from Tkinter import *

class MenuBar(Frame):
"""Legordulo menusor"""
def __init__(self, boss =None):
Frame.__init__(self, borderwidth =2, relief =GROOVE)
##### <File> menu #####
fileMenu = Menubutton(self, text ='Fichier')
fileMenu.pack(side =LEFT, padx =5)
me1 = Menu(fileMenu)
me1.add_command(label ='Opcik', underline =0,
command = boss.options)
me1.add_command(label ='jraindits', underline =0,
command = boss.reset)
me1.add_command(label ='Vge', underline =0,
command = boss.quit)
fileMenu.configure(menu = me1)

##### <Help> menu #####


helpMenu = Menubutton(self, text ='Help')
helpMenu.pack(side =LEFT, padx =5)
me1 = Menu(helpMenu)
me1.add_command(label ='A jtk elve', underline =0,
command = boss.principe)
me1.add_command(label ='A propos ...', underline =0,
command = boss.aPropos)
helpMenu.configure(menu = me1)

class JatekTabla(Frame):
"""Jatektabla ( n x m es negyzetracs)"""
def __init__(self, boss =None):
# Ez a tabla egy atmeretezheto frame-bol all, amiben egy vaszon van
# A frame minden atmeretezesekor kiszamoljuk a racs leheto legnagyobb
# kockameretet es a vaszon meretet ennek megfeleloen allitjuk be

Frame.__init__(self)
self.nrow, self.ncol = 4, 4 # Kezdotabla = 4 x 4
# A <resize> esemeny osszekapcsolasa egy megfelelo esemenykezelovel :
self.bind("<Configure>", self.redim)
# Canevas :
self.can =Canvas(self, bg ="dark olive green", borderwidth =0,
highlightthickness =1, highlightbackground ="white")
# Az <egerkattintas esemeny > osszekapcsolasa az esemenykezelojevel :
self.can.bind("<Button-1>", self.clic)
self.can.pack()
self.initGame()

def initGame(self):
"A jatek allapotat tarolo lista inicializalasa"

247. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
self.state =[] # egymasba agyazott lista letrehozasa
for i in range(12): # (egyenertek egy 12 sor x 12 oszlopos
self.state.append([0]*12) # tablaval)

def redim(self, event):


"atmeretezeskor vegrehajtando m veletek"
# Az ujrakonfiguralas esemenyevel asszocialt tulajdonsagok
# a frame uj mereteit tartalmazzak :
self.width, self.height = event.width -4, event.height -4
# A 4 pixeles klonbseg a vasznat korlvevo 'highlightbordure'
# kompenzalasara szolgal)
self.drawGrid()

def drawGrid(self):
"A racs kirajzolasa az opciok es a meretek fggvenyeben"
# a negyzetek lehetseges max. szelessege es hosszusaga :
lmax = self.width/self.ncol
hmax = self.height/self.nrow
# A negyzet merete ezen meretek legkisebbikevel egyenlo :
self.side = min(lmax, hmax)
# -> a vaszon uj mereteinek beallitasa :
width_, height_ = self.side*self.ncol, self.side*self.nrow
self.can.configure(width =width_, height =height_)
# A racs kirajzolasa :
self.can.delete(ALL) # elozo rajzok torlese
s =self.side
for l in range(self.nrow -1): # vizszintes vonalak
self.can.create_line(0, s, width_, s, fill="white")
s +=self.side
s =self.side
for c in range(self.ncol -1): # fggolees vonalak
self.can.create_line(s, 0, s, height_, fill ="white")
s +=self.side
# Az osszes feher illetve fekete korong kirajzolasa a jatek allapotanak
# megfeleloen :
for l in range(self.nrow):
for c in range(self.ncol):
x1 = c *self.side +5 # korongok merete=
x2 = (c +1)*self.side -5 # negyzetek merete -10
y1 = l *self.side +5 #
y2 = (l +1)*self.side -5
colour =["white","black"][self.state[l][c]]
self.can.create_oval(x1, y1, x2, y2, outline ="grey",
width =1, fill =colour)

def clic(self, event):


"Az egerkattintas kezelese : a korongok megforditasa"
# A sor es az oszlop meghatarozasaval kezdjk :
row, col = event.y/self.side, event.x/self.side
# Majd a szomszedos 8 negyzetet kezeljk :
for l in range(row -1, row+2):
if l <0 or l >= self.nrow:
continue
for c in range(col -1, col +2):
if c <0 or c >= self.ncol:
continue
if l ==row and c ==col:
continue
# Korongforditas logikai inverzioval :
self.state[l][c] = not (self.state[l][c])
self.drawGrid()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 248.
class Ping(Frame):
"""A foprogram teste"""
def __init__(self):
Frame.__init__(self)
self.master.geometry("400x300")
self.master.title(" Ping jatek")

self.mbar = MenuBar(self)
self.mbar.pack(side =TOP, expand =NO, fill =X)

self.game =JatekTabla(self)
self.game.pack(expand =YES, fill=BOTH, padx =8, pady =8)

self.pack()

def options(self):
"A racs sor es oszlopszamanak kivalasztasa"
opt =Toplevel(self)
curL =Scale(opt, length =200, label ="Sorok szama :",
orient =HORIZONTAL,
from_ =1, to =12, command =self.majLignes)
curL.set(self.game.nrow) # a cursor kezdo pozicioja
curL.pack()
curH =Scale(opt, length =200, label ="Oszlopok szama :",
orient =HORIZONTAL,
from_ =1, to =12, command =self.majColonnes)
curH.set(self.game.ncol)
curH.pack()

def majColonnes(self, n):


self.game.ncol = int(n)
self.game.drawGrid()

def majLignes(self, n):


self.game.nrow = int(n)
self.game.drawGrid()

def reset(self):
self.game.initGame()
self.game.drawGrid()

def principe(self):
"A jtk elvt tartalmaz zenetablak"
msg =Toplevel(self)
Message(msg, bg ="navy", fg ="ivory", width =400,
font ="Helvetica 10 bold",
text ="A minden korongnak van egy fehr s egy fekete oldala "\
"Amikor egy korongra kattintunk, a 8 szomszdja tfordul\n"\
"A jtk abbl ll, hogy megprbljuk mindet tfordtani.\n\n"\
"Ha a gyakorlat 2 x 2-es rccsal nagyon egyszer nek t nik, "\
"nehezebb vlik nagyobb mret rcsokkal. S t bizonyos "\
"mret rcsokkal egyltaln nem lehet lejtszani.!\n\n "\
"Irodalom : 'Pour la Science' Aout 20022").pack(padx =10, pady =10)

249. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
def aPropos(self):
"A szerz t s a licenc tpust megad zenetablak"
msg =Toplevel(self)
Message(msg, width =200, aspect =100, justify =CENTER,
text ="Ping Jtk\n\n(C) Grard Swinnen, Aout 2002.\n"\
"Licenc = GPL").pack(padx =10, pady =10)

if __name__ == '__main__':
Ping().mainloop()

Emlkeztet: Ha az olvas az jrarsuk nlkl akar ksrletezni ezekkel a programokkal, akkor a


forrskdjukatmegtallhatjaakvetkezcmen: http://www.ulg.ac.be/cifen/inforef/swi/python.htm
http://learnpython.openproject.hu

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 250.
16.Fejezet: Adatbziskezels
Az adatbzisok egyre gyakrabban alkalmazott eszkzk. Nagymennyisg adat trolst teszik lehetv
egyetlenjlstruktrlthalmazban.Relcisadatbzisokesetnegyebekkzttlehetsgvanaduplikltadatok
elkerlsreis.Azolvasbiztosantallkozottmrakvetkezproblmval:
Azonosadatokatrtunkkitbbfileba.Hamdostani,vagytrlniakarjukegyikket,akkorazsszesfilet,
amelyiktartalmazzaazadatot,megkellnyitnunksmdostanunkkell!Ahibzsveszlyenagyonrelis,ami
elkerlhetetlenlinkoherencikhozvezet,nembeszlvearrlazidvesztesgrl,amitazadatmdostsilletve
trlsjelent.
Az adatbzisok jelentik a megoldst erre a problmatpusra. A Python szmos rendszer alkalmazst
megengedi,decsakketttfogunkmegvizsglni:aGadflytsaMySQLt.

16.1 Adatbzisok
Szmos adatbzistpus ltezik. Pldul mr elemi adatbzisnak tekinthetnk egy nevek s cmek listjt
tartalmazfilet.
Haalistanemtlhosszshanemakarunkbennesszetettfelttelektlfggkeresseketvgrehajtani,
akkor magtl rtetdik, hogy ehhez az adattpushoz olyan egyszer utastsokkal frhetnk hozz, mint
amilyeneketa108.oldalontrgyaltunk.
A helyzet azonban nagyon gyorsan komplikltt vlik, ha kivlasztsokat s rendezseket hajtunk vgre,
klnsen,haezekszmamegn.Anehzsgekmgtovbbnnek,haazadatokklnbztblkbanvannak,
amikethierarchikusrelcikkapcsolnaksszeshatbbfelhasznlnakegyidejlegkelltudnihozzjukfrni.
Kpzeljkpldulel, hogy az iskolnk vezetse megbz bennnketegy szmtgpes tanulmnyirtest
ksztsvel.Nmigondolkodsutnrjvnk,hogyezegysortblzatelksztstfelttelezi:egytanulnvsor
tblt(amitermszetesenms,atanulkravonatkozspecifikusinformcikatistartalmaz:lakcm,szletsi
dtum, stb.); egy tantrgytblt (a tanr nevvel, a heti raszmmal, stb.); egy dolgozattblt, amiben a
dolgozatokattroljukazrtkelsekhez(adolgozatjellegvel,dtumval,tartalmval,stb.);egytanulcsoport
tblt,amiosztlyonkntsfakultcinkntrjaleatanulcsoportokat,azegyestanulktantrgyait,stb.,stb.
Azolvasjlltja,hogyezekatblzatoknemfggetlenekegymstl.Ugyanannakatanulnakadolgozatai
klnbztantrgyakhozkapcsoldnak.Atanultanulmnyirtestjnekelksztsheztermszetesenadatokat
kellkiszednnkadolgozatoktblzatbl,deezeknekmstblkbantalltinformcikkalissszefggsbenkell
lenni(tantrgytbla,osztlyok,opcik,stb.)
Aksbbiekbenmegfogjukltni,hogyanrjukleezeketatblkatsazketsszektkapcsolatokat.

16.1.1 RelcisadatbziskezelrendszerekAkliens/servermodell
Az ilyen komplex adatok hatkony kezelsre alkalmas programok maguk is szksgszeren sszetettek.
Ezeket a programokat relcis adatbzis kezel rendszereknek hvjk (RDBMS = Relational Database
Management Systems). A vllalkozsok szmra elsdleges fontossg alkalmazsokrl van sz. Kzlk
egyesek specilizldott vllalatok (IBM, Oracle, Microsoft, Informix, Sybase...) termkei s ltalban
nagyon drgk. Msokat (PostgreSQL, MySQL ...) kutatsi kzpontokban vagy az egyetemi oktatsban
fejlesztettekki;ezekltalbanteljeseningyenesek.
Erendszerekmindegyikesajtosjellemzkkelsteljestmnnyelrendelkezik,azonbanatbbsgkmkdse

251. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
a kliens/server modellenalapul.Ezaztjelenti,hogyazalkalmazslegnagyobbrsze(valamintazadatbzis)
egyetlenhelyre,elvilegegynagyteljestmnygprevanteleptve(ezazegyttesalkotjaaservert),mgamsik
jvalegyszerbbrszmeghatrozatlanszmmunkallomsravanteleptve(ezekethvjukklienseknek).
Akliensekklnbzeljrsokvagyprotokolok(esetlegazinternet)rvnllandanvagyideiglenesena
serverhez vannak kapcsolva. Mindegyikk hozzfrhet az adatok tbbkevesebb rszhez, egyes adatokat
engedllyelvagyanlklmdosthatnak,jakatvihetnekbe,trlhetnekajlmeghatrozotthozzfrsijogoktl
fggen.(Ezeketajogosultsgokategyadatbzisadminisztrtordefinilja).
Aserversklienseiklnllalkalmazsok,amikinformcitcserlnek.Kpzeljkpldulel,hogyegyike
vagyunkegyrendszerfelhasznlinak.Ahhoz,hogyhozzfrjnkazadatokhoz,valamelyikmunkallomsonel
kellindtanunkegykliensalkalmazst.Akliensalkalmazsazzalkezdiazindtprocessben,hogykapcsolatot
ltestaserverrelsazadatbzissal61.Amikorltrejttakapcsolat,akliensalkalmazsmegfelelformjkrs
(request)kldsvellekrdezhetiaservert.Pldulegymeghatrozottinformcitkellmegkeresni.Aservera
megfeleladatokadatbzisbantrtnkeressvelvgrehajtjaakrst,majdvalamilyen vlaszt kldvisszaa
kliensnek.
Ezavlaszlehetakrtinformci,vagyhibaesetnegyhibazenet.
A kliens s a server kztti kommunikcit teht krsek s vlaszok alkotjk. A krsek a klienstl a
servernek kldtt valdi utastsok, amik nemcsak adatok kinyersre, hanem adatok beszrsra, trlsre,
mdostsra,stb.isszolglnak.

16.1.2 AzSQLnyelvGadfly
Tekintettel arra, hogy klnbz RDBMSek lteznek, azt hihetnnk, hogy mindegyikk esetben egy
specilisnyelvetkellanekikcmzettkrsekhezhasznlni. Mindenholnagyerfesztsekettettekegykzs
nyelvkidolgozsrasjelenlegltezikegyjlfelptettstandard:azSQL(StructuredQueryLanguage,vagy
struktrltlekrdeznyelv)62.
Azolvasnakmstrgyak(pdulirodaialkalmazsok)keretbenvalsznlegalkalmalesztallkozniaz
SQLlel.APythonprogramozsbavalbevezetskeretbenktpldabemutatsrafogokszortkozni:kizrlag
csak a Pythont felhasznlva fogunk kszteni egy kis RDBMSt s el fogjuk kszteni egy ambcizusabb
kliensprogramvzt,amitegyMySQLadatbzisserverrelvalkommunikcirasznok.
ElspldnkbanegyGadflynevmodultfogunkalkalmazni.TeljesegszbenPythonbanvanmegrva.Eza
modul nem rsze a standard disztribcinak, ezrt kln kell telepteni 63. Az SQL parancsok egy nagy
alcsoportjtintegrlja.Teljestmnyenyilvnnemvethetsszeanagy,specializltrelcisadatbziskezel
rendszerekteljestmnyvel64,deszernymretadatbzisokkezelsrekivl.Tkletesenportbilis.AGadfly

61 Ahozzfrshezbiztos,hogymegkelladnunknhnyinformcit:aserverhlzaticmt,azadatbzisnevt,a
felhasznlnevt,jelszt,...
62 AklnbzSQLimplementcikkzttvannhnyvltozatanagyonspecifikuslekrdezsekszmra,deaz
alapmegegyezik.
63 AGadflymodulingyenesenhozzfrhetazinternetenakvetkezcmen:http://sourceforge.net/projects/gadfly
Ateleptsta17.6fggelkrjalea309.oldalon.
64 A Gadfly viszonylag hatkonynak ltszik kzepes mret, egy felhasznls adatbzisok kezelsre.
TbbfelhasznlsnagyadatbzisokkezelsreolyanRDBMSeketkellalkalmazni,mintamilyenaPostgreSQL,
EzekhezislteznekPythonkliensmodulok(Pygresqlpldul).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 252.
ugyangy fog Windows Linux vagy MacOS alatt mkdni, mint a Python. Mitbb, a Gadfly val ellltott
adatbzisokattartalmazknyvtrakatugyangy,mdostsnlklhasznlhatjukegyikvagymsikopercis
rendszerbl.
Haegyolyanalkalmazstakarunkfejleszteni, aminekviszonylagsszetettrelcikatkellkezelniegykis
adatbzisban,akkoraGadflymodulnagyonleegyszersthetiafeladatot.

16.2 EgyszeradatbzisksztseGadflyval
A kvetkezkben megvizsgljuk, hogyan kszthetnk egy egyszer alkalmazst, amiugyanazon agpen
egyszerretltibeaserversakliensszerept.

16.2.1 Adatbzisltrehozsa
Mintazolvasbizonyramrvrja,amegfelelfunkcikhozvalhozzfrshezelgimportlnia gadfly
modult.
Utnaltrekellhozniagadflyegypldnyt(egyobjektumot):
import gadfly
adatBazis= gadfly.gadfly()

Az gy ltrehozott adatBazis objektum a loklis adatbzismotorunk, ami a mveletek nagy rszt a


memribanfogjavgrehajtani.Ezakrseknagyongyorsvgrehajtstteszilehetv.
Azadatbzisltrehozshozazobjektumstartupmetdustkellhvni:
adatBazis.startup("mydata","E:/Python/essais/gadfly")

Azelsparamter,amydata,azadatbzisnakvlasztottnv(termszetesenmsnevetislehetvlasztani!).A
msodikparamterazaknyvtr,ahovtelepteniakarjukazadatbzist.(Eztaknyvtratelzlegltrekell
hoznunk.Mindenaknyvtrbanmydatanvenmrltezadatbzistfigyelmeztetsnlklmegfogsemmisteni
ametdus.)
Aberthromkdsorelegend:mostantlfogvavanegymkdkpesadatbzisunk,amibenltrehozhatunk
klnbztblkat,majdezekhezatblkhozadatokatadhatunk,adatokattrlhetnk,mdosthatunk.
MindenmvelethezazSQLnyelvetfogjukhasznlni.
Ahhoz,hogyazadatBazisobjektumnakttudjukadniazSQLkrseinket,egycursortkellksztennk.Ez
egyfajta memriapuffer, ami az ppen kezelt adatok s a rajtuk vgrehajtott mveletek tmeneti trolsra
szolgl,mielttazadatokatvglegesenfileokbarnnkki.Ezatechnikalehetvteszi,amennyibenszksges,
egyvagytbbnemmegfelelnekbizonyultmveletetrvnytelentst.(AzolvasazSQLnyelvvelfoglalkoz
kziknyvekbltbbettudhatmegerrl.)
Mostvizsgljukmegazalbbiscriptetsjegyezzkmeg,hogyazSQLkrsekstringek,amiket a cursor
objektumexecutemetdusakezel:
cur = adatBazis.cursor()
cur.execute("create table membres (kor integer, nev varchar, meret float)")
cur.execute("insert into membres(kor, nev, magas) values (21,'Dupont',1.83)")
cur.execute("INSERT INTO MEMBRES(KOR, NEV, MAGAS) VALUES (15,'Suleau',1.57)")
cur.execute("Insert Into Membres(Kor, Nev, Magas) Values (18,'Forcas',1.69)")
adatBazis.commit()

Azelssorltrehozzaacurcursorobjektumot.Akvetkez4sorbanazidzjelbenlvstringekazSQL

253. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
krsek. Jl jegyezzk meg,hogy azSQL rzketlen arra, hogy kisvagynagybett hasznlunk:azSQL
krseinket akr kis, akr nagybetkkel kdolhatjuk (termszetesen ez nem ll fnn a krnyez Python
utastsokra!)
Amsodiksoregymembresnevadattblthozltre,ami3mezbejegyzseitfogjatartalmazni:azegsz
szm tpus kor mez, a string tpus (vltoz hosszsg) nev mez s a vals szm tpus
(lebegpontos)magasmezbejegyzseit.AzSQLnyelvelvilegmstpusokatismegenged,deezeknincsenek
implementlvaaGadflyban.
Ahromkvetkezsorhasonl.sszekevertembennkakissnagybetket,hogymegmutassam,azSQL
benezeknemlnyegesek.Ezekasorokarraszolglnak,hogyamembres tblbahrombejegyzstszrjunk
be.
Amveleteknekebbenafzisbanabejegyzsekmgnincsenekdiszkfileokbakirva.gyvisszalehettrnia
kiindulshoz,amintaztaksbbiekbenmeg fogjuk ltni.Adiszkretrtn adatkivitelt azutolsutastssor
commit()metdusaaktivlja.

16.2.2 Kapcsoldsegyltezadatbzishoz
Tegyk fel, hogy a fenti mveletek sorn gy hatroztunk, befejezzk a scriptet vagy kikapcsoljuk a
szmtgpet.Hogyankelleljrnunkaksbbiekben,hogymeginthozzfrjnkazadatbzisunkhoz?
Ehhezktkdsorravanszksgnk:
import gadfly
adatBazis = gadfly.gadfly("mydata","E:/Python/essais/gadfly")

Ezaktsorelgadiszkrekirtfileokbanlvtblzatoktartalmnakamemribatrtntvitelhez.Ettl
kezdveazadatbzislekrdezhetsmdosthat:
cur = adatBazis.cursor()
cur.execute("select * from membres")
print cur.pp()

Azelssormegnyitegycursort.Amsodiksorbankiadottkrsegybejegyzscsoportkivlasztstkri,ami
az adatbzisbl a cursorba fog tkerlni. Ebben az esetben a kivlaszts valjban nem egy bejegyzs
kivlasztsa: a membres tbla sszes bejegyzst krjk (az informatikban a * szimblumot gyakran a
minden,sszesjelentsselhasznljuk).
Aharmadiksorbanacursorraalkalmazott pp() metduselformzottalakbankiratjaacursortartalmt(a
megjelentett adatok automatikusan oszlopokba vannak rendezve). A pp jelentse pretty print (szp
kirs).
Hamagunkakarjukirnytaniazinformciklapratrdelst,akkora pp() metdushelyetta fetchall()
metdustkellhasznlnunk,amiegytuplekbllllisttadvissza.Pldulprbljukkiakvetkezt:
for x in cur.fetchall():
print x, x[0], x[1], x[2]

Termszetesentovbbiadatokatisbejegyezhetnk:
cur.execute("Insert Into Membres(Kor, Nev, Magas) Values (19,'Ricard',1.75)")

Egyvagytbbbejegyzsmdostshozazalbbitpuskrstkellvgrehajtani:
cur.execute("update membres set nev ='Gerart' where nev='Ricard'")

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 254.
Egyvagytbbbejegyzstrlshezhasznljukakvetkezkrst:
cur.execute("delete from membres where nev='Gerart'")

Ha mindezeket a mveleteket a Python parancssorban hajtatjuk vgre, akkor az eredmnyt brmelyik


pillanatban megnzhetjk egy pretty print tel, ahogyan azt fntebb magyarztam. Mivel a cursoron
vgrehajtottmindenmdostsamemribantrtnik,ezrtsemmisemleszvgrvnyesenrgztvemindaddig,
amgvgrenemhajtjukazadatBazis.commit()utastst.

Az elz commit() utasts ta vgrehajtott valamennyi mdostst trlhetjk gy, hogy lezrjuk a
kapcsolatot:
adatBazis.close()

16.2.3 Keressegyadatbzisban
(16) Gyakorlat:
16.1. Mielttnagyonmessziremennnk,arrakremazolvast,hogysszefoglalgyakorlatknthozzonltre
teljesennllanegyZeneadatbzist,amiakvetkezkttblttartalmazza(Eznmimunkba
kerl,deadatokravanszksgahhoz,hogyksrleteznitudjonakeressrendezfggvnyekkel):

muvek Zeneszerzok
szerzo(string) szerzo(string)
cim(string) ev_szul(egesz)
ido(egesz) ev_halal(egesz)
eloado(string)

Kezdjeelfeltltenia Zeneszerzok tbltakvetkezadatokkal(hasznljakiazalkalmatsrjonegykis


scriptet,amimegknnytiazadatbevitelt:ittegyprogramhurkotrdemesalkalmazni!)
szerzo ev_szul ev_halal

Mozart 1756 1791


Beethoven 1770 1827
Handel 1685 1759
Schubert 1797 1828
Vivaldi 1678 1741
Monteverdi 1567 1643
Chopin 1810 1849
Bach 1685 1750

rjabeamuvektblbaakvetkezadatokat:
szerzo cim ido eloado

Vivaldi Les quatre saisons 20 T. Pinnock


Mozart Concerto piano N12 25 M. Perahia
Brahms Concerto violon N2 40 A. Grumiaux
Beethoven Sonate "au clair de lune" 14 W. Kempf
Beethoven Sonate "pathtique" 17 W. Kempf
Schubert Quintette "la truite" 39 SE of London
Haydn La cration 109 H. Von Karajan

255. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Chopin Concerto piano N1 42 M.J. Pires
Bach Toccata & fugue 9 P. Burmester
Beethoven Concerto piano N4 33 M. Pollini
Mozart Symphonie N40 29 F. Bruggen
Mozart Concerto piano N22 35 S. Richter
Beethoven Concerto piano N3 37 S. Richter
Aev_szulsev_halalmezkazeneszerzkszletsnekshallnakazvszmttartalmazzk.Azenem
idtartamtpercekbenadjukmeg.Nyilvnannyizenemvetszeneszerztlehetrgzteni,amennyitcsakaz
olvasakar,deazelbbiadatoknakelgnekkelllenniaksrletezshez.
Atovbbiakbanfelttelezem,hogyaktfentitblaadataikdolvavannak.(Hanehzsgeivannakascript
megrsval,gyadokregypldtafggelkbena355.oldalon).
Akvetkezscriptcsaktjkoztatjelleg.EgyalapSQLkliens,amilehetvtesziaZeneadatbzishoz
aminek mr az egyik knyvtrunkban kell lenni kapcsoldst, egy cursor megnyitst s a cursor
alkalmazst a lekrdezsek vgrehajtsra. Jegyezzk meg, hogy mindaddig amg nem hvjuk a commit()
metdust,addigsemmisemleszkirvaadiszkre.
# SQL krseket elfogad kis adatbzis hasznlata

import gadfly

adatBazis = gadfly.gadfly("musique","E:/Python/essais/gadfly")
cur = adatBazis.cursor()
while 1:
print "rja be az SQL krst (vagy <Enter> -t a befejezshez) :"
keres = raw_input()
if keres =="":
break
try:
cur.execute(keres) # megksrel vgrehajtani SQL krst
except:
print '*** INKORREKT KRS ***'
else:
print cur.pp() # krs eredmnynek kirsa
print

valasztas = raw_input("Valban mentsem (o/n) ? ")


if valasztas[0] == "o" or valasztas[0] == "O":
adatBazis.commit()
else:
adatBazis.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 256.
Ez a rendkvl egyszer alakalmazs nyilvn csak egy plda. Ki kellene egszteni az adatbzis s a
munkaknyvtr kivlasztsnak lehetsgvel. A 118. oldalon mr lert kivtelkezelst alkalmaztam, hogy
elkerljemascriptkiakadstamikorafelhasznlegyhibskrstkdol.

16.2.4 Aselectutasts
A select azSQLnyelvegyikleghatkonyabbutastsa.Ennekfogjukmostmegnzninhnyalkalmazst.
Ismtlem,atrgykrnekcsaknagyonkisrszbemegynkbele:azSQLrszleteslersatbbknyvettenneki.
Indtsukelafentiscriptetselemezzk,hogymitrtnik,amikorakvetkezkrseketadjukmeg:
select*frommuvek

select*frommuvekwhereszerzo='Mozart'

selectszerzo,cim,idofrommuvekorderbyszerzo

selectcim,szerzofrommuvekwhereszerzo='Beethoven'orszerzo='Mozart'orderbyszerzo

selectcount(*)frommuvek

selectsum(ido)frommuvek

selectavg(ido)frommuvek

selectsum(ido)frommuvekwherecomp='Beethoven'

select*frommuvekwhereido>35orderbyidodesc
A krsek mindegyiknl igyekezznk a lehet legjobban elmagyarzni, hogy mi trtnik. Lnyegben
szrketsrendezseketaktivlunkazadatbzoson.
Akvetkezkrsekbonyolultabbak,mivelegyszerrekttblravonatkoznak.
selecto.cim,c.nev,c.ev_szulfrommuveko,zeneszerzokcwhereo.szerzo=c.szerzo

selectszerzofrommuvekintersectselectszerzofromzeneszerzok

selectszerzofrommuvekexceptselectszerzofromzeneszerzok

selectszerzofromzeneszerzokexceptselectszerzofrommuvek

selectdistinctszerzofrommuvekunionselectszerzofromzeneszerzok

Nincsrlehetsgem,hogyajegyzetkereteikzttjobbankifejtsemalekrdeznyelvetsltalbanaz
ltalnos adatbzis kezelst. Viszont megvizsglunk mg egy Pythonnal kszlt pldt, ami egy
adatbzisrendszerhezfordul.Mostaztttelezzkfel,hogyegyfggetlenserverrendszerrelvalprbeszdrlvan
sz(amipldulegynagy,vllalatiadatbzisserver,egyiskolaidokumentcisserver,stb.lehet).

257. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
16.3 EgyMySQLkliensprogramvza
Afejezetbefejezsekntakvetkezoldalakonegykonkrtmegvalstsramutatokbepldt.Eznemegy
igaziprogram(atmakrnekegyknyvetkelleneszentelni),inkbbegyelemzsrevalelnagyoltvzlatlesz,
amivelazaclom,hogybemutassam,hogyangondolkodhatunkegykomplexproblmamegkzeltsesorngy,
mintegyprogramoz.
Atechnikk,amiketmajdkiviteleznk,egyszerjavaslatok.Megprbljukbennkalegjobbanfelhasznlni
azelzfejezetekbenmegismerteszkzket,nevezetesen:magasszintadatstruktrkat(listkatssztrakat),
s az objektumokkal trtn programozst. Magtl rtetdik, hogy a gyakorlatban tett vlasztsaink
nagymrtkbenkritizlhatk:ugyanezekaproblmknyilvnmsmegkzeltsseliskezelhetk.
Akonkrtclunkaz,hogygyorsaneljussunkegyolyanalapklienskivitelezsig,amikpes prbeszdet
folytatni egy olyan igazi adatbzisserverrel, mint a MySQL. Azt szeretnnk, haa kliensnk egy nagyon
ltalnoskisutilitymaradna,ami:kpesegytbbadattblttartalmazkisadatbzisltrehozsra,mindegyik
tblbabejegyzsekettudtenni,lehetvtesziazalapSQLkrsekeredmnynektesztelst.
Akvetkezsorokbanfelttelezem,hogyazolvasmrhozzfregyMySQLserverhez,aminajules
nevfelhasznlnak,akinekajelszavaabcde,ltrehoztakegydiscothequeadatbzist.Ezaserverlehet
egyhlzatontelrhettvoligpen,vagyloklisanazolvasPCjn65.

16.3.1 Azadatbzislersaegyalkalmazsknyvtrban
Egyadatbzissalprbeszdetfolytatalkalmazsmajdnemmindigkomplexalkalmazs.Nagyszmkdsort
tartalmaz. Ezeket osztlyokba (vagy legalbb fggvnyekbe) val zrssal a lehet legjobban szeretnnk
struktrlni.

65 Egy MySQL server installlsa s konfigurlsa meghaladja ennek aknyvnek akereteit,de nem egynagyon
komplikltfeladat.St,nagyonegyszer,haolyankasszikusdisztribcikblteleptettLinuxszaldolgozunk,
mint a Debian, RedHat, SuSE vagy Mandrake. Elegend a MySQLserver s PythonMySQL packageeket
telepteni,elindtaniaMySQLservicet,majdberniakvetkezparancsokat:
mysqladminurootpasswordxxxx

EzaparancsaMySQLfadminisztrtornakjelszavtdefinilja.ALinuxrendszeradminisztrtornak('root')kell
vgrehajtatni azltalunkvlasztott jelszval.Majdazgydefinilt adminisztrtoraccountjval kapcsoldunka
serverhez(ajelsztkrnifogja):
mysqlurootmysqlp
grantallprivilegeson*.*tojules@localhostidentifiedby'abcde';
grantallprivilegeson*.*tojules@"%"identifiedby'abcde';
\q
Ezek a parancsok egy j, jules nev felhasznlt definilnak a MySQL rendszer szmra s ehhez a
felhasznlhozkellkapcsoldniazabcdejelsznak.(Aktsoraloklissahlzatonttrtnhozzfrst
engedlyezi.)
Afelhasznlnvtetszleges:nemszksges,hogyazopercisrendszeregyfelhasznlnevelegyen.
Ajulesnevfelhasznlrkapcsoldhataserverresadatbzisokathozhatltre.
mysqlujulesp
createdatabasediscotheque;
\q
...stb.EbbenastdiumbanaMySQLserverkszarra,hogyprbeszdetfolytassonazezekenazoldalakonlert
Pythonklienssel.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 258.
Akdszmoshelyn,amikgyakrannagyontvolvannakegymstl,azutastsblokkoknakfigyelembekell
venniazadatbzisstruktrt,vagyisazadatbzistblkrasmezkretrtnfelosztst,valamintabejegyzsek
kztthierarchitltestrelcikat.
Agyakorlataztmutatja,hogyegyadatbzisstruktrjaritknvgleges.Afejlesztssorngyakranjvnkr,
hogybekellszrni,vagytrlnikellmezket,nhappenegyrosszulfelptetttbltkellhelyettestenikt
msiktblval,stb.Nemblcsdologegyklnlegesstruktratlsgosanspeciliskdrszeithardkdolni.
Ezzelszembeninkbbaprogrambanegyhelyenajnlatoslerniazadatbziskomplettstruktrjtsaztn
ezt a lerst hvatkozsknt hasznlni az ilyen tblkra vagy mezkre vonatkoz specilis utastsok
flautomatikus generlsakor. gy javarszt elkerljk annak a rmt, hogy minden alkalommal, amikor az
adatbzisstruktrjabrmilyenkismrtkbenmegvltozik,akdbanmindenfelesztszrtnagyszmutastst
kelljenbehatrolnismdostani.Ehelyettelegendmegvltoztatniareferencialerstsakdlegnagyobbrsze
korrektmarad,nemszksgesmdostani.
Astabilalkalmazsokltrehozsnakegyikvezrelvhezragaszkodunk:
Egyadatbziskezelsreszntprogramotmindigegyalkalmazssztralapjnkellmegkonstrulni.
Amit itt alkalmazssztr alatt rtek, annak nem kell szksgszeren egy Python sztrnak lenni.
Brmilyenadatstruktramegfelelhet,alnyeg,hogyegyadatokatlerkzpontihvatkozslegyen,amitesetleg
aformzsravonatkozinformcikkalmanipullsraknlunkfel.
MivelaPythonlistk,tuplekssztrakbrmilyentpusadatokatkpesekegyegysgbebecsomagolni,
ezrtezektkletesenmegfelelnekerreafeladatra.Akvetkezpldbanegysztrathasznlunk,aminekaz
rtkei tuplek listi, de az olvas a tbbi adatstruktrt is ugyangy vlaszthatn ugyanezeknek az
informciknakazeltrszervezsre.
Miutnjlmegszerveztk,mgegyfontoskrdsselkellfoglalkoznunk:konkrtanhovfogjuktelepteniaz
alkalmazssztrat?
Ezeket az informcikat a program brmely rszrl el kell tudnunk rni. gy tnik, hogy egy globlis
vltozba kell tenni az alkalmazssztrat, pontosan gy, mint ms, a programunk egsznek mkdshez
szksges adatokat. Mrpedig tudjuk, hogy a globlis vltozk hasznlata nem javasolt: olyan veszlyeket
hordoznak,amikaprogrammretvelnnek.Mindenesetreagloblisnaknevezettvltozkcsakugyanazona
modulonbellgloblisak.Haaprogramunkatmodulokegyttesekntkvnjukmegszervezni(amiegybkntegy
kitngyakorlat),akkorgloblisvltozinkhozcsakegyetlenmodulbanfogunkhozzfrni.
Erreaproblmravanegyegyszerselegnsmegolds:klnosztlybakellsszegyjteniazalkalmazs
egytteseszempontjblgloblissttusztignylvltozkat.gyegyosztlynvterbebezrvaezekavltozk
problmanlklhasznlhatkbrmilyenmodulban:elg,haamodulimportljaeztazosztlyt.Radsulennek
atechniknakahasznlataegyrdekeskvetkezmnnyeljr:azilymdondefiniltvltozkgloblisjellege
vilgosanmegjelenikaminstettnevkben,mertezanvavltozttartalmazosztlynevvelkezddik.
HapldulGlobagloblisvltozinkszmraltrehozottosztlyneve,akkoraprogramunkbanezekrea
vltozkramindenttaGlob.ez,Glob.az,stb66.explicitnevekkelkellhivatkoznunk.

Ezatechnikafedezhetfelscriptnkelssoraiban.Definilunkascriptbenegy Glob() osztlyt,aminem


ms,mintegyegyszerkontner. Egyetlenobjektumotsemfogunkltrehozniebblazosztlybl,aminem
tartalmazmetdusokat.Agloblisvltozinkegyszerosztlyvltozkkntvannakdefinilvasgyezekrea

66 GloblisvltozinkatelhelyezhetjkegyGlob.pynevmodulban,amitaztnimportlunk.Modulvagyosztly
nvtrknt val hasznlata vltozktrolsra teht hasonltechnikk.Egyosztly hasznlata taln egy kicsit
rugalmasabbsolvashatbb,mertazosztlytkvethetiascripttbbirsze,mgegymodulszksgszerenegy
klnllfile.

259. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
program tbbi rszben mint a Glob attribtumaira hivatkozhatunk. Pldul az adatbzis nevt mindentt a
Glob.dbNamevltozbanlehetmajdmegtallni,aserverIPcmtaGlob.hostvltozban,stb.:

1. class Glob:
2. """Nvtr <pszeudo-global> vltozk s fggvnyek szmra"""
3.
4. dbName = "discotheque" # az adatbzis neve
5. user = "jules" # tulajdonos vagy felhasznl
6. passwd = "abcde" # hozzfrs jelszava
7. host = "192.168.0.235" # a server neve vagy IP cme
8.
9. # Adatbzisszerkezet. Tblk s mez k sztra :
10. dicoT ={"Zeneszerzok":[('id_szerzo', "k", "els dleges kulcs"),
11. ('nev', 25, "nv"),
12. ('utonev', 25, "utnv"),
13. ('ev_szul', "i", "szletsi v"),
14. ('ev_halal', "i", "hall ve")],
15. "muvek":[('id_mu', "k", "els dleges kulcs"),
16. ('id_szerzo', "i", "szerz kulcs"),
17. ('cim', 50, "m cme"),
18. ('ido', "i", "id (percben)"),
19. ('eloado', 30, "el ad")]}

AzadatbzisszerkezetetleralkalmazssztraGlob.dicoTvltozbanvan.
EzegyPythonsztr,aminekakulcsaiatblanevek.Amiazrtkeketilleti,mindegyikkegylista,amia
tblamindenegyesmezjnekalerstegyegytupleformjbantartalmazza.
Teht mindegyik tuple a tbla egy kln mezjt rja le. Hogy ne legyen a gyakorlat megterhel, ezrt
sszesen hrom informcira korltoztam a lerst: meznv, meztpus s rvid kommentr. Egy igazi
alkalmazsbanblcsdologlenneezekhezhozztennimgmsinformcikat,amikpldulamezadatainak
esetlegeshatrrtkeire,akpernyrevagynyomtatratrtnkirsformzsravonatkoznak;aszveget,amit
azoszlopfejlcbekellrni,amikorazadatokattblzatbanakarjukprezentlni,stb.
Azolvasnakmeglehetsen unalmasnak tnhetazadatstruktraennyirerszletekbemen lersa, amikor
valsznlegrgtnelszeretnekezdenigondolkodniazadatokkezelsreszolglalgoritmusokkivitelezsn.
Egy j struktralerssal ksbb biztosan sok idt fog nyerni, mert az szmos dolog automatizlst teszi
lehetv.Aksbbiekbenennekegydemonstrcijtfogjukltni.Egybkntmegkellrlagyzdnie,hogyeza
kicsitkellemetlenfeladatfelksztarra,hogyahtralvmunkajlstruktrltlegyen:rlapokszervezse,az
elvgzendtesztek,stb.

16.3.2 Egyinterfaceobjektumosztlydefinilsa
AzelzszakaszbanlertGlob()osztlytascriptelejnhelyezzkel,vagyegymodulban,amitascriptelejn
importlunk. A tovbbiakban felttelezem, hogy ezt az utbbi formt alkalmazzuk: a Glob() osztlyt egy
dict_app.pynevmodulbamentettk,ahonnanmostakvetkezscriptbeimportlhatjuk.
Ezazjscriptegyinterfaceobjektumosztlytdefinil.Hasznotszeretnnkazelzfejezetekbentanultakbl
hzni, s ezrt az objektumokkal val programozst tmogatjuk, hogy egysgbe zrt s szles krben jra
felhasznlhatkdrszletekethozzunkltre.
Azinterfaceobjektumok,amiketltreakarunkhozni,hasonlakleszneka9.fejezetbenfilekezelsrehasznlt
fileobjektumokhoz.Emlkezznkvissza:pldulgynyitunkmegegyfilet,hogyaz open() factoryfggvny
segtsgvelltrehozunkegyfileobjektumot.Hasonlmdonfogjukmegnyitniakommunikcitazadatbzissal.
AzABKezelo()osztlysegtsgvelgenerlunkegyinterfaceobjektumot,amimajdltrehozzaakapcsolatot.A
fileobjektummetdusaithasznljukarra,hogyegynyitottfileblolvassunk,illetveabbarjunk.Analgmdon

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 260.
egyinterfaceobjektumklnbzmetdusaivalfogunkmveleteketvgrehejtatniazadatbzison.

1. import MySQLdb, sys


2. from dict_app import *
3.
4. class ABKezelo:
5. """Egy MySQL adatbzis ltrehozsa s illesztse"""
6. def __init__(self, dbName, user, passwd, host, port =3306):
7. "Kapcsolat ltrehozsa Cursor ltrehozsa"
8. try:
9. self.adatBazis = MySQLdb.connect(db =dbName,
10. user =user, passwd =passwd, host =host, port =port)
11. except Exception, err:
12. print 'Nem sikerlt a kapcsolat az adatbzissal :\n'\
13. 'A detektlt hiba :\n%s' % err
14. self.kudarc =1
15. else:
16. self.cursor = self.adatBazis.cursor() # cursor ltrehozsa
17. self.kudarc =0
18.
19. def createTables(self, dicTables):
20. " <dicTables>.sztrban lert tblk ltrehozsa"
21. for table in dicTables: # kulcsok bejrsa.
22. req = "CREATE TABLE %s (" % table
23. pk =''
24. for descr in dicTables[table]:
25. mezoNev = descr[0] # ltrehozand mez cmkje
26. mt = descr[1] # ltrehozand mez tpusa
27. if mt =='i':
28. mezoTipus ='INTEGER'
29. elif mt =='k':
30. # 'els dleges kulcs' mez (automatikusan incrementlt)
31. mezoTipus ='INTEGER AUTO_INCREMENT'
32. pk = mezoNev
33. else:
34. mezoTipus ='VARCHAR(%s)' % mt
35. req = req + "%s %s, " % (mezoNev, mezoTipus)
36. if pk == '':
37. req = req[:-2] + ")"
38. else:
39. req = req + "CONSTRAINT %s_pk PRIMARY KEY(%s))" % (pk, pk)
40. self.executeReq(req)
41.
42. def deleteTables(self, dicTables):
43. "<dicTables>-ben lert sszes tbla trlse"
44. for table in dicTables.keys():
45. req ="DROP TABLE %s" % table
46. self.executeReq(req)
47. self.commit() # kirats diszkre
48.
49. def executeReq(self, req):
50. "<req> krs vgrehajtsa, az esetleges hiba detektlsval"
51. try:
52. self.cursor.execute(req)
53. except Exception, err:
54. # a krs s a rendszer hibazenetnek kirsa :
55. print "Inkorrekt SQL krs:\n%s\nDetektlt hiba:\n%s"\
56. % (req, err)
57. return 0
58. else:
59. return 1
60.
61. def resultReq(self):
62. "el z krs eredmnynek visszakldse (egymsba gyazott tuplek)"
63. return self.cursor.fetchall()
64.
65. def commit(self):
66. if self.adatBazis:

261. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
67. self.adatBazis.commit() # cursor -> diszk tvitel
68.
69. def close(self):
70. if self.adatBazis:
71. self.adatBazis.close()

Magyarzatok:
1.2.sorok:Asajtdict_appmodulunkmellett,amiagloblisvltozkattartalmazza,importljuka:sys
modult,aminhnyrendszerfggvnytsaMySQLdbmodult,amimindazttartalmazza,amiaMySQLlel
valkommunikcihozszksges.Emlkezznkr,hogyezamodulnemkpezirsztastandardPython
disztribcinak,ezrtklnkelltelepteni.
5.sor:Azinterfaceobjektumokltrehozsakormegkelladnunkakapcsolatparamtereit:azadatbzisnevt,
a felhasznlnevet, a felhasznl jelszavt, a gp nevt vagy az IP cmt. A kommunikcis port szma
szoksszerintazalaprtelmezettrtk.Felttelezem,hogymindezekazinformcikrendelkezsrellnak.
8.17.sorok:Tancsosakommunikciltrehozsraszolglkdotegy tryexceptelse kivtelkezelben
(lsd119.oldalt)elhelyezni,mertnemttelezhetjkfel,hogyaserverelrhetlesz.Jegyezzkmeg,hogyaz
__init__() metdusnemadhatvisszatrsirtket(a return utastssegtsgvel)abblatnybladdan,
hogyaPythonautomatikusanhvjaegyobjektumltrehozsakor.Amitebbenazesetbenahvprogramnak
visszaad,azazjonnanltrehozottobjektum.Tehtahvprogramnaknemtudjukjelezniegyvisszatrsi
rtkkel, hogysikerltevagy pedig meghisult akapcsolat ltrehozsa. Erre a problmra egy egyszer
megolds, hogy akapcsolatteremts ksrletnek az eredmnyt egy objektumattribtumban (self.kudarc
vltoz)troljuk,amitahvprogramakkortesztelhet,amikorazszmrajnaktnik.
19.40.sorok: Ez a metdus az alkalmazssztr lerst amit argumentumban kell neki megadni
kihasznlva automatizlja az adatbzis tblinak a ltrehozst. Egy ilyen automatizls nyilvn annl
jelentsebb, minl komplexebb lesz az adatbzis szerkezete. (Kpzeljnk el pldul egy 35 adattblt
tartalmazadatbzist!).Azrt,hogyneneheztsemabemutatst,azintegersvarchartpusmezk
ltrehozsrakorltoztamennekametdusnakakpessgeit.Azolvasszabadonkiegszthetimstpus
mezkltrehozshozszksgesutastsokkal.

Haazolvasalaposabbannzimegakdot,megfogjallaptani,hogyazmindentblaszmraegyareq
stringbe darabrldarabra trtn SQL krs sszelltsbl ll. Az SQL krst aztn argumentumknt
vgrehajtsra tadjuk az executeReq() (krs vgrehajtsa) metdusnak. Ha meg akarjuk nzni az gy
ltrehozottkrst,nyilvna40.sorutnakdhozlehetrniegyprintrequtastst.

Ehhezametdushozhozzlehetadniahivatkozsiintegritsiknyszerekbevezetsnekakpessgtisegy
alkalmazssztrbanlvkiegsztsalapjn,amilerjaezeketaknyszereket.Nemfejtemkiakrdst,deha
azolvastudjahogymirlvansznemkelleneennekproblmtokozni.
42.47.sorok: Ez a metdus sokkal egyszerbb, mint az elz, ugyanazt az elvet alkalmazza az
alkalmazssztrbanlertsszestblatrlsre.
49.59.sorok:Ametdustadjaakrstacursorobjektumnak.Ahasznaaz,hogyegyszerstiahozzfrst
acursorobjektumhozshaszksgeshibazenetetgenerl.
61.71.sorok:EzekametdusokcsakegyszerkzvettkaMySQLdbmodulltalltrehozottobjektumok
fel:a MySQLdb.connect() factoryfggvnyltalltrehozottconnectorobjektumsamegfelelcursor
objektumfel.Lehetvteszikahvprogramnmiegyszerstst.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 262.
16.3.3 Formgenertorksztse
Azrt adtam ezt az osztlyt a gyakorlathoz, hogy bemutassam, hogyan hasznlhatjuk fel ugyanazt az
alkalmazssztrat egy ltalnos kd kidolgozsra. Az az elkpzels, hogy egy formobjektum osztlyt
konstrulunk,amibrmilyenadattblabejegyzskdolsrlkpesgondoskodniazalkalmazssztrblkinyert
informcikalapjnautomatikusanltrehozottmegfeleladatbeviteliutastsokrvn.
Egyvaldialkalmazsbanbiztosanjelentsentkellenealaktanieztavgletekigleegyszerstettformot.
Valsznleg specializlt ablak alakja lenne, amiben az adatbeviteli mezket s cmkiket megint csak
automatikusanhozhatnnkltre.Nemlltom,hogyezjplda,pusztnaztakaromvelemegmutatni,hogyan
automatizlhat a form konstrukcija. Hasonl elveket hasznlva prblja meg az olvas elkszteni a sajt
formjait.

1. class adatRogzites:
2. """klnbz bejegyzsek kezelsre szolgl osztly"""
3. def __init__(self, bd, table):
4. self.bd =bd
5. self.table =table
6. self.description =Glob.dicoT[table] # mez k lersa
7.
8. def enter(self):
9. "bevitt adat rgztse az adatbzisban"
10. mezok ="(" # vzstring a mez neveknek
11. ertekek ="(" # vzstring az rtkeknek
12. # Egyms utn minden mez nek rtket krnk :
13. for cha, type, nev in self.description:
14. if type =="k": # nem fogjuk krni a bejegyzs sorszmt
15. continue # a felhasznltl (automatikus sorszmozs)
16. mezok = mezok + cha + ","
17. val = raw_input("rja be az rtket %s :" % nev)
18. if type =="i":
19. ertekek = ertekek + val +","
20. else:
21. ertekek = ertekek + "'%s'," % (val)
22.
23. mezok = mezok[:-1] + ")" # az utols vessz trlse
24. ertekek = ertekek[:-1] + ")" # egy zrjel hozzadsa
25. req ="INSERT INTO %s %s VALUES %s" % (self.table, mezok, ertekek)
26. self.bd.executeReq(req)
27.
28. ch =raw_input("Folytatja (I/N) ? ")
29. if ch.upper() == "I":
30. return 0
31. else:
32. return 1
Magyarzatok:
1.6.sorok: Ennek az osztlynak az objektumai ltrehozsuk pillanatban megkapjk a sztr egyik
tbljnakahivatkozst.Enneksegtsgvelfrnekhozzamezlersokhoz.
8.sor: Az enter() metdus generlja a formot. gondoskodik a bejegyzseknek az adattblba val
bersrlasztrbantalltlerssegtsgvelalkalmazkodvaazokstruktrjhoz.
Amkdsemegintabblll,hogyrszekblmegalkotegystringet,amiegySQLkrslesz,ahogyanazaz
elzszakaszbanazABKezelo()osztlycreateTables()metdusbanlevanrva.

Termszetesenmgmspldulabejegyzsektrlsres/vagymdostsraszolglmetdusokatis
hozzadhatnnkehhezazosztlyhoz.
12.21.sorok: A self.description pldnyattribtum egy tuplekbl ll listt tartalmaz. A tuplek
mindegyikehromelemblll,ezek:amezneve,avrtadattpusasvilgoslersa.A13.sor for

263. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
ciklusabejrjaeztalisttsmindegyikmezhzkirameztksrlersalapjnegyadatbevitelrefelszlt
zenetet.Amikorafelhasznlbertaakrtrtket,akkorazegystringbenmegleszformzva.Aformzsa
meztpusnakmegfelelenalkalmazkodikazSQLnyelvkonvenciihoz.
23.26.sorok:Amikormindenmeztbejrtunk,akrstsszelltjasvgrehajtja.Hamegakarjuknznia
krst,termszetesena25.sorutnrhatunkegyprintrequtastst.

16.3.4 Azalkalmazsteste
Egykezdkszmrartknyvbennemltomrtelmtagyakorlattovbbfejlesztsnek.Haatrgykrrdekli
azolvast,akkormrelegetkelltudniaahhoz,hogymagaiseltudjonkezdeniksrletezni.Megkellnzniolyan
jreferenciamveket,mintDeitelstsaiPython:Howtoprogramja,vagyaPythonbvtmnyekrlszl
websiteokat.
A kvetkez script egy kis alkalmazs, ami az elz oldalakon lert osztlyok tesztelsre val.
Tkletesthetvagyegymsik,teljeseneltrscriptrhatbelle!
1. ###### F program : #########
2.
3. # Adatbzis-interface objektum ltrehozsa :
4. bd = ABKezelo(Glob.dbName, Glob.user, Glob.passwd, Glob.host)
5. if bd.kudarc:
6. sys.exit()
7.
8. while 1:
9. print "\nMit akar csinlni :\n"\
10. "1) Adattblkat ltrehozni\n"\
11. "2) Adattblkat trlni ?\n"\
12. "3) Zeneszerz ket berni\n"\
13. "4) M veket berni\n"\
14. "5) Zeneszerz ket listzni\n"\
15. "6) M veket listzni\n"\
16. "7) Valamilyen SQL krst vgrehajtani\n"\
17. "9) Kilpni ? Vlasszon :",
18. ch = int(raw_input())
19. if ch ==1:
20. # a sztrban lert sszes tbla ltrehozsa :
21. bd.createTables(Glob.dicoT)
22. elif ch ==2:
23. # a sztrban lert sszes tbla trlse :
24. bd.deleteTables(Glob.dicoT)
25. elif ch ==3 or ch ==4:
26. # zeneszerz k vagy m vek adatRogzites objektumnak ltrehozs :
27. table ={3:'Zeneszerzok', 4:'muvek'}[ch]
28. enreg =adatRogzites(bd, table)
29. while 1:
30. if enreg.enter():
31. break
32. elif ch ==5 or ch ==6:
33. # az sszes zeneszerz vagy az sszes m listzsa :
34. table ={5:'Zeneszerzok', 6:'muvek'}[ch]
35. if bd.executeReq("SELECT * FROM %s" % table):
36. # a fenti krs eredmnynek elemzse :
37. records = bd.resultReq() # tuple-kb l ll tuple lesz
38. for rec in records: # => minden bejegyzs
39. for item in rec: # => minden mez a bejegyzsben
40. print item,
41. print
42. elif ch ==7:
43. req =raw_input("rja be az SQL krst : ")
44. if bd.executeReq(req):
45. print bd.resultReq() # tuple-kb l ll tuple lesz
46. else:
47. bd.commit()
48. bd.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 264.
49. break

Magyarzatok:
Termszetesenfelfogomttelezni,hogyafntebblertosztlyokisbennevannakebbenascriptbenvagy
importltukket.
3.6.sorok:Azinterfaceobjektumot hozzuk itt ltre. Ha eznemsikerl, akkora bd.kudarc objektum
attribtumaz1rtkettartalmazza.Az5.s6.soroktesztjeazalkalmazsazonnalilelltstteszilehetv(a
sysmodulexit()fggvnyespecilisanerreszolgl).
8.sor:Azalkalmazshtralvrszeegyvgtelenhurok,amimindaddigugyanaztamentknljafl,amg
afelhasznlan9opcitnemvlasztja.
27.s28.sorok: Az adatRogzites() osztly brmelyik adattbla bejegyzseit elfogadja kezelsre. Egy
sztratamiafelhasznlvlasztstlfggenmegadja,hogymelyiknevetfogadjukel(n3vagyn4
opci) hasznlunk annak meghatrozsra, hogy az objektum ltrehozsakor melyik adattblt kell
hasznlni.
29.31.sorok:AzadatRogzitesobjektumenter()metdusaaszerintad0vagy1visszatrsirtket,hogya
felhasznlabejegyzsekrgztsnekfolytatstvagylelltstvlasztotta.Ennekazrtknekavizsglata
teszilehetvahurokmegszaktst.
35.s44.sorok: Az executeReq() metdus aszerint ad 0 vagy 1 visszatrsi rtket, hogy a server
elfogadtae a krst vagy sem. Teht azt eldntend vizsglhatjuk ezt az rtket, hogy ki kelle rni az
eredmnytvagysem.

Gyakorlatok:
16.2. Mdostsa az elz oldalakon lert scriptet gy, hogy egy kiegszt tblt ad az
adatbzishoz. Ez pldul lehetne egy zenekar tbla, amiben mindegyik bejegyzs
tartalmaznazenekarnevt,akarmesternevtahangszerekszmt.

16.3. Adjonegymeztazegyiktblhoz(pldulegyfloat(vals)tpusvagyegydtumtpus
mezt)smdostsaascriptet.

265. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
17.Fejezet: Webalkalmazsok
Azolvasbiztosansokmindenttanultmrmsholaweblapokszerkesztsrl.Tudja,hogyezekalapok
HTML formtum dokumentumok, amiket egy hlzaton (intraneten vagy interneten) webbrowsernek vagy
navigtornaknevezettprogramokkal(Netscape,Konqueror,Internetexplorer,...)lehetmegnzni.
A HTML lapok egy msik szmtgp amin llandan fut egy Web servernek (Apache, IIS, Zope, ...)
nevezettalkalmazspublicknyvtrbavannakteleptve.Amikorltrejttegykapcsolatamiszmtgpnks
ekzttaszmtgpkztt,akkoranavigtorprogramunkprbeszdetfolytathataserverprogrammal(egysor
hardvereszkzsprogramkzvettsvel,amikrlmostnemfogunkbeszlni:telefonvonalak,routerek,cache
ek,kommunikcisprotokolok...).
A weblapok tvitelt kezel HTTP protokol ktirny adatcsert engedlyez. Azonban az esetek nagy
tbbsgben az informci tvitel gyakorlatilag csak egyirny, tudni illik a server fell a navigtor fel:
szvegeket,kpeket,klnflefileokatkldnekinagyszmban(ezekaweblapok,amiketmegnznk);ezzel
szemben a navigtor a servernek csak kevs informcit kld: lnyegben azoknak a lapoknak az URLt,
amiketaszrfzmegakarnzni.

17.1 Interaktvweblapok
Tudjuk viszont, hogy vannak olyan weblapok, amik arra szltanak fel, hogy szolgltassunk nagyobb
mennyisginformcit:adjunkmegszemlynkrevonatkozadatokategyklubbavalberatkozskor,vagy
egyszllodaiszobafoglalskor,ahitelkrtyaszmunkategyekereskedelmisiteonegytermkmegrendelsekor,
vlemnynketvagyjavaslatainkat,stb.
Sejtjk,hogyegyilyenesetben,mintazemltettekegyike,aztvittinformcitaserveroldalonegyspecilis
programnakkellkezelni.Tehtazilyen,informcifogadsraszntweblapokelkelllegyenekltvaegyolyan
mechanizmussal,amibiztostjaazadatoktviteltazinformcikezelsreszntprogramfel.Arraisszksg
van,hogyezaprograminformcittudjontadniaservernek,hogyazamveleteredmnytegyjweblap
formjbantudjaprezentlniaszrflnek.
Ennek a fejezetnek az a clja, hogy megmagyarzza, hogyan hasznlhatjuk fel Python programozsi
tudsunkatarra,hogyegywebsitehozvaldialkalmazsokbeillesztsvelilyeninterakivitstadjunk.
Fontosmegjegyzs:Akvetkezfejezetbenkifejtettekazolvasiskoljnakvagyvllalatnakintranetn
azonnal mkdkpesek lesznek (felttve, hogy az intranet adminisztrtora a servert megfelel mdon
konfigurlta). Ami az internetet illeti, a helyzet egy kicsit bonyolultabb. Magtl rtetdik, hogy csak a
rendszergazda beleegyezsvel lehet programokat telepteni egy internetre kapcsolt serverre. Ha egy internet
szolgltatbizonyosdiszkterletetbocstottarendelkezsnkre,aholengedlyezvevanstatikusweblapok
teleptse, az nem jelenti azt, hogy ott Python scripteket mkdtethetnk. Ahhoz, hogy az utbbiak
mkdhessenek,azinternetszolgltatnktlengedlytsinformcikatkellkrnnk.Megkellkrdezni,hogy
aktivlhatunkePythonbanrtCGIscripteketaweblapjainkrlsmelyknyvtr(ak)batelepthetjkket.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 266.
17.2 ACGIinterface
ACGI(CommonGatewayInterface)interfacealegtbbwebservernekazegyikkomponense.Ezegytjr,
ami lehetv teszi a kommunikcit az ugyanazon a szmtgpen fut ms programokkal. CGIvel ms
nyelveken(Perl,C,Tcl,Python...)rhatunkscripteket.
Ahelyett,hogyawebetelremegrtdokumentumokrakorltoznnk,aCGIlehetvteszi,hogyaszrfl
navigtora segtsgvel megadott adatoktl fggen hozzunk ltre weblapokat. A CGI scriptekkel az
alkalmazsok szles sklja hozhat ltre: online regisztrcis szolgltatsok, adatbzis keres eszkzk,
kzvlemnykutatsok,jtkok,stb.
ACGIprogramozstantsaegszkziknyvektrgytkpezheti.Ebbenakezdkszmrartknyvbencsak
nhny alapelvet magyarzok el, hogy sszehasonlts rvn megrtessem azt az risi elnyt, amit olyan
specializlt alkalmazsserver modulok nyjtanak egy interaktv websiteot fejleszteni kvn programoznak,
mintaKarrigell,aCherryPyvagyaZope.

17.2.1 EgyalapCGIinterakci
A kvetkezk megrtse rdekben felttelezem, hogy az olvas iskolai vagy vllalati hlzatnak
adminisztrtora gy konfigurlt egy intranet webservert, hogy az olvas egy sajt knyvtrba telepthessen
HTMLoldalakatsPythonscripteket.
Elspldnkegyrendkvlegyszerweblaplesz.Egyetleninteraktvelemettesznkr,egygombot.Ezzela
gombbalfogjukelindtaniaztaprogramot,amitmajdaksbbiekbenrokle.
KdoljukazalbbiHTMLdokumentumotegytetszlegeseditorral(asorszmokatnerjukbe,mertcsaka
magyarzatmegknnytsemiattvannakott):
1. <HTML>
2. <HEAD><TITLE> Pythonos gyakorlat</TITLE></HEAD>
3. <BODY>
4.
5. <DIV ALIGN="center">
6. <IMG SRC="penguin.gif">
7. <H2>Interaktv weblap</H2>
8. <P>Ez a lap egy Python scripttel van sszekapcsolva</P>
9.
10. <FORM ACTION="http://Serveur/cgi-bin/input_query.py" METHOD="post">
11. <INPUT TYPE="submit" NAME="send" VALUE="A script vgrehajtsa">
12. </FORM>
13.
14. </DIV></BODY></HTML>

Azt mr biztosan tudja az olvas, hogy a kezd s a megfelel zr <HTML>, <HEAD>, <TITLE>,
<BODY>tagekmindenHTMLdokumentumbankzsek.Ezrtnemfogunkfoglalkozniaszerepkkel.
Az5.sorbanalkalmazott<DIV>tagszoksszerintaHTMLdokumentumklnrszekrebontsraszolgl.
Ittarrahasznlom,hogyegyolyanrsztdefinilok,amibenmindenelem(vzszintesen)kzprevanigaztva.
A6.sorbabeszrokegykpet.
A7.sormsodlagoscmkntegyszvegsortdefinil.
A8.soregyszokvnyosbekezds.

267. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
A10.12.soroktartalmazzkalnyegeskdot(amivelfoglalkozunk).A<FORM>s</FORM>tagekegy
formot definilnak, vagyis a weblap egy rsze klnbz widgeteket tartalmazhat adatbeviteli mezket,
gombokat,jellngyzeteket,rdigombokat,stb.amikkelaszrflbizonyostevkenysgeketvgezhet.
A<FORM>tagnekktfontosparamtertkelltartalmazni:aformelkldsekorvgrehajtand akcit (itt
annakaprogramnakazURLtkellmegadni,amitaztvittadatokkezelshezkellhvni) sazinformci
tvitelrehasznltmdszert(amiminketillet,ezmindigapostmdszerlesz).

Pldnkban a hvni kvnt program egy input_query.py nev Python script, ami az intranet server egy
specilisknyvtrbanvan.Sokszerverenennekaknyvtrnakaneve cgibin. Ezcsakegykonvenci.Ittazt
felttelezem, hogy az iskolai intranet adminisztrtora a Python scripteknek ugyanabba a knyvtrba val
teleptstengedlyezte,mintamelyikbenazolvassajtweblapjaivannak.
Ezrt a pldnk 10. sorban lv http://Serveur/cgibin/input_query.py cmet azzal a cmmel kell
helyettesteni,amitazadminisztrtormegad67.
A11.sortartalmazzaaztataget,amiegyelkldsgomb(<INPUTTYPE="submit">tag)tpuswidgetet
definil.AVALUE="texte"attribtummaladjukmegaztaszveget,aminekagombonkellmegjelenni.Jelen
esetbenaNAMEparamtermegadsanemktelez.Ezawidgetnevtjelli(arraazesetre,haaclprogramnak
szksgelenner).
Amikor befejeztk a kdolst, mentsk a dokumentumot tetszleges nven .html vagy .htm filenv
kiterjesztsselabbaaknyvtrba,amiaweblapjainkelhelyezsreszolgl(pldul:essai.html).

Az input_query.py Python scriptet az albbiakban rszletezem. Mint mr fntebb emltettem, a scriptet


ugyanabbaaknyvtrbalehettelepteni,mintamibenaHTMLdokumentumunkvan.:
1. #! /usr/bin/python
2.
3. # Egy egyszer stett HTML rlap kiratsa :
4. print "Content-Type: text/html\n"
5. print """
6. <H3><FONT COLOR="Royal blue">
7. Pythonscripttelellltottweblap
8. </FONT></H3>
9.
10. <FORM ACTION="print_result.py" METHOD="post">
11. <P>Krem rja be a nevt az albbi mez be :</P>
12. <P><INPUT NAME="latogato" SIZE=20 MAXLENGTH=20 TYPE="text"></P>
13. <P>rjon be egy tetsz leges mondatot is :</P>
14. <TEXTAREA NAME="mondat" ROWS=2 COLS=50>Mississippi</TEXTAREA>
15. <P>Ezt a mondatot fogom hisztogramksztsre hasznlni.</P>
16. <INPUT TYPE="submit" NAME="send" VALUE="Action">
17. </FORM>
18. """

67 Pldul:http://192.168.0.100/cgi/Classe6A/Dupont/input_query.py.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 268.
Ascriptsemmimstnemcsinl,mintkiregyjweblapot,amimegintegyformottartalmaz,deazmost
kidolgozottabb,mintazelzvolt.
Azelssornlklzhetetlen:ezjelziaCGIinterfacenek,hogyascriptvgrehajtshozelkellindtania
Pythoninterpretert.Amsodiksoregykomment.
A 4. sor nlklzhetetlen. Ez teszi lehetv a Python interpreternek egy valdi HTML dokumentum
inicializlst, amit t fog adni a webservernek. Ez utbbi vissza fogja kldeni a HTML dokumentumot a
szrflnavigtornak,amikiratjaazt.
AzutnakvetkeztisztaHTMLkdotaPythonegyszerkarakterlnckntkezeli,amitaprintutastssal
ratunkki.Hogy betudjukszrnimindazt, amit szeretnnk asoremelseket,aposztrfokat,idzjeleketis
belertve,ezrteztastringet<<<>>>lelhatroljuk.(Emlkezznkr,hogyaHTMLfigyelmenkvlhagyja
a soremelseket, teht annyit hasznlhatunk bellk a kdunk levegsebb s gy olvashatbb ttelre,
amennyitakarunk).

17.2.2 EgyadatgyjtsreszolglHTMLform
ElemezzkmostaHTMLkdot.Lnyegbenegytbbbekezdsttartalmazjformottallunkbenne,amiben
tbbwidgetismerhetfel.A10.sormegadjaannakaCGIscriptnekanevt,aminekaformadataitlesznek
adva:nyilvnegymsikPythonscriptrlleszsz.
A12.sorbanegyadatbevitelimez(INPUTTYPE="text")tpuswidgetdefincijttalljuk.Ezarra
sztnziafelhasznlt,hogyrjabeanevt.AMAXLENGTHparamteraberandkarakterlncmaximlis
hosszthatrozzameg(esetnkben20karakter).ASIZEparamteramezmrettakpernynhatrozzameg.
ANAMEparamterazanv,amitannakavltoznakvlasztunk,amibenavrtstringetfogjuktrolni.
A14.sorbanegymsodik,kisseltradatbevitelimezvandefinilva(TEXTAREAtag).Egynagyobb
mezrlvansz,amitbbsorosszvegekfogadsraszolgl.(Ezamezautomatikusangondoskodikgrget
svokrl,haabevittszvegtlterjedelmes).AROWSsCOLSparamterekneveelgkifejez.Anyitszr
tagekkzalaprtelmezettszvegetrhatunk(pldnkban:Mississippi).
Mintazelzpldban,a16.sortartalmazzaannakagombnakadefincijt,amirerkellkattintani,hogy
tadjukazadatokataclCGIscriptnek,amitakvetkezkbenfogoklerni.

269. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
17.2.3 EgyadatkezelsreszolglCGIscript
ACGIscriptbenegynagyonegyszermecanizmusthasznlunkaHTMLformmaltadottadatokfogadsra.
Azalbbipldbaneztelemezhetjk.:
1. #! /usr/bin/python
2. # HTML form-mal tadott adatok kezelse
3.
4. import cgi # interface modul a webserverrel
5. form = cgi.FieldStorage() # A felhasznli krs fogadsa :
6. # egyfajta sztrrl van sz
7. if form.has_key("phrase"): # A kulcs nem ltezik, ha a
8. text = form["mondat"].value # megfelel mez res maradt
9. else:
10. text ="*** a phrase mez res volt ! ***"
11.
12. if form.has_key("latogato"): # A kulcs nem ltezik, ha a
13. nomv = form["latogato"].value # megfelel mez res marad
14. else:
15. nomv ="n nem adta meg a nevt"
16.
17. print "Content-Type: text/html\n"
18. print """
19. <H3>Ksznm, %s !</H3>
20. <H4>n a kvetkez mondatot adta meg: </H4>
21. <H3><FONT Color="red"> %s </FONT></H3>""" % (nomv, text)
22.
23. histogr ={}
24. for c in text:
25. histogr[c] = histogr.get(c, 0) +1
26.
27. lista = histogr.items() # talakts tuple-k listjv
28. lista.sort() # a lista rendezse
29. print "<H4>A mondat karaktereinek el fordulsi gyakorisgai :</H4>"
30. for c, f in lista:
31. print 'a <B>"%s"</B> karakter %s alkalommal fordul el <BR>' % (c, f)

A4.s5sorokalegfontosabbak.
A4.sorbanimportltcgimodulbiztostjaaPythonscriptkapcsolattaCGIinterfaceszel,amilehetvteszi
aprbeszdetawebserverrel.
Az 5. sorbana modul FieldStorage() fggvnyevisszatrsi rtkknt egy objektumotad,amiaHTML
formmal tadott adatokat tartalmazza. A form nev vltozba tesszk ezt a sztrra nagyon hasonlt
objektumot.
Egyvaldisztrsaformnevvltozbatettobjektumkzttazalnyegesklnbsg,hogyazutbbibla
value()metdussalkellkiszedniazrtkeket.Asztrakraalkalmazhattbbimetdust,mintamilyenpldula
has_key(),aszoksosmdonhasznlhatjuk.

A FieldStorage() visszatrsi rtkeknt megadott sztrobjektum fontos jellemzje, hogy a megfelel


HTMLformbanresenhagyottmezkszmranincskulcsa.
Pldnkbanaformnakktadatbevitelimezjevan,amikhezalatogatosmondatneveketrendeltk.
Ha a felhasznl kitlttte ket, akkor a tartalmukat a sztrobjektumban a latogato s a mondat
indexekenfogjukmegtallni.Viszont,havalamelyikmeztnemtltttkki,akkorazannakmegfelelindex
nem fogltezni. Teht az rtkek brmifle kezelse eltt felttlenl meg kell bizonyosodni a vrt indexek

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 270.
ltezsrl.Ezttesszka715sorokban.

(17) Gyakorlat:
17.1. Azelzekigazolsakntpldulkikommentezhetjkascript7.,9.,10.,12.,14.&15.
sorait. Ha ellenrizzk a mkdst, ltni fogjuk, hogy minden rendben megy, ha a
felhasznlazsszesmeztkitlti.Haviszontazegyikmeztresenhagyja,akkoregy
hibakeletkezik.
Fontosmegjegyzs:mivelascriptetegyweblapsegtsgvelindtottukel,ezrtaPythonhibazeneteknem
lesznekkirvaerreaweblapra,hanemawebserveresemnynapljbalesznekbejegyezve.Beszljemegaserver
adminisztrtorval,hogyhogyanfrhethozzehhezanaplhoz. Mindenesetreszmtsonr,hogyegyCGI
scriptbensokkalnehezebbahibakeress,mintegykznsgesalkalmazsban.
Ascripttbbirszeelgszokvnyos.
A 1721 sorokban csak a formmal tadott adatokat rjuk ki. Jegyezzk meg, hogy a nomv s text
vltozknakmrelzetesenlteznikkell,aminlklzhetetlennteszia9.,10.,14.s15.sorokat.
A 23., 24. s 25. sorokban egy sztrat hasznlunk hisztogramksztsre, ahogyan azt a 149. oldalon
magyarztam.
A27.sorbanasztrategytuplekbllllistvalaktjuk,hogya28.sorbanazutbbitnvsorszerinttudjuk
rendezni.
A30.s31.sorokforciklushoznemkellkommentr.

17.3 EgywebserverPythonban!
AzelzoldalakonazrtmagyarztamelnhnyCGIprogramozsialapismeretet,hogyjobbanmegrtsk
hogyanmkdikegywebalkalmazs.Haazolvasvalbanszeretneegyilyenalkalmazstkszteni(pldulegy
websiteot,amiinteraktv),akkorrfogjnni,hogyaCGIinterfacetlsgosankezdetlegeseszkz.Tlsgosan
nehzkesahasznlataezekbenascriptekben,ezrtjobbankidolgozotteszkzketkellignybevenni.
Rendkvljelentssvltawebfejlesztsirntirdekldssersazignyazehhezafeladathozadaptlt
interfaceeksprogramozsikrnyezetekirnt.Mghanemisolyanuniverzlis,mintaC/C++,aPythontmr
mindentszleskrbenalkalmazzkignyesprogramokrsra,gyazwebserveralkalmazsokterletnis.A
nyelv stabilitsa s egyszer kivitelezse szmos tehetsges fejlesztt vonzott, akik rendkvl magasszint
webfejleszt eszkzket ksztettek. Ezek kzl az alkalmazsok kzl tbb is rdekelheti az olvast, ha
sajtmagaakarklnbztpusinteraktvwebsiteokatkszteni.
Alteztermkektbbsgeszabadszoftver.Aszksgletekszlesskljtfedikle,anhnyoldalaskis
szemlyes websitetl a nagymret, kollaboratv kereskedelmi siteig, ami napi tbbezer krsre kpes
vlaszolnisaminekklnbzrszeitvltozatosismeretekkelrendelkezszemlyek(grafikusok,programozk,
adatbzisspecialistk,stb.)kezelnekanlkl,hogyzavarnkegymst.
AleghresebbezekkzlatermkekkzlaZope,amitmrnagymagnsnyilvnosszervezetekadaptltak
kollaboratv intranet s extranet fejlesztsekre. Egy nagyon versenykpes, biztonsgos, majdnem teljesen
Pythonbanrtalkalmazsserverrlvansz,amitegyegyszerwebinterfacesegtsgveltvolrlfelgyelhetnk.
AZopealkalmazslersraatmatlterjedelmesvoltamiattnemlenneelgegyknyv.Detudjunkrla,hogy

271. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
ezatermktkletesenalkalmasnagyonnagyvllalatiwebsiteokkezelsre,mikzbenrendkvlielnyket
knlaklasszikusPHPssJavasmegoldsokhozkppest.
Ms, kevsb ignyes, de gyszintn rdekes eszkzk is rendelkezsre llnak. A Zopehoz hasonlan a
tbbsgk szabadon letlthet az internetrl. Egybknt az, hogy Pythonban vannak rva biztostja
portabilitsukat:ugyangytudjukketWindowsalatthasznlni,mintLinuxvagyMacOsalatt.Mindegyikk
hasznlhat olyan klasszikus webserverrel, mint az Apache vagy a Xitami (ez a preferland, ha a
megvalstandsiteotnagyonnagyterhelsresznjuk).Egybkntegyesekkzlksajtwebservertfoglalnak
magukba,amilehetvteszi,hogyteljesenautonmmdonmkdjenek.Ezalehetsgklnsenhasznosegy
siteksztsekor,mertegyszerstiahibakeresst.
Asiteokelksztsnekegyszersgveltrsulvaezateljesautonmiaazemltetttermkeketnagyonj
megoldsokktesziakisskzpvllalkozsoknl,azadminisztrciban vagyaziskolkban specializlt
intranetsiteokmegvalstsra.HaazolvasolyanPythonalkalmazstakarfejleszteni,aminekegyegyszer
navigtorralkellelrhetneklenniegyvllalatiintranetenkeresztl(vagyppenazinternetenkeresztl,haaz
elrelthatterhelsnemtljelents),akkorezekazalkalmazsokazolvasnakkszltek.
Szmosvltozatukltezik: Poorman'sZope,Spyce,Karrigell,Webware,Cherrypy,Quixote,Twisted, stb.
Vlasszonignyeitlfggen.Absgzavarvalfogkzdeni.
A kvetkezkben egy Karrigelllel mkd webalkalmazst fogok lerni. A rendszer a
http://karrigell.sourceforge.netcmentallhat.Ezegyangoluljldokumentlt,egyszerwebfejleszts(Pierre
Quentelaszerzje,akarrigellbretonszjelentse:taliga).

17.3.1 AKarrigellteleptse
Ateleptsgyerekjtk:azinternetrlletltttarhvfiletkikellcsomagolniegytetszlegesknyvtrba.A
kicsomagolsautomatikusanltrehozegyKarrigellverziszmnevalknyvtrat.Eztaknyvtratfogjuk
akvetkezkbengykrknyvtrnaktekinteni.
Ha nem szndkozzuk a Karrigell kiegsztjeknt adott Gadfly68 adatbzisservert hasznlni, akkor ez
minden, amit tennnk kell ! Ha igen, akkor menjnk a gadfly1.0.0 alknyvtrba s rjuk be a python
setup.pyinstallparancsot(Linuxalattrootnakkelllennnk).Haabeptettdemotteljesegszbenmeg
akarjuknzni,eztazutaststkellvgrehajtani.

17.3.2 Aserverindtsa:
Egy webservert indtunk el, amihez aztn loklisan vagy a hlzaton t brmilyen navigtorral
hozzfrhetnk. Az indts eltt tancsos egy pillantst vetni a gykrknyvtrban tallhat Karrigell.ini
konfigurcisfilera.
Alaprtelmezettena Karrigell a80asportonvr http krseket.Anavigtoroktbbsgeeztaportszmot
hasznljaalaprtelmezetten.HaazonbanegyLinuxosgpenteleptjkaKarrigellt,akkor(biztonsgiokokbl)
nincsjogunkaz1024alattiportokhasznlatra.Haezahelyzetllfnt,akkormdostanikellakonfigurcis
filet,hogya Karrigell egymagasabbportszmothasznljon.ltalbana39.soreltti#karaktereltvoltst
vlasztjuk,amia8080portotaktivlja.Ksbbesetlegazrtkvnjukmdostaniakonfigurcisfilet,hogy
megvltoztassukawebsiteunkgykrknyvtrt(alaprtelmezettenezaserverknyvtra).
Hamrmdostottukakonfigurcisfilet,menjnkaservergykrknyvtrba,hamgnemvolnnkotts
rjukbeakvetkezparancsot:

68 Lsdazelzfejezetet:aGadflyegyPythonbanrtadatbzisserver

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 272.
pythonKarrigell.py

Ez minden. A Karrigell server elindul s kedvenc navigtorunkkal ellenrizhetjk a mkdst. Ha a


navigtort ugyanazon a gpen indtjuk el, mint amin a server van, akkor egy ilyen cmet kell megadnunk:
http://localhost:8080/index.html A localhost a loklis gpet jelenti, 8080 a konfigurcis fileban
vlasztottportszmsazindex.htmlasitehomepagee.Haviszontegymsikgprlakarunkhozzfrni
ugyanehhezahomepagehez,anavigtorbanalocalhosthelynaserverIPcmtkellmegadnunk.
Az elz szakaszban69 megadott cmmel a Karrigell egy demo sitejt rjk el, ami mr teleptve van a
gykrknyvtrba.Otttalljukazalapdokumentcitsegysorpldt.
Azelzekbenhallgatlagosanfeltteleztem,hogyaservertegykonzolszveggelvagyegyterminlablakbl
indtottuk.Aserverzeneteiegyikesetbenakonzolban,msikesetbenazablakbanjelennekmeg.Ottkereshetjk
az esetleges hibazeneteket. Ott kell beavatkozni, ha le akarjuk lltani a servert (a CTRLC billenty
kombincival).

17.3.3 Egywebsitevz
Prbljukmegelkszteniasajtwebsitevzunkat.EgyklasszikuswebservertleltrenaKarrigellnemcsak
statikusHTMLoldalakat(.htm,.html,.gif,.jpg,.cssfileokat),hanem:
Pythonscripteket(.pyfileokat)
HTMLenbellihibridPythonscripteket(.pihfileokat)
PythononbelliHTMLhibridscripteket(.hipfileokat)iskezelhet.
Hagyjukahibridscripteket,azolvasmagaistanulmnyozhatjaaszintaxisukat(amiegybkntrendkvl
egyszer), ha belekezd egy weboldal fejlesztsbe (megknnythetik az letet). A knyv korltai kztt
megelgszemakznsgesPythonscriptekkelvgzettnhnyksrlettel.
Mint a site minden ms elemt (.html, .gif, .jpeg, stb. fileokat), ezeket a Python scripteket is a
gykrknyvtrban70 kellelhelyezni.Rgtnellehetvgezniegyelemitesztet.rjukbeakvetkezegysoros
scriptet:
print "Bienvenue sur mon site web !"

Mentsk el ezt a scriptet hello.py nven a gykrknyvtrba, majd rjuk be a navigtorba a


http://localhost/hello.py vagy a: http://localhost/hello (a .py kiterjeszts elhagyhat) cmet. Ltnunk kell
megjelenni az zenetet. Ez azt jelenti, hogy a Karrigell krnyezetben a print utasts kimenete a kliens
navigtorbavankirva.
Mivelakirsegynavigtorablakbatrtnt,ezrtmindenHTMLszintaxisforrstfelhasznlhatunk,hogy
egymeghatrozottformzstkapjunk.Akvetkezutastsokkalpldulkirhatunkegy2sorbls3oszlopbl
lltblzatot:
print """
<TABLE BORDER="1" CELLPADDING="5">
69 Hameghagytuk azalaprtelmezett portszmot (80), akkorflsleges azt megismtelni acmekben, mert ezt a
portszmot hasznljk alaprtelmezetten a navigtorok. Egy msik konvenci, hogy egy website home pagee
majdnemmindgazindex.htmvagyindex.htmlnevfile.Amikoregywebsiteotahomepagenkezdveakarunk
megltogatni,akkorltalbanelhagyhatjukeztanevetacmbl.A Karrigell betartjaeztakonvencitgyegy
egyszerstettcmmelkapcsoldhatunkahomepagehez,mintamilyenakvetkez: http://localhost:8080 vagy
http://localhost(haaportszm80).
70 ...vagy a gykrknyvtr alknyvtraiban, ahogy az szoksos, amikor a konstrukci alatt lv site megfelel
struktrlsratreksznk.Ebbenazesetbenelgazalknyvtrnevtbevenniamegfelelcmekbe.

273. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
<TR> <TD> Rouge </TD> <TD> Vert </TD> <TD> Bleu </TD> </TR>
<TR> <TD> 15 % </TD> <TD> 62 % </TD> <TD> 23 % </TD> </TR>
</TABLE>
"""
Emlkezznk r, hogy a TABLE tag egy tblzatot definil. A BORDER opcija az elvlaszt keret
szlessgt,aCELLPADDINGopcijaacellktartalmakrlihzagotdefinilja.ATRsTD(TableRow et
TableData)tagekatblzatcellitssoraitdefiniljk

TermszetesenmindenPythonerforrst hasznlhatunk,
mintazalbbipldban,ahola0s90kzesszgek
sinusaibl, cosinusaibl s tangenseibl ksztnk tblzatot
egyciklussegtsgvel.
7.sor:A range() fggvnythasznljukaszgtartomny
definilsra(0tl60ig10onknt).
9.sor: A Python trigonometrikus fggvnyeinek
radinban kell a szget megadni. Ezrt egy talaktst kell
vgezni.
12.sor:Atblzatmindegyiksora4rtkettartalmaz.A
130. oldalon lert stringformz rendszer segtsgvel
formzunk:a%8.7fkonverzismarker8pozcinratja
kiazrtket,amibl7atizedespontutnvanA%8.7g
markerugyaneztcsinlja,csaktudomnyosformtumban,ha
szksges.
1. from math import sin, cos, tan, pi
2.
3. # Tblzatfej ltrehozsa
oszlopcmekkel :
4. print """<TABLE BORDER="1" CELLPADDING="5">
5. <TR><TD>Angle</TD><TD>Sinus</TD><TD>Cosinus</TD><TD>Tangente</TD></TR>"""
6.
7. for angle in range(0,62,10):
8. # fokbl radinn alakts :
9. aRad = angle * pi / 180
10. # a tblzat egy sornak ltrehozsa, kihasznljuk a stringformzst
11. # a kirs finomtsra :
12. print "<TR><TD>%s</TD><TD>%8.7f</TD><TD>%8.7f</TD><TD>%8.7g</TD></TR>"\
13. % (angle, sin(aRad), cos(aRad), tan(aRad))
14.
15. print "</TABLE>"

Ebben a stdiumban az olvas taln azt krdezi magtl, hogy mi a klnbsg akztt, amivel most
ksrleteztnksegyklasszikusCGIscriptkztt(mintamilyeta267.sazaztkvetoldalakontallunk).
Amikor hibzunk, nagyon gyorsan rzkelhetv vlik annak a jelentsge, hogy egy olyan specilisabb
krnyezetbendolgozunk,mintaKarrigell.AklasszikusCGIprogramozsbanaPythoninterpreterltalkiadott
hibazenetek nem rdnak ki a navigtor ablakba. A server (pldul Apache) egy naplfilejba vannak
bejegyezve,aminemegyszerstiamegtekintsket.
EgyolyaneszkzzelmintaKarrigellviszontegynagyonhatkonyjelzrendszerrel,valamintegykomplett
debugerrelrendelkeznk.Ksrletkntcsinljunkegykishibtafentiscriptbenstltskbejreanavigtorbaa
mdostottweblapot.Pldultrljkakettspontota7.sorvgrl,ekkorakvetkezkirstkapjuk:
ADebuggombrakattintvarengetegkiegsztinformcitkapunk(kirjaakompletscriptet,akrnyezeti

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 274.
vltozkat,stb.).

17.3.4 Sessionkkezelse
Egy interaktv websitet ksztsekor sokszor azt akarjuk, hogy a ltogat tudja magt azonostani s a
klnbz lapok ltogatsa sorn mindvgig tudjon informcikat szolgltatni (erre tpusplda a
bevsrlkocsifeltltseegykereskedelmisiteltogatsasorn)gy,hogyezekazinformcikmegrzdnek
valaholegszenaltogatsvgig.Termszeteseneztmindencsatlakozottkliensreegymstlfggetlenlkell
megvalstani.
Az informcik laprl lapra trtn tadsa rejtett formmezkkel lehetsges lenne, de ez kompliklt s
nagyonkorltozjelleglenne.Kvnatos,hogyaserverneklegyenegyspecilismechanizmusa,amimindegyik
klienshezhozzrendelegyspeclis sessiont. A Karrigell eztaclt cookiekkalriel.Amikoregyjltogat
azonostjamagt,aserverltrehozegysessionIdneknevezettcookietselkldianavigtornak,amielmentiazt.
Eza cookie egyegyedisessionazonostttartalmaz,aminekaserverenegysessionobjektumfelelmeg.
Amikoraltogatasitemsoldalaitjrjabe,anavigtoramindenalkalommalelkldia cookie tartalmta
serverneksaserverasessionazonostalapjnmegtudjatallniamegfelelsessionobjektumot.gyasession
objektum a szrfl ltogatsa sorn vgig rendelkezsre ll: egy kznsges Python objektumrl van sz,
amibenattribtumokformjbanbrmennyiinformcittrolhatunk.
Aprogramozsszintjnezakvetkezkppentrtnik:
Mindenoldalt,aminmegakarunknznivagymdostaniakarunkegysessioninformcit,azzalkezdnk,hogy
ltrehozzukaSession()osztlyegyobjektumt:
objet_session = Session()

Haasessionelejnvagyunk,akkoraKarrigellgenerlegyegyediazonostt,aztelhelyeziegycookieban
sacookietelkldianavigtornak.Tetszlegesszmattribtumotadhatunkasessionobjektumhoz:
objet_session.nev = "Jean Dupont"

275. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Atbbilaponhasonlmdonjrunkel,deebbenazesetbenaSession()osztlyblltrehozottobjektumnem
egyjobjektum,hanemasessionelejnltrehozottobjektum,amitaserverbelslega cookiebeliazonost
visszaolvassarvntalltmeg.Azattribtumairtkeihezhozzfrhetnksazobjeltumhozjattribtumokat
ishozzadhatunk:
obj_sess = Session() # a cookie-val megadott objektum megkeresse
om = obj_sess.nev # ltez attribtumrtk megtallsa
obj_sess.cikkszam = 49137 # j attribtum hozzadsa

A sessionobjektumoknak van egy close() metdusuk is, ami a sessioninformci trlsre val. Nem
ktelezasessionkexplicitzrsa:aKarrigellmindenesetrebiztostja,hogysoselegyenegyidben1000nl
tbbsession:amikorelriaz1000.sessiont,trlialegrgibbeket.

Kidolgozottplda:
Mentskazalbbihromkisscriptetagykrknyvtrba.AzelsafentebblerthozhasonlHTMLformot
generl.Legyenaneve:sessionTest1.py:

1. # Egy beratkozsi form kirsa :


2.
3. print """
4. <H3>Krem, azonostsa magt :</H3>
5.
6. <FORM ACTION = "sessionTest2.py">
7. Csaldnv : <INPUT NAME = "kliensCsaladnev"> <BR>
8. Utnv : <INPUT NAME = "kliensUtonev"> <BR>
9. Neme (ffi/no) : <INPUT NAME = "kliensNeme" SIZE ="1"> <BR>
10. <INPUT TYPE = "submit" VALUE = "OK">
11. </FORM>"""

AkvetkeznevelegyensessionTest2.py.Ezazascript,amitafntiformnyittagjbena6.sorbanadtunk
megsamiakkorleszhvva,amikorafelhasznla10.sorbanelhelyezettgombrakattint.Afelhasznlltala
form klnbz mezibe bert rtkeket a Karrigell71 QUERY krnyezeti vltozjban lv krssztr
kzvettsvelfogjafogadni:

1. obSess = Session()
2.
3. obSess.nev = QUERY["kliensCsaladnev"]
4. obSess.utonev = QUERY["kliensUtonev"]
5. obSess.nem = QUERY["kliensNeme"]
6.
7. if obSess.nem.upper() == "M":
8. megszolitas ="Monsieur"
9. else:
10. megszolitas ="Madame"
11. print "<H3> dvzlm, %s %s </H3>" % (megszolitas, obSess.nem)
12. print "<HR>"
13. print """
14. <a href = "sessionTest3.py"> Folytats...</a>"""

71 A Karrigell globlis vltozkat helyez el, amiknek a neve nagybets azrt, hogy elkerlje az esetleges
konfliktusokatamivltozneveinkkel.Ezugyanaztaszerepetjtssza,mintacgimodulFieldStorage()fggvnye.
RszletesebbmagyarzatrtnzzemegaKarrigelldokumentcijt.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 276.
Ascriptelssoraltrehozegysessionobjektumot,generlnekiegyegyediazonosttscookieformjban
elkldianavigtornak.
A 3,. 4., 5. sorokban gy nyerjk ki az elz form mezibe bert rtkeket, hogy a mezneveket a
krssztrkulcsaiknthasznljuk.
A14.soregyhttplinketdefinil,amiaharmadik,sessionTest3.pynevscriptremutat:
1. folytatasSess = Session() # a session-objektum megtallsa
2. folytatasSess.cikkszam = 12345 # attributumok hozzadsa
3. folytatasSess.ar = 43.67
4.
5. print """
6. <H3> Kvetkez lap </H3> <HR>
7. Az gyfl rendelsnek kvetse : <BR> %s %s <BR>
8. Article n %s, Prix : %s <HR>
9. """ % (folytatasSess.nev, folytatasSess.utonev,
10. folytatasSess.cikkszam, folytatasSess.ar)

rjabeanavgtorbaahttp://localhost:8080/sessionTest1cmet.rjonbetetszlegesrtketaformmezibes
kattintsonazOKgombra:

277. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ahogyvrtuk,aformbabertinformciktlettekadvaamsodiklapnak.HamostaFolytats...linkre
kattintunk,akkoregyjabblaptltdikbe,deidenemtrtniksemmilyen adattadssem(mertnemform
kzvettsvelfrnkhozz).AsessionTest3.pyscriptben,amieztalapotgenerljatehtnemhasznlhatjuka
QUERYvltoztaltogatltalbertinformcikmegkeressre.
Ittlpbeasessionobjektummechanizmus.Aharmadikscriptindtsakoraserverelolvassaanavigtorltal
troltcookiet,amilehetvteszinekiazelzscriptbenltrehozottsessionobjektumjragenerlst.

Elemezzk a sessionTest3.py script els hrom sort: a Session() osztlybl ltre hozott folytatasSess
objektumavisszalltottsessionobjektum. Azelzoldalonelmentettinformcikattartalmazzaskiegszt
attribtumokbanmsinformcikatadhatunkhozz.
Innentl kezdve azonos mdon szedhetjk ssze az informcit brmelyik msik oldalrl, mert azok
mindaddigmegfognakmaradni,amgafelhasznlbenemfejeziasiteltogatst,kivvehaaclose()metdus
hvsvalprogramblzrjukbeeztasessiont.

Gyakorlat:

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 278.
17.2. Adjonazelzscripthezegynegyediklapramutatlinketsrjonegyscriptet,amiltrehozzaazt.Az
informcikatezesetbenegytblzatbakellrni:
Csaldnv Utnv Nem rucikk r

17.3.5 Egybfejlesztsek
IttbefejezzkaKarrigellrvidtanulmnyozst,mertgytnikelmondtamamitazelindulshoztudnikell.
Haazolvastbbetakartudni,akkormegkellnzniadokumentcitsatermkkeladottpldkat.Mintmr
fntebbjeleztem,aKarrigellteleptsetartalmazzaaGadflyadatbzisrendszerteleptstis.Nagyongyorsans
knnyen kszthetnk olyan interaktv siteot, amivel brmilyen adategyttest megtekinthetnk, feltve
termszetesen, hogy a siteunk terhelse mrskelt lesz s az adatbzis nem vlik gigantikus mretv. Ne
remljk,hogyaKarrigellelnapitbbmillikrskezelsrekpeskereskedelmisiteotfogunktudnikszteni!
Hailyenilyenambciinkvannak,akkormsprogramokatkellmegnznnk,mintamilyenpldulazApache
serverrelsszekapcsoltCherryPyvagyaZopesadatbziskezelkntazSQLite,MySQLvagyPostgreSQL.

279. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
18.Fejezet: Kommunikciahlzatonkeresztl
Azinternetrendkvlimrtkfejldsemegmutatta,hogyaszmtgpeknagyonhatkonykommunikcis
eszkzklehetnek.Ebbenafejezetbenktprogramsszekapcsolsnakalegegyszerbbtechnikjvalfogunk
ksrletezni,amilehetvteszikzttkahlzatonttrtninformcicsert.
Akvetkezkbenfelttelezem,hogyazolvasegyttmkdikegyvagytbbosztlytrsvalsa Python
munkallomsaikegyTCP/IPkommunikcisprotokollthasznlloklishlzatracsatlakoznak.Azopercis
rendszerneknincs jelentsge.Aksbbiekbenlert Python scriptek egyiktpldulegy Linuxszalmkd
munkallomsralehettelepteni,sprbeszdrelehetksztetniegymsikscripttel,amitegymsikopercis
rendszerrelmintamilyenaMacOSvagyWindowsmkdgpenfuttatunk.
Azolvasolyanksrletetisvgezhet,hogymegnzimitrtnik,haugyanazonagpenegymstlfggetlen
ablakokbanhajtatjavgreaklnbzscripteket.

18.1 Asocketek
Azelsgyakorlat,amitjavaslok,csakktgpkzttikommunikciltrehozsblll.Aktgpegyms
utn fog tudni zenetet vltani, azonban az olvas meg fogja tudni llaptani, hogy a konfigurciik nem
szimmetrikusak. Az egyik gpre teleptett script a serverprogram szerept fogja jtszani, mg a msik
kliensprogramkntfogviselkedni.

Aserverprogramfolyamatosanfutazegyikgpen,amelyiketegyspecifikus IPcm azonostahlzaton72.


Egy meghatrozott kommunikcis porton llandan figyeli azoknak a krseknek a berkezst, amiket a
potencilis kliensek e fel a cm fel kldenek. Ehhez a megfelel scriptnek egy socket nek nevezett
programobjektumotkellltrehozni,amisszevankapcsolvaezzelaporttal.
Egymsikgprlkiindulvaakliensprogrammegfelelkrstkibocstvamegksrliltrehozniakapcsolatot.
Ezakrsegyhlzatrabzottzenet,amiolyan,mintegylevl,amitapostrabzunk.Ahlzatbrmelyik
msik gp fel elindthatn a krst, de csak egyetlen egy gp van megclozva: hogy a rendeltetsi helyt
elrhesse,akrsheaderjetartalmazzaaclgpIPcmtskommunikcisportjt.
Amikorltrejttaserverrelakapcsolat,aklienshozzrendelisajtmaghozazegyikkommunikcisportjt.
Ettlapillanattlkezdvegytekinthetjk,hogyegyprivilegizltcsatornaktisszeaktgpetgy,minthaegy
kbelktnketssze(aktkommunikcisportjtszaakbelktvgnekaszerept).Azinformcicsere
elkezddhet.
Hogyahlzatikommunikcisportokathasznlnitudjk,aprogramoka socket ekneknevezettinterface
objektumokkzvettsvelazopercisrendszereljrsainaksfggvnyeinekegycsoportjthvjk.Ezekkt
klnbzskomplementertechniktalkalmazhatnak:azinternetenszleskrbenalkalmazottpacket(ezeket
datagrammoknakisnevezik)techniktsafolytonoskapcsolatvagy streamsocket technikt,amiegykicsit
egyszerbb.

72 Egyadottgpetegyexplicitnvvelismegadhatunkazzalafelttellel,hogyahlzatonteleptvevanegyolyan
mecanizmus(DNS),amieztanevetautomatikusanIPcmrefordtja.Hatbbetakartudnierrl,akkornzzen
utnaazopercisrendszerekshlzatoktananyagban.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 280.
18.2 Egyelemiserverksztse
Elsksrletkntastreamsockettechniktfogjukhasznlni.Eztkletesenmegfelel,ha,loklishlzattal
sszekttt gpeknek kell egymssal kommuniklni. Ezt a technikt nagyon knny alkalmazni s nagyobb
adattvitelisebessgetteszlehetv.

Amsiktechnolgia(apackagetechnolgia)azinternetenkeresztltrtnkommunikciknlleszkvnatos
anagyobbmegbzhatsgamiatt(ugyanazokacsomagokklnbzutakonrhetikelarendeltetsihelyket,
tbb pldnyban lehetnek kikldve ha az adattviteli hibk javtsa miatt az szksgesnek ltszik), de a
kivitelezsesszetettebb.Eztatechnolgitnemfogjukezenakurzusontanulni.
Azalbbiscriptegyolyanservertllt be,amiegyetlenkliensseltudkommuniklni.Kicsitksbbmajd
megltjukmivelkellkiegszteni,hogyprhuzamosantbbkliensttudjonkezelni.
1. # Egy elemi hlzati server defincija
2. # Ez a server vrja a kapcsolatot a klienssel, hogy prbeszdet kezdjen vele
3.
4. import socket, sys
5.
6. HOST = '192.168.14.152'
7. PORT = 50000
8.
9. # 1) A socket ltrehozsa:
10. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11.
12. # 2) a socket sszekapcsolsa egy meghatrozott cmmel :
13. try:
14. mySocket.bind((HOST, PORT))
15. except socket.error:
16. print "A socket sszekapcsolsa a vlasztott cmmel meghisult."
17. sys.exit()
18.
19. while 1:
20. # 3) Vrakozs a kliens kapcsolatkrsre :
21. print "A server ksz, a krsre vr ..."
22. mySocket.listen(5)
23.
24. # 4) A kapcsolat ltrehozsa :
25. connexion, adresse = mySocket.accept()
26. print "A kliens felkapcsoldott, IP cm %s, port %s" % (adresse[0], adresse[1])
27.
28. # 5) Prbeszd a klienssel :
29. connexion.send("n a Marcel serverre kapcsoldott. Kldje el az zenett.")
30. msgClient = connexion.recv(1024)
31. while 1:
32. print "C>", msgClient
33. if msgClient.upper() == "FIN" or msgClient =="":
34. break
35. msgServeur = raw_input("S> ")
36. connexion.send(msgServeur)
37. msgClient = connexion.recv(1024)
38.
39. # 6) A kapcsolat zrsa :
40. connexion.send("Viszontltsra !")
41. print "A kapcsolat megszakadt."
42. connexion.close()
43.
44. ch = raw_input("<U>jrakezdeni <B>efejezni ? ")
45. if ch.upper() =='B':
46. break

281. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Magyarzatok:
4.sor:A socketmodulminden,akommunikcisprogramokksztshezszksgesfggvnytsosztlyt
tartalmaz.Akvetkezsorokbanltnifogjuk,hogyakommunikciltrehozsahatlpsblll.
6.s7.sor:Ezaktvltozdefiniljaaserverazonosttgy,ahogyanazokatasocketbebefogjukpteni.
AHOSTnakaserverIPcmtmegadstringetkelltartalmazniamegszokottdecimlisformban,vagya
serverDNSnevt(azzalafelttellel,hogyahlzatonegynvfeloldmechanizmusvanteleptve).APORT
nakegyegszszmotkelltartalmazni,tudniillikegymghasznlatlanportszmt,amilehetsgszerint
1024nlnagyobb.(lsdahlzatiszolgltatsokkurzust).
9.s10.sor: Azsszekapcsols els lpse. Ltrehozzuk a socket() osztly egy objektumt. Kt opcit
adunkmeg,amikmegadjkavlasztottcmektpust(internettpuscmeketfogunkhasznlni)saz
adattviteli technolgit (datagrammok vagy folyamatos kapcsolat (stream): ez utbbi hasznlata mellett
dntttnk).
12.17.sorok:Msodik lps.Megksreljk ltrehozniakapcsolatotasocketsakommunikcisport
kztt.Hanemhozhatltreezakapcsolat(pldulakommunikcisportfoglaltvagyagpneveinkorrekt),
akkoraprogramegyhibazenettelbefejezdik.
Megjegyzs:asocketbind()metdusaegytupletpusargumentumotvr,emiattkellaktvltoztktpr
zrjelbetenni.
19.sor: A serverprogramot egy vgtelen ciklusban indtjuk el, mert llandan vrnia kell a potencilis
klienseinekakrseit.
20.22.sorok: Harmadik lps. Mivel a socket hozz van kapcsolva egy kommunikcis porthoz, most
felkszlhet akliensek ltal kldtt krsek fogadsra. Ez a listen() metdus szerepe. Az argumentuma
megmondja,hogymaximumhnyprhuzamoskapcsolatotfogadjonel.Majdksbbmegltjukhogyankell
ezeketkezelni.
24.26.sorok:Negyediklps.Amikoraz accept() metdusthvjuk,asocketmindaddigvr,amgegy
krsmegjelenik.Ascriptezenarszenmegszakad,ezolyan,minthaazinput()fggvnythvnnk,hogya
klaviatrrlvrjunkbemenetet.Hafogadegykrst,akkorazaccept()metdusvisszatrsirtkkntegy
ktelemtupletadmeg:azelselemasocket()73osztlyegyjobjektumnakahvatkozsa,amiaklienss
aserverkzttivaldikommunikcisinterfacelesz,amsodikelemegymsiktuplelesz,amienneka
kliensnekazadataittartalmazza(azIPcmtsaportszmot,amithasznl).
28.30:tdiklps.Akommunikciltrejtt.Asocketsend()srecv()metdusainyilvnazzenetek
amiknekegyszerstringeknekkelllennikldsresfogadsraszolglnak.
Megjegyzsek:asend()metdusazelkldttbyteokszmtadjavisszatrsirtkknt.Arecv()metdusnak
hvsakorargumentumkntmegkelladni,hogymaximlisanhnybyteotfogadjonegyszerre(Aszmfeletti
byteokegypufferbenlesznekelhelyezve.Arecv()metdusjabbhvsakorkerlsoraztvitelkre).

73 A ksbbiekben majd megltjuk, hogy mi a haszna annak, hogy inkbb gy hozunk ltre egy j socket
objektumot a kommunikci kezelsre, mint hogy a 10. sorban mr ltrehozott socketobjektumot
hasznlnnk.Rviden,haaztakarjuk,hogyaservernktbbklienskapcsolatttudjaszimultnkezelni,akkor
mindegyikszmraegyklnsockettelkellrendelkeznnkazelstlfggetlenl,amitllandanmkdni
hagyunk,hogyfogadjaazjkliensektlszrmazkrseket.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 282.
31.37.sorok:Ezazjvgtelenciklustartjafennaprbeszdetmindaddig,mgakliensgynemdnt,hogy
afinszt,vagyegyresstringetnemkld.Aktgpmonitorrakileszrvaennekadialgusnakaz
elrehaladsa.
39.42.sorok:Hatodiklps.Akapcsolatzrsa.

18.3 Egyelemiklienskonstrulsa
Az albbi script az elz oldalakon lert serverprogram kiegszt kliensprogramja. Ltni fogjuk, hogy
rendkvlegyszer.

1. # Egy elemi hlzati kliens defincija


2. # A kliens egy ad hoc serverrel folytat prbeszdet
3.
4. import socket, sys
5.
6. HOST = '192.168.14.152'
7. PORT = 50000
8.
9. # 1) socket ltrehozsa :
10. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11.
12. # 2) kapcsolatkrs kldse a serverhez :
13. try:
14. mySocket.connect((HOST, PORT))
15. except socket.error:
16. print "A kapcsolat meghisult."
17. sys.exit()
18. print "A kapcsolat ltrejtt a serverrel."
19.
20. # 3) Prbeszd a serverrel :
21. msgServeur = mySocket.recv(1024)
22.
23. while 1:
24. if msgServeur.upper() == "FIN" or msgServeur =="":
25. break
26. print "S>", msgServeur
27. msgClient = raw_input("C> ")
28. mySocket.send(msgClient)
29. msgServeur = mySocket.recv(1024)
30.
31. # 4) A kapcsolat zrsa :
32. print " A kapcsolat megszaktva."
33. mySocket.close()

Magyarzatok:
Ascriptelejehasonltaserverscriptelejhez.AzIPcmsakommunikcisportszmaserverkell,hogy
legyen.
12.18.sorok: Most csak egyetlen socketobjektumot hozunk ltre, aminek a connect() metdust
hasznljukakapcsolatkrselkldsre.
20.33.sorok:Haakapcsolatltrejtt,akkorafentebbmrlert send() s recv() metdusokathasznlva
kommuniklhatunkaserverrel.

283. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
18.4 Tbbprhuzamostaskkezelsethreadek(szlak)segtsgvel
Az elz oldalakon kidolgozott kommunikcis rendszer valban nagyon elemi: egyrszt csak kt gpet
kapcsolssze,msrsztkorltozzaaktbeszlszabadsgt.Csakegymsutnkldhetnekzeneteket.Pldul
amikorazegyikkkibocstottegyzenetet,arendszereblokkolvamaradaddig,amgapartnerenemkldneki
vlaszt.Amikorfogadottegyilyenvlaszt,akkornemleszkpesegymsikvlaszfogadsramindaddig,amg
maganemkldttelegyjzenetet,...sgytovbb.
Ezek a problmk onnan szrmaznak, hogy a szoksos scriptjeink egyszerre csak egy dologgal tudnak
foglalkozni.Amikorpldulazutastsfolyambanegyinput()fggvnyrekerlasor,mindaddigsemmisemfog
trtnni,mgafelhasznlbenemrjaavrtadatot.Mghaezavrakozsnagyonhosszis,rendszerintakkor
semlehetsges,hogyaprogramezalattazidalattmsfeladatotvgezzen.Ezazonbancsakegysugyanazon
programon bell igaz: azt biztosan tudja az olvas, hogy a szmtgpen kzben vgre lehet hajtani ms
alkalmazsokat,mertamodernopercisrendszerekmultitaskok.
Akvetkezoldalakatannakamagyarzatrasznom,hogyhogyankellimplementlniaprogramokbana
multitask funkcionalitst, hogy prhuzamosan tbb partnerrel kommuniklni kpes hlzati alkalmazsokat
tudjunkfejleszteni.
Nzzk most meg az elz oldal scriptjt. A mkdsnek a lnyege a 23.29. sorokban tallhat
programhurok.Ezahurokkthelyenmegszakad:
a27.sorban,hogymegvrjaafelhasznladatbeviteltabillentyzetrl(raw_input()
fggvny)
a29.sorban,hogyegyhlzatizenetberkezstvrja.

Ezaktvrakozsegymsutnkvetkezik,holottjvalelnysebblenne,haezekegyidejeklennnek.Ha
ezlenneahelyzet,akkorafelhasznlmindenpillanatbanzeneteketkldhetneanlkl,hogymindenesetben
meg kellene vrnia a partnere reakcijt. Akrmennyi zenetet fogadhatna anlkl, hogy ktelez lenne
mindegyikrevlaszolni,hogymszeneteketfogadhasson.
Erreazeredmnyrejuthatunk,hamegtanuljukhogyankezelnkprhuzamosantbbutastssortugyanabban
aprogramban.Dehogyanlehetsgesez?
Azinformatikatrtnetesorntbbfletechniktkitalltakarra,hogymegosszkegyprocesszormunkaidejt
klnbzprogramokkzttgy,hogygytnjnazokegyidbenmkdnek(mgavalsgbanaprocesszor
mindegyikkkelegykisideigfoglalkozik,amikorrjukkerlasor).Ezekatechnikkimplementlvavannakaz
opercis rendszerben. Nem szksges ket itt rszletezni mg akkor sem, ha mindegyikk hozzfrhet a
Pythonnal.
A kvetkez oldalakon ezen technikk kzl annak a hasznlatt fogjuk megtanulni, ami egyszerre a
legegyszerbbenkivitelezhetsazegyetlenvalbanportbilistechnika(lnyegbenmindennagyopercis
rendszertmogatja):atechniktlightprocessnekvagythread74neknevezik.
Egy szmtgpen a threadek prhuzamosan (kvziegyidejleg) kezelt utastssorozatok, amik mind
ugyanazonagloblisnvtrenosztoznak.
ValjbanbrmelyPythonprogramutastsaimindiglegalbbegythreadetkvetnek:afthreadet.Ebbl
ms gyermek threadeket lehet elindtani, amik prhuzamosan lesznek vgrehajtva. Amikor valamennyi
utaststvgrehajtottaagyermekthread,akkorbefejezdiksmindenklnbejelentsnlkleltnik.Amikor
viszontafthreadfejezdikbe,nhamegkellrlagyzdni,hogymindengyermekthreadjemeghalvele.

74 EgyUnixtpusopercisrendszerben(mintamilyenaLinux),ugyanannakaprogramnakaklnbzthreadjei
egyetlenprocessnekkpezikarszt.UgyanannakaPythonscriptnekasegtsgvelklnbzprocessekkezelse
islehetsges(forkmvelet),azonbanezatechnikamesszemeghaladjaennekakurzusnakakereteit.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 284.
18.5 Egyidejkldstsfogadstkezelkliens
Egyegyszerstettchat75rendszerksztshezfogjukmostagyakorlatbatltetniathreadtechnikt.Eza
rendszer egyetlen szerverbl s tetszleges szm kliensbl fog llni. Szemben azzal , ami az els
gyakorlatunkbantrtnt,magtaszervertsenkisemfogjakommunikcirahasznlni,hanemamikorelindtjuk,
tbbklienskapcsoldhatmajdrskezdhetelegymssalzenetetvltani.
Mindegyikkliensazsszeszenettelfogjakldeniaservernek,azpedigrgtntovbbkldiazokataz
sszes rkapcsoldott kliensnek gy, hogy mindegyik lthassa a forgalom egszt. Mindegyik brmikor,
brmilyensorrendbenelkldhetiazzeneteitsfogadhatjaatbbiekt,mertafogadsskldsegyidejleg,
klnthreadekbenvankezelve.
Akvetkezscriptakliensprogramotdefinilja.Aservertegykicsitksbbfogomlerni.Megllapthatjuk,
hogy a script frsze (a 38. s az azt kvet sorok) hasonlt az elz plda scriptjnek frszhez. Csak a
Prbeszd a serverrel rszt helyettestettem. A while hurok helyett most kt threadobjektumot ltrehoz
utastst(49.s50.sor)tallunk,amiknekamkdstakvetkezktsorbanindtjukel.Ezeketathread
objektumokata threading modul Thread() osztlyblleszrmaztatssalhozzukltre.Egymstlfggetlenl
foglalkoznakazzenetekfogadsvalskibocstsval.Aktgyermekthreadgytkletesenbevanzrva
klnbzobjektumokba,amimegknnytiamechanizmusmegrtst.

1. # zenetek prhuzamos kibocstst s fogadst kezel


2. # hlzati kliens definilsa (2 THREAD alkalmazsa).
3.
4. host = '192.168.0.235'
5. port = 40000
6.
7. import socket, sys, threading
8.
9. class ThreadReception(threading.Thread):
10. """zenetek fogadst kezel thread objektum"""
11. def __init__(self, conn):
12. threading.Thread.__init__(self)
13. self.connexion = conn # a kapcsolati socket referencija
14.
15. def run(self):
16. while 1:
17. message_recu = self.connexion.recv(1024)
18. print "*" + message_recu + "*"
19. if message_recu =='' or message_recu.upper() == "FIN":
20. break
21. # A <fogads> thread itt fejez dik be.
22. # Knyszertjk a <kibocsts> thread lezrst :
23. th_E._Thread__stop()
24. print "Lellt a kliens. Kapcsolat megszaktva."
25. self.connexion.close()
26.
27. class ThreadEmission(threading.Thread):
28. """zenetek kibocstst kezel thread objektum"""
29. def __init__(self, conn):
30. threading.Thread.__init__(self)
31. self.connexion = conn # a kapcsolati socket referencija
32.
33. def run(self):
34. while 1:
35. message_emis = raw_input()
36. self.connexion.send(message_emis)
37.
38. # F program Kapcsolat ltrehozsa :
39. connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
40. try:

75 Achat:szmtgpek(billentyzet)kzvettsvelzajlbeszlgetstjelent.

285. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
41. connexion.connect((host, port))
42. except socket.error:
43. print "A kapcsolat meghisult."
44. sys.exit()
45. print "A kapcsolat ltrejtt a serverrel."
46.
47. # Prbeszd a server-rel : kt thread-et indtunk az zenetek
48. # fogadsnak s indtsnak egymstl fggetlen kezelsre :
49. th_E = ThreadEmission(connexion)
50. th_R = ThreadReception(connexion)
51. th_E.start()
52. th_R.start()

Magyarzatok:
ltalnosmegjegyzs:Ebbenapldbanktafthreadtlfggetlen threadobjektumltrehozsrl
dntttemazrt,hogyjlmegvilgtsamafolyamatokat.Aprogramunksszesenhromthreadethasznl,
amireafigyelmesolvasmegjegyzi,hogykettelglenne.Valban,afthreadetvgliscsakamsikkt
threadelindtsrahasznljuk!Viszontsemmilyenrdeknemszlathreadekszmnakkorltozsamellett.
Ellenkezleg:attlapillanattlkezdve,ahogyennekatechniknakahasznlatamellettdntnk,hasznotkell
hznunkazalkalmazsjlelklnlrszekretagolsbl.
7.sor:Athreadingmodulegyegszsorathreadekkezelshezfontososztlydefincijttartalmazza.Itt
csaka Thread() osztlythasznljuk,deegymsikat(a Lock() osztlyt)fogjukaksbbiekbenhasznlni,
amikoraklnbzkonkurensthreadekszinkronizcijvalkellfoglalkoznunk.
9.25.sorok: A Thread() osztlybl leszrmaztatott osztlyok lnyegben egy run() metdust fognak
tartalmazni.Ebbenhelyezzkelaprogramnakaztarszt,amitspecifikusanathreadrebzunk.Gyakranegy
vgtelenhurokrlleszsz,mintitt.Ennekametdusnakatartalmtegyfggetlenscriptnektekinthetjk,ami
az alkalmazsunk tbbi komponensvel prhuzamosan hajtdik vgre. Amikor ez a kd vgrehatdott, a
threadbezrdik.
16.20.sorok:Ezahurokkezeliazzenetfogadst.Mindeniterrcibana17.sorbanegyjzenetrevrva
megszakadazutastssorozat.Azonbanaprogramtbbirszenemfagyle,atbbithreadfggetlenlfolytatja
munkjt.
19.sor:Akilpstahurokblegy'fin'(akrkis,akrnagybetvellehetrni)zenet,vagyegyresstring(ez
ahelyzet,haapartnerszntetimegakapcsolatot)fogadsavltjaki.Nhnytakartutaststhajtvgre,
majdathreadbefejezdik.
23.sor:Amikorazzenetekfogadsabefejezdik,aztakarjuk,hogyaprogramtbbirszeisfejezdjnbe.
Tehtknyszertennkkellamsikthreadobjektum(amitazzenetekkibocstsrahoztunkltre)bezrst.
Eztaknyszertettbezrsta_Thread__stop()76metdussalrhetjkel.
2736.sorok:Ezazosztlyegymsikthreadobjektumotdefinil,amiezalkalommalegyvgtelenhurkot
tartalmaz.Ezazobjektumcsakazelzbekezdsbenlertmetdussalszntethetmeg.Ahurokminden
iterrcijbanazutastssorozategybillentybemenetrevrvaa35.sorbanmegfogszakadni,deeznem
akadlyozzamegatbbithreadetamunkjavgzsben.
38.45.sorok:Ezeketasorokatazelzscriptekblvltozatlanulvettemt
47.52.sorok:Aktthreadgyermekobjektumltrehozsasindtsa.Jegyezzkmeg,hogyazindts
inkbb a start() beptett metdussal javasolt, mint a run() metdus (amit neknk kell majd definilni)

76 Hogy a puristk megbosssanak nekem, kszsggel elismerem, ez a mdszer nem igazn javasolt egy thread
knyszertettlelltsra.Azrtengedtemmegmagamnakeztazeljrst,hogyneneheztsemmegtlsgosanennek
abevezetanyagnakamegrtst.Azignyesolvasabibliogrfiban(lsda8.oldalt)megemltettreferencia
mveksegtsgvelelmlyedhetebbenakrdsben.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 286.
kzvetlenhvsval.Tudjunkarrlis,hogyastart()otcsakegyszerhvhatjuk(hamrlelltottuk,akkornem
lehetjraindtaniegythreadobjektumot).

18.6 Tbbklienskapcsolatotprhuzamosankezelserver
Akvetkezscriptegyolyanserverthozltre,amiazelzoldalakonlerttalmegegyeztpuskliensek
kapcsolataittudjakezelni.
Magtaservertnemhasznljukkommunikcira:akliensekazok,amikegymssalkommuniklnakaserver
kzvettsvel. A server egy kapcsol szerept jtssza: elfogadja a kliensek rkapcsoldst, majd vr az
zeneteikre.Amikoregybizonyosklienstlszrmazzenetrkezikbe,akkoraserverhozzrakegyazonost

287. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
karakterlncot,amijellemzakldkliensre,skikldiazsszestbbikliensnek,hogymindegyiklthasson
mindenzenetetstudhassa,hogyazkitlszrmazik.

1. # Egy egyszer stett CHAT rendszert kezel hlzati szerver defincija.


2. # thread-eket hasznl a klienskapcsolatok prhuzamos kezelsre.
3.
4. HOST = '192.168.0.235'
5. PORT = 40000
6.
7. import socket, sys, threading
8.
9. class ThreadClient(threading.Thread):
10. '''thread-objektum leszrmaztatsa a klienssel val kapcsolat
kezelshez'''
11. def __init__(self, conn):
12. threading.Thread.__init__(self)
13. self.connexion = conn
14.
15. def run(self):
16. # Prbeszd a klienssel :
17. nom = self.getName() # Minden thread-nek neve van
18. while 1:
19. msgClient = self.connexion.recv(1024)
20. if msgClient.upper() == "FIN" or msgClient =="":
21. break
22. message = "%s> %s" % (nom, msgClient)
23. print message
24. # Az zenetet kikldi az sszes tbbi kliensnek :
25. for cle in conn_client:
26. if cle != nom: # ne kldje el a kibocstnak
27. conn_client[cle].send(message)
28.
29. # A kapcsolat zrsa :
30. self.connexion.close() # a serveroldali kapcsolat megszaktsa
31. del conn_client[nom] # trli a bejegyzst a sztrban
32. print "Kliens %s lekapcsoldott." % nom
33. # A thread itt fejez dik be
34.
35. # A server inicializlsa Socket ltrehozsa :
36. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
37. try:
38. mySocket.bind((HOST, PORT))
39. except socket.error:
40. print "A socket sszekapcsolsa a vlasztott cmmel meghisult."
41. sys.exit()
42. print "A server ksz, vrakozs a krsekre ..."
43. mySocket.listen(5)
44.
45. # A kliensek ltal krt kapcsolatok vrsa s kezelse :
46. conn_client = {} # a klienskapcsolatok sztra
47. while 1:
48. connexion, adresse = mySocket.accept()
49. # j thread-objektum ltrehozsa a kapcsolat kezelsre :
50. th = ThreadClient(connexion)
51. th.start()
52. # A kapcsolat trolsa a sztrban :
53. it = th.getName() # thread-azonost
54. conn_client[it] = connexion
55. print "Kliens %s felkapcsoldott, IP cm %s, port %s." %\
56. (it, adresse[0], adresse[1])
57. # Prbeszd a klienssel :
58. connexion.send("n felkapcsoldott. Kldje el az zeneteit.")

Magyarzatok:
35.43.sorok:Aserverinicializlsamegegyezikafejezetelejnlertalapserverinicializlsval.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 288.
46.sor:Aklnbzkapcsolatokhivatkozsaittrolnikell.Elhelyezhetnnkketegylistbanis,azonban
sszerbbketegysztrbatenni.Ennekktokavan.Azelsokaz,hogytetszlegessorrendbenkellmajd
tudnunkhozzadnivagyeltvoltaniezeketahvatkozsokat,mertakliensektetszskszerintkapcsoldnak
flsle.Amsodikokaz,hogymindegyikkapcsolatnlknnyenszerttehetnkegyegyediazonostra,ami
kulcslehetegysztrban.EztazazonosttaThread()osztlyautomatikusanfogjagenerlni.
47.51.sorok:Aprogrambanittegyvgtelenhurokvan,amillandanjkapcsolatokravr.Mindenj
kapcsolat szmra ltrehoz egy j ThreadClient() objektumot, ami az sszes tbbitl fggetlenl fog a
kapcsolattalfoglalkozni.
52.54.sorok:Egyediazonostellltsaa getName() metdussal.Ittaztatnythasznljukki,hogya
Pythonmindenjthreadhezautomatikusanhozzrendelegyegyedinevet:ezanvmintazonost(vagy
kulcs)jarra,hogyasztrunkbanmegtalljukamegfelelkapcsolatot.Megfigyelhet,hogyegyThread
Nformjstringrlvansz(aholNathreadsorszma).
15.17.sorok:Tartsukszben,hogyannyiThreadClient()objektumleszltrehozva,ahnykapcsolatvans
ezekazobjektumokprhuzamosanfognakmkdni.AgetName()metdustezenobjektumokbrmelyikben
felhasznlhatjukarra,hogymegkapjukazobjektumazonostjt.Eztazinformcitarrafogjukhasznlni,
hogyazaktuliskapcsolatotmegklnbztesskatbbitl(lsda26.sort).
18.23.sorok: A thread egy bizonyos klienstl szrmaz sszes zenet fogadsra szolgl. Ehhez egy
vgtelencikluskell,amicsakafinspeciliszenetvagyegyreszenet(azazeset,amikorakapcsolatot
apartnerszaktjameg)fogadsraszakadmeg.
24.27.sorok:Azegyikklienstlfogadottvalamennyizenetetelkellkldeniazsszestbbikliensnek.A
kapcsolatoksztrnakkulcskszlettegyforciklussaljrjukbe.Akulcsokfogjkaztnlehetvtenni,hogy
megtalljuk a kapcsolatokat. Egy egyszer felttelvizsglat (a 26. sorban) megakadlyozza, hogy
visszakldjkazzenetetannakakliensnek,akitlazszrmazik.
31.sor: Egy socket lezrsakor a hivatkozst trllni kell a sztrbl, mert a hivatkozs mr nem
hasznlhat.Eztmindenklnsebbvintzkedsnlklmegtehetjk,mertasztrelemeinemrendezettek
(brmilyensorrendbenhozzadhatunkseltvolthatunkelemeket).

18.7 gyprbajhlzativltozat

289. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
A15.fejezetbenelmagyarztamegyharcijtkfejlesztst,amibenajtkosokgykkalkzdttekegyms
ellen.Ajtknemtlrdekes,amgcsakegyetlenszmtgpenjtszhat.Atanulttechnikkbeptsvelfogjuk
tkletesteni.Ateljesalkalmazsktprogramblfogllni,mintazelzoldalakonlertchatalkalmazs:
egyserveralkalmazsbl,amitcsakegygpenfogunkmkdtetnisegykliensalkalmazsbl,amittbbms
gpen elindthatunk. A Python portbilis jellegbl addan klnbz opercis rendszerekkel (MacOS <>
Linux<>Windows!)mkdszmtgpekkzttrendezhetnkgycsatkat.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 290.
18.7.1 Serverprogram:ttekints
Aserverskliensprogramokugyanaztazalapprogramothasznljk,amitnagyrszta15.fejezetbenmr
kifejlesztettprogramblszedtemssze.Atovbbiakbanfelttelezem,hogyajtkktelzverzijtazaktulis
knyvtrban a canon03.py s canon04.py modulfileokba mentettk. Az importls s az rkls okos
felhasznlsvalakdjrsztjrafelhasznlhatjuk.
A canon04 modulbl a Canon() osztly mind a server, mind a kliensprogramnl ugyanolyan jl jra
felhasznlhat. Ugyanebbl a modulbl fogjuk importlni az AppAgyuParbaj() osztlyt is, amibl az
alkalmazsservernkmasterosztlytazAppServer()tszrmaztatjukle.Konstatlnifogjuk,hogyezutbbibl
lltjukelrklsselazAppClient()alosztlyt.

Acanon03modulblfogjukvenniaVezerloPult()osztlyt,amiblegytvvezrlsrealkalmasabbverzit
ksztnk.
Vgl kt j osztly jn az elzekhez, melyek mindegyike egy threadobjektum ltrehozsra van
specializlva: a ThreadClients() osztly, aminek egy pldnya llandan figyelni fogja az j kliensek
kapcsolatkrsnekfogadsrafenntartott socketetsa ThreadConnexion() osztly,ami arraszolgl,hogy
annyi socketobjektumot hoz ltre, amennyi a mr felkapcsoldott kliensekkel val prbeszd folytatshoz
szksges.
Ezeketazjosztlyokatachatservernkhzazelzoldalakonkifejlesztettosztlyokinspirljk.Af
klnbsgazelzbbihezkpestaz,hogyegyspecilisthreadetkellaktivlnunkakliensrevalvrakozstsa
klienskapcsolatokatkezelkdnak,hogyafalkalmazsezidalattmsttudjoncsinlni.
Innentlkezdveafeladatunknkabblll,hogyaserversklienseikzttidialgusszmrakifejlesztnkegy
kommunikcis protokolt. Mirl van sz? Azoknak az zeneteknek a tartalmt kell definilni, amiket az
sszekapcsoltgpekegymssalfognakvltani.Ezanyelvlpsrllpsrefejleszthet.Egyalapprbeszd
megalkotsvalkezdjk,majdaprnkntegsztjkkibvebbszkinccsel.
A chat rendszer szmra az elz fejezetbenben kifejlesztett kliensprogram felhasznlsval
megoldhat a feladat lnyegi rsze. Az emltett kliensprogramot arra hasznljuk, hogy a fejleszts alatt ll
servernek parancsokat kldnk s addig javtjuk a servert, amg megfelelen nem mkdik: vagyis, a
serverenlpsrllpsreimplementlteljrsoknakakliensltalmanulisankikldttmegfelelzenetekre
adottvlaszaitteszteljk.

18.7.2 Kommunikcisprotokol
Magtlrtetdik,hogyaksbbiekbenlertprotokolteljesennknyes.Ms,teljeseneltrkonvencikatis
lehetne vlasztani. A vlasztsaink termszetesen kritizlhatk s az olvas taln ms, hatkonyabb s
egyszerbbprotokollalkvnjakethelyettesteni.
Aztmrtudjuk,hogyazzenetekegyszerkarakterlncok.Elreltva,hogyegyeszeneteknekegyszerre
tbbinformcitkelltovbbtani,gydntttem,hogymindegyikzenettbb,vesszkkelelvlasztottmezt
tartalmazhat. Brmelyik zenet fogadsakor a mezik tartalmt a beptett split() metdussal knnyen
sszegyjthetjkegylistban.
A kvetkezkben a kliensserver dialgusra ltunk egy pldt, ahogyan az a kliensoldalon kvethet. A
csillagokkzttizeneteketaserverkldi;atbbieketakliens:

291. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1. *server OK*
2. client OK
3. *gyk,Thread-3;104;228;1;dark red,Thread-2;454;166;-1;dark blue,*
4. OK
5. *j_gy,Thread-4,481,245,-1,dark green,az_n*
6. clzs,25,
7. t z
8. *elmozdul,Thread-4,549,280,*
9. t z
10. *elmozdul,Thread-4,504,278,*
11. *pontszm,Thread-4;1,Thread-3;-1,Thread-2;0,*
12. *szg,Thread-2,23,*
13. *szg,Thread-2,20,*
14. *tzel,Thread-2,*
15. *elmozdul,Thread-2,407,191,*
16. *megsz nik,Thread-2*
17. *j_gy,Thread-5,502,276,-1,dark green*

Amikorelindulegyjkliens,akkorazegykapcsolatkrstkldaservernek.Erreaservervlaszulaserver
OK zenetet kldi. Ennek nyugtzsul a kliens a client OK zenetet kldi. Ez az zenetvlts
nlklzhet,viszontlehetvtesziannakellenrzst,hogyaktirnykommunikcirendbenmegye.Miutn
akliensfigyelmezetteaservert,hogykszenllaprbeszdre,aserverelkldinekiajtkbanmrjelenlv
(esetlegegysincsjelen)gyklerst:azonost,pozciavsznon,rnysszn(3.sor).
A kliens vteli nyugtjra vlaszul (4. sor) a server egy j gyt helyez el a jtktren, majd az sszes
felkapcsoldottklienst,nemcsakazt,amelyikelidzteazjgyteleptstrtestiateleptsjellemzirl.
Azjkliensnekkldttzenetbenazonbanvanegyeltrs(mivelatulajdonosaazjgynak):azgy
jellemzintl,amikmindenkinekmegvannakadva,tartalmazegykiegsztmezt,amiazaz_nszveget
tartalmazza(hasonltsuksszepldulaz5.sorta17.sorral,amelyikegymsikjtkostrtestakapcsolatrl.)
Ezakiegsztjelzsteszilehetvazgytulajdonoskliensnek,hogyahasonlzenetekkzttmegtudja
klnbztetniazt,amelyikaserverltalnekiadottegyediazonostttartalmazza.
A6.s7.sorzeneteiakliensltalkldttparancsok(dlsszgbelltsastzparancs).Ajtk elz
verzijbanmrmegllapodtunkabban,hogyalvsutnazgyk(vletlenszeren)egykicsitelmozdulnak.A
servertehtvgrehajtjaeztamveletetsutnamindenfelkapcsoldottkliensselismerteti azeredmnyt.A
8.sorbanaservertlkapottzenettehtegyilyenelmozdulsnakajelzse(amegadottkoordintkazilletgy
koordinti).
A11.soraztaserverzenetetmutatjabe,amikoreltalltakegyclt.Mindenjtkosjpontszmtiskzli
mindenklienssel.
A12.,13.s14.sorokserverzeneteiegymsikjtkosltalelindtottakcitjeleznek(dlsszgbelltsa,
amitlvskvet).Alvsleadsautnazilletgyvletlenszerenelmozdul(15.sor).
16.s17.sor:amikorazegyikkliensmegszaktjaakapcsolatot,aservererrlrtestiatbbiklienstazrt,
hogyamegfelelgymindegyikposztoneltnjnajtktrrl.Megfordtva:jkliensekbrmelyikpillanatban
felkapcsoldhatnak,hogyrsztvegyenekajtkban.
Kiegsztmegjegyzsek:
Mindenzenetelsmezjemegjelliazzenettartalmt.Akliensltalkldttzeneteknagyonegyszerek:
ajtkosklnbzakciinak(alvsszgnekmdostsasatzparancs)felelnekmeg.Aserverzeneteiegy
kicsitsszetettebbek.Aserveratbbsgketmindenfelkapcsoldottkliensnekelkldi,hogytjkoztassaketa
jtklefolysrl.Kvetkezskntezekazzenetekmegkellhogyemltskannakajtkosnakazazonostjt,
akiparancsotadottegyakciravagyakivalamilyenvltozsbanrintett.Fntebblttuk,hogyezekazazonostk
azokanevek,amiketaserverthreadkezeljemindenalkalommal,amikorjklienskapcsoldikaserverhez
automatikusangenerl.
Bizonyos,ajtkegszrevonatkozutastsokmeznknttbbinformcittartalmaznak.Ebbenazesetben

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 292.
aklnbzalmezketpontosvesszvlasztjaelegymstl(3.s11.sor).

18.7.3 Serverprogram:elsrsz
Akvetkezoldalakontallhatakomplettserverprogram.Hromegymstkvetrszletbenmutatombe,
hogy a megfelel kdrszlethez kzelebb kerljn a magyarzat. A sorok szmozsa folyamatos. Jllehet a
programmrviszonylaghosszssszetett,azolvasvalsznleggyfogjagondolni,hogymgtkletestsre
szorul az ltalnos bemutats szintjn. Az olvasra hagyom, tegye hozz azokat a kiegsztseket, amik
hasznosnaktnnek(pldulindtskorfelknlniahostgpadatainakkivlasztst,egymensort,stb.):

1. #######################################################
2. # Agyuparbaj - server resz #
3. # (C) Gerard Swinnen, Verviers (Belgique) - July 2004 #
4. # Licence : GPL #
5. # A script vegrehajtasa elott ellenorizze, hogy az #
6. # alabbi IP cim a host IP cime. #
7. # Valaszthat egy eltero portszamot, vagy megvaltoztat-#
8. # hatja a jatekter mereteit. #
9. # Minden esetben ellenorizze, hogy ugyanezeket a val- #
10. # toztatasokat elvegezte-e minden kliens scripten #
11. #######################################################
12.
13. host, port = '192.168.1.9', 35000
14. width_, height_ = 700, 400 # a jatekter meretei
15.
16. from Tkinter import *
17. import socket, sys, threading, time
18. import canon03
19. from canon04 import Canon, AppAgyuParbaj
20.
21. class VezerloPult(canon03.VezerloPult):
22. """Tokeletesitett vezerlo pult"""
23. def __init__(self, boss, canon):
24. canon03.VezerloPult.__init__(self, boss, canon)
25.
26. def tuzel(self):
27. "az asszocialt agyu lovesenek elinditasa"
28. self.appli.tuzel_agyu(self.canon.id)
29.
30. def iranyzas(self, angle):
31. "az asszocialt agyu dolesszogenek beallitasa"
32. self.appli.iranyzas_agyu(self.canon.id, angle)
33.
34. def pont_ertek(self, sc =None):
35. "j <sc> pontszam kiirasa, vagy a letezo olvasasa"
36. if sc == None:
37. return self.score
38. else:
39. self.score =sc
40. self.pontok.config(text = ' %s ' % self.score)
41.
42. def inactivate(self):
43. "a tuzgomb es a szogbeallito rendszer inaktivalasa"
44. self.bTuz.config(state =DISABLED)
45. self.celzas.config(state =DISABLED)
46.
47. def activate(self):
48. "a tuzgomb es a szogbeallito rendszer aktivalasa"
49. self.bTuz.config(state =NORMAL)
50. self.celzas.config(state =NORMAL)
51.
52. def beallitas(self, angle):
53. "a kurzor poziciojanak megvaltoztatasa"
54. self.celzas.config(state =NORMAL)
55. self.celzas.set(angle)

293. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
56. self.celzas.config(state =DISABLED)
57.
A VezerloPult() osztlyta canon03 modulblimportltazonosnevosztlyblleszrmaztatssalhozzuk
ltre.Aszlosztlymindenjellemzjtrkli,defellkellrnunk77atuzel()saziranyzas()metdusokat:
A program egygpes vltozatban mindegyik vezrlpult kzvetlenl tudta irnytani a megfelel gyt.
Ebbenahlzativltozatbanviszontakliensekazok,akiktvolrlvezrlikazgykmkdst.Kvetkezsknt
aserverablakbanmegjelenvezrlpultokcsakmsolhatjkajtkosokltalazegyeskliensekenvgrehajtott
manvereket.Atzgombsalvsszgbelltcursortehtinaktivlvavannak,deakijelzsekafalkalmazs
ltalnekikcmzettparancsoknakvannakalvetve.
Eztazj VezerloPult() osztlytegyformnfogjukhasznlniakliensprogrammindegyikpldnybangy,
ahogyvan.Akliensablakbanis,mintaserverablakbanmindenvezrlpultmsolatleszazonbanajtkos
gyjnakvezrlpultjateljesenmkdkpeslesz.
Ezek az okok is magyarzzk az: activate(), inactivate(), beallitas() s pont_ertek() j metdusok
megjelenst is. A falkalmazs ezeket is hvni fogja a server s a kliensei kztti zenetutasts cserre
vlaszul.
AThreadConnexion()osztlythreadobjektumoksorozatnakgenerlsraval,amikprhuzamosanfognak
foglalkozniakliensekltalltestettsszeskapcsolattal.Azosztlyrun()metdusatartalmazzaaserverkzponti
funkcijt,tudniillikaztazutastshurkot,amiegyspecifikusklienstlszrmazutastsokfogadstkezeli,
melyutastsokmindegyikereakciksorozattvonjamagautn.Ittfogjukmegtallniazelzoldalakonlert
kommunikcis protokol konkrt felhasznlst (bizonyos utastsokat viszont a ksbbiekben trgyalt
AppServer()osztlyagyu_veletlen_elmozditasa()sgoal()metdusaigenerlnak).

58. class ThreadConnexion(threading.Thread):


59. """egy klienskapcsolatot kezelo thread objektum"""
60. def __init__(self, boss, conn):
61. threading.Thread.__init__(self)
62. self.connection = conn # a kapcsolat socket-jenek
hivatkozasa
63. self.app = boss # az alkalmazasablak hivatkozasa
64.
65. def run(self):
66. "a klienstol kapott uzenetre valaszul vegrehajtott akciok"
67. name = self.getName() # kliens id-je = a thread neve
68. while 1:
69. msgClient = self.connection.recv(1024)
70. print "**%s** %s" % (msgClient, name)
71. deb = msgClient.split(',')[0]
72. if deb == "fin" or deb =="":
73. self.app.agyu_eltavolitas(name)
74. # a tobbi kliens ertesitese az agyu eltavolitasarol :
75. self.app.locking.acquire()
76. for cli in self.app.conn_client:
77. if cli != name:
78. message = "megsz nik,%s" % name
79. self.app.conn_client[cli].send(message)
80. self.app.locking.release()
81. # az aktualis thread zarasa :
82. break
83. elif deb =="client OK":
84. # kozli az uj klienssel a mar bejegyzett agyukat :
85. msg ="gyk,"
86. for g in self.app.guns:
87. gun = self.app.guns[g]

77 Ismtls:egyszlosztlybelimetdusnevnaleszrmaztatottosztlybanjmetdustdefinilhatunkazrt,hogy
mdostsukametdusmkdstaleszrmaztatottosztlyban.Eztfellrsnaknevezzk(lsd169.oldalt).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 294.
88. msg =msg +"%s;%s;%s;%s;%s," % \
89. (gun.id, gun.x1, gun.y1, gun.irany, gun.szin)
90. self.app.locking.acquire()
91. self.connection.send(msg)
92. # fogadas nyugtazasat varja ('OK') :
93. self.connection.recv(100)
94. self.app.locking.release()
95. # a server jatekterehez hozzaad egy agyut.
96. # az agyu jellemzoit adja meg visszateresi ertekkent :
97. x, y, irany, szin = self.app.agyu_hozzadasa(name)
98. # ennek az uj agyunak a jellemzoit megadja az osszes tobbi
99. # mar felkapcsolodott kliensnek :
100. self.app.locking.acquire()
101. for cli in self.app.conn_client:
102. msg ="j_gy,%s,%s,%s,%s,%s" % \
103. (name, x, y, irany, szin)
104. # az uj kliensnek egy mezot ad, ami jelzi, hogy
105. # az uzenet az o agyujara vonatkozik :
106. if cli == name:
107. msg =msg +",az_n"
108. self.app.conn_client[cli].send(msg)
109. self.app.locking.release()
110. elif deb =='t z':
111. self.app.tuzel_agyu(name)
112. # jelzi ezt a lovest az osszes tobbi kliensnek :
113. self.app.locking.acquire()
114. for cli in self.app.conn_client:
115. if cli != name:
116. message = "tzel,%s," % name
117. self.app.conn_client[cli].send(message)
118. self.app.locking.release()
119. elif deb =="clzs":
120. t =msgClient.split(',')
121. # tobb szoget kaphatunk, hasznaljuk az utolsot :
122. self.app.iranyzas_agyu(name, t[-2])
123. # Az osszes tobbi kliensnek jelezzuk a valtozast :
124. self.app.locking.acquire()
125. for cli in self.app.conn_client:
126. if cli != name:
127. # zr vessz , az uzenetek neha csop. vannak :
128. message = "szg,%s,%s," % (name, t[-2])
129. self.app.conn_client[cli].send(message)
130. self.app.locking.release()
131.
132. # Kapcsolat zarasa :
133. self.connection.close() # megszakitja a kapcsolatot
134. del self.app.conn_client[name] # a szotarban toroljuk a hivatk.-t
135. self.app.kiir("A %s kliens lekapcsoldik.\n" % name)
136. # A thread itt fejezodik be

18.7.4 Konkurensthreadekszinkronizlsazrolssal(threadlocks)
A fenti kd vizsglata sorn az olvas bizonyra szrevette azoknak az utastsblokkoknak a specilis
struktrjt, amikkel a server ugyanazt az zenetet kldi az sszes kliensnek. Nzzk meg pldul a
74.80.sorokat:
A75.sorafalkalmazskonstruktoraltalltrehozottzrobjektumacquire()metdustaktivlja.(Lsd
ksbb). Ez az objektum a script elejn importlt Lock() osztly mely a threading modulnak rsze egy

295. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
pldnya.Akvetkez(7679)sorokegyzenetkldstidzikel(egykivtelvel)azsszeskapcsoldott
kliensnek.Utnaazrobjektumrelease()metdusaleszaktivlva.
Mirevalezazrobjektum?Mivelathreadingmodulegyikosztlyahozzaltre,kitallhat,hogya
threadekkel kapcsolatos a hasznlata. Valban, az ilyen zr objektumok a konkurens threadek
szinkronizlsravalk.Mirlvansz?
Tudjuk,hogyaservermindegyikhozzkapcsoldkliensnekegymsikthreadetindtel. Utnaezeka
threadek prhuzamosan mkdnek. Fennll teht annak a veszlye, hogy idnknt kett vagy tbb thread
egyidejlegprblmegegykzserforrsthasznlni.
Azokban akdsorokban,amiket pldulmegbeszltnk,egy olyan threaddelvandolgunk,amikvzi az
sszeskapcsolatotegyzenetkldsreakarjafelhasznlni.Lehetsges,hogyezalattazidalattegymsik
threadismegksrliegyikvagymsikkapcsolatothasznlni,amiazzalaveszllyeljr,hogymkdsizavar
lphetfel(esetnkbentbbzenetkaotikusszuperpozcijtokozhatja).
A threadek kztti konkurls problmjt egy zr objektum (thread lockobjektum)alkalmazsval
lehetmegoldani.Azsszeskonkurensthreadltalhozzfrhetnvtrbencsakegyetlenilyenobjektumothozunk
ltre. Jellemzje, hogy mindig vagy a locked, vagy unlocked llapotok valamelyikben tallhat. Kiindulsi
llapotaunlocked.
Hasznlata:
Amikoregythreadegykzserforrshasznlatrakszl,elszrazracquire()metdustaktivlja.Ha
azunlockolvavolt,akkorlockolsakrthreadnyugodtanhasznlhatjaakzserforrst.Amikorbefejezte
azerforrshasznlatt,akkoraktivljaazrrelease()metdust,amiazrattvisziazunlockedllapotba.

Haegymsikkonkurensthreadisaktivljaazracquire()metdust,amikorazrlockedllapotbanvan,a
metdusnemadjaakezt,blokkolvaezutbbithreadet,amifelfggesztiamkdstmindaddig,amga
retesztnemmegyunlockedllapotba.Eztehtmegakadlyozzaakzserforrshozvalhozzfrstamgazt
egymsikthreadhasznlja.Amikorareteszunlockolvavanazegyikvrakozthread(tbbislehetbellk)
folytatjamkdstsgytovbb.
Azrobjektumgytroljaablokkoltthreadekhvatkozsait,hogyarelease()metdusahvsakorcsak
egyblokkoltthreadetszabadtfel.mindiggyelnikellr,hogymindegyikthread,amelyikegyerforrshoz
trtnhozzfrselttareteszacquire()metdustaktvlja,utnaarelease()metdustisaktivlja.
Amennyiben mindegyik konkurens thread betartja ezt az eljrst, gy ez az egyszer technika
megakadlyozza azt, hogy egy kzs erforrst egyidejleg tbb thread hasznljon. Ebben az esetben azt
mondjuk,hogyathreadekszinkronizlvavannak.

18.7.5 Serverprogram:folytatssbefejezs
Az albbi kt osztly teljess teszi a serverscriptet. A ThreadClients() osztlyban implementlt kd
meglehetsenhasonltaChatprogramprogramtrzseszmrafejlesztettkdunkhoz.Jelenesetbenazonbana
kdotegy Thread() osztlyblleszrmaztatottosztlybanfogjukelhelyezni,merteztakdotafalkalmazs
threadjtlfggetlenthreadbenkellmkdtetnnk.Eztathreadetkizrlagagrafikusinterfacemainloop()
ciklusahasznlja78.
Az AppServer() osztly a canon04 modul AppAgyuParbaj() osztlybl szrmazik. Kiegszt

78 Eztakrdstnhnyoldallalksbbfogomrszletezni,mertrdekesperspektvkatnyitmeg.
Lsd:Animcikoptimalizlsathreadeksegtsgvel,303.oldal.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 296.
metdusokat adtam hozz, amiket alkalmass tettem a kliensekkel folytatott prbeszdekbl ered minden
mveletetvgrehajtsra.Fntebbmremltettem, hogyakliensekmindegyikeltrefoghozniegyebblaz
osztlyblleszrmaztatottvltozatot(azrt,hogyugyanazokatazablak,vszon,stb.defincikathasznljuk).

138. class ThreadClients(threading.Thread):
139. """az uj klienskapcsolatokat kezelo thread-objektum"""
140. def __init__(self, boss, connec):
141. threading.Thread.__init__(self)
142. self.boss = boss # az alkalmazasablak hivatkozasa
143. self.connec = connec # a kezdo socket hivatkozasa
144.
145. def run(self):
146. "uj klienskapcsolatok varasa es kezelese "
147. txt ="Server ksz, vrja a krseket ...\n"
148. self.boss.kiir(txt)
149. self.connec.listen(5)
150. # A kliensek altal kert kapcsolatok kezelese :
151. while 1:
152. new_conn, adresse = self.connec.accept()
153. # Egy uj thread-objektum letrehozasa a kapcsolat kezelesere :
154. th = ThreadConnexion(self.boss, new_conn)
155. th.start()
156. it = th.getName() # a thread egyedi azonositoja
157. # A kapcsolat tarolasa a szotarban :
158. self.boss.kapcsolat_bejegyzese(new_conn, it)
159. # Kiir :
160. txt = "%s kliens felkapcsoldik, IP cm %s, port %s.\n" %\
161. (it, adresse[0], adresse[1])
162. self.boss.kiir(txt)
163. # A parbeszed elkezdese a klienssel :
164. new_conn.send("server OK")
165.
166. class AppServer(AppAgyuParbaj):
167. """az alkalmazas foablaka (server vagy kliens)"""
168. def __init__(self, host, port, width_c, height_c):
169. self.host, self.port = host, port
170. AppAgyuParbaj.__init__(self, width_c, height_c)
171. self.active =1 # aktivitas-flag
172. # ugyeljunk a megfelelo kilepesre ha bezarjuk az ablakot :
173. self.bind('<Destroy>',self.threadek_zarasa)
174.
175. def specificites(self):
176. "a server resz specialis objektumainak elkeszitese"
177. self.master.title('<<< Az agyuparbaj jatek servere >>>')
178.
179. # egy gorgeto savval asszocialt Text widget :
180. st =Frame(self)
181. self.notice =Text(st, width =85, height =5)
182. self.notice.pack(side =LEFT)
183. scroll =Scrollbar(st, command =self.notice.yview)
184. self.notice.configure(yscrollcommand =scroll.set)
185. scroll.pack(side =RIGHT, fill =Y)
186. st.pack()
187.
188. # halozati server resz :
189. self.conn_client = {} # klienskapcsolatok szotara
190. self.locking =threading.Lock() #zr a thread-ek szinkroniz.-hoz
191. # A server inicializalasa - Socket letrehozasa:
192. connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
193. try:
194. connection.bind((self.host, self.port))
195. except socket.error:
196. txt ="Socket kapcsol. a %s host, %s porthoz meghisult.\n" %\
197. (self.host, self.port)
198. self.notice.insert(END, txt)
199. self.reception =None
200. else:

297. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
201. # a kliensek kapcsolodasat figyelo thread inditasa :
202. self.reception = ThreadClients(self, connection)
203. self.reception.start()
204.
205. def agyu_veletlen_mozditasa(self, id):
206. "az <id> agyu veletlenszeru elmozditasa"
207. x, y = AppAgyuParbaj.agyu_veletlen_mozditasa(self, id)
208. # az uj koordinatak kozlese az osszes klienssel :
209. self.locking.acquire()
210. for cli in self.conn_client:
211. message = "elmozdul,%s,%s,%s," % (id, x, y)
212. self.conn_client[cli].send(message)
213. self.locking.release()
214.
215. def goal(self, i, j):
216. "az <i> agyu jelzi, hogy eltalalta a <j> ellenfelet"
217. AppAgyuParbaj.goal(self, i, j)
218. # az osszes klienssel tudatjuk az uj pontszamokat :
219. self.locking.acquire()
220. for cli in self.conn_client:
221. msg ='pontszm,'
222. for id in self.pult:
223. sc = self.pult[id].pont_ertek()
224. msg = msg +"%s;%s," % (id, sc)
225. self.conn_client[cli].send(msg)
226. time.sleep(.5) # az zenetek jobb szeparalasa erdekeben
227. self.locking.release()
228.
229. def agyu_hozzadasa(self, id):
230. "egy <id> nevu agyu es vezerlopult letrehozasa 2 szotarban"
231. # valtogatni fogjuk a 2 taboret :
232. n = len(self.guns)
233. if n %2 ==0:
234. irany = -1
235. else:
236. irany = 1
237. x, y = self.veletlen_koord(irany)
238. szin =('dark blue', 'dark red', 'dark green', 'purple',
239. 'dark cyan', 'red', 'cyan', 'orange', 'blue', 'violet')[n]
240. self.guns[id] = Canon(self.jatek, id, x, y, irany, szin)
241. self.pult[id] = VezerloPult(self, self.guns[id])
242. self.pult[id].inactivate()
243. return (x, y, irany, szin)
244.
245. def agyu_eltavolitas(self, id):
246. "az <id> agyu es vezerlopult eltavolitasa"
247. if self.active == 0: # az ablakot bezartuk
248. return
249. self.guns[id].torol()
250. del self.guns[id]
251. self.pult[id].destroy()
252. del self.pult[id]
253.
254. def iranyzas_agyu(self, id, angle):
255. "az <id> agyu dolesszogenek <angle> ertekre valo beallitasa"
256. self.guns[id].iranyzas(angle)
257. self.pult[id].beallitas(angle)
258.
259. def tuzel_agyu(self, id):
260. "az <id> agyu lovesenek inditasa"
261. self.guns[id].tuz()
262.
263. def kapcsolat_bejegyzese(self, conn, it):
264. "A kapcsolat tarolasa egy szotarba"
265. self.conn_client[it] = conn
266.
267. def kiir(self, txt):
268. "egy zenet kiirasa a szovegzonaba"
269. self.notice.insert(END, txt)
270.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 298.
271. def threadek_zarasa(self, evt):
272. "a letezo kapcsolatok megszakitasa es a thread-ek zarasa"
273. # az osszes klienssel letrehozott kapcsolat megszakitasa :
274. for id in self.conn_client:
275. self.conn_client[id].send('fin')
276. # a keresekre varo server thread befejezesenek kenyszeritese :
277. if self.reception != None:
278. self.reception._Thread__stop()
279. self.active =0 # megakad. a tovabbi hozzafereseket a Tk -hoz
280.
281. if __name__ =='__main__':
282. AppServer(host, port, width_, height_).mainloop()

Magyarzatok:
173.sor:Alkalmankntmegtrtnik,hogymegakarjukvltoztatniazalkalmazsbezrsnakamenett
amit a felhasznl a programunkbl val kilpssel indt el pldul azrt, mert fontos adatok fileba
mentst,vagymsablakokbezrst,stb.iskiakarjukknyszerteni.Ehhezelegenda<Destroy>esemnyt
detektlni,ahogyanittiseljrunk,hogyazsszesaktvthreadbefejezstkiknyszertsk.
179.186.sorok:me,hogyanasszocilhatunkegygrdtsvot(Scrollbarwidgetet)egyTextwidgethez
(ugyaneztmegtehetjkegyCanvaswidgettel)aPmwknyvtrhvsanlkl79.
190.sor:Athreadekszinkronizlstlehetvtevzrobjektumltrehozsa.
202,203.sorok:Apotenciliskliensekkapcsolatkrstllandanfigyelthreadobjektumltrehozsa.
205.213.,215.227.sorok: Ezek a metdusok a szlosztlytl rklt azonos nev metdusokat
overloadoljk. Elszr a szlosztly metdust hvjk, hogy azok elvgezzk a feladatukat (207.,
217.sorok),majdhozzteszikasajtfunkcijukat,amiabblll,hogymindenkinekjelzik,hogymitrtnt.
229.243.sorok:Ezametdusmindenalkalommal,amikoregyjklienskapcsoldikaserverhez,egyj
lllsthozltre.Azgykvletlenszerenvannakelhelyezvefelvltvaabalsajobboldalon.Azeljrson
termszetesen lehetne javtani. Az elre megadott sznlista 10re korltozza a kliensek szmt, aminek
elgnekkellenelenni.

79 Lsd:PythonMegaWidgetek,205.oldal.

299. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
18.7.6 Kliensprogram
Mint a serverprogram, ez is viszonylag rvid, mert modulokat importl s az osztlyok rklsi
mechanizmustalkalmazza.Aserverscriptetegycanon_serveur.pynevfilemodulbakellettmenteni.Eztafile
tazaktulisknyvtrbakell elhelyezni ugyangy,mint a canon03.py s canon04.py filemodulokat, amiket
hasznl.
Az gy importlt modulokbl a script a Canon() s a VezerloPult() osztlyokat vltozatlan formban
hasznlja s egy AppServer() osztlybl leszrmaztatott osztlyt is hasznl. Ez utbbiban szmos metdust
fellrtunk, hogy adaptljuk a mkdsket. Tekintsk pldul a goal() s az agyu_veletlen_elmozditasa()
metdusokat, amiknek fellrt vltozata semmit sem csinl (pass utasts), mert a lvsek utn a tallatok
szmllstsazgykelmozdtstcsakaservervgezheti.
AThreadSocket()osztlyrun()metdusban(86126.sorok)tallhataserverrelvltottzeneteketkezel
kd. Egybknt benne hagytam egy print utastst (a88.sorban), hogy a server ltal fogadott utastsok
megjelenjenek a standard outputon. Az olvas termszetesen trlheti ezt az utastst, ha a jtk vgleges
formjtksztiel.

1. ######################################################################
2. # Agyuparbaj - kliensresz #
3. # (C) Gerard Swinnen, Liege (Belgique) - Juillet 2004 #
4. # Licence : GPL #
5. # A script vegrehajtasa elott ellenorizze, az alabbi IP cim a host #
6. # IP cime e. Valaszthat egy eltero portszamot, vagy megvaltoztathat- #
7. # ja a jatekter mereteit.-Minden esetben ellenorizze, hogy ugyan #
8. # ezeket a valtoztatasokat elvegezte-e a kliens scripteken- #
9. ######################################################################
10.
11. from Tkinter import *
12. import socket, sys, threading, time
13. from szerver import Canon, VezerloPult, AppServer
14.
15. host, port = '192.168.1.9', 35000
16. width_, height_ = 700, 400 # jatekter meretei
17.
18. class AppClient(AppServer):
19. def __init__(self, host, port, larg_c, haut_c):
20. AppServer.__init__(self, host, port, larg_c, haut_c)
21.
22. def specificites(self):
23. "a kliens resz specifikus objektumainak elokeszitese"
24. self.master.title('<<< gyprbaj >>>')
25. self.connec =ThreadSocket(self, self.host, self.port)
26. self.connec.start()
27. self.id =None
28.
29. def agyu_hozzadasa(self, id, x, y, irany, szin):
30. "<id> nevu agyu es vezerlopult peldanyok letrehozasa 2 szotarban"
31. self.guns[id] = Canon(self.jatek,id,int(x),int(y),int(irany),szin)
32. self.pult[id] = VezerloPult(self, self.guns[id])
33. self.pult[id].inactivate()
34.
35. def activate_pupitre_personnel(self, id):
36. self.id =id # a szervertol kapott azonosito
37. self.pult[id].activate()
38.
39. def tuzel_agyu(self, id):
40. r = self.guns[id].tuz() # False-ot ad vissza, ha blokkolva van
41. if r and id == self.id:
42. self.connec.report_gunfire()
43.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 300.
44. def imposer_score(self, id, sc):
45. self.pult[id].pont_ertek(int(sc))
46.
47. def elmozdit_agyu(self, id, x, y):
48. "megjegyzes: az x es y ertekeket stringkent fogadja"
49. self.guns[id].elmozdit(int(x), int(y))
50.
51. def iranyzas_agyu(self, id, angle):
52. "az <id> agyu dolesszoget az <angle> ertekkel valtoztatja"
53. self.guns[id].iranyzas(angle)
54. if id == self.id:
55. self.connec.report_angle(angle)
56. else:
57. self.pult[id].beallitas(angle)
58.
59. def threadek_zarasa(self, evt):
60. "a kapcsolatok megszuntetese es a threadek zarasa"
61. self.connec.finish()
62. self.active =0 # kesobbi hozzaferes megakadalyozasa a Tk
-hoz
63.
64. def agyu_veletlen_mozditasa(self, id):
65. pass # => hatastalan metodus
66.
67. def goal(self, a, b):
68. pass # => hatastalan metodus
69.
70.
71. class ThreadSocket(threading.Thread):
72. """a serverrel tort. uzenetvaltast kezelo thread-objektum
letrehozasa"""
73. def __init__(self, boss, host, port):
74. threading.Thread.__init__(self)
75. self.app = boss # az alkalmazasablak hivatkozasa
76. # socket letrehozasa - kapcsolodas a serverhez :
77. self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
78. try:
79. self.connection.connect((host, port))
80. except socket.error:
81. print "A kapcsolat nem jtt letre."
82. sys.exit()
83. print "Letrejott a kapcsolat a serverrel."
84.
85. def run(self):
86. while 1:
87. msg_rece = self.connection.recv(1024)
88. print "*%s*" % msg_rece
89. # az uzenetet eloszor egy listava alakitja at :
90. t =msg_rece.split(',')
91. if t[0] =="" or t[0] =="fin":
92. # az aktualis thread zarasa:
93. break
94. elif t[0] =="server OK":
95. self.connection.send("client OK")
96. elif t[0] =="gyk":
97. self.connection.send("OK") # accuse de reception
98. # a lista 1. es utolso elemet eliminaljuk.
99. # amik megmaradnak azok is listak :
100. lc = t[1:-1]
101. # mindegyik egy agyu komplett leirasa :
102. for g in lc:
103. s = g.split(';')
104. self.app.agyu_hozzadasa(s[0], s[1], s[2], s[3], s[4])
105. elif t[0] =="j_gy":
106. self.app.agyu_hozzadasa(t[1], t[2], t[3], t[4], t[5])
107. if len(t) >6:
108. self.app.activate_pupitre_personnel(t[1])
109. elif t[0] =='angle':
110. # lehet, hogy tobb, csoportba foglalt informaciot fogadott
111. # ekkor csak az elsot tekintjuk :

301. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
112. self.app.iranyzas_agyu(t[1], t[2])
113. elif t[0] =="tzel":
114. self.app.tuzel_agyu(t[1])
115. elif t[0] =="scores":
116. # a lista 1. es utolso elemet eliminaljuk.
117. # amik megmaradnak azok is listak :
118. lc = t[1:-1]
119. # mindegyik elem egy pontszm lersa :
120. for g in lc:
121. s = g.split(';')
122. self.app.imposer_score(s[0], s[1])
123. elif t[0] =="elmozdul":
124. self.app.elmozdit_agyu(t[1],t[2],t[3])
125. elif t[0] =="megsz nik":
126. self.app.agyu_eltavolitas(t[1])
127.
128. # Itt fejezodik be a <reception> thread.
129. print "Kliens lell. Kapcsolatot megszakitja."
130. self.connection.close()
131.
132. def report_gunfire(self):
133. self.connection.send('t z')
134.
135. def report_angle(self, angle):
136. self.connection.send('clzs,%s,' % angle)
137.
138. def finish(self):
139. self.connection.send('fin')
140.
141. # Foprogramm :
142. if __name__ =='__main__':
143. AppClient(host, port, width_, height_).mainloop()
144.

Magyarzatok:
15.,16.sor:Egyformhozzadsvalamiezeketazrtkeketazindtskorafelhasznltlfogjakrniaz
olvasmagaistkletesthetiascriptet.
19.27.sorok:Aszlosztlyconstructoraa specificites() metdushvsvalfejezdikbe.Ezutbbiban
elhelyezhetjkmindazt,amitmshogykellaserverbenilletveakliensekbenmegszerkeszteni.(Nevezetesen:
aserverltrehozegy text widgetet,amitakliensekbennemtallunkmeg;mindkettklnbzthread
objektumokatindtakapcsolatokkezelsre.
3942.sorok: Amikor a felhasznl megnyomja a tzgombot, minden esetben ennek a metdusnak a
hvsrakerlsor.Azonbanazgynemadhatlesorozatlvseket.Kvetkezskntjlvsleadsranem
kerlhetaddigsor,amgazelzlvedknemfejeztebearpplyjt.Azgyobjektumtuz()metdusnak
igazvagyhamisvisszatrsirtkeazamijelzi,hogyalvsellettfogadvavagysem.Eztazrtket
csakarrahasznljuk,hogyaservernek(saklienseknek)jelezzk,hogyvalbanlvsekvoltak.
105.108.sorok:Mindenalkalommal,amikorjklienskapcsoldikfel,mindegyikjtktrhezegyjgyt
kellhozzadni(vagyisaservervsznhozsmindenfelkapcsoldottkliensvsznhoz).Ebbenapillanatbana
server ugyanazt az zenetet kldi az sszes kliensnek, hogy tjkoztassa ket az j partner jelenltrl.
Azonban az j kliensnek kldtt zenet tartalmaz egy kiegszt mezt (amelyik az az_n stringet
tartalmazza)azrt,hogyapartnertudja,hogyezazzenetazgyjravonatkoziksaktivlnitudjaa
megfelelvezrlpultot,mikzbenaserverltalhozzrendeltazonostttrolja(lsda35.37.sorokatis).

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 302.
Kvetkeztetsekstvlatok:
Eztazalkalmazstdidaktikaicllalmutattambe.Szmosproblmtszndkosanleegyszerstettem.Pldul,
haazolvasmagateszteliezeketaprogramokat,konstatlnifogja,hogyazzenetekgyakrancsomagokba
vannak sszefogva, ami szksgess tenn az azok interpretlsra ksztett algoritmusok finomtst. Alig
vzoltamajtkalapmkdst:ajtkosokelosztstakttrflen,atallatotkapottgykeltntetst,a
klnbzakadlyokat,stb.Azolvasrasokfelfedeznivalmarad!

(18) Gyakorlatok:

18.1. Egyszerstsea284.oldalonlert,chatkliensnekmegfelelscriptetgy,hogyakt
threadobjektumegyikttrli.rjapldulgyt,hogyafthreadbenkezeljeazzenetek
kibocstst.

18.2. Mdostsaa15.fejezet(229oldal)jtkt(egygpesvltozat)gy,hogycsakegygyts
egyvezrlpultottartsonmeg.Adjonhozzegymozgclpontot,aminekamozgstegy
fggetlen threadobjektum kezeli (olymdon, hogy a cltrgy s a lvedk animcijt
vezrlkdrszekellegyenekvlasztva).

18.8 Threadek(szlak)alkalmazsaazanimcikoptimalizlsra.
Az elz fejezet vgn javasolt utols gyakorlat egy olyan alkalmazs fejlesztsi mdszert sugall, ami
klnsenrdekesnekbizonyulhatatbbszimultnanimcittartalmazvidejtkokesetben.
Valban:haegyjtkklnbzanimltelemeitmintasajtthreadjeikbenmkdfggetlenobjektumokat
programozzuk, akkor nemcsak a munknkat egyszerstjk s javtjuk a scriptnk olvashatsgt, hanem a
vgrehajtssebessgtisnveljksgyezeketazanimcikatisfolyamatosabbtesszk.Ahhoz,hogyidig
eljussunk,lekellmondanunkazeddighasznltksleltetsitechnikrl,deamithelyettefogunkalkalmaznivgl
isegyszerbb!

18.8.1 Animcikksleltetseazafter()segtsgvel
Az after() metdust(ezminden Tkinter widgethezhivatalblvanasszocilva)tartalmazfggvnyblllt
mindeneddigianimcimotorja.Tudjuk,hogyezzelametdussalegyksleltetsvihetbeaprogramunk
menetbe: egy bels ra van aktivlva gy, hogy megfelel id eltelte utn a rendszer automatikusan hv
valamilyenfggvnyt.ltalbannmagtaz after() ttartalmazfggvnythvjuk:gyegyrekurzvhurkot
lltunkel,amibenaklnbzgrafikusobjektumokelmozdulstkellprogramozni.
Programunkegyltaln nemfagyle,amgaz after() metdussalprogramozottidtartamnemtelikle.
Pldulezalattazidtartamalattkattinthatunkegygombra,tmretezhetjkazablakot,aklaviatrrladatot
vihetnkbe,stb.Ezhogyanlehetsges?
Mr tbbszr emltettem, hogy a modern grafikus alkalmazsoknak mindig van egy motorja, ami egy
folyamatosanahttrbenmkdprogram:afablak mainloop() metdusnakaktivlsakorindulel.Minta
neveisjelzi,egyugyanolyantpusvgtelen ciklusthasznl,mintamrjlismert while ciklusok.Szmos
mechanizmusvanbeptveebbeamotorba.Azegyikakeletkezesemnyekfogadsblsabblll,hogy
azokat a programokat, amik krik, utna megfelel zenetekkel figyelmezteti az esemnyek bekvetkeztre
(lsd: Esemnyvezreltprogramok 85.oldal),msokakiratsszintjnvgrehajtandakcikatvezrlik,stb.
Amikoregywidgetafter()metdusthvjuk,akkorvaljbanegyidmrmechanizmusthasznlunk,amimaga

303. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
isbelevanptveamainloop()basennlfogvaezakzpontiadminisztrtoraz,amibizonyosideltelteutn
elindtjaakvntfggvnyhvst.
Az after() metdust alkalmaz animcis technikaazegyedli lehetsges technikaazegyetlen threaden
mkdalkalmazsokszmra,mertkizrlagamainloop()az,amiegyilyenalkalmazsviselkedsegyttest
vezrli.Nevezetesen:mindenalkalommalamainloop()felelsazablakrszlegesvagyteljesjrarajzolsrt,ha
az szksges. Azrt nem kpzelhet el egy grafikus objektum koordintit tdefinil animcis motor
megkonstrulsaegyegyszerwhilehurokbelsejben,mertamainloop()vgrehajtsaegszidalattfellenne
fggesztve.Ennekazlenneakvetkezmnye,hogyezalattazidalattsemmilyenobjektum(specilisanaz,amit
mozgatniszeretnnk!)semlennejrarajzolva.gytnne,hogyazegszalkalmazsmindaddiglefagyott,mga
whilehurokmegnemszakad.
Mivel ez az egyetlen lehetsg, ezrt a monothread alkalmazsainkban mindeddig ezt a technikt
alkalmaztuk.Viszontezegyzavarnehzsggeljr:amiatt,hogyamainloop()mindeniterrcijanagyszm
mveletetkezel,ezrtazafter()relprogramozottksleltetsnemlehetnagyonrvid.Pldulezatechnikanem
tudegytipikusPCn(PentiumIV,f=1,5GHz)15msalmenni.Eztakorltotfigyelembekellvenni,hagyors
animcikatakarunkfejleszteni.
Azafter()metdussalkapcsolatosmsiknehzsgazanimcisciklusszerkezetbenrejlik(tudniillikazegy
rekurzivfggvnyvagymetdus,vagyisaminmagthvja):nemmindigegyszeruralniazilyenfajta
logikaikonstrukcit,klnsenhatbb,fggetlengrafikaiobjektumanimcijtakarjukprogramozni,melyek
szmnaksmozgsnakvltoznikellazidben.

18.8.2 Animcikksleltetseatime.sleep()pel
Eltekinthetnkafentemltett after() metduskorltaitl,haagrafikaiobjektumainkanimcijtfggetlen
threadekrebzzuk.Hagyjrunkel,megszabadulunkamainloop()gymsgtlspldulawhilevagyafor
utastsalkalmazsvalahagyomnyosabbciklusszerkezetekenalapulanimciseljrsokatkonstrulhatunk.
Viszont gyelni kell r, hogy mindegyik ciklus belsejbe szrjunk be egy ksleltetst, ami alatt kezet
nyjtunk az opercis rendszernek (azrt, hogy az ms threadekkel is tudjon foglalkozni). Ennek
megvalstshozatimemodulsleep()fggvnytfogjukhvni.Ezafggvnyteszilehetvazaktulisthread
vgrehajtsnak felfggesztst egy adott idtartamra, mialatt ms threadek s alkalmazsok folytatjk a
mkdsket.Azgyltrehozottksleltetsnemfgga mainloop()tl,kvetkezskntsokkalrvidebblehet,
mintamitazafter()metdusmegenged.

Figyelem:eznemjelentiazt,hogymagaakpernyfrisstsgyorsabblesz,mertazttovbbraisamainloop()
biztostja. Viszontnagyonfelgyorsthatjuk azokatamechanizmusokat,amiketmimagunkptnkbeasajt
animcis eljrsainkba. Pldul egy jtkprogramban gyakori, hogy peridikusan ssze kell hasonltani kt
mozgobjektum(egylvedksegycltrgy)pozcijtazrt,hogyamikorrintkeznekellehessenindtaniegy
akcit(robbans,pontszmvltoztats,stb.).Azittlertanimcistechnikvalgyakrabbanhajthatunkvgreilyen
sszehasonltsokat s gy pontosabb eredmnyt remlhetnk. Ugyangy, egy valsidej plyaszmtsnl
nvelhetjkafigyelembevettpontokszmtsgyfinomthatjukaplyt.

Megjegyzs:Azafter()metdusalkalmazsakormillisecundumokban,egszargumentumkntkellmegadnia
kvntksleltetst.Asleep()fggvnyhvsakor,azargumentumotsecundumokban,floatformbankellmegadni.
Viszontnagyonkisrtkeket(pldul:0.0003)hasznlhatunk.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 304.
18.8.3 Konkrtplda
Azalbbiscriptennekatechniknakazalkalmazstmutatjabeegyszndkosanminimalistapldn.Ezegy
kisgrafikusalkalmazs,amibenegybramozogkrbeegyvsznon.Azalkalmazs mainloop() motorjt,
ahogyazmegszokott,afthreadbenelindtjukel.Azalkalmazsconstructoraegykrrajzt,egygombotsegy
threadobjektumottartalmazvsznathozltre.Ezazathreadobjektum,amigybiztostjaarajzanimcijt,
hogysemmilyenwidgetneksemhvjaazafter()metdust.Ehelyettegyhagyomnyoswhilehurkotalkalmaz,
amiarun()metdusbanvaninstalllva.

1. from Tkinter import *


2. from math import sin, cos
3. import time, threading
4.
5. class App(Frame):
6. def __init__(self):
7. Frame.__init__(self)
8. self.pack()
9. can =Canvas(self, width =400, height =400,
10. bg ='ivory', bd =3, relief =SUNKEN)
11. can.pack(padx =5, pady =5)
12. cercle = can.create_oval(185, 355, 215, 385, fill ='red')
13. tb = Thread_labda(can, circle)
14. Button(self, text ='Indul', command =tb.start).pack(side =LEFT)
15. # Button(self, text ='Lell', command =tb.stop).pack(side =RIGHT)
16. # lelltjuk a msik thread-et, ha bezrjuk az ablakot :
17. self.bind('<Destroy>', tb.stop)
18.
19. class Thread_labda(threading.Thread):
20. def __init__(self, canevas, drawing):
21. threading.Thread.__init__(self)
22. self.can, self.drawing = canevas, drawing
23. self.anim =1
24.
25. def run(self):
26. a = 0.0
27. while self.anim == 1:

305. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
28. a += .01
29. x, y = 200 + 170*sin(a), 200 +170*cos(a)
30. self.can.coords(self.dessin, x-15, y-15, x+15, y+15)
31. time.sleep(0.010)
32.
33. def stop(self, evt =0):
34. self.anim =0
35.
36. App().mainloop()

Magyarzatok:
13.s14.sor:Pldnkmaximlisleegyszerstserdekbenazanimcirtfelelsobjektumotkzvetlenla
falkalmazs constructorban hozzuk ltre. Ez a threadobjektum viszont csak akkor indul el, ha a
felhasznlaMarchegombrakattint,amia start() metdustaktivlja(emlkezznkr,hogyezaza
beptettmetdus,amielfogjaindtaniarun()metdust,amibenazanimcishurkunkvan).
15.sor:Egybefejezettthreadetnemindthatunkjra.Ezrtcsakegyszerindthatjuk eleztazanimcit
(legalbbis az itt bemutatott formban). Hogy meggyzdjnk errl, tvoltsuk el a15. sor elejrl a #
karaktert(amimiattaPythoneztasorteddigkommentnektekintette):azanimcielindulsakorazegrrela
gombrakattintvaelidzzka27.31.sorokwhileciklusblvalkilpst,amibefejeziarun()metdust.Az
animcilell, deaztkezel thread isbefejezdik.Hamegprbljuk aIndt gombbaljraindtania
threadet,csakegyhibazenetetkapunk.
26.31.sorok:Egyenleteskrmozgsszimulcijhozelg,hafolyamatosanvltoztatjukazaszgrtkt.
Ennek a szgnek a sinusval s cosinusval kiszmolhatjuk a szgnek megfelel kerleti pont x s y
koordintit80.
Aszgmindenegyesiterrcinlcsakegyszzadradintvltozik(krlbell0,6),gy628iterrciravan
szksg,hogyamozgobjektumegyteljeskrttegyenmeg.Aziterrciszmravlasztottksleltetsa
31.sorbantallhat:10millisecundum.Ennekazrtknekacskkentsvelgyorsthatjukamozgst,denem
mehetnk1millisecundumal,amimrnemolyanrossz.

80 Errevonatkozana230.oldalontallhatmagyarzat.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 306.
19.Fejezet: Fggelk

19.1 APythonteleptse
HakiakarjaprblniaPythontaPCjn,nettovzzon!Ateleptsegyszer(stkletesenreverzibilis).

19.2 TeleptsWindowsalatt
A Python hivatalos websitejn: http://www.python.org a Download fejezetben a klnbz Python
verzikteleptprogramjaitallhatk.Nyugodtanvlaszthatjaazutolsproductionverzit.
Pldul,2003.09.03neza2.3.1verzivoltAletltenfilea:Python2.3.1.exe
Msoljukegyideiglenesknyvtrbashajtassukvgre.APythontalaprtelmezettenegyPython**nev
knyvtrbaleszteleptve(a**averziszmktszmjegytjelenti)sazindt ikonokisautomatikusanel
leszenhelyezve.
Amikorateleptsbefejezdtt,trlhetazideiglenesknyvtrtartalma.

19.2.1 TeleptsLinuxalatt
AzolvasvalsznlegegyolyankereskedelmidisztrsegtsgvelteleptetteaLinuxrendszert,minta
SuSE,RedHatvagyMandrake.TeleptseaPythonpackageet,amiadisztrrsztkpezi.NehagyjakiaTkinter
t(eznhaaPythonimaginglibraryvelegyidbenvanteleptve).

19.2.2 TeleptsMacOSalatt
A Pythonnak klnbz verzii tallhatk a MacOS 9 s Mac OS X hez Jack Jansen websitejn :
http://homepages.cwi.nl/~jack/macpython

FontosmegjegyzsaPythonjabbverziiravonatkozan
A2.3verzijtlkezdveamagyaranyanyelveknekajnlottazalbbipseudocommentekegyiktminden
Pythonscriptelejrerni(az1.vagya2.sorba):
# -*- coding:Latin-2 -*-

vagy:
# -*- coding:Utf-8 -*-

Amagyarzata40.oldalontallhat.

19.3 ASciTE(ScintillaTextEditor)teleptse
ASciTE egy kitn szvegszerkeszt,amikpesszintaktikai sznezsre,automatikuskdkiegsztsres
code foldingra, vagyis klnbz utastsblokkok (egy osztly, egy fggvny, egy ciklus, stb.) szndkos
kimaszkolsra.:Azutbbifunkciakkortnikrendkvlpraktikusnak,amikorakdkezdhosszlenni...Egy
terminlablakotisintegrl,valamintascriptekindtshozegyshortcutotisegy.

307. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
EzaszvegszerkesztmindWindowshoz,mindLinuxhozrendelkezsrell.
Nzzemega:http://www.scintilla.org/SciTE.htmlwebsiteot.

19.3.1 TeleptsLinuxalatt:
A Scintilla szvegszerkesztt a jelenlegi Linux disztribcikkal hivatalosan egytt adjk. Ha nincs a
disztrban,akkorafentemltettwebsiterllelehettlteni,majd:
Lekelltlteniagscite***.tgzarchvfilet,majdkikellcsomagolniatarral.

ASciTEvgrehajthatllomnyta/usr/local/binbekelltelepteni.

Azsszestbbillomnyt(*.propertiesfileokat)a/usr/share/scitebe(nempediga/usr/share/gscitebe!)
kelltelepteni.

19.3.2 TeleptsWindowsalatt:
Lekelltlteniawscite***.ziparchvfilet,majdkikelltmrtenia\Programfilesba
EgyindtikontkellinstalllniaSciTe.exenek

19.3.3 Aktverzihoz:
Sokmindenttestrelehetszabni(fontok,stb.)agloblistulajdonsgokfilejnakszerkesztsvel
(MenuOptionsOpenglobaloptionsfile).
Pldulacodefoldingbalmargnlv+sszimblumainakaktivlshoz:
fold.symbols = 2 # a bekeretezett + s ikonokhoz
fold.on.open = 1 # kiindulskor minden be van csomagolva
margin.width =0 # a haszontalan margk trlse

Azautomatikustabulls4betkzzelvalhelyettestshez:
tabsize = 4
indent.size = 4
use.tabs = 0

19.4 APythonmegawidgetekteleptse
Ltogassamega:http://pmw.sourceforge.netwebsiteot.
Kattintsona:DownloadPmw12tar.gzlinkreamegfelelfileletltshez.

Fejtsekieztazarchvfiletegyideiglenesknyvtrbaegyolyankitmrtprogrammal,mintpl.a: tar,
Winzip,InfoZip,unzip....
MsoljaazautomatikusanltrehozottPmwalknyvtratabbaaknyvtrba,ahovaPythonttelepttette.

Windowsalatt,ezpldulaC:\Python23

Linux alatt, valsznleg ez a :/usr/lib/python

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 308.
19.5 AGadflyteleptse(adatbzisrendszer)
Tltsk le a http://sourceforge.net/projects/gadfly websiterl a gadfly1.0.0.tar.gz csomagot. Ez egy
tmrtettarchvfile.Msoljukeztafiletegyideiglenesknyvtrba.

19.5.1 TeleptsWindowsalatt
Egytetszlegesideiglenesknyvtrbantmrtskkiazarchvfiletegyolyanprogrammal,mintaWinzip.
NyissunkmegegyDOSablakotslpjnkbeazautomatikusanltrehozottalknyvtrba.
Indtsukela:pythonsetup.pyinstall parancsot.Ezminden.
Esetlegjavthatjukateljestmnytakvetkezmvelettel:
Az automatikusan ltrehozott alknyvtrban nyissuk meg a kjbuckets alknyvtrat, majd nyissuk meg a
Python verzinknak megfelel alknyvtrat. Msoljuk az ott tallhat *.pyd filet a Python teleptsnk
gykrknyvtrba.
Amikorvgeztnk,trljkazideiglenesknyvtrunkat.

19.5.2 TeleptsLinuxalatt
Adminisztrtorknt(root),vlasszunkvalamilyenideiglenesknyvtratstmrtskodakiatarutilityvel,
amibiztosanrszeadisztribcinknak,azarchvfilet.
rjukbea:tarxvzfgadfly1.0.0.tar.gz
Lpjnkbeazautomatikusanltrehozottalknyvtrba:cdgadfly1.0.0
Indtsukela:pythonsetup.pyinstall parancsot.Ezminden.
HaaLinuxrendszernknekvanCfordtja,akkorakjbucketsknyvtrjrafordtsvaljavthatjukaGadfly
teljestmnyt.Ehhezrjukmgbeakvetkezktutastst:
cdkjbuckets
pythonsetup.pyinstall

Amikormindenbefejezdtt,trljkazideiglenesknyvtrtartalmt.

309. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
19.6 Agyakorlatokmegoldsai
Nhnygyakorlatnaknemadommegamegoldst.Trekedjenegyedlmegtallniamegoldstmgakkoris,
haaznehznektnik.Azolvasakkortanulalegtbbet,hasajtmagaoldjamegezeketaproblmkat.
4.2gyakorlat:
>>> c = 0
>>> while c < 20:
... c = c +1
... print c, "x 7 =", c*7

vagy:
>>> c = 1
>>> while c <= 20:
... print c, "x 7 =", c*7
... c = c +1

4.3gyakorlat:
>>> s = 1
>>> while s <= 16384:
... print s, "euro =", s *1.65, "dollar"
... s = s *2

4.4gyakorlat:
>>> a, c = 1, 1
>>> while c < 13:
... print a,
... a, c = a *3, c+1

4.6gyakorlat:
# Kezd rtkknt megadott msodpercek szma :
# (egy nagy szmot adunk meg !)
nsd = 12345678912
# Egy napra es msodpercek szma :
nspj = 3600 * 24
# Egy vre es msodpercek szma (365 napra -
# a szk veket nem vesszk figyelembe ) :
nspa = nspj * 365
# Egy hnapra es msodpercek szma (felttelezzk,
# hogy minden hnap 30 napos) :
nspm = nspj * 30
# A megadott id tartam ennyi vet tesz ki :
na = nsd / nspa # egszoszts
nsr = nsd % nspa # a maradk msodpecek szma
# A megmarad hnapok szma :
nmo = nsr / nspm # egszoszts
nsr = nsr % nspm # a maradk msodpecek szma
# A megmarad napok szma :
nj = nsr / nspj # egszoszts
nsr = nsr % nspj # a maradk msodpecek szma
# A megmarad rk szma :
nh = nsr / 3600 # egszoszts
nsr = nsr % 3600 # a maradk msodpecek szma
# a maradk pecek szma :

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 310.
nmi = nsr /60 # egszoszts
nsr = nsr % 60 # a maradk msodpecek szma

print "Az talaktand msodpercek szma :", nsd


print "Ez az id tartam", na, "vnek"
print nmo, "hnapnak",
print nj, "napnak,",
print nh, "rnak,",
print nmi, "percnek s",
print nsr, " msodpercnek felel meg."

4.7gyakorlat:
# A 7-es szorztbla els elemnek kiratsa,
# 3 tbbszrseinek jelzsvel :

i = 1 # szmll: 1-t l 20-ig egyms utn vesszk az rtkeket


while i < 21:
# a kirand szorzat kiszmolsa :
t = i * 7
# sorugrs nkli kirats (a vessz hasznata) :
print t,
# a szorzat 3 tbbszrse ? (a modulo opertor alkalmazsa) :
if t % 3 == 0:
print "*", # ez esetben kiratunk egy csillagot
i = i + 1 # minden esetben incrementljuk a szmllt

5.1gyakorlat:
# fok -> radin talakts
# Ismtls : 1 radinos az a szg, melyhez tartoz krv hossza
# a kr sugarnak hosszval.
# Mivel a kerlet 2 pi R, ezrt egy 1 radinos szg
# 360 / 2 pi -nek, vagy 180 / pi -nek felel meg

# A kiindulsi szg fok, perc, msodpercben megadva :


deg, min, sec = 32, 13, 49

# A szgmsodpercek talaktsa szgpercekbe :


# (a tizedespont miatt az talakts eredmnye vals szm lesz)
fm = sec/60.
# A szgpercek talaktsa fokokk :
fd = (min + fm)/60
# A szg rtknek tizedestrtt alaktsa :
ang = deg + fd
# pi rtke :
pi = 3.14159265359
# 1 radin fokokban megadva :
rad = 180 / pi
# A szg talaktsa radinn :
arad = ang / rad
# Kirs :
print deg, "", min, "'", sec, '" =', arad, "radin"

311. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
5.3gyakorlat:
# Fahrenheit <-> Celsius talakts

# A) C-ban megadott h mrsklet :


tempC = 25
# talakts Fahrenheitbe :
tempF = tempC * 1.8 + 32
# Kirats :
print tempC, "C =", tempF, "F"

# B) F-ben megadott h mrsklet :


tempF = 25
# talakts Celsiusba :
tempC = (tempF - 32) / 1.8
# Kirats :
print tempF, "F =", tempC, "C"

5.5gyakorlat:
>>> a, b = 1, 1 # vltozat : a, b = 1., 1
>>> while b<65 :
... print b, a
... a,b = a*2, b+1
...

5.6gyakorlat:
# Megadott karakter keresse egy stringben

# A kiindulsul megadott string :


ch = "Monty python flying circus"
# A keresend karakter :
cr = "e"
# Keress :
lc = len(ch) # az ellen rzend karakterek szma
i = 0 # a karakter indexe a vizsglat sorn
t = 0 # a belltand"flag", ha a keresett karakter megvan
while i < lc:
if ch[i] == cr:
t = 1
i = i + 1
# Kirats :
print "A karakter", cr,
if t == 1:
print "megvan",
else:
print "nem tallhat meg",
print "a stringben", ch

5.8gyakorlat:
# Helykitlt karakter beszrsa egy stringbe

# A kiindulsi string :
ch = "Gaston"
# A beszrand karakter :
cr = "*"
# A beszrand karakterek szma eggyel kisebb a stringben lv karakterek

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 312.
# szmnl. A stringet a msodik karaktertl kezdve manipulljuk
# (nem vesszk figyelembe az els karaktert).
lc = len(ch) # az sszes karakter szma
i = 1 # az els vizsgland karakter indexe (a msodik valjban)
nch = ch[0] # a ltrehozand j string (mr tartalmazza az els karaktert.)
while i < lc:
nch = nch + cr + ch[i]
i = i + 1
# Kirats :
print nch

5.9gyakorlat:
# String inverzija

# Kiindulsi string :
ch = "zorglub"
lc = len(ch) # az sszes karakter szma
i = lc - 1 # az utols karaktert l fogunk kezdeni
nch = "" # a ltrehozand j string (kezdetben res)
while i >= 0:
nch = nch + ch[i]
i = i - 1
# Kirats :
print nch

5.11gyakorlat:
# Kt lista talaktsa egy listv

# A kiindulsi listk :
t1 = [31,28,31,30,31,30,31,31,30,31,30,31]
t2 = ['Janur','Februr','Mrcius','prilis','Mjus','Jnius',
'Jlius','Augusztus','Szeptember','Oktbrer','November','December']
# A ltrehozand j lista (kezdetben res) :
t3 = []
# Ciklus :
i = 0
while i < len(t1):
t3.append(t2[i])
t3.append(t1[i])
i = i + 1

# Kirats :
print t3

5.12gyakorlat:
# Lista elemeinek kiratsa

# A kiindulsi lista :
t2 = ['Janur','Februr','Mrcius','prilis','Mjus','Jnius',
'Jlius','Augusztus','Szeptember','Oktbrer','November','December']
# Kirats :
i = 0
while i < len(t2):
print t2[i],
i = i + 1

313. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
5.13gyakorlat:
# Lista legnagyobb elemnek megkeresse

# A kiindulsi lista :
tt = [32, 5, 12, 8, 3, 75, 2, 15]
# A lista kezelse kzben az albbi vltozban fogjuk trolni a
# mr megtallt legnagyobb elemet :
max = 0
# Az sszes elem vizsglata :
i = 0
while i < len(tt):
if tt[i] > max:
max = tt[i] # egy j maximlis rtk trolsa
i = i + 1
# Kirats :
print "A lista legnagyobb elemnek az rtke", max

5.14gyakorlat:
# A pros s pratlan szmok sztvlasztsa

# A kiindulsi lista :
tt = [32, 5, 12, 8, 3, 75, 2, 15]
paros = []
paratlan = []
# Az sszes elem vizsglata :
i = 0
while i < len(tt):
if tt[i] % 2 == 0:
paros.append(tt[i])
else:
paratlan.append(tt[i])
i = i + 1
# Kirats :
print "Pros szmok :", paros
print "Pratlan szmok :", paratlan

6.1gyakorlat:
# mrfld/ra talaktsa km/h -v s m/s -m

print "rja be az rnknt megtett mrfldek szmt : ",


ch = raw_input() # ltalban az input() a preferlt
mph = float(ch) # a bemeneti string talaktsa vals szmm
mps = mph * 1609 / 3600 # talakts m/s -m
kmph = mph * 1.609 # talakts km/h -v
# Kirats :
print mph, " mrfld/ra =", kmph, "km/h, vagy", mps, "m/s"

6.2gyakorlat:
# Tetsz leges hromszg kerlete s terlete

from math import sqrt

print "rja be az a oldalt : "


a = float(raw_input())
print " rja be a b oldalt : "
b = float(raw_input())

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 314.
print " rja be a c oldalt : "
c = float(raw_input())
d = (a + b + c)/2 # a kerlet fele
s = sqrt(d*(d-a)*(d-b)*(d-c)) # terlet (a kplet alapjn)

print "Az oldalak hossza =", a, b, c


print "Kerlet =", d*2, "Terlet =", s

6.4gyakorlat:
# Elemek bersa egy listba

tt = [] # Az elksztend lista (kezdetben res)


ch = "start" # valamilyen rtk (de nem nulla)
while ch != "":
print "rjon be egy rtket : "
ch = raw_input()
if ch != "":
tt.append(float(ch)) # msik vltozat : tt.append(ch)

# a lista kiratsa :
print tt

6.8gyakorlat:
# Kt hatrrtk kz es egsz szmok kezelse

print "rja be az als hatrt :",


a = input()
print " rja be a fels hatrt :",
b = input()
s = 0 # a keresett sszeg (kezdetben nulla)
# Az a s b kz es szmsorozat bejrsa (a s b -t is belertve) :
n = a # az aktulisan kezelt szm
while n <= b:
if n % 3 ==0 and n % 5 ==0: # vltozat : 'or' az 'and' helyett
s = s + n
n = n + 1

print "A keresett sszeg", s

6.9gyakorlat:
# Szkvek

print "rja be az ellen rzend vszmot :",


a = input()

if a % 4 != 0:
# a nem oszthat 4-gyel -> nem szk v
bs = 0
else:
if a % 400 ==0:
# a oszthat 400-zal -> szk v
bs = 1
elif a % 100 ==0:
# a oszthat 100-zal -> nem szk v
bs = 0
else:

315. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
# ms esetek, amikor a oszthat 4-gyel -> szk v
bs = 1
if bs ==1:
ch = ""
else:
ch = "nem"
print a, ch, " szk v."

(AlexMisbahltaljavasoltvltozat):
a=input('rjon be egy vszmot:')

if (a%4==0) and ((a%100!=0) or (a%400==0)):


print a,"szk v"
else:
print a,"nem szk v"

6.11gyakorlat:Hromszgekszmolsai

from sys import exit # rendszerfggvnyeket tartalmaz modul

print """
rja be a hrom oldal hosszt
(az rtkeket vessz vel vlassza el) :"""
a, b, c = input()
# Nem lehet olyan hromszget konstrulni, melynek minden oldala
# rvidebb, mint a msik kt oldal hossznak sszege :
if a < (b+c) and b < (a+c) and c < (a+b) :
print "Ez a hrom hossz egy hromszget definil."
else:
print "Nem lehet ilyen hromszget konstrulni !"
exit() # ezrt kilpnk a programbl.

f = 0
if a == b and b == c :
print "Ez a hromszg egyenl oldal."
f = 1
elif a == b or b == c or c == a :
print "Ez a hromszg egyenl szr."
f = 1
if a*a + b*b == c*c or b*b + c*c == a*a or c*c + a*a == b*b :
print "Ez a hromszg derkszg ."
f = 1
if f == 0 :
print " Ez egy ltalnos hromszg."

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 316.
6.15gyakorlat:
# Iskolai rdemjegyek
jegyek = [] # A ltrehozand lista
n = 2 # valamilyen pozitv rtk a ciklus elindtshoz
while n >= 0 :
print "rjon be egy rdemjegyet. : ",
n = float(raw_input()) # egsz szmm alakts
if n < 0 :
print "OK. Befejezs."
else:
jegyek.append(n) # hozztesz egy rdemjegyet a listhoz
# A mr be bert rdemjegyeken vgzett klnbz szmtsok :
# minimlis s maximlis rtkek + a jegyek sszege.
min = 500 # valamennyi rdemjegynl nagyobb rtk
max, tot, i = 0, 0, 0
nn = len(jegyek) # A mr bert rdemjegyek szma
while i < nn:
if jegyek[i] > max:
max = jegyek[i]
if jegyek[i] < min:
min = jegyek[i]
tot = tot + jegyek[i]
atlag = tot/nn
i = i + 1
print "Jegyek=", nn, "Max =", max, "Min =", min, "tl. =", atlag

7.3gyakorlat:
from math import pi

def surfCircle(r):
"Egy r sugar kr terlete"
return pi * r**2

# teszt :
print surfCircle(2.5)

7.4gyakorlat:
def volBox(x1, x2, x3):
"Egy parallelepipedon trfogata"
return x1 * x2 * x3

# teszt :
print volBox(5.2, 7.7, 3.3)

7.5gyakorlat:
def maximum(n1, n2, n3):
"Renvoie le plus grand de trois nombres"
if n1 >= n2 and n1 >= n3:
return n1
elif n2 >= n1 and n2 >= n3:
return n2
else:
return n3

# teszt :
print maximum(4.5, 5.7, 3.9)

317. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
7.9gyakorlat:
def karSzamlalo(ca, ch):
"Megadja a ca karakter elfordulsainak szmt a ch stringben"
i, tot = 0, 0
while i < len(ch):
if ch[i] == ca:
tot = tot + 1
i = i + 1
return tot

# teszt :
print karSzamlalo("e","Ez a karakterlnc egy plda")

7.10gyakorlat:
def indexMax(tt):
"a tt lista legnagyobb elemnek indext adja meg"
i, max = 0, 0
while i < len(tt):
if tt[i] > max :
max, imax = tt[i], i
i = i + 1
return imax

# teszt :
serie = [5, 8, 2, 1, 9, 3, 6, 4]
print indexMax(serie)

7.11gyakorlat:
def honapNev(n):
"az v n-edik hnapjnak nevt adja meg"
mois = ['Janur','Februr','Mrcius','prilis','Mjus','Jnius','Jlius',
'Augusztus','Szeptember','Oktber','November','December']
return mois[n -1] # az indexek szmozsa nullval kezddik

# teszt :
print honapNev(4)

7.14gyakorlat:
def volBox(x1 =10, x2 =10, x3 =10):
"Egy parallelepipedon trfogata"
return x1 * x2 * x3

# teszt :
print volBox()
print volBox(5.2)
print volBox(5.2, 3)

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 318.
7.15gyakorlat:
def volBox(x1 =-1, x2 =-1, x3 =-1):
"Egy parallelepipedon trfogata"
if x1 == -1 :
return x1 # nem adtunk meg argumentumot
elif x2 == -1 :
return x1**3 # egy argumentum -> kocka
elif x3 == -1 :
return x1*x1*x2 # kt argumentum -> prizmatikus test
else :
return x1*x2*x3

# teszt :
print volBox()
print volBox(5.2)
print volBox(5.2, 3)
print volBox(5.2, 3, 7.4)

7.16gyakorlat:
def changeChar(ch, ca1, ca2, eleje =0, vege =-1):
"A ch karakterlncban kicserli az sszes ca1 karaktert a ca2 karakterre"
if vege == -1:
vege = len(ch)
nch, i = "", 0 # nch : a ltrehozand j karakterlnc
while i < len(ch) :
if i >= eleje and i <= vege and ch[i] == ca1:
nch = nch + ca2
else :
nch = nch + ch[i]
i = i + 1
return nch

# teszt :
print changeChar("Ceci est une toute petite phrase", " ", "*")
print changeChar("Ceci est une toute petite phrase", " ", "*", 8, 12)
print changeChar("Ceci est une toute petite phrase", " ", "*", 12)

7.17gyakorlat:
def eleMax(lst, eleje =0, vege =-1):
"Az lst legnagyobb elemt adja meg"
if vege == -1:
vege = len(lst)
max, i = 0, 0
while i < len(lst):
if i >= eleje and i <= vege and lst[i] > max:
max = lst[i]
i = i + 1
return max

# teszt :
serie = [9, 3, 6, 1, 7, 5, 4, 8, 2]
print eleMax(serie)
print eleMax(serie, 2)
print eleMax(serie, 2, 5)

319. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.7gyakorlat:
# Olimpiai karikk - tmr vltozat.

from Tkinter import *

# Az 5 karika X,Y koordinti :


coord = [[20,30], [120,30], [220, 30], [70,80], [170,80]]
# Az 5 karika sznei :
colour = ["red", "yellow", "blue", "green", "black"]

base = Tk()
can = Canvas(base, width =335, height =200, bg ="white")
can.pack()
bou = Button(base, text ="Kilp", command =base.quit)
bou.pack(side = RIGHT)
# Az 5 karika rajza :
i = 0
while i < 5:
x1, y1 = coord[i][0], coord[i][1]
can.create_oval(x1, y1, x1+100, y1 +100, width =2, outline =colour[i])
i = i +1
base.mainloop()

Vltozat:
# Olimpiai karikk - minden karikt kln rajzol vltozat.

from Tkinter import *

# Fggvnyek az 5 karika rajzolshoz :

def drawCircle(i):
x1, y1 = coord[i][0], coord[i][1]
can.create_oval(x1, y1, x1+100, y1 +100, width =2, outline =colour[i])

def a1():
drawCircle(0)

def a2():
drawCircle(1)

def a3():
drawCircle(2)

def a4():
drawCircle(3)

def a5():
drawCircle(4)

##### Fprogram : ##########

# Az 5 karika X,Y koordinti :


coord = [[20,30], [120,30], [220, 30], [70,80], [170,80]]
# az 5 karika sznei :
colour = ["red", "yellow", "blue", "green", "black"]

base = Tk()
can = Canvas(base, width =335, height =200, bg ="white")
can.pack()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 320.
but = Button(base, text ="Kilp", command =base.quit)
but.pack(side = RIGHT)

# Az 5 gomb ltrehozsa :
Button(base, text='1', command = a1).pack(side =LEFT)
Button(base, text='2', command = a2).pack(side =LEFT)
Button(base, text='3', command = a3).pack(side =LEFT)
Button(base, text='4', command = a4).pack(side =LEFT)
Button(base, text='5', command = a5).pack(side =LEFT)
base.mainloop()

321. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.9s8.10gyakorlat:
# Dmatbla vletlenszer en elhelyezett korongokkal

from Tkinter import *


from random import randrange # vletlenszm genertor

def dama_tabla():
"10 ngyzetb l ll sor rajzolsa vltakoz eltoldssal"
y = 0
while y < 10:
if y % 2 == 0: # kt alkalombl egyszer
x = 0 # a ngyzetekb l ll sor
else: # egy ngyzetnyi
x = 1 # eltoldssal fog kezd dni
line_of_squares(x*c, y*c)
y += 1

def line_of_squares(x, y):


"x, y -bl kiindulva ngyzetekb l ll vonal rajzolsa"
i = 0
while i < 10:
can.create_rectangle(x, y, x+c, y+c, fill='navy')
i += 1
x += c*2 # ngyzetes kzk hagysa

def circle(x, y, r, colour):


"x,y kzppont s r sugar kr rajzolsa"
can.create_oval(x-r, y-r, x+r, y+r, fill=colour)

def korong_hozzaadasa():
"korong vletlenszer rajzolsa a dmatblra"
# a korong coordintinak sorsolsa :
x = c/2 + randrange(10) * c
y = c/2 + randrange(10) * c
circle(x, y, c/3, 'red')

##### F program : ############

# Prblja meg jl "paramterezni" a programjait, ahogyan ebben a scriptben


tettk.
# A script tetsz leges mret dmatblkat rajzolhat egyetlen rtk,
# a ngyzet mretnek megvltoztatsval :

c = 30 # ngyzetek mrete

ablak = Tk()
can = Canvas(ablak, width =c*10, height =c*10, bg ='ivory')
can.pack(side =TOP, padx =5, pady =5)
b1 = Button(ablak, text ='dmatbla', command =dama_tabla)
b1.pack(side =LEFT, padx =3, pady =3)
b2 = Button(ablak, text ='korongok', command =korong_hozzaadasa)
b2.pack(side =RIGHT, padx =3, pady =3)
ablak.mainloop()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 322.
8.12gyakorlat:
# Gravitci szimullsa

from Tkinter import *


from math import sqrt

def distance(x1, y1, x2, y2):


"az x1,y1 s x2,y2 pontokat elvlaszt tvolsg"
d = sqrt((x2-x1)**2 + (y2-y1)**2) # Pythagoras ttele
return d

def forceG(m1, m2, di):


"egymstl di tvolsgra lv m1 et m2 tmeg tmegpontok kztti
gravitcis er"
return m1*m2*6.67e-11/di**2 # Newton-trvny

def mozdul(n, gd, hb):


"az n csillag elmozdulsa, balrl jobbra vagy fentrl lefel"
global x, y, step
# j koorddintk :
x[n], y[n] = x[n] +gd, y[n] +hb
# a rajz elmozdulsa a vsznon :
can.coords(astre[n], x[n]-10, y[n]-10, x[n]+10, y[n]+10)
# az j tvolsg szmolsa :
di = distance(x[0], y[0], x[1], y[1])
# a "kpernytvolsg" konverzija "asztronmiai tvolsgg" :
diA = di*1e9 # (1 pixel => 1 milli km)
# a megfelel gravitcis er szmolsa :
f = forceG(m1, m2, diA)
# az j tvolsg- s errtkek szmolsa :
valDis.configure(text="Tvolsg = " +str(diA) +" m")
valFor.configure(text="Er = " +str(f) +" N")
# a "lps" adaptlsa a tvolsg fggvnyben :
step = di/10

def balra1():
mozdul(0, -step, 0)

def jobbra1():
mozdul(0, step, 0)

def fel1():
mozdul(0, 0, -step)

def le1():
mozdul(0, 0, step)

def balra2():
mozdul(1, -step, 0)

def jobbra2():
mozdul (1, step, 0)

def fel2():
mozdul(1, 0, -step)

def le2():
mozdul(1, 0, step)

# A csillagok tmege :
m1 = 6e24 # (a Fld tmege, kg-ban)

323. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
m2 = 6e24 #
astre = [0]*2 # lista a rajzok hivatkozsainak trolsra
x =[50., 350.] # a csillagok X (kperny)koordintinak listja
y =[100., 100.] # a csillagok Y (kperny)koordintinak listja
step =10 # egy elmozduls "lps"

# Ablak ltrehozsa :
ablak = Tk()
ablak.title(' Newton-fle gravitcis trvny')
# Cmkk :
valM1 = Label(ablak, text="M1 = " +str(m1) +" kg")
valM1.grid(row =1, column =0)
valM2 = Label(ablak, text="M2 = " +str(m2) +" kg")
valM2.grid(row =1, column =1)
valDis = Label(ablak, text="Distance")
valDis.grid(row =3, column =0)
valFor = Label(ablak, text="Force")
valFor.grid(row =3, column =1)
# Vszon 2 csillag rajzval:
can = Canvas(ablak, bg ="light yellow", width =400, height =200)
can.grid(row =2, column =0, columnspan =2)
astre[0] = can.create_oval(x[0]-10, y[0]-10, x[0]+10, y[0]+10,
fill ="red", width =1)
astre[1] = can.create_oval(x[1]-10, y[1]-10, x[1]+10, y[1]+10,
fill ="blue", width =1)
# 4 gombbl ll 2 gombcsoport, mindegyikk egy keretbe (frame) van tve :
fra1 = Frame(ablak)
fra1.grid(row =4, column =0, sticky =W, padx =10)
Button(fra1, text="<-", fg ='red',command =balra1).pack(side =LEFT)
Button(fra1, text="->", fg ='red', command =jobbra1).pack(side =LEFT)
Button(fra1, text="^", fg ='red', command =fel1).pack(side =LEFT)
Button(fra1, text="v", fg ='red', command =le1).pack(side =LEFT)
fra2 = Frame(ablak)
fra2.grid(row =4, column =1, sticky =E, padx =10)
Button(fra2, text="<-", fg ='blue', command =balra2).pack(side =LEFT)
Button(fra2, text="->", fg ='blue', command =jobbra2).pack(side =LEFT)
Button(fra2, text="^", fg ='blue', command =fel2).pack(side =LEFT)
Button(fra2, text="v", fg ='blue', command =le2).pack(side =LEFT)

ablak.mainloop()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 324.
8.16gyakorlat:
# Fahrenheit <=> Celsius talakts

from Tkinter import *

def convFar(event):
"a hmrsklet rtke Fahrenheit fokban kifejezve"
tF = eval(mezoTC.get())
varTF.set(str(tF*1.8 +32))

def convCel(event):
"a hmrsklet rtke Celsius fokban kifejezve"
tC = eval(mezoTF.get())
varTC.set(str((tC-32)/1.8))

ablak = Tk()
ablak.title('Fahrenheit/Celsius')

Label(ablak, text='Temp. Celsius :').grid(row =0, column =0)


# Adatbeviteli mezhz asszocilt "Tkinter vltoz". Ez az "objektum-vltoz"
# biztostja az interface-t a TCL s a Python kztt (ld. jegyzet, 165.
oldal) :
varTC =StringVar()
mezoTC = Entry(ablak, textvariable =varTC)
mezoTC.bind("<Return>", convFar)
mezoTC.grid(row =0, column =1)
# A Tkinter vltoz tartalmnak inicializlsa :
varTC.set("100.0")

Label(ablak, text='Temp. Fahrenheit :').grid(row =1, column =0)


varTF =StringVar()
mezoTF = Entry(ablak, textvariable =varTF)
mezoTF.bind("<Return>", convCel)
mezoTF.grid(row =1, column =1)
varTF.set("212.0")

ablak.mainloop()

8.18s8.20gyakorlat:
# Krk s Lissajous-grbk

from Tkinter import *


from math import sin, cos

def move():
global ang, x, y
# az elz koordintkat troljuk az jak szmolsa eltt :
xp, yp = x, y
# elforgats 0.1 radinnal :
ang = ang +.1

# a szg sinus-a s cosinus-a => trigon. kr egy pontjnak koordinti.

325. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
x, y = sin(ang), cos(ang)
# A Lissajous grbt f1/f2 = 2/3 -vel definil vltozat:
# x, y = sin(2*ang), cos(3*ang)
# sklzs (120 = kr sugara, (150,150) = vszon kzepe
x, y = x*120 + 150, y*120 + 150
can.coords(labda, x-10, y-10, x+10, y+10)
# can.create_line(xp, yp, x, y, fill ="blue") # plyarajzols
ang, x, y = 0., 150., 270.
ablak = Tk()
ablak.title('Lissajous-grbk')
can = Canvas(ablak, width =300, height=300, bg="white")
can.pack()
labda = can.create_oval(x-10, y-10, x+10, y+10, fill='red')
Button(ablak, text='Go', command =move).pack()

ablak.mainloop()

8.27gyakorlat:
# Ess s visszapattans

from Tkinter import *

def move():
global x, y, v, dx, dv, flag
xp, yp = x, y # az elz koordintk trolsa
# vzszintes elmozduls :
if x > 385 or x < 15 : # visszapattans az oldalfalrl :
dx = -dx # invertljuk az elmozdulst
x = x + dx
# a fggleges sebessg varicija (mindig lefel):
v = v + dv
# fggleges elmozduls (arnyos a sebessggel)
y = y + v
if y > 240: # a fld szintje 240 pixelre :
y = 240 # nem mehet tovbb !
v = -v # visszapattan : a sebessg megfordul

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 326.
# jra pozcionljuk a labdt :
can.coords(labda, x-10, y-10, x+10, y+10)
# plyavget rajzolunk :
can.create_line(xp, yp, x, y, fill ='light grey')
# ... addig csinljuk, amg szksges :
if flag > 0:
ablak.after(50,move)

def start():
global flag
flag = flag +1
if flag == 1:
move()

def stop():
global flag
flag =0

# a koordintk, a sebessgek s az animciflag inicializlsa :


x, y, v, dx, dv, flag = 15, 15, 0, 6, 5, 0

ablak = Tk()
ablak.title(' Ess s visszapattans')
can = Canvas(ablak, width =400, height=250, bg="white")
can.pack()
labda = can.create_oval(x-10, y-10, x+10, y+10, fill='red')
Button(ablak, text='Start', command =start).pack(side =LEFT, padx =10)
Button(ablak, text='Stop', command =stop).pack(side =LEFT)
Button(ablak, text='Kilp', command =ablak.quit).pack(side =RIGHT, padx =10)

ablak.mainloop()

327. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.1gyakorlat(egyszereditor,'textfile'bairshozolvasshoz):
# Egyszer szvegszerkeszt

def sansDC(ch):
"a ch karakterlncot adja vissza az utols karaktere nlkl"
uj = ""
i, j = 0, len(ch) -1
while i < j:
uj = uj + ch[i]
i = i + 1
return uj

def fileba_ir():
of = open(nameF, 'a')
while 1:
line = raw_input("Irjon be egy szovegsort (vagy <Enter>) : ")
if line == '':
break
else:
of.write(line + '\n')
of.close()

def filebol_olvas():
of = open(nameF, 'r')
while 1:
line = of.readline()
if line == "":
break
# kirats az utols karakter figyelmen kvl hagysval (= sorvge) :
print sansDC(line)
of.close()

nameF = raw_input('A kezelendo file neve : ')


choice = raw_input('Irjon be "i" -t irashoz, "o" -t olvasashoz : ')

if choice =='i':
fileba_ir()
else:
filebol_olvas()

9.3gyakorlat(230szorztblagenerlsa):
def tableMulti(n):
# n-es szorztblt generl fggvny n (20 tag)
# a tblt egy karakterlnc formjban adja vissza :
i, ch = 0, ""
while i < 20:
i = i + 1
ch = ch + str(i * n) + " "
return ch

NomF = raw_input("A letrehozando file neve : ")


file = open(NomF, 'w')

# A ltrehozand tblk 2 -tl 30 -ig :


table = 2
while table < 31:
file.write(tableMulti(table) + '\n')
table = table + 1
file.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 328.
9.4gyakorlat:
# Ez a script azt is bemutatja, hogyan vltoztatjuk meg egy file tartalmt
# gy, hogy elszr tvisszk az egszet egy listba, majd
# a listt a mdosts utn kirjuk a file-ba

def triplerEspaces(ch):
"a fv. meghromszorozza a szavak kztti tvolsgot a ch stringben"
i, uj = 0, ""
while i < len(ch):
if ch[i] == " ":
uj = uj + " "
else:
uj = uj + ch[i]
i = i +1
return uj

nameF = raw_input("File neve : ")


file = open(nameF, 'r+') # 'r+' = mode read/write
lines = file.readlines() # az sszes sort elolvassa

n=0
while n < len(lines):
lines[n] = triplerEspaces(lines[n])
n =n+1

file.seek(0) # visszatrs a file elejre


file.writelines(lines) # jra kirjafile.close()

9.5gyakorlat:
# A kezelt file egy szvegfile, aminek minden sora egy vals szmot tartalmaz
# (exponens nlkl s karakterlnc formjban kdolva)

def kerErtek(ch):
"a ch stringben megadott szam lekerekitett reprezentcija"
f = float(ch) # string konverzija vals szmm
e = int(f + .5) # talakts egssz (Elszr 0.5-t hozzadunk
# a vals szmhoz, hogy korrekten kerektsnk)
return str(e) # visszaalakts stringg

fiSource = raw_input("A kezelendo file neve : ")


fiDest = raw_input("A celfile neve : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')

while 1:
line = fs.readline() # a file egy sornak olvassa
if line == "" or line == "\n":
break
line = kerErtek(line)
fd.write(line +"\n")

fd.close()
fs.close()

329. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.6gyakorlat:
# Kt file karakterenknti sszehasonltsa :

fich1 = raw_input("Az 1. file neve : ")


fich2 = raw_input("A 2. file neve : ")
fi1 = open(fich1, 'r')
fi2 = open(fich2, 'r')

c, f = 0, 0 # karakterszmll s flag
while 1:
c = c + 1
car1 = fi1.read(1) # 1 karakter beolvassa
car2 = fi2.read(1) # mindegyik file-bl
if car1 =="" or car2 =="":
break
if car1 != car2 :
f = 1
break # eltrst tallt

fi1.close()
fi2.close()

print "Ez a kt file",


if f ==1:
print "eltr a ", c, "karaktertl"
else:
print "azonos."

9.7gyakorlat:
# Kt szvegfile kombinlsa egy j szvegfile-l

fichA = raw_input("Az 1. file neve : ")


fichB = raw_input("A 2. file neve : ")
fichC = raw_input("A clfile neve : ")
fiA = open(fichA, 'r')
fiB = open(fichB, 'r')
fiC = open(fichC, 'w')

while 1:
lineA = fiA.readline()
lineB = fiB.readline()
if lineA =="" and lineB =="":
break # Elrtk a kt file vgt
if lineA != "":
fiC.write(lineA)
if lineB != "":
fiC.write(lineB)

fiA.close()
fiB.close()
fiC.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 330.
9.8gyakorlat:
# Klubtagok adatainak mentse

def kodolas():
"a bert adatok listjt, vagy egy res listt ad vissza"
print "*** rja be az adatokat (vagy <Enter> a befejezshez) :"
while 1:
csaladNev = raw_input("Csaladnev : ")
if csaladNev == "":
return []
utoNev = raw_input("Utonev : ")
utcaSzam = raw_input("Cm (utca s hazszam) : ")
irSzam = raw_input("Iranyitoszam : ")
helyseg = raw_input("Helysegnev : ")
tel = raw_input("Telefonszam : ")
print csaladNev, utoNev, utcaSzam, irSzam, helyseg, tel
ver = raw_input("<Enter> ha korrekt, <n> ha nem ")
if ver == "":
break
return [csaladNev, utoNev, utcaSzam, irSzam, helyseg, tel]

def fileba_iras(lista):
"a lista adatainak kirsa <#>-nel elvlasztva a listaelemeket"
i = 0
while i < len(lista):
of.write(lista[i] + "#")
i = i + 1
of.write("\n") # sorvge karakter

nameF = raw_input('Clfile neve : ')


of = open(nameF, 'a')
while 1:
tt = kodolas()
if tt == []:
break
fileba_iras(tt)

of.close()

331. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
9.9gyakorlat:
# A klub file-jnak kiegsztse informcival

def forditas(ch):
"a forrsfile egy sornak talaktsa adatlistv"
dn = "" # ideiglenes string az adatok kiszedshez
tt = [] # a ltrehozand lista
i = 0
while i < len(ch):
if ch[i] == "#":
tt.append(dn) # hozzadjuk az adatot a listhoz s
dn ="" # reinicializljuk az ideiglenes stringet
else:
dn = dn + ch[i]
i = i + 1
return tt

def kodolas(tt):
"a tt listt adja vissza, kiegsztve a szletsi dtummal s a nemmel"
print "*** rja be az adatokat (vagy <Enter> a befejezshez) :"
# A listban mr meglv adatok kiratsa :
i = 0
while i < len(tt):
print tt[i],
i = i +1
print
while 1:
daNai = raw_input("Szletsi dtum : ")
sexe = raw_input("Nem (f vagy n) : ")
print daNai, sexe
ver = raw_input("<Enter> ha korrekt, <n> ha nem ")
if ver == "":
break
tt.append(daNai)
tt.append(sexe)
return tt

def fileba_iras(tt):
"a tt lista adatainak kirsa <#>-nel elvlasztva a listaelemeket"
i = 0
while i < len(tt):
fd.write(tt[i] + "#")
i = i + 1
fd.write("\n") # sorvge karakter

fSource = raw_input('Forrasfile neve : ')


fDest = raw_input('Celfile neve : ')
fs = open(fSource, 'r')
fd = open(fDest, 'w')
while 1:
line = fs.readline() # a forrsfile egy sort elolvassuk
if line =="" or line =="\n":
break
lista = forditas(line) # talaktjuk egy listv
lista = kodolas(lista) # kiegszt adatokat fznk hozz
fileba_iras(lista) # elmentjk a clfile-ba.

fd.close()
fs.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 332.
9.10gyakorlat:
# Megadott sor keresse egy szvegfile-ban :

def searchCP(ch):
"ch -ban keresi a postai irnyt szmot (CP) tartalmaz stringrszt"
i, f, ns = 0, 0, 0 # ns szmllja a # kdokat
cc = "" # a ltrehozand string
while i < len(ch):
if ch[i] =="#":
ns = ns +1
if ns ==3: # az irnytszm a 3. # utn tallhat
f = 1 # flag
elif ns ==4: # nincs rtelme a 4. # kd utn olvasni
break
elif f ==1: # az olvasott karakter rszt kpezi
cc = cc + ch[i] # a keresett CP -nek -> elmentjk
i = i +1
return cc

nevF = raw_input("A kezelendo file neve : ")


codeP = raw_input("A keresendo iranyitoszam : ")
fi = open(nevF, 'r')
while 1:
line = fi.readline()
if line =="":
break
if searchCP(line) == codeP:
print line
fi.close()

10.2gyakorlat(stringrszekredarabolsa):
def darabol(ch, n):
"egy ch string n karakterbl ll rszekre darabolsa"
d, f = 0, n # a rszstring elejnek s vgnek indexe
tt = [] # a ltrehozand string
while d < len(ch):
if f > len(ch): # a vgn tl nem tudunk darabolni
f = len(ch)
fr = ch[d:f] # egy fragmentum kivgsa
tt.append(fr) # a fragmentum hozzadsa a listhoz
d, f = f, f +n # a kvetkez indexek
return tt

def invertal(tt):
"a tt lista elemeit fordtott sorrendben lltja ssze"
ch = "" # a ltrehozand string
i = len(tt) # a lista vgvel kezdjk
while i > 0 :
i = i - 1 # az utols elem indexe n -1
ch = ch + tt[i]
return ch

# Teszt :
if __name__ == '__main__':
ch ="abcdefghijklmnopqrstuvwxyz123456789"
lista = darabol(ch, 5)
print lista
print invertal(lista)

333. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.3gyakorlat:
# Adott karakter indexnek megkeresse egy stringben

def keres(ch, car, deb=0):


"megkeresi a car karakter indext a ch karakterlncban"
i = deb
while i < len(ch):
if ch[i] == car:
return i # megtallta a karaktert -> vge
i = i + 1
return -1 # az egsz karakterlncot vgignzte, nincs
eredmnyz

# Teszt :
if __name__ == '__main__':
print keres("Coucou c'est moi", "z")
print keres("Juliette & Romo", "&")
print keres("Csar & Cloptre", "r", 5)

10.6gyakorlat:
prefixes, suffixe = "JKLMNOP", "ack"

for p in prefixes:
print p + suffixe

10.7gyakorlat:
def szoSzamlalo(ch):
"megszmolja a szavakat a ch karakterlncban"
if len(ch) ==0:
return 0
nm = 1 # a karakterlnc legalbb egy szt tartalmaz
for c in ch:
if c == " ": # elg a betkzket megszmolni
nm = nm + 1
return nm

# Teszt :
if __name__ == '__main__':
print szoSzamlalo("Les petits ruisseaux font les grandes rivires")

10.8gyakorlat:
def nagybetu(car):
"<igaz> a visszatrsi rtke, ha a car nagybet"
if car in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
return 1
else:
return 0

# Teszt :
if __name__ == '__main__':
print nagybetu('d'), nagybetu('F')

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 334.
10.10gyakorlat:
def szoLista(ch):
"a ch karakterlncot talaktja szavakbl ll listv"
lista, ct = [], "" # ct tmeneti string
for c in ch:
if c == " ":
lista.append(ct) # a listhoz adjuk a ch tmeneti stringet
ct = "" # a ch tmeneti string reinicializlsa
else:
ct = ct + c
if ct != "":
lista.append(ct) # ne felejtsk ki az utols szt
return lista

# Teszt :
if __name__ == '__main__':
print szoLista("Une hirondelle ne fait pas le printemps")
print szoLista("")

10.11gyakorlat(azelzgyakorlatokbandefinilt2fggvnythasznl):
from exercice_10_08 import nagybetu
from exercice_10_10 import szoLista

txt = "Le nom de ce Monsieur est Alphonse"


lst = szoLista(txt) # a mondatot talaktja szavak listjv
for szo in lst: # a listban minden egyes szt megvizsgl
if nagybetu(szo[0]): # megvizsglja a sz els karaktert
print szo

10.12gyakorlat:
# karakterlncokra vonatkoz fggvnyek modulja

def nagybetu(car):
"visszatrsi rtke <igaz> ha a car nagybetu"
if car >= "A" and car <= "Z":
return 1
else:
return 0

def kisbetu(car):
"visszatrsi rtke <igaz> ha a car kisbetu"
if car >= "a" and car <= "z":
return 1
else:
return 0

def alphab(car):
"visszatrsi rtke <igaz> ha a car az abc egy betje"
if nagybetu(car) or kisbetu(car):
return 1
else:
return 0

# Teszt :
if __name__ == '__main__':
print nagybetu('d'), nagybetu('F')
print kisbetu('d'), kisbetu('F')
print alphab('q'), alphab('P'), alphab('5')

335. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.15gyakorlat(azelzgyakorlatokbandefinilt2fggvnythasznl):
from exercice_10_12 import nagybetu
from exercice_10_10 import szoLista

def nagybetuSzamlalo(ch):
"a ch stringben nagybetvel kezdd szavakat szmolja meg"
c = 0
lst = szoLista(ch) # mondat talaktsa szavak listjv
for szo in lst: # a lista mindegyik szavt elemzi
if nagybetu(szo[0]): # a sz els betjt ellenrzi
c = c +1
return c

# Teszt :
if __name__ == '__main__':
phrase = "Les filles Tidgout se nomment Justine et Corinne"
print "Ez a mondat", nagybetuSzamlalo(phrase), "nagybetvel kezdd szt
tartalmaz."

10.16gyakorlat(ASCIIkdoktblzata):
# ASCII kdtbzat

c = 32 # Els <nyomtathat> ASCII

while c < 128 : # csak az kezet nlkli karakterek


print "Kd", c, ":", chr(c), " "
c = c + 1

10.18gyakorlat(nagybet>skisbet>nagybettalakts):
def csereKisNagy(ch):
"a ch karakterlncban felcserli egymssal a kis- s a nagybetket"
ujC = "" # a ltrehozand karakterlnc
for car in ch:
code = ord(car)
if car >= "A" and car <= "Z":
code = code + 32
elif car >= "a" and car <= "z":
code = code - 32
ujC = ujC + chr(code)
return ujC

# Teszt :
if __name__ == '__main__':
print csereKisNagy("Ferdinand-Charles de CAMARET")

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 336.
10.20gyakorlat(Magnhangzszmols):
def mh(car):
"ellenrzi, hogy car magnhangz e"
if car in "AEIOUYaeiouy":
return 1
else:
return 0

def szamlaloMh(ch):
"megszmolja a magnhangzkat a ch karakterlncban"
n = 0
for c in ch:
if mh(c):
n = n + 1
return n

# Test :
if __name__ == '__main__':
print szamlaloMh("Monty Python Flying Circus")

10.22gyakorlat:

# Szavak szmllsa egy szvegben

fiSource = raw_input("A file neve : ")


fs = open(fiSource, 'r')

n = 0 # szmll
while 1:
ch = fs.readline()
if ch == "":
break
# a beolvasott karakterlnc talaktsa szavak listjv :
li = ch.split()
# a szavak sszegzse :
n = n + len(li)
fs.close()
print "Ez a szvegfile sszesen %s szt tartalmaz" % (n)

337. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.23gyakorlat:
# Mindegyik sor els karaktert nagybetv alaktja

fiSource = raw_input("A kezelendo file neve : ")


fiDest = raw_input("A celfile neve : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')

while 1:
ch = fs.readline()
if ch == "":
break
if ch[0] >= "A" and ch[0] <= "Z":
# az els karakter nagybet. Nem csinlunk semmit sem.
pass
else:
# A karakterlnc visszalltsa:
pc = ch[0].upper() # Az els talaktott karakter
rc = ch[1:] # a karakterlnc tbbi rsze
ch = pc + rc # egyests
# egy beptett metdust alkalmaz vltozat :
# ch = ch.capitalize()
# trs :
fd.write(ch)

fd.close()
fs.close()

10.24gyakorlat:
# Sorok egyestse mondatokk

fiSource = raw_input("A kezelendo file neve : ")


fiDest = raw_input("A celfile neve : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')

# Elszr az els sort olvassuk el :


ch1 = fs.readline()
# utna a kvetkez sorokat olvassuk el s egyestjk ket, ha szksges :
while 1:
ch2 = fs.readline()
if ch2 == "":
break
# Ha a beolvasott string nagybetvel kezddik, akkor az elzt trjuk a
# clfileba, s azzal a karakterlnccal helyettestjk, amit beolvastunk :
if ch2[0] >= "A" and ch2[0] <= "Z":
fd.write(ch1)
ch1 = ch2
# ha nem, az elzvel egyestjk :
else:
ch1 = ch1[:-1] + " " + ch2
# (gyeljnk r, hogy tvoltsuk el ch1 -rl a sorvge karaktert)

fd.write(ch1) # ne felejtsk el trni az utolst !


fd.close()
fs.close()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 338.
10.25gyakorlat(gmbjellemzi):
# A kiindulsi file egy <szvegfile>, aminek minden sora egy vals szmot
tartalmaz
# (string formban van kdolva)

from math import pi

def caractSphere(d):
"megadja egy d tmrj gmb jellemzit"
d = float(d) # az argumentum (=string) talaktsa vals szmm
r = d/2 # sugr
ss = pi*r**2 # fkr terlete
se = 4*pi*r**2 # felszn
v = 4./3*pi*r**3 # trfogat (! az els osztsnak valsnak kell lenni !)
# A lentebb alkalmazott %8.2f konverzis marker hatsra a kirt szm
# sszesen 8 helyirtket foglal el; gy van kerektve, hogy
# a tizedes pont utn kt helyirtk van :
ch = "Diam. %6.2f cm Section = %8.2f cm " % (d, ss)
ch = ch +"Surf. = %8.2f cm. Vol. = %9.2f cm" % (se, v)
return ch

fiSource = raw_input("A kezelendo file neve : ")


fiDest = raw_input("A celfile neve : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
while 1:
diam = fs.readline()
if diam == "" or diam == "\n":
break
fd.write(caractSphere(diam) + "\n") # kirs fileba
fd.close()
fs.close()

10.26gyakorlat:
# Numerikus adatok formzsa
# Egy szvegfile-t kezelnk, aminek minden sora egy vals szmot tartalmaz
# (exponens nlkli s string formban van kdolva)

def kerekit(real):
".0 -ra vagy .5 -re kerektett egsz szm reprezentcija"
ent = int(real) # a szm egszrsze
fra = real - ent # trtrsz
if fra < .25 :
fra = 0
elif fra < .75 :
fra = .5
else:
fra = 1
return ent + fra

fiSource = raw_input("A kezelendo file neve : ")


fiDest = raw_input("A celfile neve : ")
fs = open(fiSource, 'r')
fd = open(fiDest, 'w')
while 1:
line = fs.readline()
if line == "" or line == "\n":
break
n = kerekit(float(line)) # talakts <float> -t, majd kerekts

339. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
fd.write(str(n) + "\n") # kirs fileba
fd.close()
fs.close()

10.29gyakorlat:
# Szorztblk kiratsa

nt = [2, 3, 5, 7, 9, 11, 13, 17, 19]

def tableMulti(m, n):


"az m-es szorztbla n tagjt adja vissza"
ch =""
for i in range(n):
v = m * (i+1) # az egyik tag kiszmolsa
ch = ch + "%4d" % (v) # formzs 4 karakterre
return ch

for a in nt:
print tableMulti(a, 15) # csak az els 15 tagot

10.30gyakorlat(listabejrsa):
lst = ['Jean-Michel', 'Marc', 'Vanessa', 'Anne',
'Maximilien', 'Alexandre-Beno', 'Louise']

for e in lst:
print "%s : %s karakter" % (e, len(e))

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 340.
10.31gyakorlat:
# Az azonos adatok kikszblse

lst = [9, 12, 40, 5, 12, 3, 27, 5, 9, 3, 8, 22, 40, 3, 2, 4, 6, 25]


lst2 = []

for el in lst:
if el not in lst2:
lst2.append(el)

lst2.sort()
print lst2

10.33gyakorlat(azvsszesnapjnakkiratsa):
## Ez a vltozat egymsba gyazott listkat alkalmaz ##
## (amit knnyen helyettesthetnnk kt klnbz listval)

# Az albbi lista kt elemet tartalmaz, amik maguk is listk.


# a 0. elem a hnapok napjainak szmt tartalmazza, mg
# az 1. elem a 12 hnap nevt tartalmazza :
honap = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
['Janur', 'Februr', 'Mrcius', 'prilis', 'Mjus',
'Jnius', 'Jlius', 'Augusztus', 'Szeptember', 'Oktber',
'November', 'December']]

nap = ['Vasrnap','Htf','Kedd','Szerda','Cstrtk','Pntek','Szombat']

evn, hon, hen, m = 0, 0, 0, 0

while evn <365:


evn, hon = evn +1, hon +1 # en = az v napja, hon = a hnap napja
hen = (evn +3) % 7 # hen js = a ht napja + offset
# a kezdnap kivlasztst teszi lehetv

if hon > honap[0][m]: # a 0. lista m-edik eleme


hon, m = 1, m+1

print honap[1][m], hon, nap[hen] # az 1. lista m-edik eleme

341. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.40gyakorlat:
# Erasztotenszi szita az 1 s 999 kz es prmszmok megkeresshez

# Egy 1-esekbl ll 1000 elem lista ltrehozsa (az indexei 0-tl 999-ig
mennek) :
lst = [1]*1000
# A lista bejrsa a 2 indexrtktl kezdve:
for i in range(2,1000):
# a listnak azokat az elemeit, melyek indexe
# az i-nek tbbszrsei nullv tesszk :
for j in range(i*2, 1000, i):
lst[j] = 0

# Kiratjuk azoknak az elemeknek az indext, melyek rtke 1 maradt


# (a 0 elemet nem vesszk figyelembe) :
for i in range(1,1000):
if lst[i]:
print i,

10.43gyakorlat(Vletlenszmgenertortesztje):
# A vletlenszm genertor tesztelse

from random import random # 0 s 1 kz es vals vletlenszmot sorsol

n = raw_input("Hany veletlenszamot sorsoljon (default = 1000) : ")


if n == "":
nVal =1000
else:
nVal = int(n)

n = raw_input("A reszintervallumok szama 0-1 -ben (2 es "


+ str(nVal/10) + " kztt, default =5) : ")
if n == "":
nFra =5
else:
nFra = int(n)

if nFra < 2:
nFra =2
elif nFra > nVal/10:
nFra = nVal/10

print nVal, "hzs rtkeinek megoszlsa ..."


listVal = [0]*nVal # nullkbl ll listt hoz ltre
for i in range(nVal): # majd mindegyik elemet mdostja
listVal[i] = random()

print "Megszmolja az rtkeket a(z)", nFra, "rszinterv. mindegyikben ..."


listCompt = [0]*nFra # ltrehozza a szmllk listjt
# az rtkek listjnak bejrsa :
for valeur in listVal:
# megkeresi az rtket tartalmaz rszintervallum indext :
index = int(valeur*nFra)
# incrementlja a megfelel szmllt :
listCompt[index] = listCompt[index] +1

# kiratja a szmllk llapott :


for compt in listCompt:
print compt,

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 342.
10.44gyakorlat:krtyahzs
# Krtyahzs
from random import randrange

colours = ['Pique', 'Trefle', 'Carreau', 'Coeur']


values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'junga', 'dma', 'kirly', 'sz']

# Az 52 krtya listjnak a ltrehozsa :


card =[]
for coul in colours:
for val in values:
card.append("%s %s" % (coul, str(val)))

# Vetlenszer? hz :
while 1:
k = raw_input("<c> krtyt hz, <Enter> vge")
if k =="":
break
r = randrange(52)
print card[r]

10.45gyakorlat:Sztrltrehozsasmegtekintse
def megnez():
while 1:
nev = raw_input("Irjon be egy nevet (vagy <enter> a befejezeshez) : ")
if nev == "":
break
if dico.has_key(nev): # a nv a listban van ? ?
item = dico[nev] # megnzzk
eletkor, magassag = item[0], item[1]
print "Nev : %s - eves : %s ans - magassag : %s m."\
% (nev, eletkor, magassag)
else:
print "*** ismeretlen nev ! ***"

def kitolt():
while 1:
nev = raw_input("Irjon be egy nevet (vagy <enter> a befejezshez) : ")
if nev == "":
break
eletkor = int(raw_input("Irja be az eletkort (egeszszam !) : "))
magassag = float(raw_input("Irja be a magassagot (meterben) : "))
dico[nev] = (eletkor, magassag)

dico ={}
while 1:
choice = raw_input("Valasszon : (K)itolt - (M)egnez - (V)ege : ")
if choice.upper() == 'V':
break
elif choice.upper() == 'K':
kitolt()
elif choice.upper() == 'M':
megnez()

343. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.46gyakorlat:akulcsoksrtkekfelcserlseegysztrban
# A kulcsok s rtkek felcserlse egy sztrban

def inverse(dico):
"egy j sztr ltrehozsa lpsr l lpsre"
dic_inv ={}
for key in dico:
item = dico[key]
dic_inv[item] = key

return dic_inv

# programteszt :

dico = {'Computer':'Szamitogep',
'Mouse':'Eger',
'Keyboard':'Billentyuzet',
'Hard disk':'Merev lemez',
'Screen':'Kepernyo'}

print dico
print inverse(dico)

10.47gyakorlat:hisztogram
# Egy szvegben elfordul betk elfordulsi gyakorisgnak hisztogramja

nFile = raw_input('Filenev : ')


fi = open(nFile, 'r')
text = fi.read() # a file talaktsa karakterlncc
fi.close()

print text
dico ={}
for c in text:
c = c.upper() # minden bett nagybetv alakt
dico[c] = dico.get(c, 0) +1

list = dico.items()
list.sort()
print list

10.48gyakorlat:
# Szveg szavainak el fordulsi gyakorisgbl ksztett hisztogram

nFile = raw_input('Kezelendo file neve : ')


fi = open(nFile, 'r')
text = fi.read()
fi.close()

# annak erdekeben, hogy a szoeg szavai konnyen elklulonithetok legyenek, a nem


# betu karaktereket betukozzealakitjuk :

alpha = "abcdefghijklmnopqrstuvwxyz "

letters = '' # a lerehozand uj karakterlanc


for c in text:
c = c.lower() # minden betut kisbetuve alakit

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 344.
if c in alpha:
letters = letters + c
else:
letters = letters + ' '

# az eredmnystring talaktsa szavak listjv :


words = letters.split()

# a hisztogram elksztse :
dico ={}
for m in words:
dico[m] = dico.get(m, 0) +1

lista = dico.items()

# az eredmnylista rendezse :
lista.sort()

# kiiratas :
for item in lista:
print item[0], ":", item[1]

10.49gyakorlat:
# szoveg kodolasa szotarba

nFile = raw_input('Kezelendo file neve : ')


fi = open(nFile, 'r')
text = fi.read()
fi.close()

# Ugy tekintjk, hogy a szavak olyan karakterek sorozatai, amik az alabbi


# stringnek kepezik reszeit. Minden mas karakter szeparator :

alpha = "abcdefghijklmnopqrstuvwxyz "

# szotar letrehozasa :
dico ={}
# a szovegoszes karakterenek bejarasa :
i =0 # az eppen beolvasott karakter indexe
word ="" # munkavaltozo : az eppen beolvasott szo
for c in text:
c = c.lower() # minden betut kisbetuve alakit

if c in alpha: # alfabetikus karakter => egy szo belsejeben vagyunk


word = word + c
else: # nem alfabetikus karakter => szo vege
if word !="": # hogy figyelmen kivl hagyjuk az egymast koveto nem
# alfabetikus karaktereket minden szonak,
#lerehozunk egy indexlistat:

if dico.has_key(word): # mr listba vett szo :


dico[word].append(i) # egy index hozzaadasa a listahoz
else: # eloszor elofordulo szo:
dico[word] =[i] # indexek listjanak letrehozasa
word ="" # a kovetkezo szo olvasasanak elokeszitese
i = i + 1 # a kovetkezo karakter indexe

# A szotar kiiratasa :
for key, value in dico.items():
print key, ":", value

345. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
10.50gyakorlat:Sztrmentse(10.45gyakorlatkiegsztse).

def record():
file = raw_input("Irja be az elmentendo file nevet : ")
ofi = open(file, "w")
# az elzleg listv alaktott sztr bejrsa :
for key, value in dico.items():
# stringformzs alkalmazsa :
ofi.write("%s@%s#%s\n" % (key, value[0], value[1]))
ofi.close()

def readFile():
file = raw_input("Irja be az elmentett file nevet : ")
try:
ofi = open(file, "r")
except:
print "*** nem ltez file ***"
return

while 1:
line = ofi.readline()
if line =='': # filevge detektlsa
break
enreg = line.split("@") # [key,value] lista visszalltsa
key = enreg[0]
value = enreg[1][:-1] # sorvge karakter kikszblse
data = value.split("#") # [age, height] lista visszalltsa
age, height = int(data[0]), float(data[1])
dico[key] = (age, height) # sztr rekonstrulsa
ofi.close()

Eztaktfggvnytafprogramelejn,illetvevgnhvhatjuk,mintazalbbipldban:

dico ={}
readFile()
while 1:
choice = raw_input("Valasszon : (K)itolt - (M)egnez - (V)ege : ")
if choice.upper() == 'V':
break
elif choice.upper() == 'K':
fill()
elif choice.upper() == 'M':
consult()
record()

10.51gyakorlat:Programvgrehajtsvezrlsesztrral

Ez a gyakorlatazelztegszti ki.Hozzadunk mgktfggvnytstrjuk a fprogramot, hogy egy


sztrralvezreljkaprogramvgrehajtst:

def finish():
print "*** Munka vge ***"
return 1 # a ciklus befejezsnek el idzse

def other():
print "Krem vlasszon V, H, B, M vagy K."

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 346.
dico ={}
func ={"V":readFile, "H":fill, "B":consult,
"M":writeFile, "K":finish}
while 1:
choix = raw_input("Vlasszon :\n" +\
"(V)isszaolvasunk egy mar letezo mentett szotarat egy filebol\n" +\
"(H)hozzaadunk az aktualis szotarhoz ujabb adatokat\n" +\
"(B)elenezunk az aktualis szotarba\n" +\
"(M)enti az aktualis szotarat egy fileba\n" +\
"(K)ilep : ")
# az albbi utasts minden vlasztsra ms fggvnyt hv
# a <func> sztr segtsgvel :
if func.get(choice, other)():
break
# Rem : minden itt hvott fggvny alaprtelmezett visszatrsi rtke ,
# <None> kivve a finish() fggvnyt, esetben 1 => kilps a ciklusbl

12.1gyakorlat:
class Domino:
def __init__(self, pa, pb):
self.pa, self.pb = pa, pb

def kiir_pontok(self):
print "A oldal :", self.pa,
print "B oldal :", self.pb

def ertek(self):
return self.pa + self.pb

# Tesztprogram :

d1 = Domino(2,6)
d2 = Domino(4,3)

d1.kiir_pontok()
d2.kiir_pontok()

print "sszes pont :", d1.ertek() + d2.ertek()

lista_dominok = []
for i in range(7):
lista_dominok.append(Domino(6, i))

vt =0
for i in range(7):
lista_dominok[i].kiir_pontok()
vt = vt + lista_dominok[i].ertek()

print "sszpontszm :", vt

347. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
12.3gyakorlat:
class auto:
def __init__(self, marka = 'Ford', szin = 'piros'):
self.szin = szin
self.marka = marka
self.vezeto = 'senki'
self.sebesseg = 0

def gyorsit(self, gyorsulas, idotartam):


if self.vezeto =='senki':
print "Ennek az autnak nincs vezet je !"
else:
self.sebesseg = self.sebesseg + gyorsulas * idotartam

def valaszt_sofort(self, nev):


self.vezeto = nev

def kiir_mindent(self):
print "%s %s vezeti %s, sebesseg = %s m/s" % \
( self.szin, self.marka, self.vezeto, self.sebesseg)

a1 = auto('Peugeot', 'kk')
a2 = auto(szin = 'zld')
a3 = auto('Mercedes')
a1.valaszt_sofort('Romeo')
a2.valaszt_sofort('Juliette')
a2.gyorsit(1.8, 12)
a3.gyorsit(1.9, 11)
a1.kiir_mindent()
a2.kiir_mindent()
a3.kiir_mindent()

12.4gyakorlat:
class Muhold:
def __init__(self, nev, tomeg =100, sebesseg =0):
self.nev, self.tomeg, self.sebesseg = nev, tomeg, sebesseg

def lokes(self, ero, idotartam):


self.sebesseg = self.sebesseg + ero * idotartam / self.tomeg

def energia(self):
return self.tomeg * self.sebesseg**2 / 2

def kiir_sebesseg(self):
print "%s M hold sebessge = %s m/s" \
% (self.nev, self.sebesseg)

# Tesztprogram :

s1 = Muhold('Zo', tomeg =250, sebesseg =10)

s1.lokes(500, 15)
s1.kiir_sebesseg()
print s1.energia()
s1.lokes(500, 15)
s1.kiir_sebesseg()
print s1.energia()

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 348.
12.512.6gyakorlatok(hengerskposztly):
# Leszrmaztatott osztlyok - polimorfizmus

class Kor:
def __init__(self, sugar):
self.sugar = sugar

def terulet(self):
return 3.1416 * self.sugar**2

class Henger(Kor):
def __init__(self, sugar, magassag):
Kor.__init__(self, sugar)
self.magassag = magassag

def terfogat(self):
return self.terulet()*self.magassag

# a terulet() metdust a szl osztlytl rkli

class Kup(Henger):
def __init__(self, sugar, magassag):
Henger.__init__(self, sugar, magassag)

def terfogat(self):
return Henger.terfogat(self)/3

# ez az j terfogat() metdus helyettesti a


# zl osztlytl rklt metdust (polimorfizmus plda)

# Tesztprogram :

henger = Henger(5, 7)
print "Henger alapterlete =", henger.terulet()
print "Hengertrfogat =", henger.terfogat()

kup = Kup(5,7)
print "Kp alapterlete =", kup.terulet()
print "Kptfogat =", kup.terfogat()

349. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
12.7gyakorlat:
# Krtyahza

from random import randrange

class KartyaJatek:
"""Krtyajtk"""
# osztlyattribtumok (minden pldny esetben kzsek) :
couleur = ('Pique', 'Trefle', 'Carreau', 'Coeur')
ertek = (0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'junga', 'dama', 'kiraly',
'asz')

def __init__(self):
"Az 52 krtya listjnak ltrehozsa"
self.kartya =[]
for coul in range(4):
for val in range(13):
self.kartya.append((val +2, coul)) # az rtk 2-vel kezddik

def kartya_neve(self, c):


"A c krtya rtkt adja meg, en clair"
return "%s %s" % (self.couleur[c[1]], self.ertek[c[0]])

def kever(self):
"Megkeveri a krtykat"
t = len(self.kartya) # a maradk krtyk szma
# a kevershez azonos szm csert vgznk :
for i in range(t):
# 2 listabeli hely vletlenszer sorsolsa :
h1, h2 = randrange(t), randrange(t)
# felcserljk az ezeken a helyeken lv krtykat :
self.kartya[h1], self.kartya[h2] = self.kartya[h2], self.kartya[h1]

def huz(self):
"A pakli els krtyjnak kihzsa"
t = len(self.kartya) # ellenrizzk, hogy maradt-e krtya
if t >0:
kartya = self.kartya[0] # kivlasztjuk az els krtyt
del(self.kartya[0]) # kivonjuk a jtkbl
return kartya # megadjuk a msolatt a hv
programnak
else:
return None # fakultativ

### Tesztprogramme :

if __name__ == '__main__':
jatek = KartyaJatek() # objektum ltrehozsa
jatek.kever() # krtyk keverse
for n in range(53): # 52 krtya hzsa :
c = jatek.huz()
if c == None: # egyetlen krtya sem marad
print 'Vege !' # a listban
else:
print jatek.kartya_neve(c) # a krtya rtke s szne

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 350.
12.8gyakorlat:
(Felttelezem, hogy az el z gyakorlatot exercice_12_07.py nven mentettk el.)
# Kartyacsata

from exercice_12_07 import KartyaJatek

jatekA = KartyaJatek() # az elso jatek letrehozasa


jatekB = KartyaJatek() # a masodik jatek letrehozasa
jatekA.kever() # mange de chacun
jatekB.kever()
pA, pB = 0, 0 # compteurs de points des joueurs A et B

# mindegyik jatek eseteben 52-szer huzunk :


for n in range(52):
cA, cB = jatekA.huz(), jatekB.huz()
vA, vB = cA[0], cB[0] # a kartyak ertekei
if vA > vB:
pA += 1
elif vB > vA:
pB += 1 # (semmi sem tortenik, ha vA = vB)
# a kartyak es a pontok egymasutani kiiratasa :
print "%s * %s ==> %s * %s" % (jatekA.kartya_neve(cA),
jatekB.kartya_neve(cB), pA, pB)

print "Az A jatekos %s pontot nyert, a B jatekos %s pontot nyert." % (pA, pB)

13.6gyakorlat:

from Tkinter import *

def circle(can, x, y, r, colour ='white'):


"<r> sugaru kor rajzolasa a vaszon <can> <x,y> pontjaba"
can.create_oval(x-r, y-r, x+r, y+r, fill =colour)

class Application(Tk):
def __init__(self):
Tk.__init__(self) # a szuloosztaly constructora
self.can =Canvas(self, width =475, height =130, bg ="white")
self.can.pack(side =TOP, padx =5, pady =5)
Button(self, text ="Vonat", command =self.drawing ).pack(side =LEFT)
Button(self, text ="Hello", command =self.kukucs).pack(side =LEFT)
Button(self, text ="Vilgt34", command =self.light34).pack(side =LEFT)

def drawing (self):


"4 vagon letrehozasa a vasznon"
self.w1 = Wagon(self.can, 10, 30)
self.w2 = Wagon(self.can, 130, 30, 'dark green')
self.w3 = Wagon(self.can, 250, 30, 'maroon')
self.w4 = Wagon(self.can, 370, 30, 'purple')

def kukucs(self):
"emberek jelennek meg bizonyos ablakokban"
self.w1.perso(3) # 1. vagon, 3. ablak
self.w3.perso(1) # 3. vagon, 1. ablak
self.w3.perso(2) # 3. vagon, 2. ablak
self.w4.perso(1) # 4. vagon, 1. ablak

def light34(self):
"a vilagitas bekapcsolasa a 3 & 4 vagonban"

351. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
self.w3.light()
self.w4.light()

class Wagon:
def __init__(self, canvas_, x, y, colour ='navy'):
"egy kis vagon rajza a <canvas_> vsznon <x,y> -ban"
# paramterek trolsa pldny-vltozkban :
self.canvas_, self.x, self.y = canvas_, x, y
# alap tglalap : 95x60 pixel :
canvas_.create_rectangle(x, y, x+95, y+60, fill =colour)
# 3 ablak 25x40 pixeles, 5 pixel tvolsgra :
self.wind =[] # az ablakok hivatkozasainak tarolasara
for xf in range(x +5, x +90, 30):
self.wind.append(canvas_.create_rectangle(xf, y+5,
xf+25, y+40, fill ='black'))
# kt 12 pixel sugar kerk :
circle(canvas_, x+18, y+73, 12, 'gray')
circle(canvas_, x+77, y+73, 12, 'gray')

def perso(self, wind):


"egy ember jelenik meg a <wind> ablakban"
# az ablakok koordinatainak kiszamolasa :
xf = self.x + wind*30 -12
yf = self.y + 25
circle(self.canvas_, xf, yf, 10, "pink") # arc
circle(self.canvas_, xf-5, yf-3, 2) # balszem
circle(self.canvas_, xf+5, yf-3, 2) # jobbszem
circle(self.canvas_, xf, yf+5, 3) # szaj

def light(self):
"felkapcsolja a vagon belso vilagitasat"
for f in self.wind:
self.canvas_.itemconfigure(f, fill ='yellow')

app = Application()
app.mainloop()

13.21gyakorlat:

from Tkinter import *

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 352.
# A modul diszken levo file-ok keresesere szolgalo
# standard dialogbox-okat allit elo :
from tkFileDialog import asksaveasfile, askopenfile

class Application(Frame):
'''Alkalmazasablak'''
def __init__(self):
Frame.__init__(self)
self.master.title("Sznsztr ltrehozsa")

self.dico ={} # szotar letrehozasa

# A widget-ek ket keretben (Frame) vannak csoportositva :


frUpp =Frame(self) # 6 widget -et tartalmazo felso frame
Label(frUpp, text ="Szn neve :",
width =20).grid(row =1, column =1)
self.enName =Entry(frUpp, width =25) # adatbeviteli mezo
self.enName.grid(row =1, column =2) # a szinnek
Button(frUpp, text ="Mr ltezik ?", width =12,
command =self.searchColour).grid(row =1, column =3)
Label(frUpp, text ="Megf. hexa kd :",
width =20).grid(row =2, column =1)
self.enCode =Entry(frUpp, width =25) # adatbeviteli mezo
self.enCode.grid(row =2, column =2) # a hexakodnak
Button(frUpp, text ="Teszt", width =12,
command =self.testColour).grid(row =2, column =3)
frUpp.pack(padx =5, pady =5)

frLow =Frame(self) # a maradekot tartalmazo also frame


self.test = Label(frLow, bg ="white", width =45, # tesztzona
height =7, relief = SUNKEN)
self.test.pack(pady =5)
Button(frLow, text ="A szn hozzadsa a sztrhoz",
command =self.addColour).pack()
Button(frLow, text ="Sztr kirsa", width =25,
command =self.record).pack(side = LEFT, pady =5)
Button(frLow, text ="Sztr visszalltsa", width =25,
command =self.restore).pack(side =RIGHT, pady =5)
frLow.pack(padx =5, pady =5)
self.pack()

def addColour(self):
"az aktualis szin hozzaadasa a szotarhoz"
if self.testColour() ==0: # volt definialva szin ?
return
name = self.enName.get()
if len(name) >1: # elutasitja a tul rovid nevet
self.dico[name] =self.cHexa
else:
self.test.config(text ="%s : inkorrekt nev" % name, bg ='white')

def searchColour(self):
"egy a szotarba mar beirt szin keresese"
name = self.enName.get()
if self.dico.has_key(name):
self.test.config(bg =self.dico[name], text ="")
else:
self.test.config(text ="%s : ismeretlen szin" % name, bg ='white')

def testColour(self):
"hexakod ervenyessegenek igazolasa. - a megfelelo szin kiirasa."

353. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
try:
self.cHexa =self.enCode.get()
self.test.config(bg =self.cHexa, text ="")
return 1
except:
self.test.config(text ="Inkorrekt szin kodolasa", bg ='white')
return 0

def record(self):
"szotar kiirasa szovegfile-ba"
# Ez a metodus egy standard dialogbox-ot alkalmaz a diszken levo file
# kivalasztasara. A Tkinter a tkFileDialog modulban egy sor fggvyt ad,
# amik ezekhez a # dialogbox-okhoz vannak asszocialva.
# Az alabbi fuggveny egy irasra megnyitott file-objektumot ad vissza :
ofi =asksaveasfile(filetypes=[("Szveg",".txt"),("Minden","*")])
for key, value in self.dico.items():
ofi.write("%s %s\n" % (key, value))
ofi.close()

def restore(self):
"szotar visszaallitasa tarolt filebol"
# Az alabbi fuggveny egy olvasasra megnyitott file-objektumot
# ad visszateresi erteknek :
ofi =askopenfile(filetypes=[("Szveg",".txt"),("Minden","*")])
lignes = ofi.readlines()
for li in lignes:
cv = li.split() # a megfelelo kulcs es ertek kiszedese
self.dico[cv[0]] = cv[1]
ofi.close()

if __name__ == '__main__':
Application().mainloop()

13.22gyakorlat(3.vltozat):
from Tkinter import *
from random import randrange
from math import sin, cos, pi

class FaceDom:
def __init__(self, can, val, pos, size =70):
self.can =can
x, y, c = pos[0], pos[1], size/2
self. square = can.create_rectangle(x -c, y-c, x+c, y+c,
fill ='ivory', width =2)
d = size/3
# a pontok elrendezese az oldalon, mind a 6 esetre :
self.pDispo = [((0,0),),
((-d,d),(d,-d)),
((-d,-d), (0,0), (d,d)),
((-d,-d),(-d,d),(d,-d),(d,d)),
((-d,-d),(-d,d),(d,-d),(d,d),(0,0)),
((-d,-d),(-d,d),(d,-d),(d,d),(d,0),(-d,0))]

self.x, self.y, self.dim = x, y, size/15


self.pList =[] # ennek az oldalnak a pontjait tartalmazo lista
self.draw_points(val)

def draw_points(self, val):


# a val rtknek megfelel pontok rajzainak a ltrehozsa :
disp = self.pDispo[val -1]

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 354.
for p in disp:
self.circle(self.x +p[0], self.y +p[1], self.dim, 'red')
self.val = val

def circle(self, x, y, r, colo):


self.pList.append(self.can.create_oval(x-r, y-r, x+r, y+r, fill=colo))

def erase(self, flag =0):


for p in self.pList:
self.can.delete(p)
if flag:
self.can.delete(self.square)

class Project(Frame):
def __init__(self, width_, height_):
Frame.__init__(self)
self.width_, self.height_ = width_, height_
self.can = Canvas(self,bg='dark green', width =width_, height =height_)
self.can.pack(padx =5, pady =5)
# az elhelyezend gombok s az esemnykezel ik listja :
bList = [("A", self.buttonA), ("B", self.buttonB),
("C", self.buttonC), ("Quitter", self.buttonQuit)]
bList.reverse() # a lista sorrendjt megfordtja
for b in bList:
Button(self, text =b[0], command =b[1]).pack(side =RIGHT, padx=3)
self.pack()
self.die =[] # a kockkat tartalmaz lista
self.actu =0 # az aktulisan kivlasztott kocka hivatkozsa

def buttonA(self):
if len(self.die):
return # mert a rajzok m leznek !
a, da = 0, 2*pi/13
for i in range(13):
cx, cy = self.width_/2, self.height_/2
x = cx + cx*0.75*sin(a) # kr elhelyezshez,
y = cy + cy*0.75*cos(a) # a trigonometrit alkalmazzuk !
self.die.append(FaceDom(self.can, randrange(1,7) , (x,y), 65))
a += da

def buttonB(self):
# a kivlasztott kocka pontrtkt nveli. A kvetkez kockra tr t :
v = self.die[self.actu].val
v = v % 6
v += 1
self.die[self.actu].erase()
self.die[self.actu].draw_points(v)
self.actu += 1
self.actu = self.actu % 13

def buttonC(self):
for i in range(len(self.die)):
self.die[i].erase(1)
self.die =[]
self.actu =0

def buttonQuit(self):
self.master.destroy()

Project(600, 600).mainloop()
16.1gyakorlat("musique"nevadatbzisltrehozsa):

355. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
# Egy kis adatbzis ltrehozsa s feltltse

import gadfly
import os

path_ = os.getcwd() # aktualis konyvtar

connection = gadfly.gadfly()
connection.startup("music", path_)
cur = connection.cursor()
request = "create table zeneszerzok (eloado varchar, ev_szul integer,\
ev_halal integer)"
cur.execute(request)
request = "create table muvek (eloado varchar, cim varchar,\
ido integer, interpr varchar)"
cur.execute(request)

print "Bevitt adatok kiirasa a zeneszerzok adattablaba :"


while 1:
nv = raw_input("Zeneszerzo neve (<Enter> befejezes) : ")
if nm =='':
break
esz = raw_input("Szuletes eve : ")
eha = raw_input("Halal eve : ")
request ="insert into zeneszerzok(eloado, ev_szul, ev_halal) values \
('%s', %s, %s)" % (nv, esz, eha)
cur.execute(request)
# Ellenorzeskent kiirja a bevitt adatokat :
cur.execute("select * from zeneszerzok")
print cur.pp()

print "Bevitt adatok rgzitese a muvek adattablaba :"


while 1:
nev_ = raw_input("Zeneszerzo neve (<Enter> befejezes) : ")
if nev_ =='':
break
cim_ = raw_input("Zenemu cime : ")
ido_ = raw_input("idotartam (perc) : ")
int = raw_input("eloado : ")
request ="insert into muvek(eloado, cim, ido, interpr) values \
('%s', '%s', %s, '%s')" % (nev_, cim_, ido_, int)
cur.execute(request)
# Ellenorzeskent kiirja a bevitt adatokat :
cur.execute("select * from muvek")
print cur.pp()

connection.commit()

18.2gyakorlat:
#####################################
# Mozg clpont bombzsa #
# (C) G. Swinnen - Avril 2004 - GPL #
#####################################

from Tkinter import *


from math import sin, cos, pi
from random import randrange
from threading import Thread
import time
class Canon:

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 356.
"""gyrajz"""
def __init__(self, boss, num, x, y, irany):
self.boss = boss # a vszon hivatkozsa
self.num = num # az gy szma a listban
self.x1, self.y1 = x, y # gy forgstengelye
self.irany = irany # lvs irnya (-1:balra, +1:jobbra)
self.lagyucso = 30 # gycs hossza
# gycs rajzolsa (vzszintes) :
self.x2, self.y2 = x + self.lagyucso * irany, y
self.cso = boss.create_line(self.x1, self.y1,
self.x2, self.y2, width =10)
# gytest rajzolsa (sznes kr) :
self.rc = 15 # a kr sugara
self.test = boss.create_oval(x -self.rc, y -self.rc, x +self.rc,
y +self.rc, fill ='black')
# egy lvedk elrajzolsa (kiindulskor egy pont) :
self.lovedek = boss.create_oval(x, y, x, y, fill='red')
self.anim = 0
# a vszon szlessgnek s magassgnak meghatrozsa :
self.xMax = int(boss.cget('width'))
self.yMax = int(boss.cget('height'))

def iranyzas(self, angle):


"gy dlsszgnek belltsa"
# rem : az <angle> (szg) paramtert stringknt kapja.
# t kell alaktani vals szmm, majd radinn :
self.angle = float(angle)*2*pi/360
self.x2 = self.x1 + self.lagyucso * cos(self.angle) * self.irany
self.y2 = self.y1 - self.lagyucso * sin(self.angle)
self.boss.coords(self.cso, self.x1, self.y1, self.x2, self.y2)

def tuz(self):
"goly kilvsnek indtsa"
# cltrgy hivatkozsa :
self.celtargy = self.boss.master.celtargy
if self.anim ==0:
self.anim =1
# lvedk kezd pozcija (ez az gy torka) :
self.xo, self.yo = self.x2, self.y2
v = 20 # kezd sebessg
# ennek a sebessgnek a fggleges s vzszintes komponensei :
self.vy = -v *sin(self.angle)
self.vx = v *cos(self.angle) *self.irany
self.animacio_lovedek()

def animacio_lovedek(self):
"lvedk animcija (ballisztikus plya)"
# lvedk pozcionlsa koordinti jradefinilsval :
self.boss.coords(self.lovedek, self.xo -3, self.yo -3,
self.xo +3, self.yo +3)
if self.anim >0:
# a kvetkez pozci szmolsa :
self.xo += self.vx
self.yo += self.vy
self.vy += .5
self.test_akadaly() # akadlyba tkztt ?
self.boss.after(1, self.animacio_lovedek)
else:
# animci vge :
self.boss.coords(self.lovedek, self.x1, self.y1, self.x1, self.y1)

357. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
def test_akadaly(self):
"Eldntjk: a lvedk clba tallt-e vagy elrte-e a jtktr hatrt"
if self.yo >self.yMax or self.xo <0 or self.xo >self.xMax:
self.anim =0
return
if self.yo > self.celtargy.y -3 and self.yo < self.celtargy.y +18 \
and self.xo > self.celtargy.x -3 and self.xo < self.celtargy.x +43:
# megrajzoljuk a lvedk robbanst (narancssrga kr) :
self.robbanas = self.boss.create_oval(self.xo -10,
self.yo -10, self.xo +10, self.yo +10,
fill ='orange', width =0)
self.boss.after(150, self.robbanas_vege)
self.anim =0

def robbanas_vege(self):
"a robbansi kr trlse - a pontszm kezelse"
self.boss.delete(self.robbanas)
# a siker jelzse a master-ablaknak :
self.boss.master.goal()

class VezerloPult(Frame):
"""Egy gyhoz asszocilt vezrlpult"""
def __init__(self, boss, canon):
Frame.__init__(self, bd =3, relief =GROOVE)
self.score =0
s =Scale(self, from_ =88, to =65,
troughcolor ='dark grey',
command =canon.iranyzas)
s.set(45) # a lvs kezd szge
s.pack(side =LEFT)
Label(self, text ='Dlsszg').pack(side =TOP, anchor =W, pady =5)
Button(self, text ='Tz !', command =canon.tuz).\
pack(side =BOTTOM, padx =5, pady =5)
Label(self, text ="pont").pack()
self.pontok =Label(self, text=' 0 ', bg ='white')
self.pontok.pack()
# positionner a gauche ou a droite suivant le sens du canon :
gd =(LEFT, RIGHT)[canon.irany == -1]
self.pack(padx =3, pady =5, side =gd)

def pontHozzaadasa(self, p):


"a pontszm nvelse vagy cskkentse"
self.score += p
self.pontok.config(text = ' %s ' % self.score)

class Celtargy:
"""cltrgyknt szolgl grafikus objektum"""
def __init__(self, can, x, y):
self.can = can # a vszon hivatkozsa
self.x, self.y = x, y
self.celtargy = can.create_oval(x, y, x+40, y+15, fill ='purple')

def elmozditas(self, dx, dy):


"a cltrgy dx,dy elmozdtsa"
self.x += dx
self.y += dy
self.can.move(self.celtargy, dx, dy)
return self.x, self.y

class Thread_celtargy(Thread):

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 358.
"""a cltrgy animcijt irnyt thread-objektum"""
def __init__(self, app, celtargy):
Thread.__init__(self)
self.celtargy = celtargy # az elmozdtand objektum
self.app = app # az alkalmazsablak hivatkozsa
self.sx, self.sy = 6, 3 # tvolsg- s idnvekmnyek
self.dt =.3 # az animcihoz

def run(self):
"animls, amg az alkalmazsablak ltezik"
while self.app != None:
x, y = self.celtargy.elmozditas(self.sx, self.sy)
if x > self.app.xm -50 or x < self.app.xm /5:
self.sx = -self.sx
if y < self.app.ym /2 or y > self.app.ym -20:
self.sy = -self.sy
time.sleep(self.dt)

def stop(self):
"a thread zrsa, ha az alkalmazsablak zrva van"
self.app =None

def gyorsit(self):
"a mozgs gyorstsa"
self.dt /= 1.5

class Application(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title('<<< Lvs mozg cltrgyra >>>')
self.pack()
self.xm, self.ym = 600, 500
self.jatek = Canvas(self, width =self.xm, height =self.ym,
bg ='ivory', bd =3, relief =SUNKEN)
self.jatek.pack(padx =4, pady =4, side =TOP)

# Egy gy s egy vezrl pult objektum ltrehozsa :


x, y = 30, self.ym -20
self.agyu =Canon(self.jatek, 1, x, y, 1)
self.pult =VezerloPult(self, self.agyu)

# mozg clpont ltrehozsa :


self.celtargy = Celtargy(self.jatek, self.xm/2, self.ym -25)
# mozg clpont animlsa sajt thread-del :
self.tc = Thread_celtargy(self, self.celtargy)
self.tc.start()
# az sszes thread lelltsa amikor zrjuk az ablakot :
self.bind('<Destroy>',self.zaras_threadek)

def goal(self):
"a clpontot eltalltuk"
self.pult.pontHozzaadasa(1)
self.tc.gyorsit()

def zaras_threadek(self, evt):


"a clpont animcis thread-jnek lelltsa"
self.tc.stop()
if __name__ =='__main__':
Application().mainloop()

359. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
19.7 AHowtothinklikeacomputerscientistfggelknek
kivonatai
A GNUFreeDocumentationlicencenekmegfelelen(lsd366.oldalon)akvetkezfggelkeknekgy,
ahogyvannakktelezenkvetnikkellazeredetiszvegmindendisztribcijt,fggetlenlattl,hogyazt
mdostottk(lefordtottkpldul)vagysem.

19.7.1 Contributorlist
byJeffreyElkner
Perhapsthemostexcitingthingaboutafreecontenttextbookisthepossibilityitcreatesforthoseusing
the book tocollaborate in its development. I have been delighted by the many responses, suggestions,
corrections,andwordsofencouragementIhavereceivedfrompeoplewhohavefoundthisbooktobe
useful,andwhohavetakenthetimetoletmeknowaboutit.
Unfortunately,asabusyhighschoolteacherwhoisworkingonthisprojectinmysparetime(whatlittle
thereisofit;),Ihavebeenneglectfulingivingcredittothosewhohavehelpedwiththebook.Ialways
plannedtoaddan"Acknowlegdements"sectionsuponcompletionofthefirststableversionofthebook,but
astimewentonitbecameincreasinglydifficulttoeventrackthosewhohadcontributed.
Upon seeing the most recent version of Tony Kuphaldt's wonderful free text, "Lessons in Electric
Circuits", I got the idea from him to create an ongoing "Contributor List" page which could be easily
modifiedtoincludecontributorsastheycomein.
Myonlyregretisthatmanyearliercontributorsmightbeleftout.Iwillbeginassoonaspossibletogo
backthrougholdemailstosearchoutthemanywonderfulfolkswhohavehelpedmeinthisendeavour.In
themeantime,ifyoufindyourselfmissingfromthislist,pleaseacceptmyhumbleapologiesanddropme
anemailatjeff@elkner.nettoletmeknowaboutmyoversight.
Andso,withoutfurtherdelay,hereisalistingofthecontributors:
LloydHughAllen
Lloydsentinacorrectiontosection8.4.Hecanbereachedat:lha2@columbia.edu
YvonBoulianne
YvonsentinacorrectionofalogicalerrorinChapter5.Shecanbereachedat:mystic@monuniverse.net
FredBremmer
Fredsubmittedacorrectioninsection2.1.Hecanbereachedat:Fred.Bremmer@ubc.cu
JonahCohen
JonahwrotethePerlscriptstoconverttheLaTeXsourceforthisbookintobeautifulHTML.HisWeb
pageisjonah.ticalc.organdhisemailisJonahCohen@aol.com
MichaelConlon
MichaelsentinagrammercorrectioninChapter2andanimprovementinstyleinChapter1,andhe
initiated discussion on the technical aspects of interpreters. Michael can be reached at:
michael.conlon@sru.edu
CourtneyGleason
CourtneyandKatherineSmithcreatedthefirstversionofhorsebet.py,whichisusedasthecasestudyfor

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 360.
thelastchaptersofthebook.Courtneycanbereachedat:orion1558@aol.com
LeeHarr
Leesubmittedcorrectionsforsections10.1and11.5.Hecanbereachedat:missive@linuxfreemail.com
JamesKaylin
Jamesisastudentusingthetext.Hehassubmittednumerouscorrections.Jamescanbereachedbyemail
at:Jamarf@aol.com
DavidKershaw
David fixed the broken catTwice function in section 3.10. He can be reached at:
david_kershaw@merck.com
EddieLam
EddiehassentinnumerouscorrectionstoChapters1,2,and3.HealsofixedtheMakefilesothatit
createsanindexthefirsttimeitisrunandhelpedussetupaversioningscheme.Eddiecanbereachedat:
nautilus@yoyo.cc.monash.edu.au
ManYongLee
ManYong sent in a correction to the example code in section 2.4. He can be reaced at:
yong@linuxkorea.co.kr
DavidMayo
While he didn't mean to hit us over the head with it, David Mayo pointed out that the word
"unconsciously" in chapter 1 needed to be changed to "subconsciously". David can be reached at:
bdbear44@netscape.net
ChrisMcAloon
Chrissentinseveralcorrectionstosections3.9and3.10.Hecanbereachedat:cmcaloon@ou.edu
MatthewJ.Moelter
Matthewhasbeenalongtimecontributorwhosentinnumerouscorrectionsandsuggestionstothebook.
Hecanbereachedat:mmoelter@calpoly.edu
SimonDiconMontford
SimonreportedamissingfunctiondefinitionandseveraltyposinChapter3.Healsofounderrorsinthe
incrementfunctioninChapter13.Hecanbereachedat:dicon@bigfoot.com
JohnOuzts
John sent in a correction to the "return value" definition in Chapter 3. He can be reached at:
jouzts@bigfoot.com
KevinParks
Kevinsentinvaluablecommentsandsuggestionsastohowtoimprovethedistributionofthebook.He
canbereachedat:cpsoct@lycos.com
DavidPool
Davidsentinatypointheglossaryofchapter1,aswellaskindwordsofencouragement.Hecanbe
reachedat:pooldavid@hotmail.com
MichaelSchmitt
Michael sent in a correction to the chapter on files and exceptions. He can be reached at:
ipv6_128@yahoo.com

361. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
PaulSleigh
PaulfoundanerrorinChapter7andabuginJonahCohen'sPerlscriptthatgeneratesHTMLfrom
LaTeX.Hecanbereachedat:bat@atdot.dotat.org
ChristopherSmith
Chris is a computer science teacher at the Blake School in Minnesota who teaches Python to his
beginningstudents.Hecanbereachedat:csmith@blakeschool.orgorsmiles@saysomething.com
KatherineSmith
KatherineandCourtneyGleasoncreatedthefirstversionofhorsebet.py,whichisusedasthecasestudy
forthelastchaptersofthebook.Katherinecanbereachedat:kss_0326@yahoo.com
CraigT.Snydal
CraigistestingthetextinacourseatDrewUniversity.Hehascontributedseveralvaluablesuggestions
andcorrections,andcanbereachedat:csnydal@drew.edu
IanThomas
Ianandhisstudentsareusingthetextinaprogrammingcourse.They arethefirstonestotestthe
chaptersinthelatterhalfofthebook,andtheyhavemakenumerouscorrectionsandsuggestions.Iancanbe
reachedat:ithomas@sd70.bc.ca
KeithVerheyden
KeithmadecorrectioninSection3.11andcanbereachedat:kverheyd@glam.ac.uk
ChrisWrobel
ChrismadecorrectionstothecodeinthechapteronfileI/Oandexceptions.Hecanbereachedat:
ferz980@yahoo.com
MosheZadka
Moshehasmadeinvaluablecontributionstothisproject.Inaddition towriting thefirstdraftofthe
chapteronDictionaries,heprovidedcontinualguidanceintheearlystagesofthebook.Hecanbereached
at:moshez@math.huji.ac.il

19.7.2 Preface
byJ.Elkner

Thisbookowesitsexistancetothecollaborationmadepossiblebytheinternetandthefreesoftware
movement.Itsthreeauthors,acollegeprofessor,ahighschoolteacher,andaprofessionalprogrammer,have
yettomeetfacetoface,butwehavebeenabletoworkcloselytogether,andhavebeenaidedbymany
wonderfulfolkswhohavedonatedtheirtimeandenergytohelpingmakeitbetter.
Whatexcitesmemostaboutitisthatitisatestamenttoboththebenefitsandfuturepossibilitiesofthis
kindofcollaboration,theframeworkforwhichhasbeenputinplacebyRichardStallmanandtheFree
SoftwareFoundation.

a) HowandwhyIcametousePython

In1999,theCollegeBoard'sAdvancedPlacementComputerScienceexamwasgiveninC++forthefirst
time.Asinmanyhighschoolsthroughoutthecountry,thedecisiontochangelanguageshadadirectimpact

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 362.
onthecomputersciencecurriculumwhereIteachatYorktownHighSchool,inArlington,Virginia.Upto
thispoint,PascalwasthelanguageofinstructioninbothourfirstyearandAPcourses.Inkeepingwithpast
practiceofgivingstudentstwoyearsofexposuretothesamelanguage,wemadethedecisiontoswitchtoC
++inthefirstyearcourseforthe199798schoolyear,sothatwewouldbeinstepwiththeCollegeBoard's
changefortheAPcoursethefollowingyear.
Twoyearslater,IwasconvincedthatC++wasapoorchoicetouseforintroducingstudentstocomputer
science. While it is certainly a very powerful programming language, it is also an extremely difficult
languagetolearnandteach.IfoundmyselfconstantlyfightingwithC++'sdifficultsyntaxandmultiple
waysofdoingthings,andIwaslosingmanystudentsunnecessarilyasaresult.Convincedtherehadtobea
betterlanguagechoiceforourfirstyearclass,IwentlookingforanalternativetoC++.
AdiscussionontheHighSchoolLinuxUsers'Groupmailinglistprovidedasolution.Athreademerged
duringthelatterpartofJanuary,1999concerningthebestprogramminglanguageforusewithfirsttime
highschoolcomputersciencestudents.InapostingonJanuary30th,BrendonRankingwrote:
I believe thatPython is the best choice for any entrylevel programming class.Itteaches proper
programmingprincipleswhilebeingincrediblyeasytolearn.Itisalsodesignedtobeobjectorientedfrom
itsinceptionsoitdoesn'thavetheaddonpainthat bothPerlandC++sufferfrom......Itisalso*very*
widelysupportedandverymuchwebcentric,aswell.
IhadfirstheardofPythonafewyearsearlierataLinuxInstallFest,whenanenthusiasticMichael
McLaytoldmeaboutPython'smanymerits.HeandBrendonhadnowconvincedmethatIneededtolook
intoPython.
MattAhrens,oneofYorktown'sgiftedstudents,jumpedatthechancetotryoutPython,andinthefinal
twomonthsofthe199899schoolyearhenotonlylearnedthelanguagebutwroteanapplicationcalled
pyTicketwhichenabledourstafftoreporttechnologyproblemsviatheweb.IknewthatMattcouldnot
havefinishedanapplicationofthatscaleinsoshortatimeinC++,andthisaccomplishmentcombinedwith
Matt'spositiveassessmentofPythonsuggestedPythonwasthesolutionIwaslookingfor.

b) Findingatextbook

HavingdecidedtousePythoninbothmyintroductorycomputerscienceclassesthefollowingyear,the
mostpressingproblemwasthelackofanavailabletextbook.
Free content came to the rescue. Earlier in the year Richard Stallman had introduced me to Allen
Downey.BothofushadwrittentoRichardexpressinganinterestindevelopingfreeeducationalcontent.
Allenhadalreadywrittenafirstyearcomputersciencetextbooktitled, Howtothinklikeacomputer
scientist.WhenIreadthisbookIknewimmediatelythatIwantedtouseitinmyclass.Itwastheclearest
andmosthelpfulcomputersciencetextIhadseen.Itemphasizedtheprocessesofthoughtinvolvedin
programming,ratherthanthefeaturesofaparticularlanguage.Readingitimmediatelymademeabetter
teacher.
NotonlywasHowtothinklikeacomputerscientistanexcellentbook,butitwasalsoreleasedundera
GNUpubliclicense,whichmeantitcouldbeusedfreelyandmodifiedtomeettheneedsofitsuser.OnceI
decidedtousePython,itoccurredtomethatIcouldtranslateAllen'soriginalJavaversionintothenew
language.WhileIwouldnothavebeenabletowriteatextbookonmyown,havingAllen'sbooktowork
frommadeitpossibleformetodoso,atthesametimedemonstratingthatthecooperativedevelopment
modelusedsowellinsoftwarecouldalsoworkforeducationalcontent.
Workingonthisbookforthelasttwoyearshasbeenrewardingforbothmeandmystudents,andthe

363. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
studentsplayedabigpartintheprocess.SinceIcouldmakeinstantchangeswheneversomeonefounda
spellingerrorordifficultpassage,Iencouragedthemtolookforerrorsinthebookbygivingthemabonus
pointeverytimetheyfoundorsuggestedsomethingthatresultedinachangeinthetext.Thishadthedouble
benefitofencouragingthemtoreadthetextmorecarefully,andofgettingthetextthoroughlyreviewedby
itsmostimportantcritics,studentsusingittolearncomputerscience.
Forthesecondhalfofthebookonobjectorientedprogramming,Iknewthatsomeonewithmorereal
programmingexperiencethanIhadwouldbeneededtodoitright.Thebookactuallysatinanunfinished
stateforthebetterpartofayearuntiltwothingshappenedthatledtoitscompletion.
I received an email from Chris Meyers expressing interest in the book. Chris is a professional
programmerwhostartedteachingaprogrammingcourselastyearusingPythonatLaneCommunityCollege
inEugeneOregon.TheprospectofteachingthecoursehadledChristothebook,andhestartedhelpingout
withitimmediately.Bytheendoftheschoolyearhehadcreatedacompanionprojectonourwebsiteat
http://www.ibiblio.org/obpcalledPythonforFunandwasworkingwithsomeofmymostadvancedstudents
asamasterteacher,guidingthembeyondtheplacesIcouldtakethem.

c) IntroducingprogrammingwithPython

TheprocessoftranslatingandusingHowtothinklikeacomputerscientistforthepasttwoyearshas
confirmed Python's suitability to teaching beginning students. Python greatly simplifies programming
examplesandmakesimportantprogrammingideaseasiertoteach.
Thefirstexamplefromthetextdramatically illustratesthispoint.Itisthetraditional"hello,world"
program,whichintheC++versionofthebooklookslikethis:
#include <iostream.h>
void main()
{
cout << "Hello, world." << endl;
}

inthePythonversionitbecomes:
print "Hello, World!"

Eventhoughthisisatrivialexample,theadvantagestoPythonstandout.Therearenoprerequisitesto
Yorktown'sComputerScienceIcourse,somanyofthestudentsseeingthisexamplearelookingattheirfirst
program. Some of them are undoubtedly a little nervous, having heard that computer programming is
difficulttolearn.TheC++versionhasalwaysforcedmetochoosebetweentwounsatisfyingoptions:either
toexplainthe#include,voidmain(),{,and}statements,andriskconfusingorintimidatingsomeofthe
studentsrightatthestart,ortotellthem"justdon'tworryaboutallofthatstuffnow,wewilltalkaboutit
later"andriskthesamething.Theeducationalobjectivesatthispointinthecoursearetointroducestudents
totheideaofaprogrammingstatementandtogetthemtomaketheirfirstprogram,therebyintroducing
themtotheprogrammingenvironment.ThePythonprogramhasexactlywhatisneededtodothesethings,
andnothingmore.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 364.
ComparingSection1.5ofeachversionofthebook,wherethisfirstprogramislocated,furtherillustrates
whatthismeanstothebeginningstudent.Therearethirteenparagraphsofexplanationof"Hello,world"in
theC++version,inthePythonversionthereareonlytwo.Moreimportantly,themissingelevenparagraphs
donotdealwiththe"bigideas"incomputerprogramming,butwiththeminutiaofC++syntax.Ifoundthis
samethinghappeningthroughoutthebook.WholeparagraphssimplydisappearfromthePythonversionof
thetextbecausePython'smuchclearersyntaxrendersthemunnecessary.
UsingaveryhighlevellanguagelikePythonallowsateachertopostponetalkingaboutlowleveldetails
ofthemachineuntilstudentshavethebackgroundthattheyneedtobettermakesenseofthedetails.Itthus
createstheabilitytoput"firstthingsfirst"pedagogically.
OneofthebestexamplesofthisisthewayinwhichPythonhandlesvariables.InC++avariableisa
nameforaplacewhichholdsathing.Variableshavetobedeclaredwithtypesatleastinpartbecausethe
sizeoftheplacetowhichtheyreferneedstobepredetermined.Thustheideaofavariableisboundupwith
thehardwareofthemachine.Thepowerfulandfundamentalconceptofavariableisalreadydifficultenough
forbeginningstudents(inbothComputerScienceandAlgebra).Bytesandaddressesdonothelpthematter.
InPythonavariableisanamewhichreferstoathing.Thisisafarmoreintuitiveconceptforbeginning
students,andonewhichismuchclosertothemeaningofvariablethattheylearnedintheirmathclass.Ihad
muchlessdifficultyteachingvariablesthisyearthanIdidinthepast,andIspentlesstimehelpingstudents
withproblemsusingthem.
AnotherexampleofhowPythonaidesintheteachingandlearningofprogrammingisinitssyntaxfor
functions. My students have always had a great deal of difficulty understanding functions. The main
problemcentersaroundthedifferencebetweenafunctiondefinitionandafunctioncall,andtherelated
distinctionbetweenaparameterandanargument.Pythoncomestotherescuewithsyntaxthatisnothing
shortofbeautiful.Functiondefinitionsbeginwiththekeyworddef,soIsimplytellmystudents,"whenyou
defineafunction,beginwithdef,followedbythenameofthefunctionthatyouaredefining,whenyoucall
afunction,simplycall(type)outitsname."Parametersgowithdefinitions,argumentsgowithcalls.There
arenoreturntypesorparametertypesorreferenceandvalueparameterstogetintheway,soIamnowable
toteachfunctionsinlessthenhalfthetimethatitpreviouslytookme,withbettercomprehension.
UsingPythonhasimprovedtheeffectivenessofourcomputerscienceprogramforallstudents.Iseea
highergenerallevelofsuccessandalowerleveloffrustrationthanIexperiencedduringthetwoyearsusing
C++.Imovefasterwithbetterresults.Morestudentsleavethecoursewiththeabilitytocreatemeaningful
programs,andwiththepositiveattitudetowardtheexperienceofprogrammingthatthisengenders.

d) Buildingacommunity

IhavereceivedemaileverycontinentontheglobeandfromasfarawayasKoreafrompeopleusingthis
booktolearnortoteachprogramming.Ausercommunityhasbeguntoemergeandincreasingnumbersof
people have been contributing to the project by sending in materials for the companion web site at
http://www.ibiblio.org/obp.
Withthepublicationofthebookinprintform,Iexpectthegrowthintheusercommunitytocontinueand
accelerate.Itistheemergenceofthisusercommunityandthepossibilityitsuggestsforsimilarcollaboration
amongeducatorsthathasbeenthemostexcitingthingformeaboutworkingontheproject.Byworking
togetherwecanbothincreasethequalityofmaterialsavailableforouruseandsavevaluabletime.Iinvite
youtojoinourcommunityandlookforwardtohearingfromyou.

365. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
JeffreyElkner
YorktownHighSchool
Arlington,Virginia

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 366.
19.7.3 GNUFreeDocumentationLicense
Version1.1,March2000
Copyright2000FreeSoftwareFoundation,Inc.
59TemplePlace,Suite330,Boston,MA021111307USA
Everyoneispermittedtocopyanddistributeverbatimcopiesofthislicensedocument,butchangingitisnot
allowed.

Preamble
ThepurposeofthisLicenseistomakeamanual,textbook,orotherwrittendocument"free"inthesense
offreedom:toassureeveryonetheeffectivefreedomtocopyandredistributeit,withorwithoutmodifying
it,eithercommerciallyornoncommercially.Secondarily,thisLicensepreservesfortheauthorandpublisher
awaytogetcreditfortheirwork,whilenotbeingconsideredresponsibleformodificationsmadebyothers.
ThisLicenseisakindof"copyleft,"whichmeansthatderivativeworksofthedocumentmustthemselves
befreeinthesamesense.ItcomplementstheGNUGeneralPublicLicense,whichisacopyleftlicense
designedforfreesoftware.
WehavedesignedthisLicenseinordertouseitformanualsforfreesoftware,becausefreesoftware
needsfreedocumentation:afreeprogramshouldcomewithmanualsprovidingthesamefreedomsthatthe
softwaredoes.ButthisLicenseisnotlimitedtosoftwaremanuals;itcanbeusedforanytextualwork,
regardless of subject matter or whether it is published as a printed book. We recommend this License
principallyforworkswhosepurposeisinstructionorreference.

19.7.3.a.1 ApplicabilityandDefinitions

ThisLicenseappliestoanymanualorotherworkthatcontainsanoticeplacedbythecopyrightholder
sayingitcanbedistributedunderthetermsofthisLicense.The"Document,"below,referstoanysuch
manualorwork.Anymemberofthepublicisalicensee,andisaddressedas"you."
A"ModifiedVersion"oftheDocumentmeansanyworkcontainingtheDocumentoraportionofit,
eithercopiedverbatim,orwithmodificationsand/ortranslatedintoanotherlanguage.
A "Secondary Section" is a named appendix or a frontmatter section of the Document that deals
exclusivelywiththerelationshipofthepublishersorauthorsoftheDocumenttotheDocument'soverall
subject(ortorelatedmatters)andcontainsnothingthatcouldfalldirectlywithinthatoverallsubject.(For
example,iftheDocumentisinpartatextbookofmathematics,aSecondarySectionmaynotexplainany
mathematics.)Therelationshipcouldbeamatterofhistoricalconnectionwiththesubjectorwithrelated
matters,oroflegal,commercial,philosophical,ethical,orpoliticalpositionregardingthem.
The"InvariantSections"arecertainSecondarySectionswhosetitlesaredesignated,asbeingthoseof
InvariantSections,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.
The"CoverTexts"arecertainshortpassagesoftextthatarelisted,asFrontCoverTextsorBackCover
Texts,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.
A"Transparent"copyoftheDocumentmeansamachinereadablecopy,representedinaformatwhose
specification is available to the general public, whose contents can be viewed and edited directly and
straightforwardlywithgenerictexteditorsor(forimagescomposedofpixels)genericpaintprogramsor(for
drawings) somewidelyavailabledrawing editor,and thatissuitableforinput to textformattersorfor

367. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
automatic translation to a variety of formats suitable for input to text formatters. A copy made in an
otherwiseTransparentfileformatwhose markuphasbeendesignedtothwartordiscourage subsequent
modificationbyreadersisnotTransparent.Acopythatisnot"Transparent"iscalled"Opaque."
ExamplesofsuitableformatsforTransparentcopiesincludeplainASCIIwithoutmarkup,Texinfoinput
format,\LaTeX~inputformat,SGMLorXMLusingapubliclyavailableDTD,andstandardconforming
simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary
formatsthatcanbereadandeditedonlybyproprietarywordprocessors,SGMLorXMLforwhichtheDTD
and/orprocessingtoolsarenotgenerallyavailable,andthemachinegeneratedHTMLproducedbysome
wordprocessorsforoutputpurposesonly.
The"TitlePage"means,foraprintedbook,thetitlepageitself,plussuchfollowingpagesasareneeded
tohold,legibly,thematerialthisLicenserequirestoappearinthetitlepage.Forworksinformatswhichdo
nothaveanytitlepageassuch,"TitlePage"meansthetextnearthemostprominentappearanceofthe
work'stitle,precedingthebeginningofthebodyofthetext.

19.7.3.a.2 VerbatimCopying

YoumaycopyanddistributetheDocumentinanymedium,eithercommerciallyornoncommercially,
providedthatthisLicense,thecopyrightnotices,andthelicensenoticesayingthisLicenseappliestothe
Documentarereproducedinallcopies,andthatyouaddnootherconditionswhatsoevertothoseofthis
License.Youmaynotusetechnicalmeasurestoobstructorcontrolthereadingorfurthercopyingofthe
copies youmake ordistribute.However, you may accept compensation inexchange for copies.Ifyou
distributealargeenoughnumberofcopiesyoumustalsofollowtheconditionsinSection3.
Youmayalsolendcopies,underthesameconditionsstatedabove,andyoumaypubliclydisplaycopies.

19.7.3.a.3 CopyinginQuantity

IfyoupublishprintedcopiesoftheDocumentnumberingmorethan100,andtheDocument'slicense
noticerequiresCoverTexts,youmustenclosethecopiesincoversthatcarry,clearlyandlegibly,allthese
CoverTexts:FrontCoverTextsonthefrontcover,andBackCoverTextsonthebackcover.Bothcovers
mustalsoclearlyandlegiblyidentifyyouasthepublisherofthesecopies.Thefrontcovermustpresentthe
fulltitlewithallwordsofthetitleequallyprominentandvisible.Youmayaddothermaterialonthecovers
inaddition.Copyingwithchangeslimitedtothecovers,aslongastheypreservethetitleoftheDocument
andsatisfytheseconditions,canbetreatedasverbatimcopyinginotherrespects.
Iftherequiredtextsforeithercoveraretoovoluminoustofitlegibly,youshouldputthefirstoneslisted
(asmanyasfitreasonably)ontheactualcover,andcontinuetherestontoadjacentpages.
IfyoupublishordistributeOpaquecopiesoftheDocumentnumberingmorethan100,youmusteither
includeamachinereadableTransparentcopyalongwitheachOpaquecopy,orstateinorwitheachOpaque
copy a publicly accessible computernetwork location containing a complete Transparent copy of the
Document, free of added material, which the general networkusing public has access to download
anonymouslyatnochargeusingpublicstandardnetworkprotocols.Ifyouusethelatteroption,youmust
takereasonablyprudentsteps,whenyoubegindistributionofOpaquecopiesinquantity,toensurethatthis
Transparentcopywillremainthusaccessibleatthestatedlocationuntilatleastoneyearafterthelasttime
youdistributeanOpaquecopy(directlyorthroughyouragentsorretailers)ofthateditiontothepublic.
Itisrequested,butnotrequired,thatyoucontacttheauthorsoftheDocumentwellbeforeredistributing
anylargenumberofcopies,togivethemachancetoprovideyouwithanupdatedversionoftheDocument.

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 368.
19.7.3.a.4 Modifications

YoumaycopyanddistributeaModifiedVersionoftheDocumentundertheconditionsofSections2and
3above,providedthatyoureleasetheModifiedVersionunderpreciselythisLicense,withtheModified
Version filling the role of the Document, thus licensing distribution and modification of the Modified
Versiontowhoeverpossessesacopyofit.Inaddition,youmustdothesethingsintheModifiedVersion:
UseintheTitlePage(andonthecovers,ifany)atitledistinctfromthatoftheDocument,andfromthose
ofpreviousversions(whichshould,iftherewereany,belistedintheHistorysectionoftheDocument).
You may use the same title as a previous version if the original publisher of that version gives
permission.
ListontheTitlePage,asauthors,one ormorepersonsorentitiesresponsibleforauthorshipofthe
modifications in the Modified Version, together with at least five of the principal authors of the
Document(allofitsprincipalauthors,ifithaslessthanfive).
StateontheTitlepagethenameofthepublisheroftheModifiedVersion,asthepublisher.
PreserveallthecopyrightnoticesoftheDocument.
Addanappropriatecopyrightnoticeforyourmodificationsadjacenttotheothercopyrightnotices.
Include,immediatelyafterthecopyrightnotices,alicensenoticegivingthepublicpermissiontousethe
ModifiedVersionunderthetermsofthisLicense,intheformshownintheAddendumbelow.
PreserveinthatlicensenoticethefulllistsofInvariantSectionsandrequiredCoverTextsgiveninthe
Document'slicensenotice.
IncludeanunalteredcopyofthisLicense.
Preservethesectionentitled"History,"anditstitle,andaddtoitanitemstatingatleastthetitle,year,
newauthors,andpublisheroftheModifiedVersionasgivenontheTitlePage.Ifthereisnosection
entitled "History" in the Document, create one stating the title, year, authors, and publisher of the
DocumentasgivenonitsTitlePage,thenaddanitemdescribingtheModifiedVersionasstatedinthe
previoussentence.
Preservethenetworklocation,ifany,givenintheDocumentforpublicaccesstoaTransparentcopyof
theDocument,andlikewisethenetworklocationsgivenintheDocumentforpreviousversionsitwas
basedon.Thesemaybeplacedinthe"History"section.Youmayomitanetworklocationforaworkthat
waspublishedatleastfouryearsbeforetheDocumentitself,oriftheoriginalpublisheroftheversionit
referstogivespermission.
Inanysectionentitled"Acknowledgements"or"Dedications,"preservethesection'stitle,andpreservein
thesectionallthesubstanceandtoneofeachofthecontributoracknowledgementsand/ordedications
giventherein.
PreservealltheInvariantSectionsoftheDocument,unalteredintheirtextandintheirtitles.Section
numbersortheequivalentarenotconsideredpartofthesectiontitles.
Deleteanysectionentitled"Endorsements."SuchasectionmaynotbeincludedintheModifiedVersion.
Donotretitleanyexistingsectionas"Endorsements"ortoconflictintitlewithanyInvariantSection.
If the Modified Version includes new frontmatter sections or appendices that qualify as Secondary
SectionsandcontainnomaterialcopiedfromtheDocument,youmayatyouroptiondesignatesomeorall
ofthesesectionsasinvariant.Todothis,addtheirtitlestothelistofInvariantSectionsintheModified
Version'slicensenotice.Thesetitlesmustbedistinctfromanyothersectiontitles.

369. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Youmayaddasectionentitled"Endorsements,"provideditcontainsnothingbutendorsementsofyour
ModifiedVersionbyvariouspartiesforexample,statementsofpeerrevieworthatthetexthasbeen
approvedbyanorganizationastheauthoritativedefinitionofastandard.
YoumayaddapassageofuptofivewordsasaFrontCoverText,andapassageofupto25wordsasa
BackCoverText,totheendofthelistofCoverTextsintheModifiedVersion.OnlyonepassageofFront
CoverTextandoneofBackCoverTextmaybeaddedby(orthrougharrangementsmadeby)anyone
entity.IftheDocumentalreadyincludesacovertextforthesamecover,previouslyaddedbyyouorby
arrangementmadebythesameentityyouareactingonbehalfof,youmaynotaddanother;butyoumay
replacetheoldone,onexplicitpermissionfromthepreviouspublisherthataddedtheoldone.
Theauthor(s)andpublisher(s)oftheDocumentdonotbythisLicensegivepermissiontousetheirnames
forpublicityforortoassertorimplyendorsementofanyModifiedVersion.

19.7.3.a.5 CombiningDocuments

YoumaycombinetheDocumentwithotherdocumentsreleasedunderthisLicense,undertheterms
definedinSection4aboveformodifiedversions,providedthatyouincludeinthecombinationallofthe
InvariantSectionsofalloftheoriginaldocuments,unmodified,andlistthemallasInvariantSectionsof
yourcombinedworkinitslicensenotice.
ThecombinedworkneedonlycontainonecopyofthisLicense,andmultipleidenticalInvariantSections
maybereplacedwithasinglecopy.IftherearemultipleInvariantSectionswiththesamenamebutdifferent
contents,makethetitleofeachsuchsectionuniquebyaddingattheendofit,inparentheses,thenameof
theoriginalauthororpublisherofthatsectionifknown,orelseauniquenumber.Makethesameadjustment
tothesectiontitlesinthelistofInvariantSectionsinthelicensenoticeofthecombinedwork.
Inthecombination,youmustcombineanysectionsentitled"History"inthevariousoriginaldocuments,
formingonesectionentitled"History";likewisecombineanysectionsentitled"Acknowledgements,"and
anysectionsentitled"Dedications."Youmustdeleteallsectionsentitled"Endorsements."

19.7.3.a.6 CollectionsofDocuments

YoumaymakeacollectionconsistingoftheDocumentandotherdocumentsreleasedunderthisLicense,
andreplacetheindividualcopiesofthisLicenseinthevariousdocumentswithasinglecopythatisincluded
inthecollection,providedthatyoufollowtherulesofthisLicenseforverbatimcopyingofeachofthe
documentsinallotherrespects.
You may extract a single document from such a collection, and distribute it individually under this
License,providedyouinsertacopyofthisLicenseintotheextracteddocument,andfollowthisLicensein
allotherrespectsregardingverbatimcopyingofthatdocument.

19.7.3.a.7 AggregationwithIndependentWorks

AcompilationoftheDocumentoritsderivativeswithotherseparateandindependentdocumentsor
works,inoronavolumeofastorageordistributionmedium,doesnotasawholecountasaModified
Version of the Document, provided no compilation copyright is claimed for the compilation. Such a
compilationiscalledan"aggregate,"andthisLicensedoesnotapplytotheotherselfcontainedworksthus
compiledwiththeDocument,onaccountoftheirbeingthuscompiled,iftheyarenotthemselvesderivative
worksoftheDocument.
IftheCoverTextrequirementofSection3isapplicabletothesecopiesoftheDocument,thenifthe

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 370.
Documentislessthanonequarteroftheentireaggregate,theDocument'sCoverTextsmaybeplacedon
coversthatsurroundonlytheDocumentwithintheaggregate.Otherwisetheymustappearoncoversaround
thewholeaggregate.

19.7.3.a.8 Translation

Translationisconsideredakindofmodification,soyoumaydistributetranslationsoftheDocument
underthetermsofSection4.ReplacingInvariantSectionswithtranslationsrequiresspecialpermissionfrom
theircopyrightholders,butyoumayincludetranslationsofsomeorallInvariantSectionsinadditiontothe
originalversionsoftheseInvariantSections.YoumayincludeatranslationofthisLicenseprovidedthatyou
alsoincludetheoriginalEnglishversionofthisLicense.Incaseofadisagreementbetweenthetranslation
andtheoriginalEnglishversionofthisLicense,theoriginalEnglishversionwillprevail.

19.7.3.a.9 Termination

Youmaynotcopy,modify,sublicense,ordistributetheDocument exceptasexpresslyprovidedfor
underthisLicense.Anyotherattempttocopy,modify,sublicense,ordistributetheDocumentisvoid,and
willautomaticallyterminateyourrightsunderthisLicense.However,partieswhohavereceivedcopies,or
rights,fromyouunderthisLicensewillnothavetheirlicensesterminatedsolongassuchpartiesremainin
fullcompliance.

19.7.3.a.10 FutureRevisionsofThisLicense

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation
Licensefromtimetotime.Suchnewversionswillbesimilarinspirittothepresentversion,butmaydiffer
indetailtoaddressnewproblemsorconcerns.See
http:///www.gnu.org/copyleft/.
EachversionoftheLicenseisgivenadistinguishingversionnumber.IftheDocumentspecifiesthata
particularnumberedversionofthisLicense"oranylaterversion"appliestoit,youhavetheoptionof
followingthetermsandconditionseitherofthatspecifiedversionorofanylaterversionthathasbeen
published(notasadraft)bytheFreeSoftwareFoundation.IftheDocumentdoesnotspecifyaversion
numberofthisLicense,youmaychooseanyversioneverpublished(notasadraft)bytheFreeSoftware
Foundation.

371. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Tartalomjegyzk
Bevezets...................................................................................................................................................................4
Azelsprogramozsinyelvkivlasztsa............................................................................................................5
APythonnyelvbemutatjaStfaneFermigier...................................................................................................6
Tbbklnbzverzi?.......................................................................................................................................7
APythonterjesztseBibliogrfia.......................................................................................................................8
Atanrnak,akioktatsisegdletkntakarjahasznlniaknyvet......................................................................9
Aknyvpldi...................................................................................................................................................10
Ksznetnyilvnts...........................................................................................................................................10
Afordtelszava..............................................................................................................................................11
1.Fejezet:Programozkntgondolkodni..............................................................................................................12
1.1Aprogramozs..............................................................................................................................................12
1.2Gpinyelv,programozsinyelv..................................................................................................................12
1.3Compillssinterpretls...........................................................................................................................14
1.4ProgramfejlesztsHibakeress(debug)...............................................................................................16
1.4.1Szintaxishibk.......................................................................................................................................16
1.4.2Szemantikaihibk.................................................................................................................................16
1.4.3Vgrehajtskzbenfellphibk........................................................................................................17
1.5Hibakeresssksrletezs...........................................................................................................................17
1.6Termszetessformlisnyelvek..................................................................................................................18
2.Fejezet:Azelslpsek.....................................................................................................................................20
2.1SzmolsaPythonnal...................................................................................................................................20
2.2Adatoksvltozk........................................................................................................................................22
2.3Vltozneveksfoglaltszavak.....................................................................................................................23
2.4Hozzrendels(vagyrtkads)...................................................................................................................24
2.5Vltozrtknekakirsa...........................................................................................................................25
2.6Avltozktpusadsa...................................................................................................................................25
2.7Tbbszrsrtkads....................................................................................................................................26
2.8Opertorokskifejezsek.............................................................................................................................27
2.9Amveletekprioritsa..................................................................................................................................28
2.10Kompozci.................................................................................................................................................29
3.Fejezet:Azutastsfolyamvezrlse.................................................................................................................30
3.1Utastsszekvencia.......................................................................................................................................30
3.2Kivlasztsvagyfelttelesvgrehajts........................................................................................................30
3.3Relcisopertorok.......................................................................................................................................32
3.4sszetettutastsokUtastsblokkok.........................................................................................................32
3.5Egymsbagyazottutastsok......................................................................................................................33
3.6APythonnhnyszintaktikaiszablya........................................................................................................33
3.6.1Azutastsoksablokkokhatraitasortrsdefinilja.....................................................................33

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 372.
3.6.2sszetettutasts=Fej,kettspont,behzottutastsokblokkja....................................................34
3.6.3Aspaceeketsakommenteketrendszerintfigyelmenkvlhagyjaazinterpreter...........................34
4.Fejezet:Ismtldutastsok............................................................................................................................35
4.1Ismteltrtkads..........................................................................................................................................35
4.2Ciklikusismtldsekawhileutasts.......................................................................................................36
4.3Tblzatkszts............................................................................................................................................38
4.4Egymatematikaisormegalkotsa................................................................................................................38
4.5Azelsscriptek,avagy:Hogyanrizzkmegprogramjainkat?...............................................................39
4.6kezetessspeciliskarakterekrevonatkozmegjegyzs:........................................................................41
5.Fejezet:Afadattpusok....................................................................................................................................43
5.1Numerikusadatok.........................................................................................................................................43
5.1.1Azintegerslongtpusok..........................................................................................................43
5.1.2Afloattpus......................................................................................................................................45
5.2Azalfanumerikusadatok..............................................................................................................................47
5.2.1Astring(karakterlnc)tpus...........................................................................................................47
5.2.2Hozzfrsegykarakterlncegyeskaraktereihez...............................................................................48
5.2.3Elemimveletekkarakterlncokon......................................................................................................49
5.3Alistk(elsmegkzelts)..........................................................................................................................51
6.Fejezet:Elredefiniltfggvnyek...................................................................................................................54
6.1Interakciafelhasznlval:azinput()fggvny........................................................................................54
6.2Fggvnymodulimportlsa.........................................................................................................................55
6.3Egykispihenaturtle(tekns)modullal.....................................................................................................57
6.4Egykifejezsigaz/hamisrtke....................................................................................................................58
6.5Ismtls..........................................................................................................................................................59
6.5.1AzutastsfolyamvezrlseEgyszerlistahasznlata....................................................................59
6.5.2AwhileciklusBegyazottutastsok.................................................................................................60
7.Fejezet:Sajtfggvnyek..................................................................................................................................63
7.1Fggvnydefinilsa....................................................................................................................................63
7.1.1Paramtereknlkliegyszerfggvny..............................................................................................64
7.1.2Paramteresfggvny...........................................................................................................................66
7.1.3Vltozargumentumknttrtnhasznlata.......................................................................................67
7.1.4Fggvnytbbparamterrel.................................................................................................................68
7.2Loklisvltozk,globlisvltozk..............................................................................................................69
7.3Igazifggvnyekseljrsok.................................................................................................................71
7.4Fggvnyekhasznlatascriptben.................................................................................................................73
7.5Fggvnymodulok.........................................................................................................................................74
7.6Paramterektpusadsa.................................................................................................................................79
7.7Alaprtelmezettrtkekadsaaparamtereknek.........................................................................................79
7.8Argumentumokcmkvel..............................................................................................................................80
8.Fejezet:Azablakoksagrafikahasznlata.......................................................................................................82

373. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
8.1Grafikusinterfaceek(GUI)..........................................................................................................................82
8.2ElslpsekaTkinterrel.............................................................................................................................82
8.3Esemnyvezreltprogramok.........................................................................................................................86
8.3.1Grafikusplda:vonalakrajzolsavszonra.........................................................................................88
8.3.2Grafikusplda:rajzokkzttivlts...................................................................................................91
8.3.3Grafikusplda:egyegyszerszmolgp...........................................................................................94
8.3.4Grafikusplda:egrkattintsdetektlsashelynekazonostsa...................................................96
8.4ATkinterwidgetosztlyai...........................................................................................................................97
8.5Agrid()metdusalkalmazsawidgetekpozcionlsra...........................................................................98
8.6Utastsokkomponlsaatmrebbkdrdekben.................................................................................102
8.7ObjektumtulajdonsgainakmdostsaAnimci..................................................................................104
8.8AutomatikusanimciRekurzivits.......................................................................................................107
9.Fejezet:Afileok..............................................................................................................................................110
9.1Afileokhaszna..........................................................................................................................................110
9.2Munkavgzsfileokkal...............................................................................................................................111
9.3FilenevekAktulisknyvtr....................................................................................................................112
9.4Aktimportforma......................................................................................................................................112
9.5Szekvencilisrsfileba............................................................................................................................114
9.6Fileszekvencilisolvassa.........................................................................................................................115
9.7Aciklusblvalkilpsreszolglbreakutasts....................................................................................116
9.8Szvegfileok..............................................................................................................................................117
9.9Klnbzvltozkmentsesvisszalltsa...........................................................................................119
9.10Kivtelkezels.Atryexceptelseutastsok......................................................................................120
10.Fejezet:Azadatstruktrkmlyebbtrgyalsa.............................................................................................123
10.1Akarakterlncoklnyege.........................................................................................................................123
10.1.1Konkatenci,ismtls.....................................................................................................................123
10.1.2Indexels,kivgs,hossz..................................................................................................................123
10.1.3Szekvenciabejrsa.Afor...in...utasts......................................................................................125
10.1.4Szekvencihoztartozs.Amagbanalkalmazottinutasts...........................................................126
10.1.5Astringeknemmdosthatszekvencik........................................................................................127
10.1.6Akarakterlncoksszehasonlthatk...............................................................................................128
10.1.7Akarakterekosztlyozsa................................................................................................................128
10.1.8Akarakterlncokobjektumok..........................................................................................................130
10.1.9Karakterlncokformzsa................................................................................................................132
10.2Alistklnyege.........................................................................................................................................134
10.2.1EgylistadefincijaHozzfrsazelemeihez.................................................................................134
10.2.2Alistkmdosthatk.......................................................................................................................135
10.2.3Alistkobjektumok..........................................................................................................................135
10.2.4Listamdostsraszolglhaladslicing(szeletelsi)technikk...........................................137
10.2.5Szmokbllllistaltrehozsaarange()fggvnnyel.................................................................139

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 374.
10.2.6Listabejrsaafor,range()slen()segtsgvel............................................................................139
10.2.7Adinamikustpusadsegykvetkezmnye....................................................................................140
10.2.8Mveleteklistkon...........................................................................................................................140
10.2.9Tartalmazsigazolsa.......................................................................................................................140
10.2.10Listamsolsa.................................................................................................................................141
10.2.11VletlenszmokHisztogrammok.................................................................................................143
10.3Atuplek....................................................................................................................................................146
10.4Asztrak..................................................................................................................................................147
10.4.1Sztrltrehozsa.............................................................................................................................147
10.4.2Mveleteksztrakkal......................................................................................................................148
10.4.3Asztrakobjektumok.....................................................................................................................148
10.4.4Sztrbejrsa..................................................................................................................................149
10.4.5Akulcsoknemszksgkppenstringek..........................................................................................150
10.4.6Asztraknemszekvencik............................................................................................................151
10.4.7Hisztogramksztsesztrsegtsgvel........................................................................................152
10.4.8Utastsfolyamvezrlssztrsegtsgvel....................................................................................153
11.Fejezet:Osztlyok,objektumok,attributumok..............................................................................................155
11.1Azosztlyokhaszna..................................................................................................................................155
11.2Egyelemiosztly(class)defincija........................................................................................................156
11.3Pldnyattribtumokvagyvltozk........................................................................................................157
11.4Objektumokargumentumknttrtntadsafggvnyhvskor..........................................................158
11.5Hasonlsgsegyedisg...........................................................................................................................158
11.6Objektumokblalkotottobjektumok........................................................................................................159
11.7Azobjektumokmintfggvnyekvisszatrsirtkei..............................................................................160
11.8Azobjektumokmdosthatk...................................................................................................................162
12.Fejezet:Osztlyok,metdusok,rkls........................................................................................................163
12.1Ametdusdefincija...............................................................................................................................163
12.2Aconstructormetdus........................................................................................................................165
12.3Osztlyoksobjektumoknvterei............................................................................................................169
12.4rkls......................................................................................................................................................170
12.5rklsspolimorfizmus.........................................................................................................................171
12.6Osztlyknyvtrakattartalmazmodulok................................................................................................175
13.Fejezet:Osztlyoksgrafikusinterfaceek...................................................................................................178
13.1Sznkdok:egyegysgbezrtproject...............................................................................................178
13.2Kisvast:rkls,osztlyokkzttiinformcicsere.......................................................................182
13.3OscilloGraphe:egytestreszabottwidget..........................................................................................185
13.4Kurzorok:egykompozitwidget........................................................................................................190
13.4.1AScalewidgetbemutatsa.........................................................................................................190
13.4.2Hromcursorosvezrlpanelksztse............................................................................................191
13.5Akompozitwidgetekbeptseegysszetettalkalmazsba..................................................................195

375. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.Fejezet:smgnhnywidget.....................................................................................................................202
14.1Ardigombok..........................................................................................................................................202
14.2Ablaksszelltsakeretekbl(frameekbl)..........................................................................................204
14.3Hogyanmozgassunkazegrrelrajzokat..................................................................................................206
14.4PythonMegaWidgetek.............................................................................................................................209
14.4.1ComboBox.................................................................................................................................209
14.4.2kezeteskarakterekbersravonatkozmegjegyzs....................................................................210
14.4.3ScrolledText...............................................................................................................................211
14.4.4ScrolledCanvas..........................................................................................................................214
14.4.5Eszkztrakbuborkhelppellambdakifejezsek.......................................................................217
14.5Ablakokmenkkel....................................................................................................................................220
14.5.1Aprogramelsvza:.......................................................................................................................221
14.5.2AZenszekmenhozzadsa.....................................................................................................223
14.5.3AFestkmenhozzadsa:.......................................................................................................225
14.5.4AzOpcikmenbeillesztse:...................................................................................................226
15.Fejezet:Konkrtprogramokelemzse...........................................................................................................231
15.1gyprbaj................................................................................................................................................231
15.1.1ACanon(gy)osztlyprototpusa............................................................................................233
15.1.2Metdusokhozzadsaaprototpushoz...........................................................................................236
15.1.3Azalkalmazsfejlesztse.................................................................................................................238
15.1.4Kiegsztfejlesztsek.....................................................................................................................243
15.2APingjtk...............................................................................................................................................247
15.2.1Azelv................................................................................................................................................247
15.2.2Programozs.....................................................................................................................................249
16.Fejezet:Adatbziskezels..............................................................................................................................254
16.1Adatbzisok...............................................................................................................................................254
16.1.1RelcisadatbziskezelrendszerekAkliens/servermodell.....................................................254
16.1.2AzSQLnyelvGadfly....................................................................................................................255
16.2EgyszeradatbzisksztseGadflyval..................................................................................................256
16.2.1Adatbzisltrehozsa.......................................................................................................................256
16.2.2Kapcsoldsegyltezadatbzishoz..............................................................................................257
16.2.3Keressegyadatbzisban.................................................................................................................258
16.2.4Aselectutasts................................................................................................................................260
16.3EgyMySQLkliensprogramvza.............................................................................................................261
16.3.1Azadatbzislersaegyalkalmazsknyvtrban............................................................................261
16.3.2Egyinterfaceobjektumosztlydefinilsa.....................................................................................263
16.3.3Formgenertorksztse..................................................................................................................266
16.3.4Azalkalmazsteste..........................................................................................................................267
17.Fejezet:Webalkalmazsok.............................................................................................................................269
17.1Interaktvweblapok...................................................................................................................................269

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 376.
17.2ACGIinterface.........................................................................................................................................270
17.2.1EgyalapCGIinterakci...................................................................................................................270
17.2.2EgyadatgyjtsreszolglHTMLform.........................................................................................272
17.2.3EgyadatkezelsreszolglCGIscript.............................................................................................273
17.3EgywebserverPythonban!......................................................................................................................274
17.3.1AKarrigellteleptse........................................................................................................................275
17.3.2Aserverindtsa:.............................................................................................................................275
17.3.3Egywebsitevz.................................................................................................................................276
17.3.4Sessionkkezelse..........................................................................................................................278
17.3.5Egybfejlesztsek............................................................................................................................282
18.Fejezet:Kommunikciahlzatonkeresztl..............................................................................................283
18.1Asocketek................................................................................................................................................283
18.2Egyelemiserverksztse........................................................................................................................284
18.3Egyelemiklienskonstrulsa...................................................................................................................286
18.4Tbbprhuzamostaskkezelsethreadek(szlak)segtsgvel..............................................................287
18.5Egyidejkldstsfogadstkezelkliens..............................................................................................288
18.6Tbbklienskapcsolatotprhuzamosankezelserver..............................................................................291
18.7gyprbajhlzativltozat...............................................................................................................293
18.7.1Serverprogram:ttekints.................................................................................................................294
18.7.2Kommunikcisprotokol.................................................................................................................294
18.7.3Serverprogram:elsrsz.................................................................................................................296
18.7.4Konkurensthreadekszinkronizlsazrolssal(threadlocks)................................................299
18.7.5Serverprogram:folytatssbefejezs.............................................................................................300
18.7.6Kliensprogram..................................................................................................................................303
18.8Threadek(szlak)alkalmazsaazanimcikoptimalizlsra..............................................................306
18.8.1Animcikksleltetseazafter()segtsgvel................................................................................306
18.8.2Animcikksleltetseatime.sleep()pel......................................................................................307
18.8.3Konkrtplda....................................................................................................................................308
19.Fejezet:Fggelk............................................................................................................................................310
19.1APythonteleptse...................................................................................................................................310
19.2TeleptsWindowsalatt............................................................................................................................310
19.2.1TeleptsLinuxalatt.........................................................................................................................310
19.2.2TeleptsMacOSalatt......................................................................................................................310
19.3ASciTE(ScintillaTextEditor)teleptse................................................................................................310
19.3.1TeleptsLinuxalatt:.......................................................................................................................311
19.3.2TeleptsWindowsalatt:.................................................................................................................311
19.3.3Aktverzihoz:...............................................................................................................................311
19.4APythonmegawidgetekteleptse.........................................................................................................311
19.5AGadflyteleptse(adatbzisrendszer)...................................................................................................312
19.5.1TeleptsWindowsalatt...................................................................................................................312

377. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
19.5.2TeleptsLinuxalatt.........................................................................................................................312
19.6Agyakorlatokmegoldsai........................................................................................................................313
19.7AHowtothinklikeacomputerscientistfggelknekkivonatai.....................................................363
19.7.1Contributorlist..................................................................................................................................363
19.7.2Preface...............................................................................................................................................365
19.7.3GNUFreeDocumentationLicense..................................................................................................369

GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 378.

You might also like