Vous êtes sur la page 1sur 378

GraceHopper,acompilerfeltallja:

Szmomra a programozs tbb mint alkalmazott tudomny. A programozs a tuds mlysgeibe vezet
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
InstitutS
t
JeanBerchmansS
te
Marie
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
a tnyt, hogy a klnbz emberek ugyanazokat a fogalmakat nem ugyanabban a sorrendben tanuljk meg.
Mindenekeltt a figyelemfelkeltsre trekedtnk sarra, hogy a kvetkez vezrelvekbetartsval akapukat
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
rendelkezsre ll adatszerkezetek bemutatsa eltt, mert megfigyelhet, az osztlyainkba rkez fiatalok
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
kerljn kapcsolatba mr ltez objektumokkal s osztlyknyvtrakkal. gy nagyon korn megtanulja, 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,aWindows hoz.Nemportbilisakmsopercis
rendszerekre(Unix,MacOS,stb.).Eznemilleszkedikabbaapedaggiaitervnkbe,hogyltalnos(sezrt
szertegaz) kpzst adunk, amiben az informatikai invarinsokat amennyire lehetsges nyilvnvalv
tesszk.
Ezrt gy dntttnk, hogy megnzzk az alternatv knlatot, vagyis amit a szabad szoftver mozgalom
1

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 ssze kell vele akadni. A baj csak az, hogy nagyon ijeszt s bonyolult,
tlsgosangpkzeli. Aszintaxisakevssolvashatsersen korltoz. Egy nagymret program megrsa
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
Msrszt ennekanyelvnekakorszergyakorlatagyakranfolyamodikalkalmazsgenertorokhozsms
nagyon fejlett segdeszkzkhz, mint amilyen a C++Builder, Kdevelop, stb. Ezek a programfejleszt
krnyezeteknagyonhatkonynakbizonyulhatnakgyakorlottprogramozkkezben,detlsgosansoksszetett
eszkztknlnaksolyanismeretekettteleznekfelafelhasznlrszrl,melyekkelegykezdnyilvnvalan
mgnemrendelkezik.Kzttk elvszakezd,nemltjaaftlazerdt,amiazzalaveszllyeljr,hogya
segdeszkzkelfedikanyelvalapmechanizmusait.EzrtaC/C++tksbbrehagyjuk.
Programozsi tanulmnyaink elejn szmunkra preferlhatbbnak tnik egy magasabb szint, kevsb
korltoz,jobbanolvashatszintaktikjnyelvhasznlata.NzzemegazolvasetrgykrbenJeffreyElkner
Howtothinklikeacomputerscientistknyvnekelszavt(lsda362.oldalt).
MiutnmegvizsgltuksegykicsitksrleteztnkaPerl sTcl/Tk nyelvekkel,vglanagyonkorszers
nvekvnpszersgnekrvendPythonmellettdntttnk.
APythonnyelvbemutatjaStfaneFermigier
2
.
APythonegyportbilis,dinamikus,bvthet,ingyenesnyelv,amilehetvtesziaprogramozsmodulris
sobjektumorientltmegkzeltst.1989tafejlesztiGuidovanRossumsszmosnkntes.
Anyelvjellemzi
Rszletezzkegykicsitanyelv,pontosabbanktjelenlegiimplementcijnakjellemzit:
APythonportbilis nemcsakklnbzUnixvltozatokra,hanemMacOS, 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.
A Pythonba mint a Javaba vagy a C++ jabb verziiba egy kivtelkezel rendszer van beptve, 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: mint a Tcl tvagya Guile t,a Pythont knnyenilleszthetjkmr meglv C knyvtrakhoz.
Felhasznlhatjukkomplexprogramnyelvekbvtnyelveknt.
AstandardPythonknyvtrsakiegsztpackageekvltozatosszolgltatsokattesznekhozzfrhetv:
stringeksregulriskifejezsek,standardUNIXszolgltatsok(fileok,pipeok,jelek,socketek,szlak,...),
internet protokolok (Web, News, FTP, CGI, HTML...), llandsg (persistence), adatbzisok s grafikus
interfaceek.
APythonfolyamatosanfejld 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
Learntoprogram usingPython, by AlanGauld, AddisonWesley Professional;, January152001, 288
pages,ISBN:0201709384
Python in a Nutshell, by Alex Martelli, 1st Edition, O'Reilly, March 2003, 654 pages,
ISBN:0596001886
Learning Python, by Mark Lutz, David Ascher, 2nd Edition, O'Reilly,December 2003, 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, 2nd Edition, 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: Howtothinklikeacomputerscientist kurzusa
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.
Ksznetilleti mindazokat,akikaPythonskiegszti,valamintadokumentcifejlesztsndolgoznak,
GuidovanRossummalkezvetermszetesen,deatbbieketsemkifelejtve(Szerencsretlsgosansokanvannak,
semhogyvalamennyiknevtfeltudnmittsorolni).
Ksznet illeti mg kollgimat Freddy Klichet, Christine Ghiott s David Carrerat a Ligei St. 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: Programozkntgondolkodni
3
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.
A szmtgp a bels mkdse sorn csakbinris szmokat tud kezelni. Minden ms tpus informcit
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).Aprogramozsinyelv nagyonpontosszablyokhozrendelt(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.
AzolvaselsprogramozsinyelvkntaPythontfogjamegtanulni.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, vagyis gy mkdtethetjk, hogy nem kell sokat vltoztatni rajta a klnbz gpeken vagy
opercis rendszereken. Egy alacsonyszint nyelven rt program mindig csak egy gptpuson tud mkdni.
Ahhoz,hogyegymsikgptpusonmkdjnteljesentkellrni.
13. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
1.3 Compillssinterpretls
Aprogramot,ahogyanaztegyszerkesztprogrammal(egyfajtaspecilizlt szvegszerkesztvel)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
Acompills 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
szmtgpszempontjblabytecode 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.
Abytecode portbilis.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)
A programozs nagyon sszetett s mint minden emberi tevkenysg sorn, ennek sorn is szmos hibt
kvetnkel.Anekdotaiokokblaprogramozsihibkatbug
4
oknaknevezzk.Adetektlsukrasjavtsukra
hasznlttechnikkegyttestdebugnaknevezzk.
Hromfletpushibaltezhetegyprogramban.Illendmegtanulnimegklnbztetniket:
1.4.1 Szintaxishibk
APythoncsakakkortudvgrehajtaniegyprogramot,haaszintaxisa 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, hogy els programozi lpseinket egy olyan interpetlt nyelvvel tesszk meg, mint a Python.
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 a poloskk. 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
A hibk harmadik tpust a vgrehajts kzben fellp hibk (Runtime error) kpezik. Ezek csak akkor
lpnek fel, amikor a program mkdse sorn specilis krlmnyek llnak el (pldul a program egy mr
nemltezfiletksrelmegolvasni).Ezeketahibkat kivteleknek (exception) ishvjk,mertezekltalban
jelzik,hogyvalamikivtelestrtnt(amitnemlttunkelre).Tbbszrfogunktallkozniilyentpushibval
amikoregyrenagyobbmretprojekteketfogunkprogramozni.
1.5 Hibakeresssksrletezs
Atanuls sorn elsajttandegyiklegfontosabbkszsg ahatkony programhiba keress (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.
Ha a jslatunk tvesnek bizonyul, akkor egy jabb hipotzist kell alkotnunk. Ahogyan azt Sherlock 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.
Pldul tudjuk, hogy a Linux egy tbb ezer kdsorbl ll opercis rendszer (teht egy nagy program).
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.
Pldul a 3+3=6 egy matematikailag korrekt brzolsmd, mg a $3=+6 nem az. Ugyangy a H
2
O kmiai
kpletkorrekt,deaZq
3
G
2
nem.
Aszintaxisszablyokatnemcsakanyelvszimblumaira(pldulaZqkmiaiszimblumnemmegengedett,
mertsemmilyenelemneksemfelelmeg),hanemazokkombinlsimdjraisalkalmazzuk.Ezrt,jlleheta6+=
+/5matematikai egyenlet csak megengedett szimblumokat tartalmaz, azonban azok inkorrekt elrendezse
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
megismteljk ugyanazt, hogy biztosak legynkbenne, hogy megrttettk magunkat). A formlis nyelvek
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:
A szveg jelentse egyrtelm s szszerinti. Tkletesen megrthet csak a szimblumok s a szerkezet
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(Linux
5
alatt)akvetkezjelenikmeg:
WindowsalattazIDLEfejlesztkrnyezetkinzeteazalbbikprehasonlt:
5 Windows alatt vlaszthatunk a Guido Van Rossum ltal rt IDLE fejlesztkrnyezet, amit magam elnyben
rszestek,saMarkHammondltalfejlesztett PythonWin kztt.Lteznekmskifinomult fejlesztkrnyezetekis,
mintakivlBoaConstructor (ezhasonlanmkdik,mintaDelphi),degyvlem,hogyeznemvalkezdknek.
TovbbifelvilgostsrtaPythonwebsiteotrdemesmegnzni.
LinuxalattinkbbaWindowMakergrafikuskrnyezetetrszestemelnyben(mintaKDEtvagyaGnomeot,amiktl
sokerforrstvesznek ignybe). MegnyitunkegyegyszerterminlablakotaPythoninterpreter indtshoz vagya
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,hogyaszmbaegytizedesponttesznk
6
.
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 digitalizlhat
7
), 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:
A vltoznv az (a z , A Z) betk s a (0 9) szmok sorozata, aminek mindig betvel kell
kezddni.
Csakazkezetnlklibetkamegengedettek.Aszkzk,aspeciliskarakterek,mintpl.:$,#,@,stb.
nemhasznlhatk.Kivtela_(alhzs).
Akissnagybetkklnbznekszmtanak.
Figyelem:Jozsef,jozsef,JOZSEFklnbzvltozk.gyeljnkerre!
Vljonszoksunkk,hogyavltozneveketkisbetkkelrjuk(akezdbettis
8
).Egyegyszerkonvencirl
van sz, de ezt szles krben betartjk. Nagybetket csak magnak a sznak abelsejben hasznljunk, 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
kifejezsek egyenrtkek.Egyolyan mveletet jellnek,amelykapcsolatotteremt a vltoznvsa vltoz
rtke(tartalma)kztt.
APythonbanszmosmsnyelvhezhasonlanahozzrendelsmvelettazegyenlsgjelreprezentlja
9
:
>>> 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,melyekbena 7 egszszm,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, hogy megrtsk, hogy itt semmifle egyenlsgrl sincs sz. Egy ms szimbolizmust is vlaszthattunk
volna,mintplduln<7,ahogyaneztgyakranmegteszikms,algoritmusokatlerpszeudonyelvekbenazrt,
hogyjelezzk,egytartalomnak(a7rtknek)egykontnerhez(avltozhoz)valhozzrendelsrlvansz.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 24.
2.5 Vltozrtknekakirsa
Afentigyakorlatkvetkezmnyeknthromvltoznkvan:n,msg,pi
Kt lehetsg van az rtkk kpernyre trtn kiratsra. Az els: a billentyzeten berjuk a
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 snhny msnyelvtartozik. 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 : a tizedesjegyeket tizedesponttal vlasztjuk el az egszrsztl, ahogy az az angol
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,automatikusanavalstpustrendeliaza sazegsz
tpustabvltozhoz.
A plda msodik sorban az j y vltozhoz rendeljk hozz egy kifejezs eredmnyt, ami a * , + s /
opertorokatkombinljaaza,b,3s5operandusokkal.Azopertorokspecilisszimblumok,amiketolyan
egyszermatematikaimveletekreprezentlsrahasznlunk,mintazsszeadsvagyaszorzs.Azoperandusok
azrtkek,amiketazopertoroksegtsgvelkombinlunk.
APythonmindenegyeskifejezstkirtkel,amitberunkneki,legyenazakrmilyenbonyolult senneka
kirtkelsnek az eredmnye mindig egyrtk. Ehhezazrtkhez automatikusan hozzrendel egytpust, 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,hogyegya szmoszthateegybszmmal. 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.
gyaz59*100/60kifejezsbenelszraszorzst,majdeztkveten,az 5900/60osztstvgziel,
aminekazeredmnyet 98.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 Utastsszekvencia
10
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 utasts a legegyszerbb ezek kzl a feltteles utastsok kzl. Ksrlet kppen rjuk be a Python
editorbaakvetkezktsort:
>>> a = 150
>>> if (a > 100):
...
Azelsutastsazavltozhozhozzrendelia150rtket.Eddigsemmijnincs.
Amikor viszont berjuk a msodik sort, azt tapasztaljuk, hogy a Python jfajta mdon viselkedik. Ha nem
felejtettk le a : karaktert a sor vgrl, akkor megllapthatjuk, hogy a fpromptot (>>>) most egy
msodlagosprompthelyettesti,amihrompontblll
11
.
Haazeditorunknemteszimegautomatikusan,akkormosttabullnunkkell(vagy4betkztkellrnunk)
mielttberjukakvetkezsort,gyhogyazazelzsorhozkppestbeljebblegyen(vagyisbelegyenhzva).
Kpernynknakvetkezknekkelllenni:
10 Jelenesetbenaszekvenciakifejezsegymstkvetutastsoksorozattjelli.Ebbenaknyvbeneztazelnevezst
egyPythonfogalomszmratartjukfnn,amimagbafoglaljaakarakterkncokat, tupleket s 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
Azolvasmr bizonyra kitalltaaz else (klnben)utasts egyalternatv vgrehajtsprogramozst
teszi lehetv, gy a programoznak kt lehetsg kztt kell vlasztani. Az elif (az else if sszevonsa)
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 egyenlsgjellel
12
. (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%opertoramoduloopertor:egyegszosztsmaradktszmolja.gypldul, a%2 a2vel
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
Pythonbanasorvgejel
13
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,hogyalkalmazzkasorugrsokatsabehzsokat is ablokkokjvizulis
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
betkzzelkelljobbraeltolvalennik
14
).Abehzsraakrmennyi
szkzt hasznlhatunk, a programok tbbsge a 4 tbbszrseit
alkalmazza.
Jegyezzkmeg,hogyalegklsblokknak(1.blokk)abalmargn
kelllenni(semmibesincsbegyazva).
3.6.3 Aspaceeketsakommenteketrendszerintfigyelmenkvlhagyjaaz
interpreter
A sor elejn lv a behzsra szolgl szkzktl eltekintve az 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=7 s 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, hogy kommentlja azt az osztlyban. Mivel egy megszokott mveletrl van sz, ezrt a programozsi
nyelvek gyakran egy rvidtst knlnak a vgrehajtsra (pldul specilis utastsokat, mint a Basic nyelv
SWAP utastsa). A Pythonban, a tbbszrs rtkads lehetv teszi ennek a csernek a rendkvl 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
azt az elz fejezetben megtanultuk, egyazon blokk valamennyi utastsnak azonos mrtkben kell behzva
lenni(vagyisugyanannyiszkzzelkelljobbraeltolvalennik).
Megkonstrultuk teht els programhurkunkat, ami bizonyos szm alkalommal megismtli a behzott
utastsokblokkjt.Ezakvetkezkppenmkdik:
AwhileutastsesetnaPythonazrjelbenlevfelttelkirtkelsvelkezdi.(Azrjelopcionlis.Csaka
magyarzatvilgossttelerdekbenhasznlom)
Haafelttelhamis,akkorakvetkezblokkotfigyelmenkvlhagyjasaprogramvgrehajtsbefejezdik
15
.
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,
amiawhilelalkirtkeltfelttelbenmegvltoztatjaegybeavatkozvltozrtktgy,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
AFibonacci sortagjaiugyanabbaasorbavannakkirva.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. Hogy segtsek ezt vilgosabb tenni, vegyk a fradsgot s rajzoljunk egy, az albbihoz hasonl,
llapottbltaFibonaccisorprogramunknak:
Vltozk a b c
Kezdrtkek 1 1 1
Aziterrcisorn
egymsutnfelvett
rtkek
1 2 2
2 3 3
3 5 4
5 8 5
... ... ...
Helyettest
kifejezsek
b a+b c+1
Egyilyentblzatbankzzelvgezzkelaszmtgpmunkjt,sorrlsorramegadvaazokatazrtkeket,
amiket az egyes vltozk az egymst kvet iterrcikban fl fognak venni. Azzal kezdjk, hogy a tblzat
tetejre felrjukaz rintett vltozk nevt. Akvetkez sorba ezen vltozk kezd rtkei kerlnek (azok az
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
eredmnyt egy tblzatba rja ki. A tblzatban a pzsszegek geometriai haladvny
szerintnvekedjenekgy,mintazalbbipldban:
1euro=1.65dollar
2euro=3.30dollar
4euro=6.60dollar
8euro=13.20dollar
stb.(16384euronlkellmegllni)
4.4. rjonegy programot, amikiregy12szmblllsorozatot, aminekmindentagja vagy
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
knyelmetlensggel jr: minden utastssorozat, amit bertunk helyrehozhatatlanul eltnik amikor lezrjuk az
interpretert.Mieltttovbbhaladnnkmegtanuljukprogramjainkmerevlemezenvagyfloppynlvfilebaval
mentst,hogyegymstkvetfzisokbanttudjukketdolgozni,msgpekrettudjukketvinni,stb.
Ehhezmostantlfogvavalamilyenszvegszerkesztvelfogjukazutastssorozatainkatszerkeszteni(pldul
LinuxalattJoeval,Nedittel,Katetel,...MSDOSalattEdittel,...WindowsalattWordpaddel,vagymgjobb
egyolyanfejlesztkrnyezetbeliszvegszerkeszt,mintazIDLEvagyaPythonWin).Tehtrunkegyscriptet,
amitaztnelmenthetnk,mdosthatunk,msolhatunk,stb.,mintbrmilyenmsszveget,amitaszmtgppel
kezelnk
16
.
16 Szvegszerkeszttazzalafelttellelhasznlhatnnk,hogyamentsttisztaszvegknt(plaintext)vgeznnk
(laptrdelsi tagek nlkl). Kvnatosabb azonban egy valdi inteligens ANSI szvegszerkesztt hasznlni,
mintamilyenaneditvagyazIDLE.EzekaPythonszintaxisnakmegfelelensznezikaforrsszveget,amisegti
aszintaxishibkelkerlst.AzIDLEben:File Newwindow(vagyCTRLN)valmegnyitunkegyjablakot,
amibeascriptnketfogjukrni.Avgrehajtshozascriptmentseutn:Edit Runscript(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.HaLinux alattgrafikusmdbandolgozunk,megnyithatunkegyterminlablakotsugyangy
jrhatunkel.AWindowsExplorerbenvagyaKonquerorbanscriptnkvgrehajtstamegfelelikonratrtn
egrkattintssalindthatjuk.
Ha az IDLElel dolgozunk, a szerkeszts alatt a <CtrlF5> billenty kombinci segtsgvel indthatjuk
scriptnket.Konzultljontanrvalazesetlegesmsindtsilehetsgekrlmsopercisrendszerekben.
4.6 kezetessspeciliskarakterekrevonatkozmegjegyzs:
A 2.3 verzitl kezdve a magyar nyelvet hasznlknak ajnlatosminden Python scriptjk elejre berni a
kvetkezpszeudocommentekegyikt(ktelezenazelsvagyamsodiksorba):
# -*- coding:Latin-2 -*-
vagy:
# -*- coding:Utf-8 -*-
EzekapszeudocommentekaztjelzikaPythonnak,hogyascriptben:
vagy af nyugateurpai nyelvek kezetes karakterkszlett hasznljuk (francia, olasz, portugl, stb.) egy
byteonkdolvaazISO8859normaszerint;
vagyaUnicodenaknevezettktbyteoskdolsthasznljuk(aminekazUtf8vltozatacsakaspecilis
karaktereket kdolja kt byteon, a standard ASCII karakterek egy byteon vannak kdolva). Ez az utbbi
rendszeregyrejobbankezdelterjedni,mivellehetvteszimindenfleeredet(grg,arab,ciril,japn,stb.)
41. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
karakteregyttltezstugyanabbanadokumentumban.
A Python mindkt rendszert tudja hasznlni, de meg kell neki adnunk, 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. rjonegy programot, amikiszmoljaegyderkszgparallelepipedontrfogatt, aminek
megvanadvaaszlessge,amagassgasahosszsga.
4.6. rjon egy programot, ami tszmolja a kiindulsknt megadott egszszm msodpercet
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,hogygy szeretnnkmdostaniazelzFibonacci 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?
Hanemhasznlnnkatype() fggvnyt,amimindenegyesiterrcialkalmvallehetvtesziab 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).
Azilyen tpusszmokkalvgzett szmolsok mindignagyon gyorsak, mert a szmtgpprocesszoraaz
ilyen32bitesegszszmokatkzvetlenlkpeskezelni.Viszont,hanagyobbszmokat,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).
Ha akezeltrtkekezekenahatrokonkvlesnek, 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, b sc integer tpusak,mertkisegszrtkeket:3,2s1: rendelnkhozzjuk.A8.
iterrcitlkezdveazonbana b s a automatikusanlongtpusakklesznek 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
tag az elz kt tag szorzata. A nyolcadik taggal messze meghaladjuk egy integer kapacitst. A kilencedik
taggal a Python automatikusan ttr a tudomnyos jellsmdra (e+n jelentse: szer tz az nediken). A
tizentdik tag utn jra egy (hibazenet nlkli) tmenet tanui vagyunk, a valban nagyon nagy szmokat
egyszereninf(vgtelen)jelli.
Afloattpusa10
308
s10
308
kzes(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,8+32
.
5.4. rjon egy programot, ami a bankban elhelyezett 4,3 % os kamatozs tke 20 v alatt
felhalmozdottvikamataitszmoljaki.
5.5. Egyrgiindiailegendaszerintasakkjtkotegyregblcstalltaki.Akirlymegakarta
aztnekiksznnisaztmondta,hogyjutalmulbrmilyenajndkotmegadrte.Azreg
aztkrte,hogyadjonnekiegykevsrizsetregnapjaira,pontosanannyiszemrizset,hogy
azltala feltallt jtkels kockjra1szemet,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 tpusadat brmilyenkaraktersorozat, amit vagy szimpla idzjelek (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
A karakterlncok az sszetett adatoknak nevezett ltalnosabb adattpus egy specilis esett kpezik. 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, hogy egy adott karakterhez hozzfrjnk, a karakterlncot tartalmaz vltoz neve utn 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
karakterlnc palindrom e (vagyis ami mindkt irnybl olvasva ugyan az), mint pldul
radarvagyss.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 50.
5.3 Alistk(elsmegkzelts)
Azelzfejezetbentrgyaltstringekazsszetettadatokravoltakazelspldk.Azsszetettadatokat arra
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']
Alen() belsfggvny,amivelmrastringeknltallkoztunk,alistkraisalkalmazhat.Alistbanlev
elemekszmtadjavissza:
>>> len(nap)
7

Egymsikbelsfggvnyadel()
18
segtsgvel(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).
18 Lteznekolyantechnikklistkfeldarabolsra,elemcsoportokbeszrsra,elemekeltvoltsra,stb.,amikegy
sajtosszintaxist hasznlnak, amelybencsakazindexekfordulnakel. Ezeketa(karakterlncokraisalkalmazhat)
technikkat ltalnosan slicingnek (szeletelsnek) hvjuk. gy hasznljuk ket, hogy a szgletes zrjelbe tbb
indexet runk. gya nap[1:3] a['kedd', 'szerda'] alcsoportot jelli. Ezeket aspecilis technikkat egy kicsit ksbb
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. sorban a modulo opertort hasznljuk, amivel mrelzlegtallkoztunk sami j szolglatokat
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
plda listjt)azrt, hogy kt jlistthozzonltre. Azegyikcsakazeredetilistapros
szmaittartalmazza,amsikapratlanokat.Pldul,haakiindulsilistaazelzgyakorlat
listja, akkoraprogramnakegyproslistt kellltrehoznia,amia [32,12,8,2] t
tartalmazzasegypratlanlisttami[5,3,75,15]ttartalmazza.Trkk:Gondoljon
azelzekbenemltettmodulo(%)opertorhasznlatra!
5.15. rjon egy programot, amiegyszavakbl lllistaelemeit egyenkntmegvizsgljaazrt,
hogyktjlistthozzonltre.(pldul:['Jean','Maximilien','Brigitte','Sonia','JeanPierre',
'Sandra']Azegyikben6karakternlrvidebbszavakatlegyenek,amsikban6,vagyannl
tbbkarakterttartalmazzonszavaklegyenek.
53. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
6.Fejezet: Elredefiniltfggvnyek
Aprogramozsbanazegyiklegfontosabbfogalomafggvny
19
fogalma.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, egykattintst azegyikgombra,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
hogyan fog a felhasznl dnteni. Ha a felhasznl egy stringet akar berni, akkor azt aposztrofok vagy
idzjelekkzttkellbernia.Aksbbiekbenmajdmegltjuk,hogyegyjscriptnekmindigellenriznikell,
hogyabertrtktpusamegfeleleannak,amitaprogrambanvrunk.
Ezrt scriptjeinkbengyakrana hasonl funkcij raw_input() fggvnyt fogjuk elnyben rszesteni, 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
Mrtallkoztunkanyelvbebeptettfggvnyek fogalmval,mintamilyenpldulalen() fggvny,amia
karakterlnc hosszt adja meg. Magtl rtetd, hogy nem lehet azsszes elkpzelhet fggvnyt a Python
standardbabelevenni,mivelezekblvgtelensokvan:egybknthamarosanmegfogjuktanulni,hogyanhozzuk
ltre magunk j fggvnyeket. A nyelvbe beptett fggvnyek szma viszonylag csekly: ezek azok, amik
nagyongyakranhasznlhatk.Atbbiekmoduloknaknevezettklnfileokbanvannakcsoportostva.
Amodulokteht fileok, amik fggvnycsoportokat fognakegybe. A ksbbiekben majdmegltjuk, 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.
Amath 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 a Python 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=. dda) db)dc)
aholdakerletfelt,a,b,cazoldalakhossztjelli).
6.3. rjonegyprogramot,amikiszmoljaegyadotthosszsgmatematikaiingaperidusidejt
Aperidusidszmolsraszolglformulaakvetkez: T=2n
.
l
g
,
ahol:lazingahosszasgaszabadessgyorsulsaaksrlethelyn.
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
nem tartalmaze vgtelen ciklust (lsd a
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
egy felttel igazsgrtkt, vagyismeg kell hatroznia, hogy a kifejezs igaz e vagy hamis. Pldul a 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, amitfelttlenlmegkell tanulnunk.Ismtlsl:azutastsblokkokat behzsok
hatroljk. Azelsif utastsutnpldulktbehzottsorvan,amikegyutastsblokkotdefinilnak. Ezekaz
utastsokcsakakkorhajtdnakvgra,haaznn[1]>maxfeltteligaz.
A kvetkez sor (az amelyik a msodik if utastst tartalmazza) viszont nincs behzva. Ez a sor teht
ugyanazon a szinten van, mint azok a sorok, melyek a program gerinct definiljk. Ezeknek a soroknak az
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.
Mdostsagy a programot, hogy az adja sszea 3nak vagy az 5nekaz a s bhatrok kz es
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
szmnak vagy a ngyzetgykt, vagy egy zenetet, ami jelzi, hogy ennek a szmnak 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 fejezdjn be, ha a felhasznl egy negatv rtket r be. Az gy bert jegyekkel
hozzonltreegylistt.Mindenjjegybersautn(tehtmindeniterrcinl)rassakia
bertjegyekszmt,alegnagyobbsalegkisebbjegyetsajegyektlagt.
6.16. rjonegyscriptet,amikt10000kgtmegtestkztthatgravitciserrtktratjaki.
A testek kztti tvolsgok 5 cm tl (0,05 m) kezdd geometriai sorozatot alkotnak,
melynekkvciense2.
Agravitcisertakvetkezsszefggsalapjnszmoljuk:
F=6,6710
11

mm'
d
2

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, amiket azutn kln vizsglunk. (Ezek az alproblmk esetleg tovbb
bonthatkmgegyszerbbalproblmkrasgytovbb).Fontos,hogyazalgoritmusokban
20
pontosanmutassuk
beeztadekompozcit,hogyazokvilgosakmaradjanak.
Msrsztgyakranelfordul,hogyugyanaztazutastssorozatottbbszrkellalkalmaznunkegyprogramban
snyilvnnemkvnjukaztrendszeresenmegismtelni.
Afggvnyek
21
sazobjektumosztlyok eltralprogramstruktrk,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
...
Fggvnynvnekanyelvfoglalt
22
szavaikivtelvelbrmilyennevetvlaszthatunkazzalafelttellel,hogy
semmilyenspecilisvagykezeteskaraktertsemhasznlhatunk(azalhzskarakter_megengedett).A
vltoznevekhezhasonlanfkntakisbetkhasznlatajavasolt,nevezetesenaszavakelejn(anagybetvel
kezddszavakatfennfogjuktartaniazosztlyokszmra,amiketaksbbiekbenfogunktanulmnyozni).
Adef utastsazif hezsawhile hozhasonlanegysszetettutasts.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
A fggvnyek els konkrt trgyalsakor megint interaktv mdban fogunk dolgozni. A Python interaktv
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.Figyeljkmegazrjeleket
23
,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
Ezekbena pldkban afggvny hvsakor zrjelben megadott rtk (az argumentum) automatikusan az
alapnevparamterhezvanrendelve.Afggvnytrzsbenazalapugyanaztaszerepetjtsza,mintbrmelyms
vltoz.Amikorberjukatabla(9)utastst,jelezzkagpnek,hogyatabla()fggvnytakarjukvgrehajtatniaz
alapnevvltozhozrendelt9rtkkel.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 66.
7.1.3 Vltozargumentumknttrtnhasznlata
Azelzktpldbanatabla()fggvnyargumentumamindegyikesetbenegykonstans(13illetve9)volt.Ez
egyltalnnemktelez. Fggvnyhvsbanhasznlt argumentumvltozislehet,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, hogy rasson ki ms tagokat. Ha csak ez a baj. gy javtunk rajta, hogy a 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)
24
tfoglalneki.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. Azalap szimblumottartalmaznvtrszigorancsakaszorzoTabla() belsmkdse
szmravanfenntartvasautomatikusanmegsznikmihelytafggvnybefejeztefeladatt.
Fggvnyenkvldefiniltvltozkagloblisvltozk. Tartalmuklthatafggvny 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
egy fggvny belsejben loklis vltozkknt vannak definilva, ami azt jelenti, hogy valamilyen mdon be
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 ki ugyanezt a gyakorlatot 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 eljrsok
25

(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
Egy kicsitkidolgozottabb pldakntmost mdostani fogjuknmileg a tabla() fggvnyt,amin mr sokat
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.Jelenesetbenazappend() 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).
Egyltaln nem szksges, hogy egy fggvny visszatrsi rtke hozz legyen rendelve egy
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
trfogattszmoljakiazismertformulasegtsgvel: V=
4
3
nR
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:
Nzzkjl meg, a programnak hrom rszevan: a kt fggvny: cube() s gombTerfogat(), valamint a
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__ foglalt szalattismerfel(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__ entitshv egyfggvnyt, amiegymsik fggvnyt hv.Ezegy nagyongyakori
helyzet a programozsban. Ha elfogadhat mdon szeretnnk megrteni, hogy mi trtnik egy programban,
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 kln el van trolva 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.
APython egy__doc__ nev(a "doc"sztketts''_''karakterveszikrl)specilisvltozban
helyezi elezt astringet, ami a fggvnyobjektumhozvanktve,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;
mert azimportltmodulneveascriptnkbenegyvltoznvvvlna,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. DefiniljonegydobozTerfogat(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 a legnagyobbat adja vissza. Pldul a: printmaximum(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
kt egymsra rajzolt egyenoldal hromszgbl ll. Ennek az j fggvnynek az elzleg definilt
haromszog()fggvnytkellhvni.Afprogramegycsillagsorozatotfograjzolni:
7.9. Definiljon egy karakterSzam(ca,ch) fggvnyt, ami visszaadja a ch stringben elfordul 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)
4
7.11. DefiniljonegyhonapNeve(n) fggvnyt,ami azvnedikhnapjnaknevtadjavissza.Pldula:
printhonapNeve(4)utastsnakazpriliseredmnytkelladni.
7.12. Definiljonegy inverse(ch) fggvnyt,ami brmilyen stringbenmegfordtjaa karaktereksorrendjt.
(Azinvertltstringetfogjavisszaadniahvprogramnak.)
7.13. Definiljonegy szavakSzama(mon) fggvnyt, ami a mon mondatban tallhat szavakszmt adja
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() fggvnymindegyik esetbenelfogadjaaz
tadottargumentumot,legyenazegyszm,egystring,egylistavagyppenegykifejezs.Ezutbbiesetbena
Pythonakifejezskirtkelsvelkezdisazeredmnytadjatargumentumkntafggvnynek.
7.7 Alaprtelmezettrtkekadsaaparamtereknek
Egy fggvnydefinciban lehetsges (s gyakran 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.
Ha ezt a fggvnyt csak az els argumentuma megadsval hvjuk, akkor a msodik egy 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 az egyik elz pldban definilt dobozTerfogat(x1,x2,x3) fggvnyt gy, 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. Mdostsaa fenti dobozTerfogat(x1,x2,x3) fggvnyt olymdon,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
megadja legnagyobb rtk elemet. Akezdo s vegso argumentumok adjk meg azt a kt indexet,
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 a Tkinter grafikus knyvtrat hasznljk, ami a kezdetben a Tcl nyelv szmra
fejlesztett Tk knyvtr egy adaptcija. Sok ms igen rdekes grafikus knyvtrat ajnlottak a Pythonhoz:
wxPython,pyQT,pyGTK,stb.LehetsgvanaJavawidgeteksaWindowsMFCkhasznlatrais.
EbbenajegyzetbenaTkinterrefogunkszortkozni,aminekszerencsrehasonl(singyenes)verziivannak
Linux,WindowssMacplatformokra.
8.2 ElslpsekaTkinterrel
Amagyarzathozfelttelezem,hogyaTkinter modulmrteleptvevan.Ahhoz,hogyafunkciithasznlni
tudjuk,ascriptvalamelyikelssornakegyimportutaststkelltartalmazni:
from Tkinter import *
A Pythonban nem mindig szksges scriptet rni. Interaktv mdban elindtva
szmos ksrletet vgezhetnk kzvetlenl parancssorban. A kvetkez pldban
egyegyszerablakothozunkltreskttipikuswidget
27
etkapcsolunkhozz: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, vagy magba az interaktv mdban mkd interpreterbe (vagyis kzvetlenl a parancssorba)
importlhatjuk. Ezt tesszk pldnk els sorban: fromTkinterimport* 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, de ezt egy kicsit ksbbre hagyom.
Az objektumot ltrehoz utasts egy egyszer rtkadshoz hasonlt. Azonban itt kt dolog trtnik
egyszerre:
egyjobjektumjnltre,(amisszetettlehetsezrttekintlyesmennyisgmemritfoglalhatle)
rtketadunkegyvltoznak,amiettlfogvaazobjektumhivatkozskntfogszolglni
29
.
28 Ha Windows alatt vgezzk ezt a gyakorlatot, akkor azt ajnlom, hogy inkbb DOSablakban, vagy IDLEben
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
argumentumokat adunk meg. Majd megltjuk, hogy egy osztly egyfajta kontner, amiben fggvnyek s
adatokvannaksszegyjtve.
Milyenargumentumokatadtunkmegehhezazinstancilshoz?
Azelsargumentum(abl1)aztadjameg,hogyamostltrehozottj widgetet egymrltezmsik
widgetfogjatartalmazni.Azutbbitazj widget masterwidgetjnek nevezzk, azabl1 widget a
tex1objektumtulajdonosa.(Aztismondhatjuk,hogyatex1objektumazabl1objektumslavewidget
je).
A kvetkez kt argumentum a widget pontos alakjnak meghatrozsra val. 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.
Apack() metdus rszeegy metduscsoportnak, aminekatagjai nemcsaka 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,mertezindtjaelazablakhozkapcsolt esemnyfogadt,
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.). Valamilyen esemny detektlsakor az illet esemnyt ler zeneteket kld azoknak a
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.)
Szvegmdprogrambanezahromszakasz aszemkztibralinerisszervezst
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
azilyenprogramesemnyvezrelt.Azinicializlsiszakaszutnazilyentpusprogram
vrakozsbamegytsrbzzamagtegymsik,tbbkevsbmlyenaszmtgpopercisrendszerbe
integrltsllandanmkdprogramra.
Ezazesemnyfogad llandnfigyeliaperifrikat(billentyzetet,egeret,rt,modemet,stb.) sazonnal
reaglr,haegyesemnytrzkel.
Egyilyenesemnylehetbrmilyenfelhasznliakci:azegrelmozdtsa,billentylenyomsa,stb.,deegy
belsesemny,vagyegyautomatizmusislehet(pldulrajel).
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 86.
Amikorazesemnyfogadrzkelegyesemnyt,akkoregyspecifikusjeletkldaprogramnak
30
,aminekazt
felkellismerni,hogyreagljonr.
Egy grafikus user interface program inicializlsi szakasza olyan utastsokbl ll, amik az interface
klnbz interaktv komponenseit helyezik el (ablakokat, gombokat, check boxokat, stb.). Ms utastsok a
kezelendzeneteketdefiniljk:eldnthetjk,hogyaprogramcsakbizonyosesemnyekrereagljonsatbbit
hagyjafigyelmenkvl.
Mgegy szvegesprogramban amkdsi szakaszolyanutastssorozatbl ll, ami elrelerja azta
sorrendet,ahogyanagpnekaklnbzfeladataitvgrekellhajtania(mghaklnbzvgrehajtsiutakrl
gondoskodunk is vlaszul a vgrehajts sorn add klnbz felttelekre), addig egy grafikus interface
programmkdsifzisbancsakfggetlenfggvnyekettallunk.Ezeketaprogramspecifikusanakkorhvja,
amikoregymeghatrozottesemnytrzkelazopercisrendszer:vagyisaztafeladatotvgzikel,amiterreaz
esemnyrevlaszulvrunkaprogramtlssemmimst
31
.
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 mkdst
32
, 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 az zeneteket gyakran WMmel jelljk (Window messages: Window zenetek) egy (reaktv znkat :
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
tbb konkurens pldny hajtja vgre. A ksbbiekben majd megltjuk, hogy ez nemkvnatos 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 metdusokkal
33
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 az esemnykezeltindt abl1.mainloop() utastssal fejezdikbe. 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 utasts teszilehetv.Egydarabig gy jrunkel(decsak azrt, 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 opertor hasznlatt (pldnkban az r vltoz rtkt 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
programvgrehajtsalatt 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,hogy azemltett
szmolgpnek valamennyi hasznlatos matematikai s tudomnyos fggvny (sin, cos, ngyzetgyk, stb.)
rendelkezsrelljon.
Ezutndefiniljukakiertekel() fggvnyt.Eztaprogramakkorfogjavgrehajtani,amikorafelhasznla
Return (vagy Enter) gombra kattint, miutn a ksbbiekben lert adatbeviteli mezbe bert valamilyen
matematikaikifejezst.
93. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Ez a fggvny a chain
34
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.Aget()
metdussallehetkiszedniamezowidgetblafelhasznlltalmegadottkarakterlncot.
Afprogramtartalmazzaazinicializlsiszakaszt,amiazesemnyfigyel(mainloop)indtsvalvgzdik.A
fprogrambanltrehozunkegyTk()ablakot,amiaLabel()classblltrehozottchainsazEntry()classbl
ltrehozottmezowidgetettartalmazza.
Figyelem:azrt,hogyamezowidgetvalbantennitudjaadolgt,vagyishogyaprogramnakttudjaadni
aztakifejezst,amitafelhasznlbert,abind()
35
metdussegtsgvelhozzkapcsolunkegyesemnyt:
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)
Elszrlerjukazobjektum 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.
Nemfogunk nagyonbelemerlni arszletekbe. Haaz olvas berja az albbiscriptet sksrletezikvele,
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, amiazegrpozcijt fogjatartalmazni akattints
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,amikormegprblunkportbilis programokat
rni(vagyisolyanokat,amikkpesekklnbzopercisrendszerekenmintaUnix,MacOSvagyWindows
futni),amiknekazablakaitmretezhetek.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 96.
8.5 Agrid()metdusalkalmazsawidgetekpozcionlsra
Eddigmindigapack()metdussegtsgvelhelyeztkelawidget
eket az ablakukban. Ennekametdusnakarendkvliegyszersgaz
elnye, azonban nem ad tl sok szabadsgot a widgetek kedvnk
szerinti elrendezshez. Mit kell pldul csinlni, hogy megkapjuk az
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() widgetdefinilsval sa 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()
Ebbenascriptbenapack() metdusta grid()delhelyettestettk.Lthat,hogyazutbbihasznlataigen
egyszer.Ezazablakotegytblzatnak(rcsnak)tekinti.Elg,hamegadjukneki,hogyatblzatmelyiksorba
(row)smelyikoszlopba(column)akarjukelhelyezniawidgeteket.Asorokatsoszlopokatgyszmozhatjuk,
ahogy akarjuk: kezdhetjk nulltl, vagy egytl, vagy akrmilyen szmtl. ATkinter 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, elg a grid() metdusnak egy argumentumot megadni. Asticky opcingy rtket
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. Az elskt oszlopoban33sor van, viszont a harmadikoszlopban lvkp valamilyen mdonlefedi a
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:
ATkinter nemteszilehetv,hogykzvetlenlszrjunkbekpetazablakba.Elszregyvsznat(canvas)
kellazablakbaelhelyeznisakpeterrekelltenni.Avszonnakfehrszntvlasztottamazrt,hogymeg
lehessenklnbztetniazablaktl.Haaztakarjuk,hogyavszonlthatatlannvljon,akkorabg='white'
paramteretbg='gray'velhelyettestsk.Miveltbbflekptpusltezik,ezrtaPhotoImage()
36
classbana
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
vszonnak azt az x s y koordintjt, ahov a kp kzppontjt kell tenni. (Mivel a vszon 160x160as
mret,ezrtakpetavszonkzeprecentrljaakoordintavlasztsunk).
3. Asoroksoszlopokszmozstagrid()metdusban:
Megllapthatjuk,hogyezalkalommalagrid()metdusbanasoroksoszlopokszmozsa1gyelkezddik
(nempedignullval,mintazelzscriptben).Amintmrfeljebbemltettem,aszmozsvlasztsateljesen
szabad.
Szmozhatnnkgyis:5,10,15,20...mertaTkinter figyelmenkvlhagyjaazressorokatsoszlopokat.
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() vagyplace))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:
Eddig gy hoztunk ltre klnbz objektumokat valamilyen osztlybl, hogy azokat minden alkalommal
vltozkhozrendeltkhozz.Pldulamikoraztrtuk,hogy:
txt1=Label(abl1,text='Elsmez:')
akkoraLabel()osztlyegypldnythoztukltre,amitatxt1vltozhozrendeltkhozz.
Atxt1 vltozvalerreapldnyrahivatkozhatunkascriptbenmindenhol.Valjbanazonbancsakegyszer
hasznljuk,mgpedigarra,hogyalkalmazzukragrid()metdust,mertaszbanforgwidgetnemegybmint
egyegyszercmke.Nemjavasolhatgyakorlatcsakazrtltrehozniegyjvltozt,hogyutnacsakegyszer(s
kzvetlenlaltrehozsautn)hivatkozzunkr,ugyanisavltozfeleslegesenfoglallememriaterletet.
Ha ilyen helyzet ll el, akkor blcsebb dolog sszetett utastsokat alkalmazni. Pldul a kvetkez kt
utastst:
osszeg=45+72
printosszeg
inkbbegyetlensszetettutastssalhelyettestjk:
print45+72
gymegtakartunkegyvltozt.
Ugyangy, amikor olyan widgeteket helyeznk el, amikreksbb nem kvnunk visszatrni, ami gyakran
elfordul a Label() osztly widgetjei esetben, akkor azok ltrehozsakor ltalban egyetlen sszetett
utastsbankzvetlenlalkalmazhatkapozcionlmetdusok(agrid(),pack()vagyplace()).
Ez csak azokra a widgetekre vonatkozik, amikre a ltrehozsuk utn tbbet nem hivatkozunk. 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.
A valsgban az utasts ltrehozta az Entry() osztlybl az j widgetet s a pack() metdus elvgezte az
ablakbeli pozcionlst, de a mezo vltozba a pack() metdus visszatrsi rtkt trolta: ez pedig nem a
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 oszlopok
37
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:ltrehozunkegyabl1 ablakot,ebbenelhelyeznkegyvsznat,
amin egyszneskr, st vezrlgomb van. Vegyk szre, hogy a nyomgomb widgeteket nem rendeljk
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. hogytrljkketegyadott helyen, majd egy kicsit tvolabb jrarajzoljukket. Ezzel szemben az
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 rszre az gitestek tmegt valamint a
tvolsgsklt).EbbenagyakorlatbanNewtongravitcistrvnytkellalkalmazni(lsda62.oldalon
a42.gyakorlatotsafizikatanknyvet).
8.13. Avsznonaz egrkattintst detektl programtlett felhasznlvamdostsaafentiprogramotgy,
hogycskkentseagombokszmt:egygitestelmozdtshozlegyenelgazgitestetkivlasztaniegy
gombbal,majdavszonrakattintani,hogyakivlasztottgitestarraahelyrekerljn,ahovkattintott.
8.14. Azelzprogrambvtse.Jelentsenmegegyharmadikgitestetsmindigrassaki mindenegyes
gitestre a hat eredk erjt (mindegyik gitest mindig a msik kett ltal kifejtett gravitcis er
hatsaalattll!).
8.15. Ugyanazagyakorlat,mintazelz,ktelektromostltssel(Coulombtrvny).Adjonlehetsgeta
tltseljelnekmegvlasztsra!
8.16. rjonegyprogramot,amimegjelentegyablakotktmezvel:azegyikrjakiahmrskletetCelsius
fokban,amsikugyanaztahfokotFahrenheitfokban.Akthmrskletbrmelyiktmegvltoztatva
amsikmegfelelenmdosuljon.Aztvltshoza T
F
=T
C
1,80+32 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
gyalogtkelhelyet reprezentlnak. Helyezzenel ngy szneskrt, amik agyalogosoks ajrmvek
kzlekedsi lmpit reprezentljk. A nyomgombra trtn minden egyes kattintsra a lmpknak
szntkellvltani:
8.22. rjonegyprogramot,amiegyvsznatjelentmeg,amireegyegyszerelektromosramkrvanrajzolva
(feszltsgforrs + kapcsol + ellenlls). Az ablakban legyenek adatbeviteli 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
ATkinter grafikus interfaceszel val els tallkozsunk sszegzseknt nzzk meg az utols animcis
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.Nyilvngyegy vgtelenciklustkapunk,hacsaknem
gondoskodunkelrevalamilyeneszkzrl,hogymegszaktsukazt.
Nzzk,hogyanmkdikezapldnkban:
Amove() fggvnytelszr az Indtgombra valkattintskorhvjaa program. Afggvny elvgzi a
feladatt(vagyispozcionljaalabdt)majdegykissznetutnnmagthvja.Elvgzifeladatt,majdegykis
sznetutnjrahvjanmagtsezgymegytovbbavgtelensgig...
Legalbbiseztrtnne,haelvigyzatossgblnemtettnkvolnavalahovahurokbaegykilpsiutastst.
Egyegyszerfelttelvizsglatrlvansz:mindeniterrcisciklusbanmegvizsgljukegyifutastssegtsgvel
aflagvltoztartalmt.Haa flagvltoztartalmanulla,akkoraciklustbbetnemfutlesazanimcilell.
Mivel a flag vltoz egy globlis vltoz, ezrt ms fggvnyek segtsgvel knnyen megvltoztathatjuk az
rtkt.Azokkalafggvnyekkel,amiketazIndtsLelltgombokhozkapcsoltunk.
gyegyegyszermechanizmustkapunkazanimciindtsraslelltsra:
AzelskattintsazIndtgombraegynemnullartketrendelaflag vltozhoz,majdrgtnkivltjaa
move() fggvnyelshvst.Ezvgrehajtdiksezutnminden50secundumbanmindaddighvjanmagt,
amgaflag nullvnemvlik.HatovbbkattintgatunkazIndtgombra,aflag rtken,desemmiegyb
nemtrtnik,mertamove() hvsracsakakkorkerlsor,haaflag rtke1.gyelkerljktbb,konkurrens
ciklusindtst.
ALelltgombvisszalltjaaflagrtktnullrasaciklusmegszakad.
Gyakorlatok:
8.23. Trlje a start_it() fggvnyben az if flag == 0: utastst (s az azt kvet kt sort). 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. Az elz scriptekbl mostmr tud rni egy jtkprogramot, ami a kvetkez kppen mkdik : Kis
sebessggel vletlenszeren mozog egy labda a vsznon. A jtkosnak meg kell prblni az egrrel
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
hosszabb lesz s egy j zskmny jelenik meg valahol. A jtk akkor fejezdikbe, amikora kgy
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
Az eddigi programjaink csak nagyon kevs adatot kezeltek. gy mindig kdolni tudtuk ket (pldul egy
listt)aprogramba.Ezazeljrsazonbanalkalmatlannagymennyisgadatkezelsre.
Kpzeljkpdulel,hogyegygyakorlprogramotakarunkrni,amiakpernyretbbvlasztsoskrdseket
rkisautomatikusankezeliafelhasznlvlaszait.Hogyanfogjuktrolniakrdsekszvegt?
A legegyszerbb elkpzels: a program elejn rtkad utastsokkal mindegyik szveget egy vltozban
troljuk.Pldul:
a = "Quelle est la capitale du Guatmala ?"
b = "Qui succd Henri IV ?"
c = "Combien font 26 x 43 ?"
... etc.
Sajnosezegynagyonleegyszerstelkpzels. Mindenbonyolulttfogvlni,amikormegprbljukmajd
folytatni a programot, vagyis azokat az utastsokat megrni, amiknek vletlenszeren kell kivlasztani egyik
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
okatazaktulisknyvtrban 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,vagyWindows
38
bandolgozunk.
>>> 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:
Vagyezeketaparancsokatszrjukbeascript elejre, 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
A pldaelssora teljesegszben importljaaz os modult, ami szmos fggvnyt tartalmaz azopercis
rendszer elrshez. A msodik sor az os
39
modul 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 *
Ezazimportlsimdmegknnytiakdrst.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 A szepartor pont itt tartalmazsi relcit fejez ki. Egy minstett nvmegadsi formrl 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
A Pythonbanafileokhozval hozzfrstegy kzbens fileobjektum biztostja, amit az open() bels
fggvny segtsgvel hozunk ltre. Ennek a fggvnynek a hvsa utn a fileobjektum specilis metdusait
hasznlvaolvasnisrnitudunkafileban.
Azalbbipldabemutatja,hogyannyitunkmegegyfiletrsra,jegyznkbektkarakterlncot,majd
zrjuk le a filet. Jegyezzk meg, hogy ha a file mg nem ltezik, akkor automatikusan ltre lesz hozva. 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 a megnyitand 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(ezrtbeszlnkszekvencilis hozzfrsfilerl).Awrite()
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:
sajatFile annaka filenaka neve, amit olvasniakarunk.Afilet megnyitutastsnak szksgszeren
hivatkoznikellerreanvre.Hanemltezikafile,akkoregyhibazenetetkapunk.Plda:
>>>ofi=open('sajatFile','r')
IOError:[Errno2]Nosuchfileordirectory:'sajatFile'
Viszontsemmilyenkiktstsemtettnkafileobjektumnevnekmegvlasztsravonatkozan.Ezegy
tetszlegesvltoznv.gyazelsutastsunkbanegyofinevfileobjektumothoztunkltre,amiazolvassra
(rargumentum)megnyitottsajatFilevaldifilerahivatkozik.
Akt bert string most egyetlenstringknt vanafileban. Ezgy termszetes, mivel semmilyenelvlaszt
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.Aztistudjuk
40
,hogyaPythonmindennulltlklnbznumerikusrtketigaznaktekint.
Az gymegalkotott while ciklusvgtelen ciklus,mert a folytatsnak afelttelemindig igaz. 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 karakter
41
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 \n sorvge jelzseket szrunk be azokra a helyekre, ahol el akarjuk
egymstlvlasztaniaszvegsorokat.Enlklamarkernlklakaraktereketegymsutn rnnkkiafileba,
mintazelzpldkban.
Azolvassimveletekalattaszvegfilesoraiklnklnnyerhetkvissza.Areadline() 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.
A kvetkez scriptaztmutatja be, hogyan lehet egyolyan fggvnyt definilni, amivelegy szvegfileon
bizonyos feldolgozsi mveletet lehet vgrehajtani. Jelen esetben arrl van sz, hogy gy msolunk t egy
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
Awrite() 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...
Az ilyen fajta problmkra tbbfle megolds van. Az egyik legjobbmegolds az, hogy importlunkegy
specializltPythonmodult:apickle
42
modult.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, mint az elz pldban. Apickle modul dump() fggvnye kt argumentumot vr: az els a
mentend vltoz neve, a msodik a fileobjektum, amibe menteni fogjuk a vltoz rtkt. Apickle.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:
Atry tkvetutastsblokkotaPythonfelttelesenhajtjavgre.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>
t hasznlva a sorok elvlasztsra. A bers befejezseknt elg egy res sort bevinni (vagyis elg
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. Az A s B mr ltez fileokbl konstruljon egy harmadik C filet, ami felvltva tartalmaz egyegy
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 stuplekisrszei.Aszekvencikonegysorhasonlmveletetvgezhetnk.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. Ms nyelvekbennemmindiglehetsgesaz operator overloading: ezrtpldul az
sszeadsraskonkatenciraklnbzszimblumokatkellhasznlnunk.
10.1.2 Indexels,kivgs,hossz
Astringekkaraktersorozatok.Aszekvencibanmindegyikkarakternekpontoshelyevan.APythonbanmindig
ugyangy indexeljk (sorszmozzuk) egy szekvencia elemeit: nulltl kezdden. Ahhoz, hogy a string egy
karakterhezhozzfrjnk,elgszgleteszrjelbenmegadniazindext:
>>> nom = 'Cdric'
>>> print nom[1], nom[3], nom[5]
r c
Amikoregystringgel dolgozunk, azisnagyongyakran megtrtnik, hogy kiakarunk venni egy hosszabb
stringblegykisebbdarabot.APythonerreaslicing (darabols/kivgs)naknevezettegyszertechnikt
knlja.Ezabblll,hogyszgleteszrjelekkzttmegkelladniaszeletelejtsvgt,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, ha a msodik index kisebb, mintaz els, vagy ha a msodik index nagyobb, mint a string
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. rjon egy karakterszam() fggvnyt, ami megszmolja, hogy egy karakter hnyszor fordul el egy
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, amibenaz iterrcis lpsben rsztvev karakter indext trolnnk. Acaract vltoz egyms
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. Pldul felhasznlhatjuk az in t annak igazolsra, 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,amikawhile utaststhasznlvaegyklasszikusprogramhuroksegtsgvelugyanezta
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,
vagy kisbet, vagy mg ltalnosabban, ha meg tudjuk hatrozni, hogy egy szmrl, vagy ms
tipogrfiaikarakterrlvansz.
Termszetesentudunkrniolyanfggvnyeket,amikelvgzikeztafeladatot.Azelslehetsgazinutasts
hasznlata,amintaztazelzfejezetbenlttuk.Mivelmostmrtudjuk,hogyakarakterekazASCIIkdban
egy rendezettsorozatot alkotnak,ezrtfeltudunkhasznlnimsmdszereketis. Pldul az albbi
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. rjonegy fggvnyt, aminek akkorigaz avisszarsi rtke,ha azargumentumaegyalfabetikus
karakter(nagyvagykisbet).Alkalmazzaebbenazjfggvnybenazelzekbendefinilt kisbetu()
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
leghasznosabbakkzl
44
:
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.
Ekurzuskeretben nemlehet azsszesmetdustsa paramterezsketlerni. Ha azolvastbbetakar
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
Akarakterlncokkalkapcsolatosfggvnyekvilgbantettkalandozsunkbefejezseknthasznosnaktnik
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 markeregy szmot vr saztegssz alaktja t;a %f s %g markerekvals
szmokatvrnaksmegtudjkhatrozniakirsszlessgtspontossgt.
Azsszesformzsilehetsglersameghaladjaeknyvkereteit.Haegyspecilisformzsravanszksge,
nzzemegaPythononlinedokumentcijt,vagyegyspeciliskziknyvet.
131. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Gyakorlatok:
10.21. rjonegyscriptet,amimegszmoljaegyszvegfilebananumerikuskarakterekettartalmazsorokat.
10.22. rjonegyscriptet,amiegyszvegfilebanmegszmoljaaszavakat.
10.23. rjonegy scriptet, amitmsolegy szvegfilet, mikzbengyel arra,hogyminden sor nagybetvel
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() egyrtket 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. Van egy egsz szmokat tartalmaz lista, amiben egyes szmok tbbszr is elfordulnak. rjon egy
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. rjon egy scriptet, ami kiratja egy cstrtki nappal kezdd kpzeletbeli v napjainak a listjt. A
scriptben hrom lista lesz: az egyik a ht napjainak a neveit fogja tartalmazni, a msik a hnapok
neveit, a harmadik pedig hogy hny naposak a hnapok (a szkveket nem vesszk figyelembe).
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
Amint emltettem, egy beptett utastssal (del) trlhetnk egy elemet egy listbl, illetve egy beptett
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,hogyaszavak[1] elem nemlista(ezasajt karakterlnc),mgaszavak[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,
aTO azutols(vagyinkbbazutols+1),saSTEP 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), a for utastssal hasznlt vltoz tpusa a bejrs folyamn
folyamatosanjravandefinilva.Mgakkoris,haegylistaelemeiklnbztpusak,afor segtsgvelgy
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,hogymegmutassamazitemvltoztnyleg
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, hogy vanegyfable nevlistnk, amittszeretnnk msolnia phrase nev j vltozba. 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: elszr hozzunk ltre egy csupa nullkat tartalmaz B listt, aminek a mrete
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.Adeterminizmusbiztosanjdolog: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
teszikavletlentbbkevsbjszimulcijt.Knyveketrtakazokrlazeszkzkrl,amikavletlentj
minsgben produkljk. Nyilvn nem fogom most ezt a krdst kifejteni, de az olvast semmi sem
akadlyozzamegabban,hogyetrgykrbenkonzultljonamatematikatanrval.
APythonrandom moduljaegszsorklnbzeloszlsvletlenszmokatgenerl fggvnytknl.
Csaknhnyatfogunkmegvizsglnikzlk.Azonlinedokumentcibanlehetatbbit megnzni.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
res listbl lpsrllpsre hozza ltre (azaz ne egy mr meglv lista nulla elemeit helyettestse,
ahogyanaztazelbbtettk).
10.42. rjonegylista_nyomtatas()fggvnyt,amisoronkntrjakiegytetszlegesmretlistasszeselemt.
Alistanevtargumentumkntkellmegadni.Hasznljaeztafggvnyta veletlen_lista()fggvnnyel
generltvletlenszmokkinyomtatsra.gypldulazlista_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/10
e
ekzttirtkre.
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.
PldulelszrmegprblhatnnkdefinilniegynumeroFraction() 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.
Ha elg ideje van, akkor megcsinlhatja ennek a programnak a grafikus vltozatt, ami az eredmnyeket
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 tuple
45
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.
A sztrak egy msik sszetett adattpust kpeznek. Bizonyos fokig a listkra emlkeztetnek
(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'}
Az elzsorban megfigyelhetjk:formailag egysztrelemekvesszvel elvlasztott sorozatakntjelenik
meg (amit kapcsos zrjelek vesznek krl). Mindegyik elem egy objektumprbl ll: egy indexbl s egy
rtkbl,amiketkettspontvlasztel.
Azindexeketkulcsnak,azelemeketpedigkulcsrtkproknakhvjuk.Megllapthatjuk,hogyazasorrend,
amiben azelemekazutolssorban megjelennek,nemfelel megannak asorrendnek, amiben megadtukket.
Ennek semmilyen komoly kvetkezmnye sincs: rtkhez sose fogunk numerikus indexszel hozzfrni a
sztrban.Ehelyettkulcsokatfogunkhasznlni:
>>> print dico['mouse']
egr
Ha viszont egy sztrhoz j elemet akarunk hozzfzni, elg egy j kulcsrtk prt kpezni, szemben a
listkkal,melyekesetnegyspecilismetdust(azappend()et)kellhvnunk.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 146.
10.4.2 Mveleteksztrakkal
Mostmrtudjuk,egysztrhozhogyanadhatunkhozzelemeket.Elemtrlsreadel utaststhasznljuk.
Pldaknthozzunkltreegymsiksztrat,amimostegygymlcsraktrleltrtfogjatartalmazni.Akulcsok
(vagy indexek) a gymlcsnevek lesznek s azelemek rtkei a raktrozott gymlcsk tmegei lesznek (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
Eddig olyan sztrakat mutattam be, amiknek a kulcsai minden alkalommal string tpus rtkek voltak.
Hasonl mdon, kulcsknt hasznlhatunk brmilyen nem mdosthat adattpust: egszeket, vals szmokat,
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
nemmentalistkkal
46
:
>>> 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, melyekbe gyakran kell tetszleges sorrendben adatokat beszrni vagy trlni. Jl helyettestik 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
mindegyik sz pontos helyt (a szveg elejtl karakterpozciban szmolva) bejegyzi egy sztrba.
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.
Most azt vizsgljuk meg, mi magunk hogyan definilhatunk j objektumosztlyokat. A tma viszonylag
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
Az osztlyok az objektum orientlt programozs (Object Oriented Programming vagy OOP) f eszkzei.
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,mrmegrt programrszeketlehetismteltenfelhasznlni(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, mint afggvnyek. Viszont tudjunk rla, hogyazosztlyok praktikuss
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.APythonbanapontreprezentlsrafloat tpuskoordintkatfogunkhasznlni. 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
kvet els sor egy karakterlnc, akkor azt kommentnek tekinti a Python s automatikusan begyazza az
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.Hozzunkltrepldulegyjp9
47
objektumot:
>>> p9 = Pont()
Ap9vltozegyjPont()objektumhivatkozsttartalmazza.Aztismondhatjuk,hogyap9egyjpldnyaa
Pont()osztlynak.
Figyelem: utastsban hvott osztlyt mindig zrjeleknek kell kvetni a fggvnyekhez hasonlan (mg
akkor is, ha semmilyen argumentumot sem adunk meg). A ksbbiekben majd megltjuk, hogy az osztlyok
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 APythonbanegyszerrtkad utastssal hozhatunkltreegyobjektumot. Msnyelvek egyspecilisutastst
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 rendszer
48

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 objektumx attribtumakztt.Ap9 objektumnaksajtnvterevan,ami
fggetlenazxvltozttartalmazfnvtrtl.
Fontosmegjegyzs:
Lttuk,hogyegyszerrtkadutastssalmintap9.x=3.0 nagyonknnyhozzadniegyattribtumot
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
A fggvnyek hasznlhatjk paramterekknt az objektumokat (visszatrsi rtkknt is megadhatnak egy
objektumot).Pldulakvetkezmdondefinilhatunkegyfggvnyt:
>>> def kiir_pont(p):
print "vzszintes koord. =", p.x, "fgg leges koord. =", p.y
AfggvnypparamternekegyPont()tpusobjektumnakkelllenni,mertakvetkezutastsap.xsp.y
pldnyvltozkat hasznlja. Ezrt a fggvny hvsakor argumentumknt egy Pont() tpus objektumot kell
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).
Az eredmnynulla(ami aztjelenti, hogy azrjelbenlv kifejezshamis:teht nemll fennegyenlsg).
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.Ap1sp2vltozkaliasaik
49
egymsnak.
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.Adoboz.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). Ms nyelvek vilgos klnbsget tesznek a public (az objektumon kvlrl elrhet) s a private
(csakmagbanazobjektumbanlvalgoritmusokkalelrhet)attribtumokkztt.
Mintmrfntebbemltettem(azegyszerrtkadssaltrtnattribtumdefincikapcsn), egyobjektum
attribtumainak mdostsakor nem ezakvetend gyakorlat. Ez ugyanis ellentmondazobjektum orientlt
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,
hogy ugyanabba az egysgbe (az objektumba) kell bezrnini az adatokat (ezek a pldnyattribtumok) s a
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.
Vegynkpldulegygombwidgetet. sszernektnikazakvnsg,hogyagombnevinformatikai
objektum viselkedse hasonltson egy igazi nyomgomb viselkedsre. Egy valsgos nyomgomb funkcija
(egyelektromosramkrnyitsnakszrsnakakpessge)magbaazobjektumbavanbeptve(ugyangy,
mint ms tulajdonsgok: a mrete, szne, stb.). Ugyangy azt kvnjuk, hogy a programnyomgombunk
klnbzjellemzit(mrett,helyt,sznt,arajtalvszveget),deannakdefincijtis,hogymitrtnik
akkor, amikor klnbz egrakcikat hajtunk vgre a gombon, a program belsejben egy jl meghatrozott
entitstartalmazzagy,hogynelegyenkeveredsegymsikgombbalvagymsentitssal.
12.1 Ametdusdefincija
Mondandmillusztrcijaknt egy j Time osztlyt definilok, ami mveletek vgrehajtst teszilehetv
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
megaTime() 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.
Aself paramteraztapldnytjelli,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,haapldnyvltozkatiselredefinilnnkazosztlybelsejben smindegyikkneklenneegy
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.
Az osztly constructora inicializlja a domin A s B feln lv pontok rtkeit (az alaprtelmezett
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/ s
2
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. DefiniljonegyMuhold() 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 Av sebessgvltozsa
Av=
Ft
m
.
Pldulegy10sig600Newtonerhatsnakkitett300kgtmegrszondasebessge20m/smaln
(vagycskken).
kiir_sebesseg()kirjaazrszondanevtspillanatnyisebessgt.
energia()kirjaazrszondakinetikusenergijnakrtkt.
Emlkeztet:akinetikusenergitakvetkezkplettelszmoljukki:
E
c
=
mv
2
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
Apldbanugyanaztazaa 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,hogyamirza objektum,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 a pillanattl 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
krjk tle, hogy egy alpha nev vltoz rtkt hasznlja, akkor a nevet a loklis nvtrben (a valamilyen
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.
Az atom (vagy elem) tpust a protonok szma a rendszm hatrozzameg. Alapllapotban egy atom
azonosszmelektrontsprotonttartalmaz,ezrtelektromosansemleges.Vltozszmneutronjaisvan,de
ezeknembefolysoljkazelektromostltst.
Bizonyoskrlmnyekkzttazatomfelvehetvagyelveszthetelektronokat.Emiattelektromostltsretesz
szert,ionnalakul(negatvionn,haegyvagytbbelektrontveszfelspozitvionn,haelektron(oka)tveszt).
Azionelektromostltseaprotonjaiselektronjaiszmnakklnbsgvelegyenl.
A kvetkez script atom s ion objektumokat hoz ltre. Az elbb ismteltk t, hogy az ion egy
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,
ezrtegyosztlyattribtumban 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
rendszm elem nem ltezik, ezrt a listanulla index elemhez a None specilisobjektumot rendeltem. (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.
Akiir() 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
fogunk ltrehozni (a pldnyt a self reprezentlja a definciban). Ha egy metdusnak egy msik osztlyban
definilt metdust kell hogy hvni, akkor ez utbbinak meg kell adnunk annak a pldnynak a hivatkozst,
amelyikhezkapcsoldniakell.Hogyankelleztmegtenni?Nagyonegyszer:
Amikor egy osztly defincijban egy msik osztlyban definilt metdust akarunk hvni, els
argumentumkntapldnyhivatkozstkellnekitadnunk.
gypldulscriptnkbenazIon() osztlykir() metdusahvhatjaazAtom() osztlykir() 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,hogyaNegyzet() osztlyconstructoraapldnyhivatkozst(azazaselfet)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
saconstructoraszintntartalmazzaasugar samagassag paramtereket.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:
constructor metdus: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 a metdust hvjuk, akkor egy krtyt hzunk. A sznt s az rtkt
tartalmaz tuple t adja meg visszatrsi rtkknt a hv programnak. Mindig a lista els krtyjt
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
numerikusrtketelkellfogadni10tl10
11
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 a vszonobjektum ltrehozst (az ellenllsrajzzal 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
felhasznl ltal megadott adatnak megfelelen kell majd mdostani. Ezek a svok kezdetben feketk; a
self.linelistbanhivatkozunkrjuk.
32.53.sorok:Ezarsztartalmazzaaprogramfunkcionalitsnakalnyegt.
Afelhasznlltalmegadottrtketstringformjbanfogadjael.A36.sorbanmegprblomeztastringet
egyfloattpusnumerikusrtkktalaktani.Hanemsikerlaztalakts,akkortrolomahibt.Haegy
numerikusrtkemvan,akkorellenrzm,hogyazazengedlyezetttartomnyba(1010
11
)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(esetnkbenez10
4
).Aszmels
szmjegynek meghatrozshoz 10
4
gyel, 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).
Knnyen hozzjuthatnnk ehhez aszmjegyhez,azonbanmivelezaz utols,aztakarjuk,hogy korrekten
legyen kerektve. Ehhez elg ha 0.5t hozzadunk a 10zel trtn szorozs eredmnyhez, mieltt az
egszrszt meghatrozzuk. Pldnkban a szmols 1,687 + 0,5 = 2,187 et fog eredmnyezni, aminek az
egszrsze(2)akeresettkerektettrtk.
53.sor: Akt szmjegyhezhozzadandnullkszmaa nagysgrendnek felelmeg. Elgegyet levonnia
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. Mdostsaa fenti scriptet gy, hogy aMutatgombranelegyenszksg.Amdostott scriptben
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 megvltoztatsuk
50
. 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: ez helyezi el a
fablakot,avsznatsaktnyomgombot.
Egy fggetlen Wagon() osztly teszi lehetv 4 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 ATkinter azt is megengedi, hogy az alkalmazs 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.
A vagonobjektumokat a vszon meghatrozott helyeire akarom tenni. Ezrt nhny informcit meg kell
adnom az objektumokconstructornak: a vszon hivatkozst s a koordintkat. Ezek ameggondolsok
sejtetik, hogy majd a Wagon() osztly defincijakor a constructorban ezen argumantumok fogadsra
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.
Idelisesetbenakukucs() metdusnaknhnykiegsztutaststkellenetartalmazni. Ezeknekazrintett
vagonobjektumok ltezst kellene ellenrizni, mieltt valamelyik metdusuk aktivlst engedlyeznnk.
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:AzalkalmazselindtshoznemelgazApplication() 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
tmegpont kitrst idben ler egyenlet mindig e = A sin2n f t + u) alak, ahol e a tmegpont
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()
Azoscillo modulosztlyainakimportjautnltrehozzukaz
OscilloGraphe()osztlyelsobjektumtg1et.
Mivel semmilyen argumentumot sem adunk meg, ezrt az
objektum mretei az osztly constructorban definilt
alaprtelmezettmreteklesznek.Vegykszre,nemknldtunk
master ablak definilsval, hogy utna abban helyezzk el a
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')
A harmadik widget konfigurcijnak megrtshez vissza
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 widgethez kapcsolva. Ez a harmnikus rezgmozgs
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:Awidth_ sheight_ (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:Agrbemegrajzolshozat vltozegymsutnveszfelmindenrtket0tl1000igs
mindenalkalommalkiszmoljukamegfelele 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=1 opcisimtssaljavtjaavgs
grbealakot.
Gyakorlarok:
13.8. Mdostsa gy a scriptet, hogy a fggleges referenciatengelyen is legyen az orig kt oldaln 5
osztsosskla.
13.9. gy,mintaCanvas()osztlywidgetjei,amiblazolvaswidgetjeszrmazikazolvaswidgetje
is bepthet szveges jelzseket. Ehhez a create_text() metdust kell hasznlni. Ez a metdus
legkevesebb 3 argumentumot vr: annak a helynek az x s y koordintit, ahol aszvegnket meg
akarjukjelenteni stermszetesenmagtaszveget.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,st 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()
A sorokat nem kell magyarzni. Tetszleges mret (length opci), fekv (mint pldnkban) vagy ll (
orient=VERTICALopci)Scalewidgeteketltrehozhatunk.
A from_ (figyelem: ne felejtsk el a '_' karaktert !) s to opcik definiljk a szablyozsi tartomnyt. A
sklartkekkzttiintervallumotatickintervalopcibandefiniljuk,stb.
A cursorelmozdulsakormindenalkalommalautomatikusansorkerlacommand opcibanmeghatrozott
fggvnyhvsra,sacursorsklhozviszonytottaktulispozcijaleszargumentumknttadva.Ezazrtk
brmilyenmveletheznagyonegyszerenfelhasznlhat. NzzkmegapldabeliupdateLabel()fggvnyx
paramtert.
AScale widget egy nagyon intuitv s vonz interface, ami klnbz belltsokat knl a programunk
felhasznlinak. Tbb pldnyban fogjuk bepteni egy j widgetosztlyba: egy vezrlpanelbe, amivel egy
rezgmozgsfrekvencijt,fzistsamplitdjtlltjukbe,majdazelzoldalakonksztett oscilloGraphe
widgetsegtsgvelkifogunkratniarezgmozgskitrsidgrafikonjt.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 188.
13.4.2 Hromcursorosvezrlpanelksztse
Azelzscripthezhasonlanakvetkezscriptetisegymodulbamentjk(acurseurs.pymodulba).Azgy
elmentettosztlyokategykomplexalkalmazsbanfogjuk(importlssal)jrafelhasznlni,amitaksbbiekben
rokle
52
. Felhvomafigyelmetarra,hogyazalbbikdtbbflemdonrvidthet.(Erremgvisszafogunk
trni.)Nincsoptimalizlva,mivelehhezegykiegsztfogalomra(alambda 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()
Ezenavezrlpanelenafelhasznl knnyenbetudjalltani amegadottparamterek(frekvencia, fzis,
amplitd)rtkeit,amikmajdazelzekbenkonstrult OscilloGraphe() classegywidgetjbenakitrsid
grafikonkirajzolsnakvezrlsreszolglhatnak.Eztmajdazsszetettalkalmazsbanbefogommutatni.
Magyarzatok:
6.sor:Aconstructormetdusacoloopcionlisparamterthasznlja.Ezaparamterlehetvfogjatenni,
hogy a widget kontrolja alatt lv grafikonnak sznt vlasszunk. Aboss paramter szolgl egy esetleges
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.
gy a self.chkban hivatkozott objektum egy egsz tpus vltoz ekvivalenst tartalmazza a 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()metdushvsvalegyjesemny
53
megjelenstidziel.
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). gyvaldikommunikcisrendszerthozunkltrea
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.py t,eztazjmodultiskiegsztjkafprogramszintjnnhnykdsorral.
Ezekasoroktesziklehetvazosztlymkdsnektesztelst. Csakakkorhajtdnakvgre,haamodult
mintnllalkalmazstindtjukel.Alkalmazzaazolvasiseztatechniktasajtprogramjaiban,mertezegy
jprogramozsigyakorlat.Azgymegalkotottmodulokalkalmazja(amodulokvgrehajtsarvn)nagyon
knnyen (jra) felfedezheti azok funkciit s (ennek a nhny kdsornak az elemezsvel) a hasznlatuk
mdjt.

Ezekben a tesztsorokban egy root fablakot hozunk ltre, ami kt widgetet tartalmaz: a ChoiceVibra()
(rezgsvlaszts)saLabel()osztlyegyegywidgetjt.
Az53.sorbanafablakhozegyesemnykezeltkapcsolunk:ettlkezdvemindenspecifiklttpusesemny
az showAll() (mindent kir) fggvnythvst idzi el. Eza fggvnyaspecilisesemnykezelnk, ami
minden esetben, amikor az opercis rendszer egy <ShiftCtrlZ> tpus esemnyt detektl vgrahajtdik.
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 Valjban ezt inkbb egy zenetnek kellene hvnunk (ami maga egy esemnynek a jelzse). Szveskedjen jra
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. A Pythonnemtudjakzvetlenlolvasniazilyenvltoztartalmt,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
utn jelenik meg a master widget eknek mindaddig, mg egy esemnykezelt nem tall, vagy el nem ri a
fablakot.
A billentylenyomsoknak megfelel esemnyek (amilyen a pldban 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. Mdostsa a scriptet gy, hogy a cursor widgetek tvolabb legyenek egymstl (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.py
54
modulokbanrendelkezsnkrellnak.
Egyfizikarnbemutathatsszetettalkalmazsbanfogjukketfelhasznlni:egyOscilloGraphe() widget
egy, kt, vagy hrom klnbz szn grafikont rajzol ki egymsra, melyek mindegyikt egy 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,
hogy amikor a felhasznl megmozdtja az egyik cursort vagy megvltoztatja a checkbox llapott ilyen
esemnyek jjjenek ltre. Definilni fogom az esemnyhez tartoz handlert s beptem az j 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: Mr ismerjk a j technikkat, ezrt gy dntttem, hogy az alkalmazst egy Frame() osztlybl
leszrmaztatott osztlyknt konstrulom meg. gy a ksbbiekben teljes egszben bepthetjk ms
projektekbe,hagydntnk.
8.10.sorok: Nhny pldnyvltoz (3 lista) defincija. A hrom kirajzolt grbe grafikus objektum. A
sznketaself.colour listbandefinilom.Ksztennkkellegyself.trace listtisarajzokhivatkozsainak
trolsrasegyself.controllisttahromvezrlpanelhivatkozsainaktrolsra.
13.15.sorok: A rajzol widget ltrehozsa. Mivel az OscilloGraphe() osztlyt a Canvas() osztlybl
szrmaztattam le, ezrt a Canvas() osztlyspecifikus opciinak jradefinilsval mindig lehetsgvan a
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)adelete()
metdussegtsgvel.AzOscilloGraphe() widgetszlosztlytlaCanvas() osztlytlrklteezta
metdust.
Utnamindenolyanvezrlpanelesetn,melynekazRajzolcheckboxtbejelltk,kirajzoljaazjgrbt.
A vsznon gy kirajzolt objektumok mindegyiknek van egy hivatkozsi szma, ami az 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.AzajnlsbetartsardekbenadjunkaChoiceVibra() (rezgsvlaszts)
osztlyhoz egy values() nek nevezett kiegszt metdust, ami visszatrsi rtkknt egy tupleban
fogjamegadniavlasztott frekvencia, fzissamplitdrtkeket. Ascriptnk38.40.sorait teht
valamiolyasmivelkellhelyettesteni,mintakvetkezsor:
freq,phase,ampl=self.control[i].valeurs()
13.19. rjon egy alkalmazst, ami megjelent egy ablakot egyvszonnal segycursorwidgettel (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 a vszonra tett Visage (Arc) objektum szjt
nyitniszrnini..
(A90.oldalpldjblmerthettletetakdegyrsznekmegrshoz).
13.21. sszegzgyakorlat:sznsztrksztse.
Cl: egy olyan script ksztse, amivel egyszeren s gyorsan 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.
Egysznsakdjakztti megfeleltetslthatvttelhezkilehetprblnia 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
minden rtk csak egyszer forduljon el. A B gomb 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,
kivve ha az elz rtk 6 volt: ez esetben az j rtk 1 legyen. A C gomb az sszes kirajzolt dobkockt
(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. Nyilvn nem egy teljes Tkinter referencia dokumentcirl van sz. Ha az olvas tbbet akar
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.
Ezeknek a widgeteknek lnyeges jellemzje, 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
szrhatunk be(vagyisegy esetleg mr ltez stringelejre, vgre, vagya belsejbe). Ezt a metdust kt
argumentummalhasznljuk,azelsmegadjaabeszrshelyt(0tkellmegadni,haastringelejre,ENDet,
haavgre,vagyvalamilyennumerikusindexet,haegykzbenspozcibaakarunkbeszrni).
14.15.sorok: A ngy gombot nem kln utastsokkal, hanem inkbb egy ciklussal hozzuk ltre. Ezt
megelzenagombokspecilisopciitastyleFontHu (fontstlus)sastyleFontTk 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
specilis metdusokkal frhetk hozz. Egy string tpus Tkinter objektumvltozt hasznlunk itt, amit a
StringVar()osztlyblhozunkltre,samineka18.sorbanegyalaprtelmezettrtketadunk.
20.26.sorok:Ltrehozzukangyrdigombot.Mindegyikhezklnbzcmktsrtket rendelnk,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:AbettpusmegvltoztatsaazEntry widget font opcijnakazjrakonfigurlsvaltrtnik.
Ez azopci a bettpus nevt, mrett sesetleg stlust tartalmaz tuplet vr. Ha a bettpus neve nem
tartalmazbetkzt,atupletegystringgellehethelyettesteni.
Pldk:
('Arial',12,'italic')
('Helvetica',10)
('TimesNewRoman',12,'bolditalic')
"Verdana14bold"
"President18italic"
Lsda.oldalplditis.
201. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.2 Ablaksszelltsakeretekbl(frameekbl)
AFrame() widgetosztlyt mr sokszor hasznltuk
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.
Aszemkztiablakelksztshezktkeretetf1 s
f2 hasznltam gy, hogykt kln widgetcsoportot
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() metdust alkalmazzuk, ezrt a keret mreteit automatikusan hatrozza meg annak
tartalma.Aside=LEFTopciakeretetbalrafogjapozcionlniamasterablakban.Apadx=5opcijobbs
baloldalonegy5pixelszlessvotfogszabaddtenni(padxetfordthatjukvzszintestvolsgnakis).
10.sor:Azf1 keretbenhatmsikkeretet,melyekmindegyikeegycmkttartalmazakarunkcsoportba
foglalni.Akdegyszerbbshatkonyabblesz,haezeketawidgeteketegylistbanhozzukltre,nempedig
fggetlenvltozkban.Ksztnkegy6elemlistt,amitmajdksbbtltnkfel.
11.16.sor:A6hasonlkeretelksztshezegy6tuplebllllisttkellbejrnunk.Atuplekazegyes
keretekjellemzit troljk. Minden tuple4 elembl ll: egyindexbl, egyakeretkiemelkedstdefinil
Tkinterkonstansblsktstringbl,amikacmkeszntsszvegtrjkle.
Afor ciklus6iterrcithajtvgrea6elemlistabejrshoz.Mindegyikiterrcibanazn, col,rel stxt
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: A cmkk mind azonos mretek, de a szvegk s a httrsznk klnbz. A pack()
metdusalkalmazsamiattacmkkmreteaz,amimeghatrozzaakiskeretekmrett.Ezutbbiakpedig
azketcsoportbafoglalkeret(f1)mretthatrozzkmeg.Apadxspadyopciktesziklehetv,hogyegy
kistvolsgottartsunkmindencmkesmindenkiskeretkrl.Aside=TOPopcia6kiskeretetegyms
fltthelyezielazf1kontnerkeretben.
22.23.sorok: Az f2 keretet (jobboldali keret) ksztjk el. A szne egy srga sznrnyalat lesz s egy
bemlyedsbenyomstkeltszegllyelvesszkkrl.
25.28.sorok:Azf2keretegyvsznatsegygombotfogtartalmazni.Megintfigyeljkmega widgetek
krliressvbiztostsraszolglpadx spady opcikhasznlatt.(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).
ADraw() 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,aminekx sy 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.
AmouseUp() metdus fejezi be amveletet. Amikor a mozgatott rajzmegrkezik a rendeltetsi helyre,
trlnikellakivlasztstsarajzkrvonalnakvastagsgtazeredetirekellvisszalltani.Termszetesenez
csakakkorkpzelhetel,havalbanvanegykivlaszts.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 206.
14.4 PythonMegaWidgetek
A Pmw modulok a Tkinter rdekes kiterjesztsei. Teljes egszkben Pythonban vannak megrva,
valamennyientartalmazzkaTkinter alaposztlyokblkonstrultsszetettwidgeteknekegyknyvtrt.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
kzvetlenlbeisrhatjaegysznnevtazadatbeviteli mezbe),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:Alabelpos opciazadatbevitelimeztksrcmkeelhelyezkedsthatrozzameg.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.Eztavlasztstaget() metdussalismeglehettallni, ahogyana8.sorbantesszka
cmkeaktualizlsardekben.
14.4.2 kezeteskarakterekbersravonatkozmegjegyzs
Azelzekbenmremltettem,hogyaPythonkpesavilgvalamennyiabcjt(grg,ciril,arab,japn,stb.
lsda41.oldalt)kezelni.UgyanezllfnnaTkinterre.Magyaranyanyelvkntbiztos,hogyszeretnnk,haa
scriptjeink felhasznli tudnnak kezetes karaktereket berni az Entry, Text widgetekbe s leszrmazottaikba
(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
Jean de la Fontaine nvre kattintva aszveg automatikusanaddig grdl (scrolling), amg lthatv nem
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
jellsrehasznlt betket fogadjael rtkknt(N, S, E, W, NE, NW, SE, SW). Ha nemakarunkcmkt
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: AText widget kr egy keretet (egy Frame widgetet) akarok tenni. Aborderframe=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: Apack() 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)
ACanvas widgetnagyonsokoldal:lehetvteszi,rajzok, bitmap kpek,szvegrszek,stmswidgetek
kombinlstegytkletesenszthzhattrben.Havalamilyengrafikusjtkotakarunkrni,akkornyilvnval,
hogyezazawidget,amitelsdlegesenmegkelltanulniuralni.
Ajegyzetbenebbenatrgykrbenkzltismeretekszkgszerennagyonhinyosak.Aclomcsakaz,hogy
segtsek megrteni nhny alapfogalmat, hogy aztn az olvas kpes legyen a specilis referencia mvekben
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 a nagy rugalmassg a komplex alkalmazsok fejlesztsben az egyik 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 s kt Scrollbar komponenst egyest. A komponensek konfigurcis
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: Arandrange() fggvnnyel llthatk el egy megadott intervallumba es vletlen egsz
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.
A kvetkez alkalmazs egy eszkztrbl s egy vszonbl ll. Amikor a felhasznl az eszkztr egyik
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.
Kdunkegyszerstserdekbenmindegyikgombunkcommand 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 jellegbl addan a Python elfogadja, hogy egy program mdostani tudja 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
hvsra ott, ahol aza szoksos mdon nem lehetsges. Jegyezzk meg, hogy az ilyen fggvny anonym
(nincsneve).
Pldula:
lambdaar1=b,ar2=c:akarmi(ar1,ar2)
utasts egy anonym fggvny hivatkozst adjavisszatrsi rtkl. Eza fggvny a b s c
argumentumokkal azokat a fggvnyparamterek 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)
Ebbenazutastsrszbenagombhozrendeltparancsegyanonymfggvnyrehivatkozik.Afggvny
argparamternekazalaprtelmezettrtkeabargumentumrtke.
Amikoraparancsargumentumnlklhvja,ezazanonymfggvny mgishasznlnitudjaaparamtert
(az alaprtelmezettrtkkel) a self.action() clfggvnyhvsra sgyegyvaldiargumentum
tadstrnkel.
Nemrszletezemalambdakifejezsekkrdst,mertezmeghaladjaennekabevezetmnekakereteit.Ha
tbbetszerenetudnirluk,akkornzzemegabibliogrfibanmegadottvalamelyikreferenciamvet.
217. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
14.5 Ablakokmenkkel
Klnbztpuslegrdlmenkkelelltottalkalmazsablakkonstrukcijtfogommostlerni.Mindegyik
mentlelehetvlasztaniafalkalmazsrl,hogyfggetlenablakokkvljon,mintazalbbiillusztrcin.
Ezakicsithosszabbgyakorlatttekintslisfogszolglni.Szakaszosanfogjukkivitelezniazinkrementlis
fejlesztsneknevezettprogramozsistratgiaalkalmazsval.
Amintmrazelzekbenmagyarztam
55
,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...
Eznem jelenti azt, hogy a projekt elzetes,
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
egy mensor van. Ebben a stdiumban a mensornak csak
egyFilerovatavan.
Kattintsunk a File rovatra a megfelel men
megjelentshez : a Trls opci mg nem mkdik (a
vszon tartalmt fogja trlni), de a Befejezs opcinak
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
__name__=='__main__':utastst
56
.
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:AMenubutton() osztlyegywidgetjt hozzukltre, ami a self (vagyisazsszetett mensor
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: AMenu() osztly widgetjeire specilis metdusokat alkalmazhatunk, melyek mindegyike
szmosopcitfogadel.Azadd_command()metdushelyezielaTrlssBefejezsmenpontokat
amenben.Rgtnbeptjkazunderlineopcit,amiegybillentyrvidtsdefinilsraval.Ezazopci
adjameg,hogy amenpont melyikbetjnekkell alhzva megjelennia kpernyn.Afelhasznl tudja,
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. Amasterablakreferencijtaboss paramteradtatltrehozsa
pillanatban az aktulis widgetnek. Az erase() (trl) metdus, amit ksbb definilunk, fogja trlni a
vsznat.Azelredefiniltquit()metdusidzielakilpstamainloop()blsgyazalkalmazsablakhoz
kapcsoltesemnyfigyellelltst.
18.sor:Amikoramenpontokatdefiniltuk,utnaaMenubuttonmasterwidgetet jrakellkonfigurlnunk,
hogy a menu opcija arra a Menre mutasson, amit megkonstrultunk. Ezt az opcit nem tudtuk
kzelebbrlmeghatrozniaMenubutton widgetdefincijakor,mertabbanastdiumbanaMenu 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: A vszon trlsre szolgl metdus ebben az osztlyban van definilva (mert a vszon
objektumennekarsze),deegymsikosztlybandefiniltslavewidget 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(font opci),akirtszvegek
elshttrsznnek(foregroundsbackground)hasznlatravonatkozan.
Ismtfigyeljkmegazunderlineopcihasznlatt,amiabillentyrvidtseknekmegfelelkaraktertadja
meg(nefelejtskel,hogyastringekkaraktereinekszmozsanulltlkezddik),sklnsenazt,hogyezeknek
a widgeteknek a command opcija a boss attribtumban trolt referencia segtsgvel fr hozzmsosztly
metdusaihoz.
Avszoncreate_text()metdustktnumerikusargumentummalkellhasznlni,amikavsznonegypontX
sYkoordinti.Azargumentumkntmegadottszvegehhezaponthozkppestleszpozcionlvaazanchor
opci vlasztott rtktl fggen. Ez az rtk hatrozza meg, hogyan kell a vsznon kivlasztott ponthoz
lehorgonyozni a szveget: a kzppontjnl, a balfels sarknl, stb. fogva. Az alkalmazott 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/inaktvllapotokat jelenti meg egy x.Azilyen tpusmenkelhelyezsreszolglutastsokelg
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
widget actv/inactv llapotnaktrolsra szolgl. Ez nem lehet egy kznsges Python vltoz, mert a
Tkinter knyvtrosztlyaimsnyelvenvannakmegrva.Kvetkezskntegyilyenbelsvltozhozcsakegy
interfacen keresztl frhetnk hozz. Ez aTkinter vltoznak nevezett interface valjban egy objektum,
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()
Ezutn az rtkads utn a self.actMusi ban hivatkozott objektum egy egsz tpus vltoz
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()
57
metdust:
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,hogytbbwidgetetkellugyanahhozaTkinter vltozhozkapcsolnunk. Mindegyik
rdigombnakklnrtk felel meg s ez az az rtk, ami a vltozhoz van rendelve, amikor a felhasznl
kivlasztjaagombot.
gyakvetkezutasts:
self.mo.add_radiobutton(label ='besllyed ', variable =self.relief,
value =3, command =self.reliefBarre)
azOpcikmenegymenpontjtgykonfigurlja,hogyazgyviselkedik,mintegyrdigomb.
Amikorafelhasznlkivlasztjaeztamenpontot,akkoraself.relief Tkintervltozhoz a3rtketrendeli
(ez a widget variable opcijnak segtsgvel trtnik) s a reliefBarre() metdus hvsa trtnik meg. Ez
feladataelvgzshezkiolvassaaTkintervltozbantroltrtket.
Ennekamennekaspecilissszefggsben6klnbzlehetsgetakarunkfelknlniafelhasznlnak.
Tehthatradiobuttonravanszksg,amiknekafentihezhasonlhatutastst kdolhatnnk.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.A6iterrcislpsmindegyikbenegyj radiobutton elemethozunk
ltre,melyekvalueslabelopciitavslabvltozkkzvettsvelszedjkkialistbl.
Azolvasgyakran fogjatapasztalni asajt projektjeiben, hogyazilyen utastsok sorozata egy tmrebb
programstruktrvalhelyettesthet(ltalbanegylistnaksegyprogramhuroknakakombincijval,minta
fentipldban).
Lassankntmstechnikkatisfelfogfedezni,amikakdmretetcskkentik.Akvetkezfejezetbenmg
egypldtfogokadnierre.Azonbanigyekezznkszbentartaniaztafontosszablyt,hogyegyjprogramnak
mindenekelttolvashatnakskommentezettnekkelllenni.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 226.
c) Utastsvgrehajtsvezrlselistval
MostvizsgljukmegareliefBarre()metdusdefincijt:
Azelssorbanaget() metdussalfrnkhozzegyTkintervltozhoz,amiafelhasznl Domborzat:
almenbelivlasztsnakaszmttartalmazza.
A msodik sorban a choice vltoz tartalmt hasznljuk arra, hogy egy hatelem listbl hozzfrjnk a
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.
Hvsakor a choiceActive() metdus jrakonfigurlja a mensor Festk s Zenszek menit, 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.)
A program indtsakor minden gy trtnik, mintha a felhasznl elszr az Opcik men Festk
menpontjrakattintana,aminekahatsaamegfelelmeninaktivlsa.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 228.
15.Fejezet: Konkrtprogramokelemzse
Ebbenafejezetbenmegprblombemutatniegygrafikusprogramfejlesztsnekamenettazelsvzlatoktl
egszen egy viszonylag elrehaladott fejlesztsi stdiumig. gy szeretnm megmutatni, hogy az objektum
orientlt programozs mennyire le tudja egyszersteni s fknt milyen biztonsgoss tudja tenni a javasolt
inkrementlisfejlesztsistratgit
58
.
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
Eztaprojektet
59
avgzstanulkegyhasonlmunkjainspirlta.
Azilyenprojektekvzlattrajzokkalssmkkalrdemeskezdeni,amikaklnbzltrehozandgrafikus
elemeket s maximlis szm use caset rnak le. Ha viszolygunk a papr s ceruza hasznlattl, akkor
hasznlhatunkolyanrajzolprogramot,mintamilyenazOpenOffice.org
60
Drawprogramja.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
megkezdseelttmindigtrekednnkkellegyrszletesfeladatmeghatrozs ksztsre.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: ez azt jelenti, hogy csak egy specilis esetet kezeltek az ltalnos eset helyett.
Pldul egy grafikus objektumnak rgztettk a mreteit ahelyett, hogy az tmretezst lehetv tev
vltozkrlgondoskodtakvolna.
Egyprojektfejlesztstmindigalehetlegmlyebbrehatelemzsselkellkezdenisazelemzseredmnyt
egy olyan dokumentum egyttesben (smk, tervek, lersok) kell konkretizlni, ami a feladat meghatrozst
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,amiketspecilismetdusok
segtsgvelprogramblaktivlhatunk.)Biztos,hogysszerrjuksznniegyspecilisosztlyt.
15.1.1 ACanon(gy)osztlyprototpusa
Egyilyenosztlydefinilsvaltbblegyettnkegycsapsra.Nemcsakegydobozbagyjtjksszea
rajznak s az gy mkdsnek megfelel sszes kdot a program tbbi rsztl kln, hanem arra is
lehetsgetadunk,hogyajtkbanknnyenltrehozhassunktetszlegesszmgyt.Ezmegnyitjaaksbbi
fejlesztsektvlatt.
ACanon() (gy) osztly els implementcijnak elksztse s tesztelse sorn lehetsgnk lesz arra,
hogy kiegszt jellemzk hozzadsval gy tkletestsk az osztlyt, hogy az interfacet (az alkalmazsi
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
gycs forgstengelyt is, valamint az gycsvet reprezentl szakasz
egyikvgt.
Rajzunk befejezseknt mg meg kell hatrozni a szakasz msik
vgpontjnak koordintit. Ha emlksznk a trigonometribl a sinus s a
cosinusfogalmra,akkoreznemfognehzsgetokozni:
Egy derkszg hromszgben egy szggel szemkzti oldal s az tfog hnyadosa a szg sinusa.
Ugyanennekaszgnekacosinusaaszgmellettioldalsaztfoghnyadosa.
gyaszemkztibrban:
sino=
a
h
s
cos o=
b
h
.
Azgycsreprezentlshoz,feltve,hogyismerjkazgycslhossztsalvsaszgt,akr(xsy
koordintj) kzppontjtl kell hznunk egy vastag szakaszt, aminek a vzszintes hossza Dx= l.cos xa sa
fgglegeshosszaHy D =l.sina.
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.

a
h
b
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 s y 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.
Tkletestennk kell. Hozz kell adnunk alvedkek kilvsnek
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
idkznknt jra szmoljuk a lvedk x s y 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:Ezt a metdust egygombra trtn kattints hvja.Elindtja a lvedk mozgst sigaz
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
rajzolsnl hasznltunk. A 9. sorban a jel onnan ered, hogy a fggleges koordintkat fellrl lefel
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: Alvedk vzszintes koordintja mindig ugyanannyival n (egyenletesmozgs), mg a
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
funkcionalitst tudunkazonostani. 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.
Most pedig elemezzk az albbi scriptet. Megtalljuk benne a tovbbfejlesztett 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: Aprototpussal sszehasonltva, hrom paramtert adtunk a constructorhoz. Az id egy tetszleges
nvvelazonostjaa Canon() osztlymindenobjektumt.Airany 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. (Mimagunkegyhasonltechniktimplementltunkaboss 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: Megprbljuk gy megkonstrulni a canon (gy) osztlyunkat, hogy jra felhasznlhat
legyenolyannagyobbprogramokban,melyektetszlegesszmgyttartalmazhatnak,amikakzdelmek
sornmegjelenhetnekseltnhetnek.Ilyentvlatokblnzve,mindenjelenlvgyrlmindenegyeslvs
elttrendelkeznnkkell egyolyanlerssal, 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, deamsodik esetben egy srgasznrobbanstrajzolunks azeltallt gy
hivatkozsttroljuk.Egykisidmlvaarobbanas_vege() metdusthvjaafeladatbefejezshez,hogya
robbansikrttrljesegytallatotjelzzenetetkldjnamasterablaknak.
115153.sorok:AVezerloPult() osztlyaFrame() 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) Jobban kellene pldul paramtereznnk. Ez mit jelent ? Mostani formjban a jtkunk vszna elre
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.
Mr elvgeztk ennek a munknak egy rszt: a Canon() (gy) osztlyban a vszon mreteit egy elre
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
lenne gy megcsinlni, hogy ez a metdus egy argumentumban tadott rtk fggvnyben ugyangy tudjon
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,
amitazelzCanon() osztlyblszrmaztatunkle,megrizveazosztlynevt.gyazokatakdrszeket,
amikeztazosztlythasznljknemkellmegvltoztatni.(Eznemlettvolnalehetsges,hapldulafrom
canon03import*formthaszltukvolna.)
11.16sor: Az itt definilt metdusnak ugyanaz a neve, mint a szlosztly egyik metdus. Teht az
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.
Ezt az eredmnyt egy vagy tbb paramter hozzadsval rjk el, melyek alaprtelmezett rtkei a 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.
Haalista nemtl hossz shanemakarunkbenne sszetett felttelektl fggkeresseketvgrehajtani,
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.
Kpzeljk pldul el, hogy az iskolnk vezetse megbz bennnket egy szmtgpes tanulmnyi rtest
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).
A kliensek klnbzeljrsokvagy protokolok(esetlegazinternet) rvnllandan vagy ideiglenesena
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
ltestaserverrelsazadatbzissal
61
.Amikorltrejttakapcsolat,akliensalkalmazsmegfelelformjkrs
(request)kldsvellekrdezhetiaservert.Pldulegymeghatrozottinformcitkellmegkeresni.Aservera
megfeleladatokadatbzisbantrtnkeressvelvgrehajtjaakrst,majdvalamilyenvlaszt 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
specilis nyelvet kell anekik cmzett krsekhez hasznlni. Mindenhol nagy erfesztseket tettek egy kzs
nyelvkidolgozsrasjelenlegltezikegyjlfelptettstandard:azSQL (StructuredQueryLanguage,vagy
struktrltlekrdeznyelv)
62
.
Azolvasnak mstrgyak(pdulirodai alkalmazsok)keretbenvalsznleg alkalmalesz tallkozni az
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
alcsoportjt integrlja. Teljestmnye nyilvn nemvethetsszea nagy, specializlt relcisadatbziskezel
rendszerekteljestmnyvel
64
,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
adatbzisokat tartalmaz knyvtrakat ugyangy, mdosts nlkl hasznlhatjuk egyik vagy msik opercis
rendszerbl.
Ha egy olyan alkalmazst akarunk fejleszteni, aminek viszonylag sszetett relcikat kell kezelni egy kis
adatbzisban,akkoraGadflymodulnagyonleegyszersthetiafeladatot.
16.2 EgyszeradatbzisksztseGadflyval
A kvetkezkben megvizsgljuk, hogyan kszthetnk egy egyszer alkalmazst, ami ugyanazon a gpen
egyszerretltibeaserversakliensszerept.
16.2.1 Adatbzisltrehozsa
Mintazolvasbizonyramrvrja,amegfelelfunkcikhozvalhozzfrshezelgimportlniagadfly
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 acursor
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()
Azelssorltrehozzaacur cursorobjektumot.Akvetkez4sorbanazidzjelbenlvstringekazSQL
253. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
krsek. Jl jegyezzk meg, hogy az SQL rzketlen arra, hogy kis vagy nagybett hasznlunk: az SQL
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, amint azt a ksbbiekben meg fogjuk ltni. A diszkre trtn adatkivitelt az utols utastssor
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).
Ha magunk akarjuk irnytani az informcik lapra trdelst, akkor a pp() metdus helyett a 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)
KezdjeelfeltlteniaZeneszerzok 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
idtartamt percekben adjuk meg. Nyilvn annyi zenemvet s zeneszerzt lehet rgzteni, amennyit csak az
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
Aselect 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
Nincs r lehetsgem, hogy a jegyzet keretei kztt jobban kifejtsem a lekrdez nyelvet s ltalban az
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.
A konkrt clunk az, hogy gyorsan eljussunk egy olyan alapkliens kivitelezsig, ami kpes prbeszdet
folytatni egy olyan igazi adatbzisserverrel, mint a MySQL. Azt szeretnnk, ha a kliensnk egy nagyon
ltalnoskisutilitymaradna,ami:kpesegytbbadattblttartalmazkisadatbzisltrehozsra,mindegyik
tblbabejegyzsekettudtenni,lehetvtesziazalapSQLkrsekeredmnynektesztelst.
Akvetkezsorokbanfelttelezem, hogyazolvasmrhozzfregyMySQLserverhez,aminajules
nevfelhasznlnak,akinekajelszavaabcde,ltrehoztakegydiscothequeadatbzist.Ezaserverlehet
egyhlzatontelrhettvoligpen,vagyloklisanazolvasPCjn
65
.
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 a knyvnek a kereteit, de nem egy nagyon
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 az ltalunk vlasztott jelszval. Majd az gy definilt adminisztrtor accountjval kapcsoldunk a
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,
hogybe kell szrni,vagy trlnikellmezket,nha ppen egyrosszulfelptett tbltkellhelyettesteni kt
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,stb
66
.explicitnevekkelkellhivatkoznunk.
Ezatechnikafedezhetfelscriptnkelssoraiban.DefinilunkascriptbenegyGlob() osztlyt,aminem
ms,mint egyegyszer kontner. Egyetlenobjektumotsemfogunkltre hozniebblaz osztlybl, aminem
tartalmazmetdusokat.Agloblisvltozinkegyszerosztlyvltozkkntvannakdefinilvasgyezekrea
66 GloblisvltozinkatelhelyezhetjkegyGlob.pynevmodulban,amitaztnimportlunk.Modulvagyosztly
nvtrknt val hasznlata vltozk trolsra teht hasonl technikk. Egy osztly 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.
Az olvasnak meglehetsen unalmasnak tnhet az adatstruktra ennyire rszletekbe men 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,hogyazopen() 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,hogyeza modulnemkpezirsztastandardPython
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:Tancsosakommunikciltrehozsraszolglkdotegytryexceptelse kivtelkezelben
(lsd119.oldalt)elhelyezni,mertnemttelezhetjkfel,hogyaserverelrhetlesz.Jegyezzkmeg,hogyaz
__init__() metdusnemadhatvisszatrsirtket(areturn utastssegtsgvel)abblatnybladdan,
hogyaPythonautomatikusanhvjaegyobjektumltrehozsakor.Amitebbenazesetbenahvprogramnak
visszaad,azazjonnanltrehozottobjektum.Tehtahvprogramnaknemtudjukjelezniegyvisszatrsi
rtkkel, hogy sikerlte vagy pedig meghisult a kapcsolat ltrehozsa. Erre a problmra egy egyszer
megolds, hogy a kapcsolatteremts 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() factoryfggvnyltal ltrehozott connectorobjektumsa megfelelcursor
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.
Egy valdi alkalmazsban biztosan jelentsen t kellene alaktani ezt a vgletekig leegyszerstett formot.
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.
Termszetesen mg ms pldulabejegyzsektrlsre s/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: Az interfaceobjektumot hozzuk itt ltre. Ha ez nem sikerl, akkor a 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
Azolvasbiztosan sok mindent tanult mr mshol aweblapokszerkesztsrl. 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>tagnek ktfontosparamtert kelltartalmazni:aformelkldsekor vgrehajtandakcit (itt
annak a programnak az URLt kell megadni, amit az tvitt adatok kezelshez kell hvni) s az informci
tvitelrehasznltmdszert(amiminketillet,ezmindigapostmdszerlesz).
Pldnkban a hvni kvnt program egy input_query.py nev Python script, ami az intranet server egy
specilisknyvtrbanvan.Sokszerverenennekaknyvtrnakanevecgibin. 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,amitazadminisztrtormegad
67
.
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,amitaprint utastssal
ratunk ki. Hogy be tudjuk szrni mindazt, amit szeretnnk a soremelseket, aposztrfokat, idzjeleket is
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.
A 12. sorban egy adatbeviteli mez (INPUT TYPE="text") tpus widget defincijt talljuk. Ez arra
sztnziafelhasznlt, hogyrjabeanevt.AMAXLENGTHparamteraberandkarakterlncmaximlis
hosszthatrozzameg(esetnkben20karakter).ASIZEparamteramezmrettakpernynhatrozzameg.
ANAMEparamterazanv,amitannakavltoznakvlasztunk,amibenavrtstringetfogjuktrolni.
A 14. sorbanegymsodik, kiss eltradatbeviteli mezvan definilva (TEXTAREAtag). Egy nagyobb
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. sorban a modul FieldStorage() fggvnye visszatrsi rtkknt egy objektumot ad, ami a HTML
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 fog ltezni. Teht az rtkek brmifle kezelse eltt felttlenl meg kell bizonyosodni a vrt indexek
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 270.
ltezsrl.Ezttesszka715sorokban.
(17) Gyakorlat:
17.1. Az elzek igazolsaknt pldul kikommentezhetjkascript7., 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.
Altez termkektbbsge szabad szoftver. Aszksgletekszles skljt fedikle, a nhny oldalaskis
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
ez atermk tkletesen alkalmas nagyon nagy vllalati websiteok kezelsre, mikzben rendkvli elnyket
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.
A siteok elksztsnek egyszersgvel trsulva ez a teljes autonmia az emltett termkeket nagyon j
megoldsokk teszi a kis s kzpvllalkozsoknl, az adminisztrciban vagy az iskolkban 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 Gadfly
68
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 a 80as portonvr http krseket. A navigtoroktbbsgeezt aportszmot
hasznljaalaprtelmezetten.HaazonbanegyLinuxosgpenteleptjkaKarrigellt,akkor(biztonsgiokokbl)
nincsjogunkaz1024alattiportokhasznlatra.Haezahelyzetllfnt,akkormdostanikellakonfigurcis
filet,hogyaKarrigell egymagasabbportszmothasznljon.ltalbana39.soreltti#karaktereltvoltst
vlasztjuk, ami a 8080 portot aktivlja. Ksbb esetleg azrt kvnjuk mdostani a konfigurcis filet, 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 szakaszban
69
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
gykrknyvtrban
70
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 Ha meghagytuk az alaprtelmezett portszmot (80), akkor flsleges azt megismtelni a cmekben, mert ezt a
portszmot hasznljk alaprtelmezetten a navigtorok. Egy msik konvenci, hogy egy website home pagee
majdnemmindgazindex.htmvagyindex.htmlnevfile.Amikoregywebsiteotahomepagenkezdveakarunk
megltogatni, akkor ltalban elhagyhatjuk ezt a nevet a cmbl. AKarrigell betartja ezt a konvencit gy egy
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
Termszetesen minden Python erforrst hasznlhatunk,
mintazalbbipldban,ahola0s 90kzesszgek
sinusaibl, cosinusaibl s tangenseibl ksztnk tblzatot
egyciklussegtsgvel.
7.sor: Arange() fggvnyt hasznljuk a szgtartomny
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
ki az rtket, amibl 7 a tizedespont utn van A %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.
EgyolyaneszkzzelmintaKarrigell viszontegynagyonhatkonyjelzrendszerrel,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. AKarrigell eztaclt cookiekkalriel.Amikoregyjltogat
azonostjamagt,aserverltrehozegysessionIdneknevezettcookietselkldianavigtornak,amielmentiazt.
Ez a cookie egy egyedi session azonostt tartalmaz, aminek a serveren egy sessionobjektum felel meg.
Amikor a ltogat a site ms oldalait jrja be, a navigtora minden alkalommal elkldi a cookie tartalmt a
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,aztelhelyeziegy cookieban
sacookietelkldianavigtornak.Tetszlegesszmattribtumotadhatunkasessionobjektumhoz:
objet_session.nev = "Jean Dupont"
275. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
Atbbilaponhasonlmdonjrunkel,deebbenazesetbenaSession()osztlyblltrehozottobjektumnem
egyjobjektum, hanemasession elejnltrehozott objektum, amitaserverbelslega cookiebeli azonost
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 Karrigell
71
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,generlnekiegyegyediazonosttscookie formjban
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, akkor egy jabb lap tltdik be, de ide nem trtnik semmilyen adattads sem (mert nem form
kzvettsvelfrnkhozz).AsessionTest3.py scriptben,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.
A kvetkezkben felttelezem, hogyazolvas egyttmkdikegyvagy tbbosztlytrsval s a Python
munkallomsaikegyTCP/IPkommunikcisprotokollthasznlloklishlzatracsatlakoznak.Azopercis
rendszernek nincs jelentsge. A ksbbiekben lert Python scriptek egyikt pldul egy Linuxszal mkd
munkallomsralehet telepteni, sprbeszdrelehet ksztetni egymsikscripttel, amit egymsik opercis
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,amelyiketegyspecifikusIPcm azonostahlzaton
72
.
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,aprogramokasocket ekneknevezettinterface
objektumokkzvettsvelazopercisrendszereljrsainaksfggvnyeinekegycsoportjthvjk.Ezekkt
klnbzskomplementertechniktalkalmazhatnak:azinternetenszleskrbenalkalmazottpacket(ezeket
datagrammoknak isnevezik) technikt s a folytonos kapcsolat vagy stream socket technikt, ami egy kicsit
egyszerbb.
72 Egyadottgpetegyexplicitnvvelismegadhatunkazzalafelttellel,hogyahlzatonteleptvevanegyolyan
mecanizmus (DNS), ami ezt a nevet automatikusan IPcmre fordtja. Ha tbbet akar tudni errl, akkor nzzen
utnaazopercisrendszerekshlzatoktananyagban.
GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 280.
18.2 Egyelemiserverksztse
Elsksrletkntastreamsocket techniktfogjukhasznlni.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.
Az albbi script egy olyan servert llt be, ami egyetlen klienssel tud kommuniklni. Kicsit ksbb majd
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:Asocket modulminden,akommunikcisprogramokksztshezszksgesfggvnytsosztlyt
tartalmaz.Akvetkezsorokbanltnifogjuk,hogyakommunikciltrehozsahatlpsblll.
6.s7.sor:Ezaktvltozdefiniljaaserverazonosttgy,ahogyanazokatasocketbebefogjukpteni.
AHOSTnakaserverIPcmtmegadstringetkelltartalmazniamegszokottdecimlisformban,vagya
serverDNSnevt(azzalafelttellel,hogyahlzatonegynvfeloldmechanizmusvanteleptve).APORT
nakegyegszszmotkelltartalmazni,tudniillikegymghasznlatlanportszmt,amilehetsgszerint
1024nlnagyobb.(lsdahlzatiszolgltatsokkurzust).
9. s 10.sor: Az sszekapcsols 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 ltrehozni a kapcsolatot a socket s a kommunikcis port
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 a kliensek ltal kldtt krsek fogadsra. Ez a listen() metdus szerepe. Az argumentuma
megmondja,hogymaximumhnyprhuzamoskapcsolatotfogadjonel.Majdksbbmegltjukhogyankell
ezeketkezelni.
24.26.sorok: Negyedik lps. Amikoraz accept() metdusthvjuk, asocket mindaddig vr, amgegy
krsmegjelenik.Ascriptezenarszenmegszakad,ezolyan,minthaazinput()fggvnythvnnk,hogya
klaviatrrlvrjunkbemenetet.Hafogadegykrst,akkorazaccept() metdusvisszatrsirtkkntegy
ktelemtupletadmeg:azelselemasocket()
73
osztlyegyjobjektumnakahvatkozsa,amiaklienss
a server kztti valdi kommunikcis interface lesz, a msodik elem egy msik tuple lesz, ami ennek a
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
mindegyik szmra egy kln sockettel kell rendelkeznnk az elstl fggetlenl, amit llandan mkdni
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
legegyszerbben kivitelezhet s az egyetlen valban portbilis technika (lnyegben minden nagy opercis
rendszertmogatja):atechniktlightprocessnekvagythread
74
neknevezik.
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
Egyegyszerstettchat
75
rendszerksztshezfogjukmostagyakorlatbatltetniathreadtechnikt.Eza
rendszer egyetlen szerverbl s tetszleges szm kliensbl fog llni. Szemben azzal , ami az els
gyakorlatunkbantrtnt,magtaszervertsenkisemfogjakommunikcirahasznlni,hanemamikorelindtjuk,
tbbklienskapcsoldhatmajdrskezdhetelegymssalzenetetvltani.
Mindegyikkliensazsszeszenett elfogja kldeni aservernek, az pedig rgtntovbbkldi azokat az
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. s 50. sor) tallunk, amiknek a mkdst a kvetkez kt sorbanindtjuk el. Ezeket a thread
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:
ltalnos megjegyzs: Ebben a pldban kt a fthreadtl fggetlen threadobjektum ltrehozsrl
dntttem azrt, hogy jl megvilgtsam a folyamatokat. A programunk sszesen hrom threadet hasznl,
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()
76
metdussalrhetjkel.
2736.sorok:Ezazosztlyegymsikthreadobjektumotdefinil,amiezalkalommalegyvgtelenhurkot
tartalmaz. Ez az objektum csak az elz bekezdsben lert metdussal szntethet meg. A hurok minden
iterrcijban az utastssorozat egy billentybemenetre vrva a 35. sorban meg fog szakadni, de ez nem
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. Azignyesolvas abibliogrfiban (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:Aprogramban itt egyvgtelen hurok van, amillandanjkapcsolatokra vr.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
A server s kliensprogramok ugyanazt az alapprogramot hasznljk, amit nagyrszt a 15. fejezetben mr
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
kapcsolatkrsnek fogadsra fenntartott socketet s a ThreadConnexion() osztly, ami arra szolgl, 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
tbbinformcit kell tovbbtani, gy dntttem, hogy mindegyik zenet tbb,vesszkkel elvlasztott mezt
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.
Az j kliensnek kldtt zenetben azonban van egy eltrs (mivel a tulajdonosa az j gynak): az gy
jellemzintl,amikmindenkinekmegvannakadva,tartalmazegykiegsztmezt,amiazaz_nszveget
tartalmazza(hasonltsuksszepldulaz5.sorta17.sorral,amelyikegymsikjtkostrtestakapcsolatrl.)
Ez a kiegszt jelzs teszi lehetv az gytulajdonos kliensnek, hogy a hasonl zenetek kztt meg tudja
klnbztetniazt,amelyikaserverltalnekiadottegyediazonostttartalmazza.
A 6.s7.sor zenetei a kliens ltal kldtt parancsok (dlsszg belltsa s tzparancs). A jtk elz
verzijbanmrmegllapodtunkabban,hogyalvsutnazgyk(vletlenszeren)egykicsitelmozdulnak.A
server teht vgrehajtja ezt a mveletet s utna minden felkapcsoldott klienssel ismerteti az eredmnyt. 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.
AVezerloPult() osztlyt a canon03 modulbl importlt azonos nev osztlybl leszrmaztatssal hozzuk
ltre.Aszlosztlymindenjellemzjtrkli,defellkellrnunk
77
atuzel()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, hogy a server mindegyik hozzkapcsold kliensnek egy msik threadet indt el. Utna ezek a
threadek prhuzamosan mkdnek. Fennll teht annak a veszlye, hogy idnknt kett vagy tbb thread
egyidejlegprblmegegykzserforrsthasznlni.
Azokban a kdsorokban, amiket pldul megbeszltnk, egy olyan threaddel van dolgunk, ami kvzi az
sszes kapcsolatot egy zenet kldsre akarja felhasznlni. Lehetsges, hogy ez alatt az id alatt egy msik
threadismegksrliegyikvagymsikkapcsolatothasznlni,amiazzalaveszllyeljr,hogymkdsizavar
lphetfel(esetnkbentbbzenetkaotikusszuperpozcijtokozhatja).
Athreadek kztti konkurls problmjt egy zr objektum (thread lock objektum) 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
egyblokkoltthreadet szabadt fel.mindiggyelnikellr, hogy mindegyikthread, amelyik egyerforrshoz
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
kdot egy Thread() osztlybl leszrmaztatott osztlyban fogjuk elhelyezni, mert ezt akdota falkalmazs
threadjtlfggetlenthreadbenkellmkdtetnnk. Eztathreadetkizrlagagrafikusinterfacemainloop()
ciklusahasznlja
78
.
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
mveletet vgrehajtsra. Fntebb mr emltettem, hogy a kliensek mindegyike ltre fog hozni egy ebbl az
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, hogymegakarjukvltoztatni azalkalmazsbezrsnakamenett
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)aPmwknyvtrhvsanlkl
79
.
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
t az aktulis knyvtrba kell 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: Aszlosztly constructora a specificites() metdus hvsval fejezdik be. Ez utbbiban
elhelyezhetjkmindazt,amitmshogykellaserverbenilletveakliensekbenmegszerkeszteni.(Nevezetesen:
a server ltrehoz egy text widgetet, amit a kliensekben nem tallunk meg; mindkett klnbz thread
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, hogy a partner tudja, hogy ez az zenet az gyjra vonatkozik s aktivlni tudja a
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
vzoltam a jtk alapmkdst: ajtkosokelosztst akt trflen, atallatot kapott gykeltntetst, a
klnbzakadlyokat,stb.Azolvasrasokfelfedeznivalmarad!

(18) Gyakorlatok:
18.1. Egyszerstse a284.oldalon lert, chat kliensnekmegfelelscriptet gy, hogy a kt
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
Azafter() metdust(ezmindenTkinter widgethezhivatalblvanasszocilva)tartalmazfggvnyblllt
mindeneddigianimcimotorja.Tudjuk,hogyezzelametdussalegyksleltetsvihetbeaprogramunk
menetbe: egy bels ra van aktivlva gy, hogy megfelel id eltelte utn a rendszer automatikusan hv
valamilyen fggvnyt. ltalban nmagt az after() t tartalmazfggvnyt hvjuk: gy egy rekurzv hurkot
lltunkel,amibenaklnbzgrafikusobjektumokelmozdulstkellprogramozni.
Programunk egyltaln nem fagy le, amg az after() metdussal programozott idtartam nem telik le.
Pldulezalattazidtartamalattkattinthatunkegygombra,tmretezhetjkazablakot,aklaviatrrladatot
vihetnkbe,stb.Ezhogyanlehetsges?
Mr tbbszr emltettem, hogy a modern grafikus alkalmazsoknak mindig van egy motorja, ami egy
folyamatosanahttrbenmkdprogram:afablakmainloop() metdusnakaktivlsakorindulel.Minta
neve is jelzi, egy ugyanolyan tpus vgtelen ciklust hasznl, mint a mr jl ismert while ciklusok. Szmos
mechanizmusvanbeptveebbeamotorba.Azegyikakeletkezesemnyekfogadsblsabblll,hogy
azokat a programokat, amik krik, utna megfelel zenetekkel figyelmezteti az esemnyek bekvetkeztre
(lsd: Esemnyvezrelt programok 85.oldal),msok a kiratsszintjnvgrehajtand akcikat vezrlik, stb.
Amikoregywidgetafter()metdusthvjuk,akkorvaljbanegyidmrmechanizmusthasznlunk,amimaga
303. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
isbelevanptveamainloop()basennlfogvaezakzpontiadminisztrtoraz,amibizonyosideltelteutn
elindtjaakvntfggvnyhvst.
Az after() metdust alkalmaz animcis technika az egyedli lehetsges technika az egyetlen 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
rekurziv fggvny vagy metdus, vagyis ami nmagt hvja): nem mindig egyszer uralni az ilyen fajta
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.Azgyltrehozottksleltetsnemfggamainloop()tl,kvetkezskntsokkalrvidebblehet,
mintamitazafter()metdusmegenged.
Figyelem:eznemjelentiazt,hogymagaakpernyfrisstsgyorsabblesz,mertazttovbbraisamainloop()
biztostja. Viszont nagyon felgyorsthatjuk azokat a mechanizmusokat, amiket mi magunk ptnk be a sajt
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: Egy befejezett threadet nem indthatunk jra. Ezrt csak egyszer indthatjuk el ezt az animcit
(legalbbis az itt bemutatott formban). Hogy meggyzdjnk errl, tvoltsuk el a15. sor elejrl a #
karaktert(amimiattaPythoneztasorteddigkommentnektekintette):azanimcielindulsakorazegrrela
gombrakattintvaelidzzka27.31.sorokwhileciklusblvalkilpst,amibefejeziarun()metdust.Az
animci lell, de az t kezel thread is befejezdik. Ha megprbljuk a Indt gombbal jraindtani a
threadet,csakegyhibazenetetkapunk.
26.31.sorok:Egyenleteskrmozgsszimulcijhozelg,hafolyamatosanvltoztatjukazaszgrtkt.
Ennek a szgnek a sinusval s cosinusval kiszmolhatjuk a szgnek megfelel kerleti pont x s y
koordintit
80
.
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
knyvtrba lesz teleptve (a ** a verziszm kt szmjegyt jelenti) s az indt ikonok is automatikusan el
leszenhelyezve.
Amikorateleptsbefejezdtt,trlhetazideiglenesknyvtrtartalma.
19.2.1 TeleptsLinuxalatt
Az olvas valsznleg egy olyan kereskedelmi disztr segtsgvel teleptette a Linux rendszert, mint a
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
A SciTE egy kitn szvegszerkeszt, ami kpes szintaktikai sznezsre, automatikus kdkiegsztsre s
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, valszn leg 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)))
# V etlenszer? 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 betukozze alakitjuk :
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 szoveg oszes 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 gyakorlat az elzt egszti ki. Hozzadunk mg kt fggvnyt s trjuk 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() # m ange 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 fggv yt 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 l eznek !
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
AGNUFreeDocumentationlicencenekmegfelelen(lsd366.oldalon)akvetkezfggelkeknekgy,
ahogyvannak ktelezen kvetnik kell azeredeti szveg minden disztribcijt, fggetlenl attl, hogy azt
mdostottk(lefordtottkpldul)vagysem.
19.7.1 Contributorlist
byJeffreyElkner
Perhapsthemostexcitingthingaboutafreecontenttextbookisthepossibilityitcreatesforthoseusing
the book to collaborate in its development. I have been delighted by the many responses, suggestions,
corrections, and words of encouragement I have received from people who have found this book to be
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
Paul found an error in Chapter 7 and a bug in Jonah Cohen's Perl script that generates HTML from
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
Ian and his students are using the text in a programming course. They are the first ones to test the
chaptersinthelatterhalfofthebook,andtheyhavemakenumerouscorrectionsandsuggestions.Iancanbe
reachedat:ithomas@sd70.bc.ca
KeithVerheyden
KeithmadecorrectioninSection3.11andcanbereachedat:kverheyd@glam.ac.uk
ChrisWrobel
Chris made corrections to the code in the chapter on file I/O and exceptions. He can be reached at:
ferz980@yahoo.com
MosheZadka
Moshe has made invaluable contributions to this project. In addition to writing the first draft of the
chapteronDictionaries,heprovidedcontinualguidanceintheearlystagesofthebook.Hecanbereached
at:moshez@math.huji.ac.il
19.7.2 Preface
byJ.Elkner
Thisbookowesitsexistance tothe collaborationmadepossiblebytheinternetandthefreesoftware
movement.Itsthreeauthors,acollegeprofessor,ahighschoolteacher,andaprofessionalprogrammer,have
yettomeetfacetoface,butwehavebeenabletoworkcloselytogether, andhavebeenaidedbymany
wonderfulfolkswhohavedonatedtheirtimeandenergytohelpingmakeitbetter.
Whatexcitesmemostaboutitisthatitisatestamenttoboththebenefitsandfuturepossibilitiesofthis
kind ofcollaboration, the framework for whichhasbeenput inplace by Richard Stallmanandthe Free
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
language to learn and teach. I found myself constantly fighting with C++'s difficult syntax and multiple
waysofdoingthings,andIwaslosingmanystudentsunnecessarilyasaresult.Convincedtherehadtobea
betterlanguagechoiceforourfirstyearclass,IwentlookingforanalternativetoC++.
AdiscussionontheHighSchoolLinuxUsers'Groupmailinglistprovidedasolution.Athreademerged
duringthelatterpartofJanuary,1999concerningthebestprogramminglanguageforusewithfirsttime
highschoolcomputersciencestudents.InapostingonJanuary30th,BrendonRankingwrote:
I believe that Python is the best choice for any entrylevel programming class. It teaches proper
programmingprincipleswhilebeingincrediblyeasytolearn.Itisalsodesignedtobeobjectorientedfrom
itsinceptionsoitdoesn'thavetheaddonpainthat bothPerlandC++sufferfrom......Itisalso*very*
widelysupportedandverymuchwebcentric,aswell.
I had first heard of Python a few years earlier at a Linux Install Fest, when an enthusiastic Michael
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.
Allenhadalreadywrittenafirstyearcomputerscience textbooktitled, Howtothinklikeacomputer
scientist.WhenIreadthisbookIknewimmediatelythatIwantedtouseitinmyclass.Itwastheclearest
and most helpful computer science text I had seen. It emphasized the processes of thought involved in
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.
The first example from the text dramatically illustrates this point. It is the traditional "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
problem centers around the difference between a function definition and a function call, and the related
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
befree in the same sense. ItcomplementstheGNUGeneral PublicLicense, whichis a copyleft license
designedforfreesoftware.
WehavedesignedthisLicenseinordertouseitformanualsforfreesoftware,becausefreesoftware
needsfreedocumentation:afreeprogramshouldcomewithmanualsprovidingthesamefreedomsthatthe
software does. But this Licenseis notlimited tosoftware manuals;itcanbe used foranytextualwork,
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
sayingit canbedistributed undertheterms of thisLicense. The"Document," below, refers to anysuch
manualorwork.Anymemberofthepublicisalicensee,andisaddressedas"you."
A"ModifiedVersion" of theDocument meansany work containing the Document or aportionofit,
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) some widely available drawing editor, and that is suitable for input to text formatters or for
367. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven
automatic translation to a variety of formats suitable for input to text formatters. A copy made in an
otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent
modificationbyreadersisnotTransparent.Acopythatisnot"Transparent"iscalled"Opaque."
ExamplesofsuitableformatsforTransparentcopiesincludeplainASCIIwithoutmarkup,Texinfoinput
format, \LaTeX~inputformat, SGMLor XMLusingapubliclyavailable DTD, 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
not have any title page as such, "Title Page" means the text near the most prominent appearance of the
work'stitle,precedingthebeginningofthebodyofthetext.
19.7.3.a.2 VerbatimCopying
YoumaycopyanddistributetheDocumentinanymedium,eithercommerciallyornoncommercially,
providedthatthisLicense,thecopyrightnotices,andthelicensenoticesayingthisLicenseappliestothe
Documentarereproducedinallcopies,andthatyouaddnootherconditionswhatsoevertothoseofthis
License.Youmaynotusetechnicalmeasurestoobstructorcontrolthereadingorfurthercopyingofthe
copies you make or distribute. However, you may accept compensation in exchange for copies. If you
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.
List on the Title Page, as authors, one or more persons or entities responsible for authorship of the
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,
new authors,andpublisheroftheModifiedVersionas givenontheTitlePage.Ifthereis nosection
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
Modified Version by various partiesfor example, statements of peer review or that the text has been
approvedbyanorganizationastheauthoritativedefinitionofastandard.
YoumayaddapassageofuptofivewordsasaFrontCoverText,andapassageofupto25wordsasa
BackCoverText,totheendofthelistofCoverTextsintheModifiedVersion.OnlyonepassageofFront
Cover Text and one of BackCover Text may be added by (or through arrangements made by) any one
entity.IftheDocumentalreadyincludesacovertextforthesamecover,previouslyaddedbyyouorby
arrangementmadebythesameentityyouareactingonbehalfof,youmaynotaddanother;butyoumay
replacetheoldone,onexplicitpermissionfromthepreviouspublisherthataddedtheoldone.
Theauthor(s)andpublisher(s)oftheDocumentdonotbythisLicensegivepermissiontousetheirnames
forpublicityforortoassertorimplyendorsementofanyModifiedVersion.
19.7.3.a.5 CombiningDocuments
You may combine the Document with other documents released under this License, under the terms
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
in the collection, provided thatyou followtherulesofthis Licenseforverbatim copying of each of the
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
A compilation of the Document or its derivatives with other separate and independent documents or
works, in or onavolumeof astorageordistributionmedium, 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
Translation is considered a kind of modification, so you may distribute translations of the Document
underthetermsofSection4.ReplacingInvariantSectionswithtranslationsrequiresspecialpermissionfrom
theircopyrightholders,butyoumayincludetranslationsofsomeorallInvariantSectionsinadditiontothe
originalversionsoftheseInvariantSections.YoumayincludeatranslationofthisLicenseprovidedthatyou
alsoincludetheoriginalEnglishversionofthisLicense.Incaseofadisagreementbetweenthetranslation
andtheoriginalEnglishversionofthisLicense,theoriginalEnglishversionwillprevail.
19.7.3.a.9 Termination
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for
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
particular numbered version of this License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the Document does not specify a version
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.7gyprbaj hlzativltozat ...............................................................................................................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.

Vous aimerez peut-être aussi