377

Python - (Hu) Forditas

Embed Size (px)

Citation preview

GraceHopper,acompilerfeltallja:Szmomra a programozs tbb mint alkalmazott tudomny. A programozs a tuds mlysgeibevezetrdekeskutatsis.Maximiliennek,lisenek,Lucillenek,AugustinneksAlexanenak.ColophonAbortgrafitrajzt,aminektrgyaszdkosantrelaknyvtrgytl,aszerzksztette1987benegyrgifnykpalapjnCansonpaprra.Acowesikiktben1923banegyregattnrsztvev106tonnsValdoraversenyjachtotbrzolja.A hsz vvel korbban ptett, s eredetileg yawlnak felszerelt Valdora tbb djat elhozott,mieltt1912benarajzonlthat516mvitorlafelletketchtalaktottk.Ez a pomps vitorls, amit legnysge igen nagyra becslt kivl tengerjr tulajdonsgairt,majdnemflvszzadontkzlekedett.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 2.Tanuljunk meg programozni Python nyelvenGrardSwinnentanrspedaggiaitancsadInstitutStJeanBerchmansSteMarie59,ruedesWallonsB4000LigeEzajegyzetszabadonletlthetakvetkezwebsiterl:http://www.ulg.ac.be/cifen/inforef/swiAszvegegyrsztakvetkezminspirlta:AllenB.Downey,JeffreyElkner&ChrisMeyersHowtothinklikeacomputerscientistmegtallhat:http://rocky.wellesley.edu/downrey/ostvagy:http://www.ibiblio.org/obpCopyright(C)20002005GrardSwinnenCopyrightHungariantranslation(C)2005DarczyPterE jegyzet terjesztse a GNU Szabad Dokumentcis Licencnek (GNU Free DocumentationLicense, version 1.1) megfelelen trtnik. Ez azt jelenti, hogy n szabadon msolhatja,mdosthatja s terjesztheti a jegyzetet, amennyiben tiszteletben tartja a licencben felsoroltszablyokat,melyekteljesszvegeaGNUFreeDocumentationlicencecmfggelkbena366.oldalonolvashat.Alnyegetilletentudjonrla,nnemsajtthatjakieztaszveget,hogyutnamagnakmsreprodukcisjogokatmeghatrozvaazt(mdostvavagyvltoztatsnlkl)terjessze.Aznltalakrmdostott,akrvltozatlanformbanterjesztettdokumentumnakktelezentartalmaznikellafentidzettlicencteljesszvegt,eztafigyelmeztetst,azezutnkvetkezbevezetst,valamintazeredeti angol nyelv szveg Preface rszt (lsd a fggelket). A jegyzetnek mindenki szmraszabadonhozzfrhetnekkellmaradni.Krhetanyagihozzjrulstazoktl,akiknekajegyzetetterjeszti, de a krt sszeg csak a reprodukci kltsgeire vonatkozhat. n nem terjesztheti ajegyzetetmagnakkvetelveaszerzijogokat,nemkorltozhatjaaznltalterjesztettmsolatokreproduklsnak jogt. Ennek a szvegnek klasszikus nyomtatott knyv formjban,knyvesboltban trtn kereskedelmi terjesztse kizrlagosan az O'Reilly (Paris) kiadnak vanfnntartva.Mindengarancianlklabbanaremnybenpubliklomajegyzetet,hogyazhasznoslesz.3 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenBevezetsEz a jegyzet eredetileg a belga kzpfok oktatsban rsztvev, Tudomny s informatikafakultcinProgramozssprogramnyelvek tantrgyattanul3.osztlyosokszmrakszlt.Egyksrleti szveg, amit azinterneten szabad licenc alatt publiklt szmos ms dokumentumnagymrtkbeninspirlt.Ajegyzetbenegynemlineristantsieljrstjavaslunk,amibiztoshogykritizlhat.Tudatbanvagyunkannak,hogyezegykicsitkaotikusnakfogtnniegyespuristkszemben,demiakartukgy,mertmegvagyunkrlagyzdve,hogytbbfle(nemcsakprogramozs,hanemegyb)tantsimdszerltezikselkellfogadniaztatnyt,hogyaklnbzemberekugyanazokatafogalmakatnem ugyanabban a sorrendben tanuljk meg. Mindenekeltta figyelemfelkeltsretrekedtnksarra,hogyakvetkezvezrelvekbetartsvalakapukatszlesretrjuk: Atantsnak egytlagosdik rtelmiszintjhezsltalnosismereteihezkellalkalmazkodni.Aztelutastjuk, hogykiszsenikblllelitnekoktassunk.Ezenaszemvegentnzveadolgokatazazltalnostrekvsnk,hogybrmiflespecializcinlklnyilvnvalvtegykaprogramozssazinformatikainvarinsait. Atantssornalkalmazotteszkzknekkorszerekneksversenykpeseknekkelllenni,deazisszksges, hogy a dikok szemlyes hasznlatra leglisan jussanak hozzjuk. Tantsimdszernkazonazelkpzelsenalapul,hogyatanulknaknagyonkornelkellkezdeniksajtprojektjeikmegvalstt,amiketasajtelkpzelseikszerintfejlesztenekshasznlnakfel. Atanulnaknagyonhamarkpesnekkelllennikisgrafikusalkalmazsokmegvalstsra.Nagyon fiatalokhoz szlunk (elvileg ppen abba a korba rkeztek, amikor kpesek elkezdeniabsztrahlni). Amellett foglaltunk llst, hogy nagyon korn trjnk r a grafikus interfaceprogramozsra,mgarendelkezsrelladatszerkezetekbemutatsaeltt,mertmegfigyelhet,az osztlyainkba rkez fiatalok mr egy ablakokon s ms interaktv grafikus interfaceekenalapul informatikai kultrban lubickolnak. Ha a programozs tanulst vlasztjk,termszetesenszeretnnekminlelbb(lehet,hogynagyonegyszer)alkalmazsokatkszteni,melyekben a grafikus megjelens mr masszvan jelen van. Azrt vlasztottuk ezt a kissszokatlanmegkzeltst,hogynvendkeinkneknagyonkornlehetsgklegyenkis,szemlyesprojektekbe kezdeni, melyek rvn rezhetik,hogyrtkelikket.Aztviszontmegkveteljk,hogy a munkikat automatikus kdgenerl, fejlett programfejleszt krnyezetek alkalmazsanlklrjkmeg,mertnemakarjukaprogramozssszetettsgtsemelfedni.Egyesekazzalkritizlnakbennnket,hogymdszernknemlltjaelggkzppontbaatisztaskemnyalgoritmizlst.gygondoljuk,hogyegyilyenmegkzeltsafentebbmremltettokok miatt nincs a fiatalokra adaptlva. Radsul ez a megkzelts kevsb lnyeges, mint amltban volt. gy tnik, az objektumokkal trtn modern programozs tanulsa inkbb aztignyli,hogyatanulamilyenkorncsaklehetkerljnkapcsolatbamrltezobjektumokkalsosztlyknyvtrakkal. gy nagyon korn megtanulja, hogy inkbb objektumok kzttiinterakcikbangondolkozzon,minteljrsokbansezlehetvteszi,hogyelggyorsankiaknzzaazolyankonstrukcikelnyeit,mintazrklssapolimorfizmus.Egybknt elg jelents teret biztostottunk a klnbz tpus adatszerkezetek kezelsnek,mert gy vljk, hogy az adatszerkezetektgondolsnakkellkpeznimindenprogramfejlesztsgerict.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 4.AzelsprogramozsinyelvkivlasztsaSok programozsi nyelv ltezik. Mindegyiknek vannak elnyei s htrnyai. Biztos, hogy azlenneazidelis,hatbbnyelvethasznlnnk.Csakbtortanitudjukatanrokat,hogysznjanakridt s mutassanak be klnbz nyelvekbl vett pldkat. El kell azonban fogadnunk, hogymindenek eltt a szilrd alapok megszerzsre kell trekednnk s a rendelkezsnkre ll idkorltozott.Ezenaszemvegentnzveadolgokataztnikszszernek,hogyhaelszrcsakegynyelvethasznlunk,legalbbisazelstanvben.Demelyiknyelvetvlasszukelsnek?Amikor az j Tudomnyok s Informatika tantrgy tantervnek elksztse sorn elkezdtnkgondolkodniezen a krdsen, mr elghosszszemlyesprogramozsitapasztalatotgyjtttnkssze Visual Basickel (Micro$oft) s Clarionnal (Top$peed). Delphivel (Borl@nd) isksrleteztnkegykicsit.Termszetes volt, hogy elszr ezeknek a nyelveknek az egyikre gondoltunk (aClariontpreferlva,amisajnoskevssismert).Haezeketakarnnkalapeszkzknthasznlniazltalnosprogramozstantshoz,akkorazokktkomolyhtrnnyaljrnnak: Azzletiszoftverekheztartoznak.Ezaztjelenti,hogynemcsakazezeketaszoftverekethasznlnikvnoktatsiintzmnynekkellene minden munkalloms szmra licenet vsrolni (ami elg kltsgesnek grkezik),hanem azok a tanulk is implicit mdon erre lennnek knyszertve, akik a programozsitudsukataziskolnkvlkvnjkalkalmazni,amitnemtudunkelfogadni. Specilisanegyetlenopercisrendszerhezktdnek,aWindowshoz.Nemportbilisakmsopercisrendszerekre(Unix, MacOS,stb.).Eznemilleszkedikabbaapedaggiaitervnkbe,hogy ltalnos (s ezrt szertegaz) kpzst adunk, amiben az informatikai invarinsokat amennyirelehetsgesnyilvnvalvtesszk.Ezrt gy dntttnk, hogy megnzzk az alternatv knlatot, vagyis amit a szabad szoftvermozgalom1 ingyen knl. Amit talltunk, az nagyon fellelkestett bennnket: az Open Sourcevilgban ingyenes interpreterek s compilerek lteznek egy sor nyelvre, radsul ezek a nyelvekmodernek,versenykpesek,portbilisak(azazklnbzopercisrendszerekalatthasznlhatk,mintaWindows,Linux,MacOS...)snagyonjldokumentltak.Vitn fell a C/C++ a dominns nyelv. Ezt a nyelvet abszolt referenciaknt fogadjk el sminden komoly informatikusnak elbb vagy utbb ssze kell vele akadni. A baj csak az, hogynagyon ijeszt s bonyolult, tlsgosan gpkzeli. A szintaxisa kevss olvashat s ersenkorltoz. Egy nagymret program megrsa C/C++ ban hossz s fradsgos. (Ugyanezek amegjegyzseknagymrtkbenrvnyesekaJavanyelvreis).1 Aszabadsoftware(FreeSoftware)egyolyanprogram,aminekaforrskdjamindenkiszmrahozzfrhet(Opensource). 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. Mivelforrskdjtszmosspecialista(egyetemihallgatsoktat)boncolgatta,ezrtazesetektbbsgbenanagyonmagastechnikai sznvonal a jellemzje. Aleghresebb szabad softwarea GNU/Linux opercisrendszer,amineknpszersgenaprlnapran.5 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven Msrszt ennek a nyelvnek a korszer gyakorlata gyakran folyamodik alkalmazsgenertorokhozsms nagyonfejlettsegdeszkzkhz,mintamilyena C++Builder, Kdevelop,stb. Ezek a programfejleszt krnyezetek nagyon hatkonynak bizonyulhatnak gyakorlottprogramozkkezben,detlsgosansoksszetetteszkztknlnaksolyanismeretekettteleznekfel a felhasznl rszrl, melyekkel egy kezd nyilvnvalan mg nem rendelkezik. Kzttkelvszakezd,nemltjaaftlazerdt,amiazzalaveszllyeljr,hogyasegdeszkzkelfedikanyelvalapmechanizmusait.EzrtaC/C++tksbbrehagyjuk.Programozsi tanulmnyaink elejn szmunkra preferlhatbbnak tnik egy magasabb szint,kevsb korltoz, jobban olvashat szintaktikj nyelv hasznlata. Nzze meg az olvas etrgykrbenJeffreyElknerHowtothinklikeacomputerscientist knyvnekelszavt(lsda362.oldalt).MiutnmegvizsgltuksegykicsitksrleteztnkaPerl sTcl/Tk nyelvekkel,vglanagyonkorszersnvekvnpszersgnekrvendPythonmellettdntttnk.APythonnyelvbemutatjaStfaneFermigier2.APythonegyportbilis,dinamikus,bvthet,ingyenesnyelv,amilehetvtesziaprogramozsmodulrissobjektumorientltmegkzeltst.1989tafejlesztiGuidovanRossumsszmosnkntes.AnyelvjellemziRszletezzkegykicsitanyelv,pontosabbanktjelenlegiimplementcijnakjellemzit: A Python portbilis nemcsak klnbz Unix vltozatokra, hanemMacOS, BeOS, NeXTStep,MSDOS sklnbzWindows vltozatokrais.EgyjfordttrtakJavabanJpythonnakhvjkamiJavabytekdothozltre. Ingyenes,ugyanakkorkorltozsnlklhasznlhatkereskedelmiprojektekben. Egyarntmegfelelnhnyszortzsorosscripteknekstbbtzezersoroskomplexprojekteknek. Szintaxisa nagyon egyszer, fejlett adattpusokat kombinl (listkat, sztrakat, ...). Nagyontmr,ugyanakkorjlolvashatprogramokrhatkvele.AzazonosfunkcijCsC++(vagyppen Java) program hossznak gyakran a harmadatde az egyenrtk (bsgesenkommentltsastandardszablyoknakmegfelelenprezentlt)Pythonprogram,amiltalban510szerrvidebbfejlesztsiidtslnyegesenegyszerbbkarbantartstjelent. A programoz beavatkozsa nlkl kezeli az erforrsokat (memria, filehandlerek, ...) egyhivatkozs szmll mechanizmus segtsgvel (ami hasonlt egy szemtgyjthz(garbagecollector)),deklnbzikattl). 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 vanbeptve,amilnyegesenleegyszerstiahibakezelst.2 Stfane Fermigier az AFUL (Association Francophone des Utilisateurs de Linux et des logiciels libres = Franciaajk Linux s szabad software FelhasznlkEgyeslete) elnke. Ez a szveg aProgrammez!magazinban 1998 decemberbenmegjelentcikkkivonata, ami ahttp://www.linux-center.org/articles/9812/python.htmlwebcmenis elrhet . GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 6. A Python dinamikus (az interpreter ki tud rtkelni Python kifejezseket s utastsokattartalmazkarakterlncokat), ortogonlis (kevsfogalommalnagyszmkonstrukcirhatle),reflektv(tmogatjaametaprogramozst(pldulavgrehajtssornkpesattribtumokatvagymetdusokat hozzadni/eltvoltani egy objektumhoz/bl, vagy ppen megvltoztatni azosztlyt))sintrospektv (szmosfejleszteszkzmintadebugger saprofiler magbanaPythonbanvanimplementlva). APythondinamikustpusads,mintaSchemevagyaSmallTalk.Aprogramozltalmanipulltmindenobjektumnakaprogramvgrehajtskorjlmeghatrozotttpusavan,amitnemkellelredefinilni. Jelenleg kt implementcija van. Az egyik interpretlt, melyben a programok portbilisutastsokravannaklefordtva,majdegyvirtulisgphajtjaketvgre(mintaJavaesetben,azonbanvanegylnyegesklnbsg:mivelaJavastatikustpusads,ezrtjvalegyszerbbegy Javaprogram vgrehajtsnak a felgyorstsa, mint egy Python program). A msikimplementcikzvetlenlJavabytekdotgenerl. Bvthet: mint a Tcl t vagy a Guile t, a Pythont knnyen illeszthetjk mr meglv Cknyvtrakhoz.Felhasznlhatjukkomplexprogramnyelvekbvtnyelveknt. A standard Python knyvtr s a kiegszt packageek vltozatos szolgltatsokat tesznekhozzfrhetv:stringeksregulriskifejezsek,standardUNIXszolgltatsok(fileok,pipeok,jelek, socketek, szlak, ...), internetprotokolok(Web,News,FTP,CGI, HTML...), llandsg(persistence),adatbzisoksgrafikusinterfaceek. APythonfolyamatosanfejldnyelv,amimgttlelkesfelhasznlksfejlesztkkzssgell,akiknek tbbsge tmogatja a szabad szoftvereket. A nyelv alkotja ltal Cben rt skarbantartottinterpreterrelprhuzamosanegymsik,Javabanrtinterpretertisfejlesztenek. VglaPythonXMLkezelsrealkalmasnyelv.Tbbklnbzverzi?Amintemltettem,aPythontfolyamatosanfejlesztik.Afejlesztsacljaatermktkletestse.Ezrtnemkellaztgondolni,hogyelbbvagyutbbmindenprogramunkatmdostanikell,hogyazokategyj,azelzverzikkalinkompatibilissvltverzihozadaptljuk.Aknyvpldiegymst kveten, egyviszonylaghosszidszakalattkszltek.EgyeseketaPython1.5.2,mgmsokataz1.6,2.0,2.1,2.2svgla2.3verzijvalrtuk.Ennek ellenre valamennyi problma mentesen mkdik ez utbbi verzi alatt s bizonyranagyobbmdostsoknlklfognakmkdniakvetkezverzikalattis.Teleptseazutolsverzitsszrakozzonjl!7 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAPythonterjesztseBibliogrfiaAPythonklnbzverzii(Windowsra,Unixra,stb.),azeredetioktatanyaga,akziknyve,a fggvnyknyvtrak dokumentcija, stb. ingyen letlthetk az internetrl, a hivatalos Pythonwebsiterl:http://www.python.org.NagyonjPythonnalfoglalkozknyvekkaphatk: Programming Python, by Mark Lutz,SecondEdition,O'Reilly,March2001,1296pages,ISBN:0596000855 LearntoprogramusingPython,byAlanGauld,AddisonWesleyProfessional;,January152001,288pages,ISBN:0201709384 Python in a Nutshell,by Alex Martelli, 1st Edition, O'Reilly,March 2003, 654 pages,ISBN:0596001886 LearningPython,byMarkLutz, David Ascher, 2ndEdition, O'Reilly, December 2003, 620 pages, ISBN : 0596002815 Python : How to program, by Harvey M. Deitel, et al, Prentice Hall; February 4, 2002,1292pages,ISBN:0130923613 PythonandTkinterProgramming,byJohnE. Grayson,Manning Publications; 1st edition(January,2000),688pages,ISBN:1884777813 Core Python Programming, by Wesley J. Chun, PrenticeHall(December15,2000),816pages,ISBN:0130260363 Python Programming On Win32,byMarkHammond,AndyRobinson,FirstEditionJanuary2000,669pages,ISBN:1565926218 Python Standard Library, by Fredrik Lundh, O'Reilly,05/2001,281pages,ISBN:0596000960 Python cookbook, by Alex Martelli, Anna Martelli Ravenscroft, David Ascher, 2ndEdition,O'Reilly,03/2005,807pages,ISBN:0596007973GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 8.Atanrnak,akioktatsisegdletkntakarjahasznlniaknyvetA jegyzettel az a clunk, hogy szlesre trjuk a kapukat. Tanulmnyainknak ezen a szintjnfontosnaktnikannakbemutatsa,hogyaszmtgpprogramozsafogalmaksmdszerekrisitrhza, melyben mindenki megtallhatja a neki szimpatikus terletet. Nem gondoljuk azt, hogymindenhallgatnakpontosanugyanazokatadolgokatkellmegtanulni.Inkbbaztszeretnnk,hogymindegyikkneksikerljnkifejleszteniegykicsiteltrszaktudst,amilehetvteszi,hogymindnmaguk,mindpedigtanultrsaikelttrtkeljkmagukatshaegynagyobblptkprojektbenvalegyttmkdstajnlunknekik,akkorhozztudjanakjrulniaspecilistudsukkal.Mindenesetrealegfbbgondunkannakkelllenni,hogysikerljnflkeltennkazrdekldst,ami messze a legnagyobb haszon egy olyan nehz trgykr esetben mint a szmtgpprogramozs.Nemakarunkgytenni,mintakikazthiszikhogydikjaikazonnallelkesednifognakaszpalgoritmusokrsairnt.Inkbbarrlvagyunkmeggyzdve,hogyazrdekldstcsakattla pillanattl kezdve lehet tartsan fenntartani, amikortl kpess vlnak arra, hogy nminllsggaleredeti,szemlyesprojektfejlesztshezkezdhetnek.Ezekameggondolsokvezettekminketegyolyantantrgyszerkezetkialaktshoz,amitegyesektaln kicsit kaotikusnak fognak tallni. A vezrfonal a kitn How to think like a computerscientist,amitkicsitkibvtettnkazadatbe/kivitelresklnsenaTkintergrafikusinterfacerevonatkoz elemekkel. Azt szeretnnk, ha dikjaink mr programozs tanulmnyaik els vnekvgtlkezdvetudnnakkisgrafikusalkalmazsokatkszteni.Egszenkonkrtanezaztjelenti,gygondoljukatantrgyelsvbentfutjukajegyzetelsnyolcfejezett.Ezaztttelezifel,hogyelggyorstembenmegtrgyalunkegysorfontosfogalmat(adattpusok,programvgrehajtsvezrlutastsok,fggvnyeksciklusok),denemfoglalkozunkazzaltlsokat,hogyatanulktkletesenmegrtsenekmindenegyesfogalmat,mielttrtrnkakvetkezre.Inkbbmegprbljukrvezetniketaszemlyeskutatssksrletezszre.Sokszorhatkonyabblesz,haazegyesfogalmakatsfontosmechanizmusokatadottszituciban,vltozatossszefggsekkzttjraelmagyarzzuk.Elkpzelsnk szerint fleg a msodikvaz,amikormegprbljukamegszerzettismereteketelmlyteni s struktrlni. Az algoritmusokat rszletesen elemezzk. A projekteket, feladatmeghatrozsokatselemzmdszereketkonzultcikonbeszljkmeg.Megkveteljkbizonyosmunkkesetnajegyzknyvrendszereshasznlattsatechnikaijelentsekksztst.Avgclmindegyiktanulszmraegykomoly,eredetiprogramozsiprojektkivitelezselesz.Ezrt treksznk a fontos fogalmak elmleti trgyalsnak elg korn a tanv elejn trtnbefejezshez,hogymindenkinekelgidlljonarendelkezsre.Fontosannakamegrtse,hogyjegyzetbenkzltszmosinformciamiegysorspecilisterletet rint (grafikus interfaceek, kommunikci, adatbzisok kezelse, stb.) fakultatvtananyag.Ezekcsakjavaslatoksirnyjelzk,amiketazrtvettnkbeaknyvbe,hogysegtsnkadikjainknak a tanulmnyaikat lezr szemlyre szabott projektjk kivlasztsban smegkezdsben. Nem ksreljk meg egy adott nyelv vagy technikai terlet specialistinakkpzst:csakegykisrltstszeretnnknyjtaniazokraazrisilehetsgekre,amikazoknakknlkoznak,akikveszikafradsgotsprogramozitudsratesznekszert.9 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAknyvpldiAknyvpldinakforrskdjaletlthetaszerzwebsitejrl:http://www.ulg.ac.be/cifen/inforef/swi/python.htmKsznetnyilvntsA jegyzet egy rsze szemlyes munka eredmnye, mg ms jval jelentsebb rsze informcik s jindulat tanrok s kutatk ltal rendelkezsre bocstott tletek gyjtemnye.Amint fntebb mr jeleztem, az egyik legfontosabb forrsom A.Downey, J.Elkner & C.Meyers:How to think like a computer scientist kurzusa volt. Mgegyszer ksznet ezeknek a lelkestanroknak.Bevallom,GuidovanRossum(aPythonfszerzjnek)eredetioktatanyaga,valamintaPythonfelhasznlk(rendkvlaktv)kzssgtlszrmazpldksklnfledokumentumokis nagymrtkben inspirltak. Sajnos lehetetlen felsorolni valamennyi szveg hivatkozst, deszeretnmelismersemrlbiztostanivalamennyikszerzit.Ksznetilletimindazoknak,akikaPythonskiegszti,valamintadokumentcifejlesztsndolgoznak,GuidovanRossummalkezvetermszetesen,deatbbieketsemkifelejtve(Szerencsretlsgosansokanvannak,semhogyvalamennyiknevtfeltudnmittsorolni).KsznetilletimgkollgimatFreddyKlichet,ChristineGhiottsDavidCarrerataLigeiSt.JeanBerchmansIntzettanrait,akikdikjaikkalegyttvllalkoztakr,hogybelevetikmagukatennek az j kurzusnak a kalandjba s akiknek szintn szmos jobbt javasoltuk volt. Klnksznm Christophe Morvannak az IUT de MarnelaValle tanrnak rtkes vlemnyt sbtortst.Nagyon ksznm szerkesztmnek Florence LeroynakazO'Reilly kiadnl, hogy szakrtenjavtottafogalmazsihibimatsbelgicizmusaimat.VglmegksznmfelesgemSuzeltrelmtsmegrtst.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 10.A fordt el szava APythonaleggyorsabbanfejldnyltforrs,ltalnosclobjektumorientltprogramozsinyelv.Aprogramozk14%ahasznlja.Szintaxisarendkvlegyszer,knnyentanulhat.Awww.python.org rlingyenletlthetsmindenkorltozsnlklszabadonfelhasznlhat,mdosthat, terjeszthet. Az interneten rengeteg dokumentci, pldaprogram tallhat, amiksegtikakezdkelindulst.A gyakorlati let szmos terletn alkalmazzk pl.: hlzati alkalmazsok, webfejleszts,numerikusstudomnyosalkalmazsok,prototipusfejleszts,gyorsalkalmazsfejleszts(RAD=RapidApplicationDevelopment),stb.Grard Swinnen knyve pedaggiailag tgondolt, rendkvl logikus bevezets a Pythonprogramozsinyelvbe.Viszonylagkisterjedelmeellenreszmosalkalmazsiterletreadrltstapldaprogramoksalaposelemzsksegtsgvel.Aknyvszervesrsztkpezikapldk,illetveaklnisletlthetmkdpldaprogramok.A fordtssal az volt a clom, hogy egy iskolai tantsra is alkalmas kivl knyvet tegyekmagyarnyelvenhozzfrhetvaz rdekldknek.Azolvasfordtssalkapcsolatosszrevteleitksznettelveszemapython@gportal.humailcmen.Debrecen,2006.janur10.DarczyPter11 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.Fejezet: Programozkntgondolkodni3Mielttelkezdjkaprogramozstanulst,bekellvezesseknhnyfogalmat,melyekismeretreatovbbiakbanszksgnklesz.Szndkosanegyszerstemamagyarzatokat,hogyneterheljemtlazolvast.Aprogramozsnemnehz:elghozzegykismdszeressgskitarts.1.1AprogramozsAtantrgyclja,hogymegtantsonprogramozkntgondolkozni.Ezagondolkodsmdolyansszetett eljrsokat kombinl, mint amilyeneket a matematikusok, a mrnkk, s a tudsokalkalmaznak.Aprogramozamatematikushozhasonlanformlisnyelvekethasznlazokfejtsek(vagyazalgoritmusok) lersra. A mrnkhz hasonlan terveket gondol ki, az alkot rszekblszerkezeteket llt ssze, s rtkeli azok teljestmnyt. Mint a tuds megfigyeli az sszetettrendszerekviselkedst,magyarzatokatvzolfl,ellenrziajslatokat.Aprogramozftevkenysgeaproblmamegolds.Ezklnbzkpessgeketsismereteketignyel: egyproblmtklnbzmdokonkelltudnunkmeg/jrafogalmazni, innovatvshatkonymegoldsokatkelltudnunkelkpzelni, ezeketamegoldsokatvilgosanskomplettmdonkelltudnunkkifejezni.A szmtgp programozsa lnyegben abbl ll, hogy rszletesen megmagyarzzuk egygpnekaminemrtimegazemberinyelvet,csupnkaraktersorozatokautomatikuskezelsrekpes,hogymitkelltennie.Aprogramelrergztettkonvencikezekegyttestprogramozsinyelvneknevezznkszigorbetartsvalkdoltutastsoksorozata.Agprendelkezikegyeljrssalamigydekdoljaezeketazutastsokat,hogyanyelvmindenszavhozegypontosanmeghatrozottakcitrendel.Azolvasmegtanulprogramozni,amimrnmagbanhasznos,mertfejlesztiazintelligencit.Majd odig is eljut, hogy a programozst konkrt projektjek megvalstsra hasznlja, amibenbiztosrmtfogjalelni.1.2Gpinyelv,programozsinyelvA szmtgp kt llapot elektromos jelek (pldul egy minimlis vagy egy maximlisfeszltsg) sorozatain hajt vgre egyszer mveleteket. Ezek a jelsorozatok egy minden vagysemmi tpus logikt kvetnek. gy tekinthetjk ket, mint olyan szmok sorozatt, melyekmindg csak a 0 s az 1 rtkeket vehetik fel. Az ilyen szmrendszert kettes (binris)szmrendszerneknevezzk.Aszmtgpa belsmkdsesorn csakbinrisszmokattudkezelni.Mindenmstpusinformcitbinrisformtumvkelltalaktanivagykdolni.Eznemcsakakezelendadatokra(szvegek,kpek,hangok,szmok,stb.)igaz,hanemaprogramokrais,vagyisazokraazutastssorozatokra is, amiket azrt adunk meg a gpnek, hogy megmondjuk neki, mit kell csinlni az3 EnnekafejezetnekajelentsrsztDowney,ElknersMeyersHowtothinklikeacomputerscientistjblfordtottam.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 12.adatokkal.Azegyetlennyelv,amitaszmtgpvalbanmegrttnylegnagyontvolvanattlamitmihasznlunk.1eseks0k(ezekabitek)hosszsorozata,amiketgyakran8,16,32vagyppen64esvel csoportostva hasznl. Ez a gpi nyelv szmunkra rthetetlen. Ahhoz, hogy egyszmtgppel beszljnk, olyan fordt rendszereket kell alkalmaznunk, melyek kpesek aszmunkrarthetbbkucsszavakat(rendszerintangolszavakat)alkotkaraktersorozatokatbinrisszmokkalaktani.Ezeknek a fordt rendszereknek, amiket egy sor konvenci alapjn implementlnak,nyilvnvalanszmosvltozataltezik.Attlfggen,hogymilyeneljrstalkalmazafordt:hvjukinterpreternekvagycompilernek(lsdlentebb).Aprogramozsinyelv nagyonpontosszablyokhozrendelt(nknyesenvlasztott)kulcsszavaknak a kszlete. Azt rja le, hogyan rakhatjuk ssze ezeket a szavakat olyanmondatokk, amiket az interpreter vagyacompiler agpnyelvre (binris szmokra) le tudfordtani.Az absztrakci szintje alapjn beszlhetnkalacsonyszint(pl.: Assembler)vagymagasszint nyelvekrl (pl.:: Pascal, Perl, Smalltalk, Clarion, Java...). Egy alacsonyszint nyelvetnagyonelemi, nagyongpkzeli utastsok alkotjk. Egy magas szint nyelv utastsaiabsztraktabbakvagyhatkonyabbak.Ezaztjelenti,hogyazinterpretervagyacompilermindenutaststnagyszmelemigpiutastsrafordtle.AzolvaselsprogramozsinyelvkntaPythontfogjamegtanulni.Ezegymagasszintnyelv.Abinriskdratrtnfordtsasszetetteljrssmindgidignyes.Ezknyelmetlennektnhet.Valjban a magas szint nyelveknek rendkvli elnyeik vannak: egy magas szint nyelven aprogramrs sokkalegyszerbb,jvalkevesebbidbekerl;annakavalsznsge,hogyhibkatejtnkjvalcseklyebb,minthaegyalacsonyszintnyelvenprogramoznnk;akarbantarts(vagyisaksbbimdostsok)sahibakeress(debugols)nagymrtkbenegyszersdnek.Radsulegymagas szint nyelven megrt program gyakran hordozhat (portable) lesz, vagyis gymkdtethetjk, hogy nem kell sokat vltoztatni rajta a klnbz gpeken vagy opercisrendszereken.Egy alacsonyszint nyelvenrtprogrammindgcsakegygptpusontud mkdni.Ahhoz,hogyegymsikgptpusonmkdjnteljesentkellrni.13 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.3CompillssinterpretlsAprogramot,ahogyanaztegyszerkesztprogrammal(egyfajtaspecilizltszvegszerkesztvel)megrjukmostantlfogvaforrsprogramnak (vagyforrskdnak)nevezzk.Mintmremltettem,kt f technika ltezik arra, hogy egy ilyen forrskdot a gp ltal vgrehajthat binris kdrafordtsunk:azinterpretcisacompilatio. Azinterpretciesetnmindenegyesalkalommal,amikorvgreakarjukhajtatniaprogramot,azinterpreterprogramotkellhasznlnunk.Ennlatechniknlafordtaforrsprogrammindenegyes elemzett sort nhny gpi nyelv utastsra lefordtja, amiket azonnal vgre is hajt.Semmilyentrgyprogramsemgenerldik Acompills a teljes forrsszveg egyszeri lefordtsbl ll. A fordt program elolvassa aforrsprogramsszessortsegyjkdotlltel,amittrgykdnak(objectkd)hvunk.Ezutbbit mostmr a compilertl fggetlenl vgrehajtathatjuk s trolhatjuk egy fileban(vgrehajthatfile)Mindegyiktechniknakvannakelnyeishtrnyai:Azinterpretciidelisamikoregynyelvettanulunk,vagyegyprojekttelksrleteznk.Ezzelatechnikvalkzvetlenltesztelhetaforrskdmindenmegvltoztatsaanlkl,hogytmennnkegycompillsifzison,amimindgidignyes.Ezzel szemben, amikor egy projektnek sszetett funkcii vannak, amiket gyorsan kellvgrehajtani,acompilatitrszestjkelnyben.Nyilvnval,hogyegycompilltprogrammindglnyegesen gyorsabban fog mkdni, mint az interpretlt vltozata, mivel a szmtgpnek avgrehajtselttnemkellmindenegyesutaststjrabinriskdralefordtani.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 14.Egyesmodernnyelvekmegprbljkaktmdszertkombinlni,hogymindegyikblalegjobbathozzk ki. Ez a helyzet a Python s a Java esetben is. Amikor egy forrskdot adunk t aPythonnak, az elszr egy gpikdhozhasonlkzbenskdot.n. bytecodeothozltre, amitaztn egyinterpreternek ad tvgrehajtsra.Aszmtgpszempontjbla bytecode otnagyonegyszer gpi nyelven interpretlni. Ez az interpretci teht sokkal gyorsabb lesz, mint egyforrskdinterpretcija.Ennekamdszernekazelnyeirzkelhetek: Az,hogyllandanrendelkeznkegyinterpreterrel,lehetvteszibrmilyenkisprogramrszletkzvetlen tesztelst. Egy alkalmazs brmelyik alkotjnak helyes mkdst igazolhatjukannakltrehozstkveten. Alefordtott bytecode interpretcijanemolyangyors,mintegyigazibinriskd,deszmosprogramszmra,belertveagrafikusprogramokatis,nagyonmegfelel. Abytecode portbilis. Ahhoz, hogy egy Python vagy egy Java program klnbz gpekenvgrehajtdjonelghamindegyikgpenrendelkezsrellegyadaptltinterpreter.Az elmondottak egy kicsit bonyolultnak tnhetnek, az viszont j hr, hogy mindezt a Pythonfejlesztkrnyezet automatikusan vgziel. Elg, haberjuk aparancsokat aklaviatrn, majdnyomunksaPythonmagravllaljaazokfordtstsinterpretlst.15 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.4ProgramfejlesztsHibakeress(debug)A programozs nagyon sszetett s mint minden emberi tevkenysg sorn, ennek sorn isszmos hibt kvetnk el. Anekdotai okokbl a programozsi hibkat bug4oknak nevezzk. Adetektlsukrasjavtsukrahasznlttechnikkegyttestdebugnaknevezzk.Hromfletpushibaltezhetegyprogramban.Illendmegtanulnimegklnbztetniket:1.4.1 SzintaxishibkAPythoncsakakkortudvgrehajtaniegyprogramot,haaszintaxisateljesenkorrekt.Ellenkezesetben a programvgrehajts lell s egy hibazenetet kapunk. A szintaxis kifejezs azokra aszablyokrautal,melyeketanyelvszerzirgztettekaprogramstruktrjravonatkozan.Mindennyelvnekvanszintaxisa.Pldulamagyarnyelvbenegymondatmindgnagybetvelkezddiksrsjellelvgzdik.ezrtezamondatktszintaxishibttartalmazA kznsges szvegekben nhny kis szintaxishibnak nincs jelentsge. St elfordulhat(pldulaversekben),hogyszndkosankvettekelszintaxishibkat.Eznemgtoljamegaszvegmegrtst.Ezzel szemben egy szmtgp programban a legkisebb szintaxishiba a mkds lellst(kiakads)segyhibazenetkirsteredmnyezi.Azolvasprogramoziplyafutsaelsheteibenbiztosansok idtfog eltlteniaszintaxishibikeressvel.Gyakorlattaljvalkevesebbhibtfogelkvetni.Tartsuk szben, hogy az alkalmazott szavaknak s szimblumoknak nmagukban semmilyenjelentsksincs:ezekcsakkdsorozatok,amikarravalk,hogyautomatikusanbinrisszmokklegyenek alaktva. Kvetkezskntnagyongyelnnkkellanyelvszintaxisnakalegaprlkosabbetartsra.Szerencse,hogyelsprogramozilpseinketegyolyaninterpetltnyelvveltesszkmeg,mintaPython.Veleegyszersgyorsahibakeress.Compilltnyelvekkel(mintaC++)mindenmdostsutn,legyenekazokakrmilyenkicsikis,jrakellenefordtaniateljesprogramot.1.4.2 SzemantikaihibkAmsodikhibatpusaszemantikaihibavagylogikaihiba.Hailyentpushibavanvalamelyikprogramunkban,akkoraprogramtkletesenhajtdikvgreabbanazrtelemben,hogysemmilyenhibazenetetsemkapunk,deazeredmnynemazamitvrunk:mstkapunk.Valjbanaprogramaztteszi,amitmondtunkneki,hogyhajtsonvgre.Aproblmaaz,hogyamitmondtunk,hogyhajtsonvgrenemfelelmegannak,amitszerettnkvolna,hogyaprogramvgrehajtson.Aprogramutastsainaksorrendjenemfelelmegakitzttclnak.Aszemantika(alogika)nemkorrekt.Alogikai hibkkeresse nehz feladat lehet.Elemeznikellazoutputotsmegkellprblniegymsutnreproduklniazokatamveleteket,amiketagpazegyesutastsokutnvgrehajtott.4 A "bug" angol eredet kifejezs, olyan kis, kellemetlen rovarokat jelent, mint amilyenek a poloskk. Az elsszmtgpekelektroncsveimeglehetsennagyfeszltsgetignyeltek.Szmosalkalommalmegtrtnt,hogyezeka rovarok bemsztak az ramkrk kz sramtst kaptak, sznn gett testk rvidzrakat s gy rthetetlenmeghibsodsokatokozott.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 16.1.4.3 VgrehajtskzbenfellphibkA hibk harmadik tpust a vgrehajts kzben fellp hibk (Runtime error) kpezik. Ezekcsakakkorlpnekfel,amikoraprogrammkdsesornspeciliskrlmnyekllnakel(pldulaprogramegymrnemltezfiletksrelmegolvasni).Ezeketahibkatkivteleknek(exception)is hvjk, mert ezek ltalban jelzik, hogy valami kivteles trtnt (amit nem lttunk elre).Tbbszrfogunktallkozniilyentpushibvalamikoregyrenagyobbmretprojekteketfogunkprogramozni.1.5HibakeresssksrletezsA tanuls sorn elsajttand egyik legfontosabb kszsg a hatkony programhiba keress(debugols). Ez nha idegest, de mindgnagyonsokrtszellemitevkenysg,aminek asornlesltsrlkelltanubizonysgottenni.Emlkeztet egy rendrsgi kihallgatsra. Megvizsgljuk a tnyeket s magyarz feltevseketkelltennnk,hogyrekonstruljukatapasztalteredmnyeketadfolyamatokatsesemnyeket.Hasonlt a tudomnyos ksrletekre. Van egy elkpzelsnk arrl, hogy mi nem mkdik,mdostjukaprogramunkatsjrakiprbljuk.Kialaktottunkegyfelttelezst,amilehetvtesziannakmegjslst,hogymitkelleredmnyezzenamdosts.Haajslatbeigazoldik,tettnkegylpstegymkdprogramirnyba.Haajslatunktvesnekbizonyul,akkoregyjabbhipotzistkellalkotnunk.AhogyanaztSherlockHolmesmondja:Amikorkizrtukalehetetlent,annakkelllennieazigazsgnak,amimegmarad,mghaazvalszntlenis(A.ConanDoyle,Angyesjel).Egyeseknekaprogramozssdebugolspontosanugyanaztadolgotjelenti.Ezzelaztakarjkmondani,hogyaprogramozsugyanannakaprogramnakazllanmdostsbls javtsbl ll, mindaddig, mg vgl a program gy viselkedik, ahogyan akarjuk, hogyviselkedjen. Azelkpzels az, hogy a programksztsmindg egymr mkd(azazdebugolt)vzzalkezddik,amihezrtegrlrtegrekismdostsokattesznkhozz,fokozatosanjavtjukahibkat,hogyvglafolyamatmindegyikszakaszbanegymkdprogramunklegyen.Pldultudjuk,hogyaLinuxegytbbezerkdsorblllopercisrendszer(tehtegynagyprogram). Ennek ellenre kezdetben gy indult mint egy kicsi, egyszer program, amit LinusTorvaldsarrafejlesztettki,hogyteszteljeazIntel80386processzorsajtossgait.LarryGreenFieldszerint (The Linux user's guide, bta verzi 1): Linus els programjainak egyike egy kisprogramvolt,aminekafeladataazAAAAkarakterlncBBBBkaraklnccvalalaktsavolt.Ez az,amiksbbaLinuxszvlt!.Azelzeknemjelentikazt,hogyhomlyoselkpzelsblkiindulvaszukcesszvenapproximlvaakarnnkprogramozni.Amikoregyjelentsprogamprojektbekezdnk,mindenernkkelarrakelltrekednnk, hogy a lehet legjobb rszletes feladat meghatrozst rjuk meg, ami az elkpzeltalkalmazstervnfogalapulni.Klnbz mdszerek lteznek erre aproblmaelemzsre, azonban ezek tanulmnyozsameghaladjaennekajegyzetnekakereteit.Tovbbiinformcikrtshivatkozsokrtforduljonazolvasatanrhoz.17 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.6TermszetessformlisnyelvekAzok a termszetes nyelvek, amiketkommunikcira hasznlnak az emberek.Nemkonstrultnyelvek (mgakkor sem,haegyesekben megprblnakrendszertteremteni):termszetesmdonfejldnek.Aformlis nyelveket specilis alkalmazsokat szem eltt tartva fejlesztettk ki. gy pldul amatematikusokltalhasznltjellsrendszeregyolyanformlisnyelv,amiklnsenhatkonyanfejezi ki a klnbz szmok s mretek kztti relcikat. A vegyszek egy formlis nyelvethasznlnakamolekulkszerkezetnekbemutatsra,stb.Aprogramozsinyelvekazokaformlisnyelvek,amiketalgoritmusoklersrafejlesztettekki.Mint mr fntebb jeleztem, a formlis nyelvek szintaxisa rendkvl szigor szablyoknakengedelmeskedik.Pldula3+3=6egymatematikailagkorrektbrzolsmd,mga$3=+6nemaz.UgyangyaH2Okmiaikpletkorrekt,deaZq3G2nem.Aszintaxisszablyokatnemcsakanyelvszimblumaira(pldulaZqkmiaiszimblumnemmegengedett, mert semmilyen elemnek sem felel meg), hanem azok kombinlsi mdjra isalkalmazzuk. Ezrt, jllehet a 6+=+/5-matematikai egyenlet csak megengedett szimblumokattartalmaz,azonbanazokinkorrektelrendezsesemmitsemjelent.Egy mondatolvassakor el kelljutnunkodig,hogyelkpzeljkamondatlogikaiszerkezett(mgakkorishaeztazesetektbbsgbennemtudatosantesszk).PldulamikorApnzdarableesett. mondatot mondjuk, megrtjk, hogy A pnzdarab az alany s a leesett azlltmny.Azelemzslehetvteszi,hogymegrtskamondatjelentst,logikjt(szemantikjt).Analg mdon a Python interpreternek elemezni kell a forrsprogramunk szerkezett, hogy ajelentstkihmozzabelle.A termszetes s a formlis nyelveknek sok kzs jellemzje van (szimblumok, szintaxis,szemantika),denagyonjelentsklnbsgeketisvannakkzttk:Ktrtelmsg.A termszetes nyelvek tele vannak ktrtelmsgekkel, amik az esetek tbbsgben aszvegkrnyezet segtsgvel megszntethetk. Pldul eltr jelentst tulajdontunk az rsznakegytermkrl,illetveegyrvzrlszlszvegben.Egyformlisnyelvnemtartalmazhatktrtelmsgeket.Mindenutastsnakegyetlen,szvegkrnyezettlfggetlenjelentsevan.Redundancia.A termszetes nyelvekben sok a redundancia azrt, hogy ezeket a ktrtelmsgeket s azinformci tvitelbeli szmos hibt s vesztesget kompenzljk (mondatainkban tbbszrklnbzformbanmegismteljkugyanazt,hogybiztosaklegynkbenne,hogymegrttettkmagunkat).Aformlisnyelveksokkaltmrebbek.Irodalmisg.Az irodalmi szvegek tele vannak kpekkel s metaforkkal. Egy formlis nyelvben ezzelszemben a kifejezseket sz szerint kell venni. Ha egy bizonyos szvegkrnyezetben aztmondom,hogyleesettaktforintos,lehetsges,hogyszsincsigaziktforintosrl,sempedigleessrl.Ezzelszembenegyformlisnyelvbenakifejezseketszszerintkellrteni.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 18.Atermszetesnyelvekhasznlathozszokvasokszornehezenalkalmazkodunkaformlisnyelvekszigorhoz. Ez az egyik nehzsg, amin tl kell jutni, hogy eljussunk egy hatkony programanalitikusgondolkodsmdjig.Ajobbmegrtsrdekbenhasonltsunksszemgnhnyszvegtpust:Vers:Aversekbenaszavakatmindzeneisgk,mindjelentskmiatthasznljksakeresetthatsfkntrzelmi.Tobzdnakametaforkbansktrtelmsgekben.Przaiszveg:Aszavakszszerintijelentsefontosabbbennk,samondatokgyvannakstruktrlva,hogymegszntessk a ktrtelmsgeket, de ez soha sem sikerl teljesen. Gyakran szksgesek aredundancik.Szmtgpprogram:Aszvegjelentseegyrtelmsszszerinti.Tkletesenmegrthetcsakaszimblumoksaszerkezetelemzservn.Tehtautomatizlnilehetazelemzst.Nhnyjavaslat,hogyhogyanolvassunkszmtgpprogramot(vagybrmilyenformlisnyelvenrtszveget).Tartsukszben,hogya formlisnyelveksokkaltmrebbek,mintatermszetesnyelvek,amiaztjelenti,hogyazolvassukhoztbbidrevanszksg.Radsulastruktraezeknlnagyonfontos.ltalbanazsemjtlet,haegymenetbenazelejtlavgigolvasunkelegyprogramot.Ehelyettgyakoroljukaprogramelemzstfejbenaszimblumokazonostsvalsaszerkezetrtelmezsvel.Vglemlkezznkr,hogymindenrszletnekjelentsgevan.Klnsenfigyelnnkkellakissnagybetkrevalamintaz rsjelekhasznlatra.Mindenilyenhiba(mgaltszlaglegkisebb is,mintegyvesszkifelejtse)jelentsenmdosthatjaakdjelentstsgyaprogramlefutst.19 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.Fejezet: AzelslpsekIdejemunkhozltnunk.Pontosabban,megkrjkaszmtgpet,hogydolgozzonhelyettnk.Pdulaztazparancsotadjukneki,hogyvgezzenelegysszeadstsrjakiazeredmnyt.Ehhezutastsokatsadatokatkellmegadnunk,melyekrealkalmazniakarjukazelbbieket.2.1SzmolsaPythonnalAPythonnakazasajtossga,hogytbbflemdonhasznlhatjuk.Elszr interaktiv mdban, fogjuk hasznlni, vagyis gy, hogy a billentyzet segtsgvelkzvetlenl folytathatunk vele prbeszdet. gy igen gyorsan felfedezhetjk a nyelv szmoslehetsgt. Ksbb megtanuljuk, hogyan kell ltrehozni s diszkre elmenteni programokat(scripteket).Azinterpretertkzvetlenlaparancssorblindthatjuk(egyLinuxshellben,vagyWindowsalattegyDOSablakbl):elg,habegpeljka"python"parancsot(feltve,hogyaprogramfelvanteleptve)).Ha grafikus interfacet hasznlunk, mint aWindows,Gnome, WindowMaker vagyKDE,valsznleg inkbb egy terminlablakban fogunk dolgozni, vagy egy specializlt fejlesztkrnyezetben,mintamilyenazIDLE.Terminlablakban(Linux5alatt)akvetkezjelenikmeg:5WindowsalattvlaszthatunkaGuidoVanRossumltalrtIDLEfejlesztkrnyezet,amitmagamelnybenrszestek,saMarkHammondltalfejlesztettPythonWinkztt.Lteznekmskifinomultfejlesztkrnyezetekis,mintakivlBoa Constructor (ez hasonlan mkdik, mint a Delphi), de gy vlem, hogy ez nem val kezdknek. TovbbifelvilgostsrtaPythonwebsiteotrdemesmegnzni.LinuxalattinkbbaWindowMakergrafikuskrnyezetetrszestemelnyben(mintaKDEtvagyaGnomeot,amiktlsok erforrst vesznek ignybe). Megnyitunk egy egyszer terminlablakot a Python interpreter indtshoz vagy ascriptekvgrehajtshozsakitnNeditprogramothvjuk,amiascriptekszerkesztsreval.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 20.WindowsalattazIDLEfejlesztkrnyezetkinzeteazalbbikprehasonlt:A>>>jelafprompt,amiaztjelzi,hogyazinterpreterkszenllegyutastsvgrehajtsra.Pldul az interpretert azonnal egyszer irodai kalkultorknt hasznlhatjuk. Ellenrizzk azalbbi parancsokat (Vljon szoksunkk, hogy egy fzetbe felrjuk a kpernyn megjeleneredmnyeket):>>> 5+3>>> 2 - 9 # a szkzk opcionlisak>>> 7 + 3 * 4 # a matematikai opertorok hierarchija# megmarad-e ?>>> (7+3)*4>>> 20 / 3 # meglepets !!!Megllapthatjuk, hogy a +, , * s/.aritmetikaiopertoroksszeads,kivons, szorzssosztsravalk.Azrjelekmkdnek.Alaprtelmezsbenviszontazosztsegszoszts,amiaztjelenti,hogyhaegszargumentumokatadunk meg, akkor az eredmny egy (csonkolt) egsz lesz, mint a fenti utols pldban. Ha aztakarjuk,hogyaPythonazargumentumtvalsszmkntrtelmezze,akkoreztgytudatjukvele,hogyaszmbaegytizedesponttesznk6.Prbljukkipldul:>>> 20.0 / 3 # (hasonltsuk ssze az eredmnyt az el zpldval) >>> 8./5Ha egy mveletet vegyes tpus argumentumokkal hajtunk vgre (egszekkel s valsokkal),akkor a Python az operandusokat automatikusan vals tpusv alaktja t mieltt elvgzi amveletet.Prbljukki:>>> 4 * 2.5 / 3.36 Valamennyi programozsi nyelvben : atizedesszepartor mindg egy pont. Az informatikban a vals szmokatgyakranlebegpontosszmoknak,vagyfloattpusaknaknevezik.21 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.2AdatoksvltozkAksbbiekbenleszalkalmunkrszletezniaklnbznumerikusadattpusokat,deeltteegynagyonfontosfogalomrlbeszlnk:Egy szmtgpprogram lnyegt azadatmanipulcik kpezik. Ezek azadatok nagyonklnbzek lehetnek (lnyegben minden, ami digitalizlhat7),deaszmtgpmemrijbanvglegbinrisszmokvgessorozatvegyszersdnek.Ahhoz,hogyaprogram(brmilyennyelvenislegyenmegrva)hozztudjonfrniazadatokhoz,nagyszmklnbztpusvltozthasznl.Egyprogramozsinyelvbenegyvltozmajdnemmindegymilyenvltoznvkntjelenikmeg,aszmtgp szmra egy memriacmet jell hivatkozsrl van sz, vagyis egy meghatrozotthelyrlaRAMban.Ezen a helyen egy jl meghatrozott rtk van trolva. Ez az igazi adat, ami binris szmoksorozata formjban van trolva, de ami az alkalmazott programozsi nyelv szemben nemfelttlenl egy szm. Szinte brmilyen objektum lehet, ami elhelyezhet a szmtgpmemrijban,mintpldul:egyegsz,egyvals,egykomplexszm,egyvektor,egykarakterlnc,egytblzat,egyfggvny,stb.Aprogramozsinyelvklnbzvltoztpusokat(egsz,vals,karakterlnc,lista,stb.)hasznlaklnbzlehetsgestartalmakegymstltrtnmegklnbztetsre. Akvetkezoldalakonezeketfogomelmagyarzni.7 Igazn mit digitalizlhatunk ? Ez egy rendkvl fontos krds, amit az ltalnos szmtstechnika kurzuson kellmegtrgyalnunk.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 22.2.3VltozneveksfoglaltszavakAvltozneveketmivlasztjukmegmeglehetsenszabadon.Ennekellenretrekednnkkell,hogyjlvlasszukmegket.Elnybenkellrszesteniazelgrvid,amennyirelehetsgesexplicitneveket, amik vilgosan kifejezik, hogy mit tartalmaz az illet vltoz. Pldul: az olyanvltoznevek,mintmagassg,magas,vagymagjobbakamagassgkifejezsre,mintx.Egyjprogramoznakgyelnikellarra,hogyazutastssoraitknnylegyenolvasni.EzenkvlaPythonbanavltoznevekneknhnyegyszerszablynakkellelegettenni: Avltoznvaz(az,AZ)betksa(09)szmoksorozata,aminekmindgbetvelkellkezddni. Csakazkezetnlklibetkamegengedettek.Aszkzk,aspeciliskarakterek,mintpl.:$,#,@,stb.nemhasznlhatk.Kivtela_(alhzs). Akissnagybetkklnbznekszmtanak.Figyelem:Jozsef,jozsef,JOZSEFklnbzvltozk.gyeljnkerre!Vljonszoksunkk,hogyavltozneveketkisbetkkelrjuk(akezdbettis8).Egyegyszerkonvencirl van sz, de ezt szles krben betartjk. Nagybetket csak magnak a sznak abelsejbenhasznljunk,hogyfokozzukazolvashatsgot,mintpldul:tartalomJegyzk.Tovbbiszably:nemhasznlhatvltoznvkntazalbbfelsorolt28foglaltsz(ezeketaPythonhasznlja):and assert break class continue defdel elif else except exec finallyfor from global if import inis lambda not or pass printraise return try while yield8 Anagybetkkelkezddszavaknincsenektiltva,deezeketinkbbazosztlyokat(classokat)jellvltozknaktartjukfenn(azosztlyfogalmtksbbfogomelmagyarzni).23 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.4Hozzrendels(vagyrtkads)Mostmrtudjuk,hogyhogyanvlasszukmegjlegyvltoznakanevt.Lssukmost,hogyandefinilhatunk egy vltozt s hogyan rendelhetnk hozz rtket. A vltozhoz val rtkhozzrendelsvagyrtkadskifejezsekegyenrtkek.Egyolyanmveletetjellnek,amelykapcsolatotteremtavltoznvsavltozrtke(tartalma)kztt.A Pythonban szmos ms nyelvhez hasonlan a hozzrendels mvelett az egyenlsgjel reprezentlja9:>>> n = 7 # n-nek a 7-et adjuk rtkl >>> msg = "Mi jsg ?" # A "Mi jsg ?" rtket adjuk msg-nek>>> pi = 3.14159 # pi nevvltozhoz hozzrendeljk az rtkt Afentipythonosrtkadmveletekklasszikusak.Miutnezeketvgrehajtottuk,aszmtgpmemrijnakklnbzhelyein: hromvltoznvvan:n,msgspi hrombytesorozatvan,melyekbena7egszszm,aMijsg?karakterlncsa3,14159valsszmvankdolva.Afentihromrtkadutastsmindegyiknekahatsatbbmveletvgrehajtsaaszmtgpmemrijban:: vltoznvltrehozsasbejegyzseamemriba; vltoznvhezjlmeghatrozotttpusrendelse(eztakvetkezoldalonfogommagyarzni); egyspecilisrtkltrehozsastrolsaamemriban; kapcsolat ltestse a vltoznv s a megfelel rtk memriahelye kztt (mutatk belsrendszeresegtsgvel)Azelmondottakatazalbbillapotdiagrammalszemlltethetjk:n msg pi 7Mijsg?3.14159A hrom vltoznv a memria egy specilis rszben az .n. nvtrben (namespace) trolthivatkozs, mg a megfelel rtkek msutt, egymstl gyakran tvol helyezkednek el. Aksbbiekbenalkalmunkleszpontostanieztakoncepcit.9 Fontos, hogy megrtsk, hogy itt semmifle egyenlsgrl sincs sz. Egy ms szimbolizmust is vlaszthattunkvolna,mintplduln 7,ahogyaneztgyakranmegteszikms,algoritmusokatlerpszeudonyelvekbenazrt,hogyjelezzk,egytartalomnak(a7rtknek)egykontnerhez(avltozhoz)valhozzrendelsrlvansz.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 24.2.5VltozrtknekakirsaAfentigyakorlatkvetkezmnyeknthromvltoznkvan:n,msg,piKt lehetsg van az rtkk kpernyre trtn kiratsra. Az els: a billentyzeten berjuk avltoznevt,majd.APythonvlaszulkirjaamegfelelrtket:>>> n7>>> msg"Mi jsg ?">>> pi3.14159Az interpreter egy msodlagos funkcionalitsrl van itt sz, aminek az a clja, hogymegknnytseazletnket,amikoregyszerparancssorgyakorlatokatvgznk.Programbanmindgaprintutaststhasznljuk:>>> print msgMi jsg ?Vegyk szre a ktfle kiratsi mddal kapott eredmny kztti apr klnbsget. A printutastsszigorancsakavltozrtktrjaki,gyahogyanazkdolvavolt,mgamsikmdszer(az, amelyik csak a vltoznv bersbl ll) az idzjeleket is (azrt, hogy emlkeztessen avltoztpusra:erremgvisszafogoktrni).2.6AvltozktipusadsaAPythonbannemszksgesavltozkhasznlataelttatpusukdefinilsardekbenspecilisprogramsorokatrni. Elghahozzrendelnkegyrtketegyvltoznvhez.APythonavltoztautomatikusan azzal a tpussal hozza ltre, ami a legjobban megfelel az rtknek. Az elzgyakorlatbanpldulaz n, msg spi vltozkmindegyikt automatikusanhoztaltreklnbztpusokkal(rendreegszszm,karakterlnc,lebegpontosszmtpusokkal).EzegyrdekessajtossgaaPythonnak,amialapjnaprogramnyelveknekahhozacsoportjhozsoroljuk,amelyikhezaLisp,Schemesnhnymsnyelvtartozik.APythondinamikustpusadsnyelv, szemben a statikus tpusads nyelvekkel mint amilyenek a C++ vagy a Java. Ezekben anyelvekbenelszrmindg specilis utastsokkaldeklarlni(definilni)kellavltozknevt stpustscsakezutnlehettartalmatrendelnihozzjuk,aminektermszetesenkompatibilisnekkelllenniadeklarlttpussal.Astatikus tpusadst acompilltnyelvekrszestikelnyben,mertazlehetvtesziafordts(aminekakdjaegybefagyottbinriskd)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 asztrak(dictionary).25 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.7TbbszrsrtkadsAPythonbanegyszerretbbvltozhozrendelhetnkrtkeket.Pldul:>>> x = y = 7>>> x7>>> y7Egyetlenopertorsegtsgvelprhuzamosanisvgezhetnkrtkadst:>>> a, b = 4, 8.33>>> a4>>> b8.33Ebbenapldbanazasbegyidejlegveszifela4s8.33rtkeket.Figyelem :a tizedes jegyeket tizedes ponttal vlasztjukelazegszrsztl,ahogyazazangol nyelvterleten szoksos. Avesszt a klnbz elemek (argumentumok, stb.) elvlasztsrahasznljuk ahogyan a pldban lttuk, mind maguknak a vltozknak, mind pedig a hozzjukrendeltrtkeknekazelvlasztsra.(2)Gyakorlatok2.1. rja le a lehet legrthetbben s teljesebben, hogy mi trtnik az albbi plda hromsorban:>>> szelesseg = 20>>> magassag= 5 * 9.3>>> szelesseg * magassag9302.2. Rendeljehozza3,5,7rtkeketaza,b,cvltozkhoz.Vgezzeelazab/cmveletet.Matematikailagkorrekteazeredmny?Hanemaz,hogyankelleljrnihogyazlegyen?GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 26.2.8OpertorokskifejezsekAzrtkeketsarjukhivatkozvltozkatopertoroksegtsgvelkifejezsekkkombinljuk.Plda:a, b = 7.3, 12y = 3*a + b/5Ebbenapldbanazasbvltozkhozelszrhozzrendeljka7.3s12rtkeket.APython,ahogyaztazelzekbenmagyarztam,automatikusanavalstpustrendeliazasazegsztpustabvltozhoz.Apldamsodiksorbanazjyvltozhozrendeljkhozzegykifejezseredmnyt,amia*,+ s / opertorokat kombinlja aza, b, 3 s5 operandusokkal. Az opertorok specilisszimblumok,amiketolyanegyszermatematikaimveletekreprezentlsrahasznlunk,mintazsszeads vagy a szorzs. Az operandusok az rtkek, amiket az opertorok segtsgvelkombinlunk.APythonmindenegyeskifejezstkirtkel,amitberunkneki,legyenazakrmilyenbonyolults ennek a kirtkelsnek az eredmnye mindg egy rtk. Ehhez az rtkhez automatikusanhozzrendelegytpust,amifggattl,hogymivanakifejezsben.Afentipldbanyvalstpuslesz,mertakirtkeltkifejezslegalbbegyvalsvltozttartalmaz.NemcsakangymatematikaialapmveletopertoratartozikaPythonopertoraihoz.Hozzjukkell venni a hatvnyozs opertort **, nhny logikai opertort, a karakterlncokon mkdopertorokat,azazonossgotstartalmazsttesztelopertorokat,stb.Minderrlaksbbiekbenjrafogokbeszlni.Rendelkezsnkrellamoduloopertor,amita%szimblumjell.Ez az opertor egyszmnak egy msikszmmalval egszosztsbl szrmazmaradkt adjameg.Prbljukki:>>> 10 % 3 (jegyezzk meg, hogy mi trtnik !)>>> 10 % 5A ksbbiekben nagyon hasznos lesz, amikorazt vizsgljuk, hogyegy a szmoszthateegy bszmmal.Elgaztmegnzni,hogyaza%beredmnyeegyenlenullval.Gyakorlat:2.3. Ellenrizzeakvetkezutastssorokat.rjaleafzetbe,hogymitrtnik:>>>r , pi = 12, 3.14159>>>s = pi * r**2 >>>print s>>>print type(r), type(pi), type(s)>>>Vlemnyeszerintmiahasznaatype()fggvnynek?(Megjegyzs:afggvnyeketaksbbiekbenrszletesenbefogommutatni).27 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.9AmveletekprioritsaHaegykifejezsbenegynltbbopertorvan,akkoramveletekvgrehajtsnaksorrendjeaprioritsi szablyoktl fgg. A Pythonban a prioritsi szablyok ugyanazok, mint amiketmatematikbltanultunk: zrjelek. Ezek a legmagasabb prioritsak. Azt teszik lehetv, hogy az ltalunk kvntsorrendbentrtnjenegykifejezskirtkelse.gy2*(3-1) = 4 ,s(1+1)**(5-2) = 8. hatvnyozs.Ahatvnyokkiszmolsraatbbimveletelttkerlsor.gy2**1+1 = 3(snem4),s3*1**10 = 3(snem59049!). szorzssoszts,azonosprioritssal.Ezeketazsszeadsskivonselttrtkeliki.gy2*3-1 = 5(snem4),s 2/3-1 = -1(Emlkezznkvissza,hogyalaprtelmezsbenaPythonegszosztstvgez.) Haktopertorazonospriorits,akkoravgrehajtsukbalrljobbratrtnik.gyaz59*100/60 kifejezsbenelszraszorzst,majdeztkveten,az5900/60 osztstvgzi el, aminek az eredmnyet 98. Ha elszr azosztstvgeznel,akkorazeredmny59 lenne(emlkezznkr,hogyittegyegszosztsrllennesz).GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 28.2.10KompozciEddigegyprogramozsinyelvklnbzelemeittanulmnyoztuk:avltozkat,akifejezseketsazutastsokat,deaztnemvizsgltuk,hogyhogyanlehetezeketegymssalkombinlni.Egy magasszint programozsi nyelv egyik erssge, hogyklnbzelemekkombinlsvalsszetett utastsokat hozhatunk ltre. gy pldul, ha tudjuk hogyan adunk ssze kt szmot shogyanratunkkiegyrtket,akkoraktutaststegyetlenutastsskombinlhatjuk:>>> print 17 + 3>>> 20Ezanyilvnvalnaktntulajdonsgfogjalehetvtenniazsszetettalgoritmusokvilgosstmrprogramozst.Plda:>>> h, m, s = 15, 27, 34>>> print "az jfl ta eltelt msodpercek szma = ", h*3600 + m*60 + sFigyelem:vanegymegszortsarranzve,hogymiketlehetkombinlni:Amitegykifejezsbenazegyenlsgjelbaloldalnhelyeznkel,annakmindgegyvltoznakkelllenni,nempedigegykifejezsnek.Ezabblatnyblfakad,hogyazegyenlsgjelneknemugyanazajelentse,mintamatematikban.Mintmremltettem,egyrtkadsimveletjelrlvansz (egy bizonyos tartalmat tesznk egy vltozba), nem pedig egy egyenlsgjelrl. Azegyenlsgjelet(pldulegyfelttelellenrzsben)egykicsitksbbfogombemutatni.gypldulazm+1=butastsszablytalan.Amatematikbanviszontelfogadhatatlan a=a+1etrni,pedigezazrsmdigengyakoriaprogramozsban. Az a = a + 1 utasts az a vltoz rtknek eggyel trtn megnvelst(msknt:incrementlst)jelenti.Hamarosanalkalmunkleszvisszatrnierre.Eltteazonbanegymsiknagyonfontosfogalmatkelltisztznunk.29 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven3.Fejezet: AzutastsfolyamvezrlseAzelsfejezetbenlttuk,hogyazelemzprogramozalaptevkenysgeaproblmamegolds.Egy informatikai problma megoldshoz a tevkenysgeket mindg bizonyos sorrendben kellvgezni.Amegfelelstruktrbanssorrendbenlerttevkenysgeketalgoritmusnaknevezzk.Atevkenysgekvgrehajtsisorrendjtmeghatrozutastscsoportokavezrlstruktrk.Amodernprogramozsbancsakhromvanbellk:aszekvenciasakivlaszts,melyeketebbenafejezetbenrokle,sakvetkezfejezetbentrgyaltismtls.3.1Utastsszekvencia10Hanemmondunkmst,akkoregyprogramutastsaiegymsutnabbanasorrendbenlesznekvgrehajtva,ahogyanascriptbenlevoltakrva.Azt az tvonalat, amit a Python a programvgrehajts sorn kvet utastsfolyamnaknevezzk.Azeztmdostutastsokazutastsfolyamvezrlutastsok.NormlisanaPythonazutastsokatazelstlazutolsigvgrehajtja,kivvehaegyfelttelesutastssaltallkozik,mintamilyenazifutasts,amitezutnfogoklerni(aprogramhurkokkapcsnfogunkveletallkozni).Egyilyenutastslehetvfogjatenniaprogramnak,hogyakrlmnyektlfggenmsvgrehajtsiutakatkvessen.3.2KivlasztsvagyfelttelesvgrehajtsHa igazn hasznos programokat szeretnnk rni, akkor olyan technikkra van szksg, amiklehetvteszikaprogramvgrehajtsklnbzirnyokbatrtntirnytstattlfggen,hogymilyen felttelekkel tallkozunk. Ehhez olyan utastsok kellenek, amikkel tesztelni lehet egybizonyosfeltteltskvetkezmnykntmdostanilehetaprogramviselkedst.Azifutastsalegegyszerbbezekkzlafelttelesutastsokkzl.KsrletkppenrjukbeaPythoneditorbaakvetkezktsort:>>> a = 150>>> if (a > 100):...Azelsutastsazavltozhozhozzrendelia150rtket.Eddigsemmijnincs.Amikorviszontberjukamsodiksort,azttapasztaljuk,hogyaPythonjfajtamdonviselkedik.Ha nem felejtettk le a : karaktert a sor vgrl, akkor megllapthatjuk, hogy a fpromptot(>>>)mostegymsodlagosprompthelyettesti,amihrompontblll11.Haazeditorunknemteszimegautomatikusan,akkormosttabullnunkkell(vagy4betkztkellrnunk) mieltt berjuk a kvetkez sort, gy hogy az az elz sorhoz kppest beljebb legyen(vagyisbelegyenhzva).Kpernynknakvetkezknekkelllenni:>>> a = 150>>> if (a > 100):... print "a meghaladja a szzat"...10Jelenesetbenaszekvencia kifejezsegymstkvetutastsoksorozattjelli.EbbenaknyvbeneztaelnevezstegyPythonfogalomszmratartjukfnn,amiamagbafoglaljaakarakterkncokat, tupleket s listkat (lsdaksbbiekben).11APythonwindowsoseditornakbizonyosverziibanamsodlagospromptnemjelenikmeg.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 30.Nyomjunkmgegyt.Aprogramvgrehajtdiksakvetkeztkapjuk:a meghaladja a szzatKezdjkjraagyakorlatot,demosta=20szalazelssorban:mostaPythonsemmitsemrki.Aztakifejezst,amitzrjelekkztettnk,mostantlfogvafelttelneknevezzk.Azifennekafelttelnekatesztelstteszilehetv.Haafeltteligaz,akkora:utnbeljebbigaztottutaststhajtja vgre a Python. Ha a felttel hamis, semmi sem trtnik. Jegyezzk meg, hogy az ittalkalmazott zrjelek opcionlisak a Pythonban. Ezeket az olvashatsg javtsa rdekbenalkalmazam.Msnyelvekbenktelezklehetnek.Kezdjkjra,rjunkmgktsortazelzekhez,gyahogyanaztalbbltjuk.gyeljnkr,hogyanegyediksorbalszlenkezddik(nincsbehzs),mgaztdikmegintbevanhzva(aharmadiksorralazonosmrtkben):>>> a = 20>>> if (a > 100):... print "a meghaladja a szzat"... else:... print "a meghaladja a szzat"...Nyomjunk mg egyszer t. A program mgegyszer vgrehajtdik s ez alkalommalkirja:a nem haladja meg a szzatAz olvas mr bizonyra kitallta az else (klnben) utasts egy alternatv vgrehajtsprogramozstteszilehetv,gyaprogramoznakktlehetsgkzttkellvlasztani.Azelif(azelseifsszevonsa)utaststhasznlvamgjobbmegoldsttudunkadni:>>> a = 0>>> if a > 0 :... print "a pozitv"... elif a < 0 :... print "a negatv"... else:... print "a nulla"...31 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven3.3RelcisopertorokAzifutastsutnkirtkeltfelttelakvetkezrelcisopertorokattartalmazhatja:x == y # x egyenly -nal x != y # x nem egyenly -nal x > y # x nagyobb, mint yx < y # x kisebb, mint yx >= y # x nagyobb, vagy egyenlmint y x >> 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,nempedigazegyszeresegyenlsgjellel12.(Azegyszeresegyenlsgjelegyrtkadopertor.)UgyaneztaszimbolizmustfogjuktallniaC++bansaJavaban).3.4sszetettutastsokUtastsblokkokAz if utastssal hasznlt konstrukci azelssszetettutastsunk.Hamarosanmsflkkel isfogunk tallkozni. A Pythonban minden sszetett utastsnak mindg ugyanaz a szerkezete: egyfejsor,amikettspontravgzdik,ezalattkvetkezikegyvagytbbutasts,amiafejsoralattbevanhzva.Plda:Fejsor:a blokk elsutastsa ... ...... ...a blokk utols utastsaHa a fejsor alatt tbb behzott utasts van, akkor mindegyiknek pontosan ugyanannyira kell behzva lenni (pldul 4 karakterrel kell beljebb lenni). Ezek a behzott utastsok alkotjk azutastsblokkot. Az utastsblokk: egy logikai egyttest kpez utastsok sorozata, ami csak afejsorbanmegadottfelttelekteljeslseesetnhajtdikvgre.Azelzbekezdspldjbanazifutaststtartalmazsor alattiktbehzottsoregylogikaiblokkotalkot:ezaktsorcsak akkorhajtdikvgre,haazifelteszteltfeltteligaz,vagyishaa2velvalosztsmaradkanulla.12Emlkeztet:a%opertoramoduloopertor:egyegszosztsmaradktszmolja.gypldul,a%2a2velvalosztsmaradktadja.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 32.3.5EgymsbagyazottutastsokKomplexdntsistruktrkltrehozshozegymsbagyazhattbbsszetettutasts.Plda:if torzs == "gerincesek": # 1if osztaly == "eml sk": # 2if rend == "ragadozk": # 3if csalad == "macskaflk": # 4print "ez egy macska lehet" # 5print "ez minden esetre egy eml s" # 6elif osztaly == 'madarak': # 7print "ez egy kanri is lehet" # 8print"az llatok osztlyozsa sszetett" # 9Elemezzkapldt.Aprogramrszletcsakabbanazesetbenrjakiazezegymacskalehetet,haazelsngyfeltteligaz.Azezmindenesetreegyemlskirshozszksgesselgsges,hogyazelsktfeltteligazlegyen.Azutbbimondatot(6.sor)kiratutastsugyanazonabehzsiszintenvan,mintazifrend==''ragadozk''(3.sor).Aktsortehtugyanannakablokknakarsze,amiakkorhajtdikvgre,haaz1.s2.sorbanteszteltfelttelekigazak.Az ez taln egy kanri szveg kirshoz az szksges, hogy a trzs nev vltoz agerincesekrtket,sazosztlynevvltozamadarakrtkettartalmazza.A9.sormondattmindenesetbenkirja,mivelugyanannakazutastsblokknakarsze,mintaz1.sor.3.6APythonnhnyszintaktikaiszablyaAzelzekalapjnsszefoglalunknhnyszintaktikaiszablyt:3.6.1 AzutastsoksablokkokhatraitasortrsdefiniljaSzmosprogramozsinyelvbenmindensortspeciliskarakterrelkellbefejezni(gyakranpontosvesszvel).APythonbanasorvgejel13jtszaeztaszerepet.(Aksbbiekbenmajdmegltjuk,hogyhogyan hghat t ez a szably, hogy egy sszetett kifejezst tbb sorra terjessznk ki. Egyutastssortkommenttelisbefejezhetnk.EgyPythonkommentmindga#karakterrelkezddik.Amia#karaktersaLF(linefeed)karakterkzttvan,afordtfigyelmenkvlhagyja.Anyelvektbbsgbenazutastsblokkotspecilisjelekkelkellhatrolni(nhaabegin sendutastsokkal) A C++ ban s Java ban, pldul, az utastsblokkot kapcsos zrjelekkel kellhatrolni. Ez lehetv teszi, hogy az utastsblokkokat egyms utn rjunk anlkl, hogy abehzsokkalsasorugrsokkalfoglalkoznnk.Azonbanezzavaros,nehezenolvashatprogramokrshozvezethet.Ezrtmindenprogramoznak,akiezeketanyelvekethasznljaazttancsolom,hogyalkalmazzkasorugrsokatsabehzsokatisablokkokjvizulishatrolsra.13Ezakaraktersemakpernyn,semanyomtatottlistkonnemjelenikmeg.Ennekellenrejelenvansbizonyosesetekbenproblmkatokoz,mertnincsazonosmdonkdolvaaklnbzopercisrendszerekben.Errlksbbfogokbeszlni,amikoraszvegfileokrltanulunk(116.oldal)33 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenA Pythonbanhasznlnunk kell a sorugrsokat s a behzsokat, viszont nem kell msblokkhatrolszimblumokkalfoglalkoznunk.VgeredmnybenaPythonolvashatkdokrsrasolyanjszoksokfelvtelreknyszertbennnket,amiketmegfogunkriznimsprogramozsinyelvekhasznlatasornis.3.6.2 sszetettutasts=Fej,kettspont,behzottutastsokblokkjaA kvetkez fejezettl kezdve sokszor lesz alkalmunk az utastsblokk fogalmnak azelmlytsresgyakorlatokvgzsreebbenatrgykrben.Aszemkztismasszefoglaljaazelvet: Az utastsblokkok mindg egy jldefinilt utaststtartalmaz fejsorhoz kapcsoldnak (if, elif, else, while,def,...),amikettspontravgzdik. A blokkokat behzs hatrolja: egyazon blokk mindensornak pontosan ugyangy kell behzva lenni (vagyisugyanolyan szm betkzzel kell jobbra eltolvalennik14). A behzsra akrmennyi szkzthasznlhatunk, a programok tbbsge a 4 tbbszrseitalkalmazza. Jegyezzkmeg,hogyalegklsblokknak(1.blokk)abalmargnkelllenni(semmibesincsbegyazva).3.6.3 AspaceeketsakommenteketrendszerintfigyelmenkvlhagyjaazinterpreterA sor elejn lv a behzsra szolglszkzktleltekintveazutastsokskifejezsekbelsejbenelhelyezettszkzketmajdnemmindgfigyelmenkvlhagyjuk(kivva,haezekegykarakterlnc rszt kpezik). Ugyanez vonatkozik a kommentekre: ezek mindg a # karakterrelkezddneksazaktulissorvgigtartanak.14Tabultorokkalisbehzhatunk,deakkornagyongyelnikellarra,hogyazokatkvetenugyanabbanablokkbanbehzsra ne hasznljunk hol szkzkeket, hol pedig tabultorokat. Mg ha az eredmny azonosnak is tnik akpernyn,aspaceeksatabultorokklnbzbinriskdak:aPythonezrtezeketasorokatgyfogjatekinteni,hogy klnbz kppen vannak behzva, igy klnbz blokkoknak a rszei. Ez nehezen debugolhat hibkateredmnyezhet.Kvetkezsknt a programozk tbbsge a tabullsokrl inkbb lemond. Ha egy ''intelligens'' szvegszerkesztthasznlunk,a''Tabulcihelyettestseszkzzel''opciaktivlsvalelkerlhetjkaproblmt.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 34.4.Fejezet: Ismtldutastsok4.1IsmteltrtkadsMgnemjeleztemexplicitmdon:annyiszorrendelhetnkjrtketegyvltozhoz,ahnyszorcsakakarunk.Azismteltrtkadsavltozrgirtktegyjrtkkelhelyettesti.>>> magassag = 320>>> print magassag320>>> magassag = 375>>> print magassag375Ezjrafelhvjaafigyelmnketarraatnyre,hogyazegyenlsgjeletaPythonbanrtkadsrahasznljuk s hogy semmi esetre sem kell azt sszekeverni a matematikban hasznltegyenlsgjellel. Csbt a magassag = 320 utastst egyenlsgre vonatkoz lltskntinterpretlni,deaznemaz! Elszris,azegyenlsgkommutativ,mgazrtkadsnemaz.gyamatematikbanaza=7s7=arsaegyenrtk,mgazolyanprogramutasts,minta375=magassagilleglis. Msodszor,azegyenlsglland, mgazrtkadsthelyettestenilehet,amintaztlttuk.Haamatematikbanegylevezetselejnaza=begyenlsgetlltjuk,akkorazaazelkvetkezegszokfejtsalattllandmarad.A programozsban az els rtkads kt vltoz rtkeit egyenlv teheti s egy kvetkezutastsazutnazegyikvagyamsikrtktmegvltoztathatja.Plda:>>> a = 5>>> b = a # a s b egyenlrtkeket tartalmaz >>> b = 2 # a s b most klnbz ek Megismtlem,aPythonlehetvteszi,hogytbbvltoznakegyidbenadjunkrtket:>>> a, b, c, d = 3, 4, 5, 7APythonnakezatulajdonsgasokkalrdekesebb,mintamilyennekelspillantsratnik.Tegyk fel pldul, hogy most meg szeretnnk vltoztatni aza s c vltozk rtkeit.(Pillanatnyilagartke3,scrtke5.Aztszeretnnk,hogyezfordtvalegyen.)Mittegynk?(4)Gyakorlat4.1. rjamegaszksgesazutastssorokat,amikakvnteredmnytadjk.35 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAzgyakorlatsornazolvasbiztosantalltegymegoldsimdszert,satanravalsznlegmegfogjarkrni,hogykommentljaaztazosztlyban.Mivelegymegszokottmveletrlvansz,ezrt a programozsi nyelvek gyakran egy rvidtstknlnak a vgrehajtsra(pldulspecilisutastsokat,mintaBasic nyelvSWAPutastsa).APythonban,atbbszrsrtkads lehetvtesziennekacsernekarendkvlelegnsprogramozst:>>> a, b = b, a(Termszetesenugyanabbanazutastsbanmsvltozkrtktisfeltudnnkegyidejlegcserlni).4.2CiklikusismtldsekawhileutastsAzegyikdolog,amitaszmtgpekalegjobbancsinlnak,azazazonosfeladatokhibanlkliismtlse. Az ismtld feladatok programozsra lteznek eljrsok. Az egyik legalapvetbbelfogjukkezdeni:awhileutastssalltrehozottciklussal.rjukbeakvetkezutastst:>>> a = 0>>> while (a < 7): # (ne felejtsk el a kett spontot !) ...a = a + 1 # (ne felejtsk el a behzst !)...print aNyomjunkmgegyszert.Mitrtnik?Mielttelolvassaakvetkezoldalmagyarzatt,sznjonregykisidtsrjaleafzetbeeztaz utasts sorozatot. rja le a kapott eredmnyt is s prblja meg a lehet legrszletesebbenmegmagyarzni.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 36.MagyarzatokA while jelentse: amg. Ez az utasts jelzi a Pythonnak, hogy az utna kvetkezutastsblokkotmindaddigfolyamatosankellismtelnie,amgazavltoztartalma7nlkisebb.Mintazelzfejezetbentrgyaltifutasts,awhileutastsisegysszetettutaststkezdmeg.A kettspont a sor vgn a megismtlendutastsblokkotvezetibe, aminek ktelezen beljebbigaztva kell lenni. Ahogyan azt az elz fejezetben megtanultuk, egyazon blokk valamennyiutastsnakazonosmrtkbenkellbehzvalenni(vagyisugyanannyiszkzzelkelljobbraeltolvalennik).Megkonstrultuk teht els programhurkunkat, ami bizonyos szm alkalommal megismtli abehzottutastsokblokkjt.Ezakvetkezkppenmkdik: A while utasts esetn a Python a zrjelben lev felttel kirtkelsvel kezdi. (A zrjelopcionlis.Csakamagyarzatvilgossttelerdekbenhasznlom) Haafelttelhamis,akkorakvetkezblokkotfigyelmenkvlhagyjasaprogramvgrehajtsbefejezdik15. Haafeltteligaz,akkoraPythonaciklustestetalkotteljesutastsblokkotvgrehajtja,vagyis: aza=a+1utastst,ami1gyelincrementljaazavltoztartalmt(amiaztjelenti,hogyaza vltozhozhozzrendelnkegyjrtket,amiegyenlaza 1gyelmegnveltelzrtkvel). aprintutastst,amikiratjaazavltozaktulisrtkt amikor ez a kt utasts vgrehajtdott, akkor tani voltunk az elsiterrcinak, s aprogramhurok,vagyisavgrehajtsvisszatrawhileutaststtartalmazsorra.Azotttallhatfeltteltjrakirtkelisgytovbb.Hapldnkban,aza>> n = 3>>> while n < 5:...print "hello !"15...legalbbisebbenapldban.Ksbbmegfogjukltni,hogyaprogramvgrehajtsabehzottblokkotkvetelsutastssalfolytatdikshogyezugyanannakazutastsblokknakkpeziarszt,mintamelyiknekawhileutastsrsze.37 GrardSwinnen:TanuljunkmegprogramozniPythonnyelven4.3TblzatksztsKezdjkjraazelsgyakorlattal,deazalbbikismdostssal:>>> a = 0>>> while a < 12:... a = a +1... print a , a**2 , a**3 Az1tl12igterjedszmokngyzetnekskbneklistjtkellmegkapnunk.Jegyezzk meg, hogy a print utasts lehetv teszi, hogy ugyanabba a sorba tbb kifejezstrassunkki,egyiketamsikutn:elgvesszvelelvlasztaniket.APythonautomatikusanbeszregyszkztakirtelemekkz.4.4EgymatematikaisormegalkotsaAzalbbikisprogramaFibonaccisorelstzelemtratjaki.Egyolyanszmsorrlvansz,amelynekmindentagjaegyenlaztmegelzkttagsszegvel.Elemezzkezta(tbbszrsrtkadsthelyesenalkalmaz)programot.rjuklealehetlegjobbanazutastsokszerept.>>> a, b, c = 1, 1, 1>>> while c < 11 :...print b,...a, b, c = b, a+b, c+1Amikorelindtjukaprogramot,akvetkeztkapjuk:1 2 3 5 8 13 21 34 55 89AFibonacci sortagjaiugyanabbaasorbavannakkirva.Eztannakavessznekksznhetjk,amitaprintutaststtartalmazsorvgrertunk.Hatrljkavesszt,akkoraszmokegymsallesznekrva.Az olvas nagyon gyakran fog a programjaiban olyan ciklusokat rni, mint amilyeneket ittelemznk. Fontos dologrl van sz, amit tkletesen kell tudni kezelni. Legyen benne biztos, agyakorlatoksegtsgvelfokozatosanelfogjutniodig.Amikor egy ilyen termszet problmt vizsglunk, termszetesen meg kell nznnk azutastssorokat, de fknt a ciklusban rintett klnbz vltozk egymst kvet llapotait kellelemeznnk. Ez korntsem mindg egyszer. Hogy segtsek ezt vilgosabb tenni, vegyk afradtsgot s rajzoljunk egy, az albbihoz hasonl, llapottblt a Fibonacci sorprogramunknak:Vltozk a b cKezdrtkek 1 1 1Aziterrcisornegymsutnfelvettrtkek1 2 22 3 33 5 45 8 5... ... ...Helyettestkifejezsekb a+b c+1Egyilyentblzatbankzzelvgezzkelaszmtgpmunkjt,sorrlsorramegadvaazokatazGrardSwinnen:TanuljunkmegprogramozniPythonnyelven 38.rtkeket, amiket az egyes vltozk az egymst kvet iterrcikban fl fognak venni. Azzalkezdjk,hogyatblzattetejrefelrjukazrintettvltozknevt.Akvetkezsorbaezenvltozkkezd rtkei kerlnek (azok az rtkek, amikkel a ciklus indulsa eltt rendelkeztek). Vgllegalulraazokakifejezsekkerlnek,amiketmindenegyesciklusbanazegyesvltozkllapotnakmdostsrahasznltunk.Kitltjkazelsiterrciknakmegfelelnhnysort.Egysorrtkeinekameghatrozshozelgazelzsorrtkeit,sazegyesoszlopokaljntallhathelyettestkifejezstfelhasznlni.gy ellenrizzk, hogy amit kapunk az a keresett eredmny e. Ha nem ez a helyzet, akkor mshelyettestkifejezseketkellkiprblni.Gyakorlatok:4.2. rjonegyprogramot,amikiratjaa7esszorztblaels20tagjt.4.3. rjonegyprogramot,amieurbankifejezettpzsszegeketkanadaidollrbavlttsazeredmnyt egy tblzatba rja ki. A tblzatban a pzsszegek geometriai haladvnyszerintnvekedjenekgy,mintazalbbipldban:1 euro = 1.65 dollar 2 euro = 3.30 dollar 4 euro = 6.60 dollar 8 euro = 13.20 dollar stb.(16384euronlkellmegllni)4.4. rjon egy programot, ami kiregy12szmblllsorozatot,aminekmindentagjavagyegyenlazelztaggal,vagyannakhromszorosa.4.5Azelsscriptek,avagy:Hogyanrizzkmegprogramjainkat?Eddig a Pythont mindginteraktv mdban hasznltuk (vagyis az utastsokat mindenalkalommalkzvetlenlazinterpreterbertukbeanlkl,hogyazokatksbbegyfilebamentettkvolna). Ez lehetsget adott arra, hogy kzvetlen ksrletezssel nagyon gyorsan megtanuljuk anyelvalapjait.Ezazeljrsegynagyknyelmetlensggeljr:mindenutastssorozat,amitbertunkhelyrehozhatatlanuleltnikamikorlezrjukazinterpretert.Mieltttovbbhaladnnkmegtanuljukprogramjaink merev lemezen vagy floppyn lv fileba val mentst, hogy egymst kvetfzisokbanttudjukketdolgozni,msgpekrettudjukketvinni,stb.Ehhez mostantl fogva valamilyen szvegszerkesztvel fogjuk az utasts sorozatainkatszerkeszteni(pldulLinuxalatt Joeval,Nedittel,Katetel,...MSDOSalattEdittel,...Windowsalatt Wordpad del, vagy mg jobb egy olyan fejleszt krnyezetbeli szvegszerkeszt, mint azIDLE vagy a PythonWin). Teht runk egy scriptet, amit aztn elmenthetnk, mdosthatunk,msolhatunk,stb.,mintbrmilyenmsszveget,amitaszmtgppelkezelnk16.16Szvegszerkesztt azzal a felttellel hasznlhatnnk, hogy a mentst tiszta szvegknt (plain text) vgeznnk(laptrdelsitageknlkl).KvnatosabbazonbanegyvaldiinteligensANSIszvegszerkesztthasznlni,mintamilyen a nedit vagy az IDLE. Ezek a Python szintaxisnak megfelelen sznezik a forrsszveget, ami segti aszintaxishibk elkerlst. Az IDLEben : File New window (vagy CTRLN) val megnyitunk egy j ablakot,amibeascriptnketfogjukrni.Avgrehajtshozascriptmentseutn:Edit Runscript(vagyCTRLF5).39 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAzalbbibraaNedithasznlattillusztrljaGnome(Linux)alatt:Utna, amikor szeretnnk a programunkat tesztelni, elg lesz elindtani a Python interpretert,argumentumkntascriptettartalmazfilenevtmegadva.Pldul,haazEnScriptemnevfileba mentettnkelegyscriptet, akkorelgleszakvetkezparancsotberniegyterminlablakba,hogyascriptvgrehajtdjon:python EnScriptemHogymgjobbancsinljuk,adjunkafilenakolyannevet,ami.pykiterjesztsrevgzdik.Hatiszteletbentartjukeztakonvencit,akkor(Windows,KDE,Gnome, alatt)afilemanagerben(ExploreraWindows vagyKonqueror aKDE alatt)afilenvrevagyamegfelelikonrakattintvaelindthatjuk a script vgrehajtst. Ezek a grafikus filemanagerek tudjk, hogy mindenalkalommal,amikorafelhasznlmegprblmegnyitniegy.pykiterjesztsfilet,elkellindtskaPythoninterpretert. (Eztermszetesenaztfelttelezi,hogyezekmegfelelenvoltakkonfigurlva.)Ugyanez a konvenci ezen kvl lehetvtesziazintelligensszvegszerkesztknekaPythonscriptekautomatikusfelismerstsaszintaktikussznezsalkalmazst.Egy Python script olyan utasts szekvencikat fog tartalmazni, mint amilyenekkel eddigksrleteztnk Mivel ezeket az utastssorokat arra sznjuk, hogy megrizzk s ksbb akrmagunk, akr msok jraolvassk, ezrt melegen ajnlott, hogy scriptjeinket a lehet legjobbanszvegezzk meg, bsgesen kommentezzk.Aprogramozsfnehzsgeakorrektalgoritmusokelksztse. Ahhoz, hogy az algoritmusokat j felttelek mellett tudjuk ellenrizni, javtani,mdostani,stb.,lnyeges,hogyszerzjkalehetlegteljesebbenslegvilgosabbanrjaleket.Ezeknekalersoknakalegjobbhelyemagaascript(gyazoknemveszhetnekel).Egyjprogramozmindggyelarra,hogysokkommentetszrjonbeascriptjeibe.Ezzelazeljrssalnemcsakazesetlegesmsolvasknakknnytimegazalgoritmusaiolvasst,demagtisknyszertiarra,hogymgvilgosabbgondolatailegyenek.Egy scriptbe szinte brhova brmilyen kommentet beszrhatunk. Elg eljk tenni egy #karaktert.AmikoraPythoninterpreterrtallerreakarakterre,amiutnakvetkezikaztfigyelmenkivlhagyjaazaktulissorvgig.rtskmeg,hogyfontos,hogyaprogramozsmenetesornrjunkkommenteket.Nevrjukmegascriptbefejezst,hogymajdutnarjukhozzazokat.Azolvaslassankntrfogjnni,hogyaprogramozrendkvlsokidttltasajtkdjajraolvassval(azrt,hogymdostsa,hibtGrardSwinnen:TanuljunkmegprogramozniPythonnyelven 40.keressen benne, stb.) Ezt az jraolvasst nagyban egyszersti a szmos magyarzat smegjegyzs.Nyissukmegaszvegszerkesztnketsrjukbeazalbbiscriptet:# ElsPython script # Fibonacci-sort rat ki, azaz egy olyan szmsort, aminek minden tagja# az el zkt tag sszege. a, b, c = 1, 1, 1 # a & b az egymst kvettagok szmolsra valk # c egy szmllprint 1 # az elstag kiratsa while c> a, b, c = 1, 1, 1>>> while c>> a, b, c = 3, 2, 1>>> while c < 15:print c, ": ", ba, b, c = b, a*b, c+11 :22 :63 :124 :725 :8646 :622087 :537477128 :33435376680969 :17970749964597539635210 :60085879430566732227015542518579211 :10797883156496691381438492294473845785924307043903078412 :6488003054466075279073683736910497769500103428422804289182764945618623458261160742092813 :700566989011183200292376413995762169216245450579726979173836923132717548836212350644346734002689652046961030088325062490084374247023784755214 :454528076456265799856362940482493512051682398707229461514016556556583986422276163358151238257824601969802061415367471160941735505142279479530059170096950422693079038247634055829175296831946224503933501754776033004012758368256>>> Afentipldbanakirtszmokmretenagyongyorsann,mertmindegyikkazelzktszmszorzatvalegyenl.Kiindulskor az a, b s c integer tpusak, mert kis egszrtkeket:3, 2s1: rendelnkhozzjuk.A8.iterrcitlkezdveazonbanabsaautomatikusanlongtpusakklesznekalaktva:a6oss7estagokszorzsnakeredmnyemrjvalafentebbemltett2millirdoshatrflttvan.Asoregyrenagyobbszmokkalfolytatdik,deaszmolssebessgecskken.Alongtpusknttrolt szmok mretktl fggen vltoz mennyisg helyet foglalnak el a szmtgpmemrijban.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 44.5.1.2 AfloattpusAvalsszm,vagy lebegpontosnumerikusadattpussal,amitangolulfloatingpoint numberneknevezneksamitemiattfloatnakfogunknevezniaPythonban,mrtallkoztunk.Ez a tpus nagyon nagy vagy nagyon kis szmokkal (pldul tudomnyos adatokkal) trtnszmolsokatteszlehetvllandpontossggal.Ahhoz,hogyaPythonegynumerikusadatotfloattpusnaktekintsen,elegend,haaszmegytizedespontot,vagy10nekegyhatvnykitevjttartalmazza.Pldulakvetkezrtkeket:3.1410..0011e1003.14e-10aPythonautomatikusanfloattpuskntrtelmezi.Prbljukkieztazadattpustegyjprogramocskban(amitazelzinspirlt):>>> a, b, c = 1., 2., 1 # => a s b 'float' tpusak lesznek>>> while c >> 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.Jegyezzk meg, hogy az olyan stringeket, melyekben aposztrofok vannak, idzjelekkelhatroljuk, mg az idzjeleket tartalmaz stringeket aposztrofokkal hatroljuk. Azt is jegyezzkmeg,hogyaprintutastsakirtelemekkzegybetkztszrbe.A\(backslash)nhnykiegsztfinomsgotteszlehetv: Lehetv teszi, hogy egy parancsot, ami nem fr el egy sorban, azt tbb sorba rjunk (ezbrmilyentpusparancsrarvnyes). Egy karakterlnc belsejben a backslash specilis karakterek (sorugrs, aposztrofok, duplaidzjelek,stb.)beszrstteszilehetv.Pldk:>>> txt3 = "E\'meg kicsoda ? krdezte.">>> print txt3E'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 helloEz 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. Mgegyszer megismtlem: a kis/nagybetlnyegesavltoznevekben(Szigorantiszteletbenkelltartanunkakezdetikis/nagybetvlasztst).47 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenHromszorosidzjelek:Hogy egy karakterlncba knnyebben szrjunk be specilis vagy egzotikus karaktereketanlkl,hogyabackslashtalkalmaznnk,vagymagtabackslashttudjukbeszrni,akarakterlncothromszorosaposztroffalvagyhromszorosidzjellelhatrolhatjuk:>>> a1 = """... Hasznlat: izee[OPTIONS]... { -h... -H host... }""">>> print a1Hasznlat: izee[OPTIONS]{ -h-H host}5.2.2 HozzfrsegykarakterlncegyeskaraktereihezA karakterlncok az sszetett adatoknak nevezett ltalnosabb adattpus egy specilis esettkpezik. Egy sszetett adat egy olyan entits, ami egyszerbb entitsok egyttest egyetlenstruktrban egyesti: egy karakterlnc esetben pldul ezek az egyszerbb entitsok nyilvnmagukakarakterek.Akrlmnyektlfggenakarakterlncotholmintegyetlenobjektumot,holmint klnll karakterek egyttest akarjuk kezelni. Egy olyan programozsi nyelvet, mint aPythont teht el kell ltni olyan eljrsokkal, amik lehetv teszik egy karakterlnc egyeskaraktereihezvalhozzfrst.Ltnifogjuk,eznemolyanbonyolult:Egykarakterlncot a Python a szekvencik kategriaegyobjektumnaktekint.Aszekvencikelemek rendezett egyttesei. Ez egyszeren azt jelenti, hogy egy string karakterei mindg egybizonyos sorrendben vannak elrendezve. Kvetkezsknt a string minden egyes karakternekmeghatrozhataszekvenciabelihelyeegyindexsegtsgvel.Ahhoz,hogyegyadottkarakterhezhozzfrjnk,akarakterlncottartalmazvltozneveutnszgleteszrjelberjukakarakterstringbelipozcijnakmegfelelnumerikusindexet.Figyelem: amintaztegyebttellenrizhetjk,azinformatikbanazadatokatmajdnemmindgnulltlkezdveszmozzuk(nempedigegytl).Ezahelyzetegystringkaraktereiesetben:Plda:>>> ch = "Stphanie">>> print ch[0], ch[3]S pGrardSwinnen:TanuljunkmegprogramozniPythonnyelven 48.5.2.3 ElemimveletekkarakterlncokonA Pythonnak szmos, karakterlncok kezelsre szolgl fggvnye van (kis/nagybetstalakts, rvidebb karakterlncokra val darabols, szavak keresse, stb.). A ksbbiekben elfogunkmlyedniebbenatrgykrben(lsd129.oldalt).Pillanatnyilag megelgedhetnk azzal, hogy tudjuk, klnkln hozzfrhetnk egykarakterlnc minden egyes elemhez, amint ezt fentebb magyarztam. Tudjunk rla, hogy akvetkezketismegtehetjk: tbbrvidkarakterlncblsszerakhatunkegyhosszabbat.Eztamveletetsszekapcsolsnak(concatenationak) nevezzk s a + opertort hasznljuk r a Pythonban. (Ez az opertorszmokra alkalmazva az sszeads mveletre, mg karakterlncokra alkalmazva azsszekapcsolsraszolgl). Plda:a = 'A kis halbl'b = ' nagy hal lesz'c = a + bprint cA kis halbl nagy hal lesz meghatrozhatjukegykarakterlnchosszt(vagyisakarakterekszmt)alen()fggvnyhvsval:>>> print len(c)29 Egyszmotreprezentlkarakterlncotszmmalakthatunk.Plda:>>> ch = '8647'>>> print ch + 45 ==> *** error *** nem adhatunk ssze egy stringet s egy szmot >>> n = int(ch)>>> print n + 65 8712 # OK : 2 szmot sszeadhatunk Ebbenapldbanazint()belsfggvnyastringetszmmalaktja.Afloat()fggvnysegtsgvelvalsszmmlehetalaktaniegykarakterlncot.49 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenGyakorlatok:5.6. rjon egy programot, ami meghatrozza, hogy egy karakterlnc tartalmazzae az ekaraktert.5.7. rjon egy programot, ami megszmolja az e karakter elfordulsainak szmt egystringben.5.8. rjonegyprogramot,amiegyjvltozbamsoltegykarakterlncotgy,hogycsillagotszrbeakarakterekkz.5.9. gypldul,gastonblg*a*s*t*o*nlesz.5.10. rjonegyprogramot,amiegyjvltozbafordtottsorrendbenmsoljategykarakterlnckaraktereit.gypldulzorglub blbulgroz lesz.5.11. Az elz gyakorlatbl kiindulva rjon egy scriptet, ami meghatrozza, hogy egykarakterlnc palindrom e (vagyis ami mindkt irnybl olvasva ugyan az), mint pldulradarvagyss.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 50.5.3Alistk(elsmegkzelts)Azelzfejezetbentrgyaltstringekazsszetettadatokravoltakazelspldk.Az sszetett adatokat arra hasznljuk, hogy struktrltan csoportostunk rtkegytteseket. Lpsrllpsrefogjuk megtanulni ms sszetett adattpusok hasznlatt: a listkt, a tuplekt sa sztrakt(dictionnair)17. E hrom adattpus kzl most csak az elst fogjuk elg rviden trgyalni. Egymeglehetsenterjedelmestmrlvansz,amiretbbszrvisszakellmajdtrnnk.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.Azelshromelemstring,anegyedikegsz,aztdikvalstpus,stb.(Aksbbiekbenltnifogjuk,hogyegylistamagaislehetegylistnakeleme!).Ebbenatekintetbenalistafogalmameglehetsenklnbzik a tmb (array) vagy az indexelt vltoz fogalmtl, amivel ms programozsinyelvekbentallkozunk.Jegyezzk meg, hogy a listk is szekvencik, gy mint a karakterlncok, vagyis objektumokrendezett csoportjai. A listt alkot klnbz elemek mindg ugyanabban a sorrendben vannakelrendezve,mindegyikkhzklnhozztudunkfrni,haismerjkalistabeliindexket.Ezeknekazindexeknekaszmozsanulltlindul,nempedigegytl,akarakterlncokhozhasonlan.Pldk:>>> nap = ['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek'] >>> print nap[2]szerda>>> print nap[4]20.357Astringektl(amikegynemmdosthatadattpustkpeznek/erreaksbbiekbentbbszrleszalkalmunkvisszatrni/)eltrenegylistnakmeglehetvltoztatniazelemeit:>>>printnap['htf','kedd','szerda',1800,20.357,'cstrtk','pntek']>>>nap[3]=nap[3]+47>>>printnap['htf','kedd','szerda',1847,20.357,'cstrtk','pntek']17Majdltrehozhatjukasajtadattpusainkatis,amikormegtanuljukazosztly(class)fogalmt(lsd161.oldal)51 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAlistameghatrozottelemtakvetkezmdonhelyettesthetjkmselemmel:>>> nap[3] = 'Jlius'>>> print nap['htf ', 'kedd', 'szerda', 'Jlius', 20.357, 'cstrtk', 'pntek'] Alen() bels fggvny, amivel mr a stringeknl tallkoztunk, a listkra is alkalmazhat. Alistbanlevelemekszmtadjavissza:>>> len(nap)7 Egy msik bels fggvny a del()18 segtsgvel (az indexe alapjn) brmelyik elemettrlhetjkalistbl:>>> del(nap[4])>>> printnap['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek'] Ugyangylehetsgvanarra,hogyhozzfzznkegyelemetegylisthoz,deahhoz,hogyeztmegtegyk meg kell gondolni, hogy a lista egy objektum, aminek az egyik metdust fogjukhasznlni. Az objektum s metdus fogalmakat a ksbbiekben fogom megmagyarzni, de mostmegtudommutatni,hogyezhogyanmkdikegylistaspecilisesetben:>>> nap.append('szombat')>>> print nap['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek', 'szombat'] >>>Afentipldaelssorbanazappend()metdustalkalmaztuka'szombat'argumentummalanapobjektumra. Haemlkeztetekarra,hogyaz appendszhozzfzstjelent,akkorrthet,hogyazappend()metdusegyolyanfggvnyfajta,amivalamilyenmdonalistatpusobjektumokhozvan kapcsolva, vagy az objektumokba van integrlva. A fggvnnyel hasznlt argumentumtermszetesenazazelem,amitalistavghezakarunkfzni.Aksbbiekbenmegfogjukltni,hogyegszsorilyenmetdus van(vagyisolyanfggvnyekamiklistatpusobjektumokbavannakintegrlva,vagyinkbbbecsomagolva).Jegyezzkmeg,hogyegymetdustgyalkalmazunkegyobjektumra,hogyegyponttalkapcsoljukketssze.(Ellllannakavltoznakaneve,amiegyobjektumrahivatkozik,utnaapont,majdametdusneve,ezutbbitmindgegyzrjelprkveti).18Lteznekolyantechnikklistkfeldarabolsra, elemcsoportok beszrsra, elemekeltvoltsra, stb., amik egysajtos szintaxist hasznlnak, amelyben csak az indexek fordulnak el. Ezeket a (karakterlncokra is alkalmazhat)technikkatltalnosanslicingnek(szeletelsnek)hvjuk.gyhasznljukket,hogyaszgleteszrjelbetbbindexetrunk.gyanap[1:3]a['kedd','szerda']alcsoportotjelli.Ezeketaspecilistechnikkategykicsitksbbfogomlerni(lsda132.sazaztkvetoldalakat).GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 52.Akarakterlncokhozhasonlanalistkkalisrszletesenfogokfoglalkozniaksbbiekben(lsda133.oldalt).Ennekellenreelgismeretnkvanahhoz,hogyeltudjukkezdenikethasznlniaprogramjainkban.Elemezzkpldulazalbbikisscriptetsmagyarzzukmegamkdst:nap = ['htf ', 'kedd', 'szerda', 'cstrtk', 'pntek', 'szombat'] a, b = 0, 0while a>> a = raw_input('rjon be egy adatot : ')rjon be egy adatot : 52.37>>> type(a)

>>> b = float(a) # talakts numerikus rtkk>>> type(b) 19APythonbana''fggvny''sztklnbsgttelnlklhasznljukegyszeravaldifggvnyek,mskorazeljrsok(procedure)jellsreAksbbiekbenmegfogjukhatrozniaklnbsgetaktkzelifogalomkztt.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 54.6.2FggvnymodulimportlsaMr tallkoztunk a nyelvbe beptett fggvnyek fogalmval, mint amilyen pldul a len()fggvny, ami a karakterlnc hosszt adja meg. Magtl rtetd, hogy nem lehet az sszeselkpzelhetfggvnytaPythonstandardbabelevenni,mivelezekblvgtelensokvan:egybknthamarosanmegfogjuktanulni,hogyanhozzukltremagunkjfggvnyeket.Anyelvbebeptettfggvnyek szmaviszonylagcsekly:ezekazok,amiknagyongyakranhasznlhatk.Atbbiekmoduloknaknevezettklnfileokbanvannakcsoportostva.A modulok teht fileok, amik fggvnycsoportokat fognak egybe. A ksbbiekben majdmegltjuk, hogy knyelmesebb egy nagymret programot tbb kisebb mret rszre felbontani,hogyegyszerstskakarbantartst.EgyjellegzetesPythonalkalmazstehtegyfprogramblsegyvagytbbmodulblll,melyekmindegyikekiegsztfggvnyekdefinciittartalmazza.Nagyszm modult adnak hivatalosan a Pythonnal. Ms modulokat ms szolgltatknltallhatunk.Gyakranegymssalrokonsgbanlvfggvnycsoportokatprblnakmegugyanabbaamodulbasszefogni,amitknyvtrnakneveznk.A math modul pldul szmos olyan matematikai fggvny defincijt tartalmazza, mint asinus, cosinus, tangens, ngyzetgyk, stb. Ezeknek a fggvnyeknek a hasznlathoz elg ascriptnkelejrebeszrniakvetkezsort:from math import *EzasorjelziaPythonnak,hogyazaktulisprogrambabelekellvenniamath modulmindenfggvnyt(eztjelzia*).Ezamodulegymatematikaifggvnyknyvtrattartalmaz.Ascriptbepldulazalbbiakatrjuk:gyok = sqrt(szam) ezagyoknevvltozhozrendeliaszamngyzetgykt,sinusx = sin(szog) ezasinusxnevvltozhozrendeliaszog(radinban!)sinust,stb.Plda:# Demo : a modul fggvnyeinek hasznlatafrom math import *szam = 121szog = pi/6 # azaz 30 (a math knyvtr tartalmazza a pi defincijt is) print 'ngyzetgyk', szam, '=', sqrt(szam)print 'sinus ', szog, 'radian', '=', sin(szog)Ascriptvgrehajtsakorakvetkezketrjaki:ngyzetgyk 121 = 11.0sinus 0.523598775598 radian = 0.555 GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenEzarvidpldamrnagyonjlillusztrljaafggvnyekfontosjellemzit:+ afggvnyvalamilyennvsahozzkapcsoltzrjelekformjbanjelenikmegplda:sqrt()+ azrjelekbenegyvagytbbargumentumotadunktafggvnynekplda:sqrt(121)+ afggvnynekvanegyvisszatrsirtke(aztismondjuk,hogyvisszaadegyrtket) plda:11.0Mindezeketakvetkezoldalakonfogomkifejteni.Ezekamatematikaifggvnyekcsakazelspldk a fggvnyekre. Egy pillantst vetve a Python knyvtrak dokumentcijbamegllapthatjuk, hogy mostantl fogva mr szmos fggvny ll rendelkezsnkre, nagyszmfeladat belertve nagyon sszetett matamatikai algoritmusokat megoldsra (a Pythontltalnosan hasznljk az egyetemeken magas szint tudomnyos problmk megoldsra). Nemfogom e fggvnyek rszletes listjt megadni. Egy ilyen lista knnyen hozzfrhet a Pythonhelprendszerben:HTMLdokumentciPythondokumentciModulindexmathAkvetkezfejezetbenmegtanuljuk,hogyhogyanhozhatunkltremagunkfggvnyeket.(6)Gyakorlatok:(Megjegyzs:Mindegyikgyakorlatbanhasznljaadatbevitelrearaw_input()fggvnyt!)6.1. rjonegyprogramot,amim/secskm/hbaszmoljatafelhasznlltalmrfld/hbanmegadottsebessget..(1mrfld=1609mter)6.2. rjon egy programot, ami kiszmolja a kerlett s a terlett annak a hromszgnek,melynek3oldaltafelhasznladjameg.(Ismtls:egyhromszgterlettakvetkezformulasegtsgvelszmoljukki:S=.d(da)(db)(dc)aholdakerletfelt,a,b,cazoldalakhossztjelli).6.3. rjonegyprogramot,amikiszmoljaegyadotthosszsgmatematikaiingaperidusidejtAperidusidszmolsraszolglformulaakvetkez:T =2n.lg,ahol:lazingahosszasgaszabadessgyorsulsaaksrlethelyn.6.4. rjon egy programot, ami rtkekettesz egylistba. Ennekaprogramnakciklusbankellmkdnigy,hogymindaddigkriazrtkeket,amgafelhasznltlgynemdnt,hogybefejezskntt.Aprogramalistakirsvalfejezdikbe.Mkdsiplda:rjon be egy rtket : 25rjon be egy rtket : 18rjon be egy rtket : 6284rjon be egy rtket : [25, 18, 6284]GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 56.6.3Egykispihenaturtle(tekns)modullalLttuk, a Python egyik nagyszer tulajdonsga, hogy klnbzmodulok importlsvalrendkvlegyszerenlehethozzadniszmosjfunkcionalitst.Ennekillusztrcijakntmostegykicsitmsobjektumokkalfogunkszrakozni,mintaszmok.Meg fogunk vizsglni egy Python modult, ami tekns grafikk ltrehozst teszi lehetv,vagyis olyan geometriai rajzokt, mint amilyeneket egy kis virtulis teknshagy maga utn,aminekazelmozdulsaitamonitoronegyszerutastsokkalvezrelhetjk.Ateknsaktivlsagyerekjtk.Ahosszmagyarzathelyettinkbbprbljukkimris:>>> from turtle import *>>> forward(120)>>> left(90)>>> color('red')>>> forward(80)A gyakorlat nyilvn sokkalbeszdesebb, ha ciklusokathasznlunk:>>> reset()>>> a = 0>>> while a =80% A80%>N>=60% B60%>N>=50% C50%>N>=40% DN>> def tabla7():... n = 1... while n >> tabla7()kiratja: 714212835424956637023Egyfggvnynevetmindgzrjelnekkellkvetni,mgakkoris,haafggvnysemmilyenparamtertsemhasznl.Ezegyrsbelikonvenciblered,amikikti,hogybrmelyszmtgpprogramozssalfoglalkozszvegbenegyfggvnynevetmindgegyreszrjelprnakkellkvetni.Eztakonvencitkvetjkebbenaknyvben.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 64.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 707 14 21 28 35 42 49 56 63 707 14 21 28 35 42 49 56 63 70Azelsfggvnytehthvhategymsodikat,amiegyharmadikathvhatsgytovbb.Talnmgnemltjaazolvasennekahasznt,dektrdekestulajdonsgotmrmegfigyelhet: Egy j fggvny ltrehozsa lehetsget ad egy utastscsoport elnevezsre. gy egymsodlagos, sszetett algoritmus egyetlen parancs mg rejtsvel aminek nagyon explicitnevetadhatunkegyszersthetjkaprogramgerinct. Egy j fggvny ltrehozsa az ismtld kdrszek kiszblse rvn a programegyszerststszolglhatja.Pldul,haugyanabbana