gerard swimmen - tanuljunk meg programozni python nyelven

Upload: tamas-jonas

Post on 06-Jul-2015

283 views

Category:

Documents


4 download

TRANSCRIPT

GraceHopper,acompilerfeltallja:Szmomra a programozs tbb mint alkalmazott tudomny. A programozs a tuds mlysgeibe vezet rdekeskutatsis.Maximiliennek,lisenek,Lucillenek,AugustinneksAlexanenak.ColophonAbortgrafitrajzt,aminektrgyaszdkosantrelaknyvtrgytl,aszerzksztette1987benegyrgifnykpalapjnCansonpaprra.Az1923banacowesikiktbenegyregattnrsztvevversenyjachtota106tonnsValdoratbrzolja.Ahszvvelkorbbanptett,seredetilegyawlnakfelszereltValdoratbbdjatelhozott,mieltt1912benarajzonlthat516mvitorlafelletketchtalaktottk.Ezapompsvitorls,amitlegnysgeigennagyrabecsltkivltengerjrtulajdonsgairt,majdnemflvszzadontkzlekedett.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 2.TanuljunkmegprogramozniPythonnyelvenGrardSwinnentanrspedaggiaitancsadInstitutStJeanBerchmansSteMarie59,ruedesWallonsB4000LigeEzajegyzetszabadonletlthetakvetkezwebsiteokrl:http://www.ulg.ac.be/cifen/inforef/swihttp://learnpython.openproject.huAszvegegyrsztakvetkezminspirlta:AllenB.Downey,JeffreyElkner&ChrisMeyersHowtothinklikeacomputerscientistmegtallhat:http://rocky.wellesley.edu/downrey/ostvagy:http://www.ibiblio.org/obpCopyright(C)20002005GrardSwinnenCopyrightHungariantranslation(C)2005DarczyPterEjegyzetterjesztseaGNUSzabadDokumentcisLicencnek(GNUFreeDocumentationLicense,version1.1)megfelelentrtnik.Ezaztjelenti,hogynszabadonmsolhatja,mdosthatjasterjeszthetiajegyzetet,amennyiben tiszteletben tartja a licencben felsorolt szablyokat, melyek teljes szvege a GNU FreeDocumentationlicencecmfggelkbena366.oldalonolvashat.Alnyegetilletentudjonrla,nnemsajtthatjakieztaszveget,hogyutnamagnakmsreprodukcisjogokat meghatrozva azt (mdostva vagy vltoztats nlkl) terjessze. Az n ltal akr mdostott, akrvltozatlanformbanterjesztettdokumentumnakktelezentartalmaznikellafentidzettlicencteljesszvegt,eztafigyelmeztetst,azezutnkvetkezbevezetst,valamintazeredetiangolnyelvszvegPrefacerszt(lsd a fggelket). A jegyzetnek mindenki szmra szabadon hozzfrhetnek kell maradni. Krhet anyagihozzjrulstazoktl,akiknekajegyzetetterjeszti,deakrtsszegcsakareprodukcikltsgeirevonatkozhat.nnemterjeszthetiajegyzetetmagnakkvetelveaszerzijogokat,nemkorltozhatjaaznltalterjesztettmsolatokreproduklsnakjogt.Ennekaszvegnekklasszikusnyomtatottknyvformjban,knyvesboltbantrtnkereskedelmiterjesztsekizrlagosanazO'Reilly(Paris)kiadnakvanfnntartva.Mindengarancianlklabbanaremnybenpubliklomajegyzetet,hogyazhasznoslesz.3. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenBevezetsEz a jegyzet eredetileg a belga kzpfok oktatsban rsztvev, Tudomny s informatika fakultcinProgramozssprogramnyelvektantrgyattanul3.osztlyosokszmrakszlt.Egyksrletiszveg,amitazinternetenszabadlicencalattpublikltszmosmsdokumentumnagymrtkbeninspirlt.Ajegyzetbenegynemlineristantsieljrstjavaslunk,amibiztoshogykritizlhat.Tudatbanvagyunkannak,hogyezegykicsitkaotikusnakfogtnniegyespuristkszemben,demiakartukgy,mertmegvagyunkrlagyzdve,hogytbbfle(nemcsakprogramozs,hanemegyb)tantsimdszerltezikselkellfogadniazta tnyt, hogy a klnbz emberek ugyanazokat a fogalmakat nem ugyanabban a sorrendben tanuljk meg.Mindenekeltt a figyelemfelkeltsre trekedtnk sarra, hogy a kvetkez vezrelvekbetartsval akapukatszlesretrjuk: Atantsnakegytlagosdikrtelmiszintjhezsltalnosismereteihezkellalkalmazkodni.Aztelutastjuk,hogy kis zsenikbl ll elitnek oktassunk. Ezen a szemvegen t nzve a dolgokat az az ltalnostrekvsnk, hogy brmifle specializci nlkl nyilvnvalv tegyk a programozs s az informatikainvarinsait. Atantssornalkalmazotteszkzknekkorszerekneksversenykpeseknekkelllenni,deazisszksges,hogyadikokszemlyeshasznlatraleglisanjussanakhozzjuk.Tantsimdszernkazonazelkpzelsenalapul, hogy a tanulknak nagyon korn el kell kezdenik sajt projektjeik megvalstt, amiket a sajtelkpzelseikszerintfejlesztenekshasznlnakfel. Atanulnaknagyonhamarkpesnekkelllennikisgrafikusalkalmazsokmegvalstsra.Nagyonfiatalokhozszlunk(elvilegppenabbaakorbarkeztek,amikorkpesekelkezdeniabsztrahlni).Amellett foglaltunk llst, hogy nagyon korn trjnk r a grafikus interface programozsra, mg arendelkezsre ll adatszerkezetek bemutatsa eltt, mert megfigyelhet, az osztlyainkba rkez fiatalokmregyablakokonsmsinteraktvgrafikusinterfaceekenalapulinformatikaikultrbanlubickolnak.Haaprogramozstanulstvlasztjk,termszetesenszeretnnekminlelbb(lehet,hogynagyonegyszer)alkalmazsokatkszteni,melyekbenagrafikusmegjelensmrmasszvanjelenvan.Azrtvlasztottukeztakiss szokatlan megkzeltst, hogy nvendkeinknek nagyon korn lehetsgk legyen kis, szemlyesprojektekbe kezdeni, melyek rvn rezhetik, hogy rtkelik ket. Azt viszont megkveteljk, hogy amunkikatautomatikuskdgenerl,fejlettprogramfejlesztkrnyezetekalkalmazsanlklrjkmeg,mertnemakarjukaprogramozssszetettsgtsemelfedni.Egyesekazzalkritizlnakbennnket,hogymdszernknemlltjaelggkzppontbaatisztaskemnyalgoritmizlst. gy gondoljuk, hogy egy ilyen megkzelts a fentebb mr emltett okok miatt nincs afiatalokra adaptlva. Radsul ez a megkzelts kevsb lnyeges, mint a mltban volt. gy tnik, azobjektumokkaltrtnmodernprogramozstanulsainkbbaztignyli,hogyatanulamilyenkorncsaklehetkerljn kapcsolatba mr ltez objektumokkal s osztlyknyvtrakkal. gy nagyon korn megtanulja, hogyinkbb objektumok kztti interakcikban gondolkozzon, mint eljrsokban s ez lehetv teszi, hogy elggyorsankiaknzzaazolyankonstrukcikelnyeit,mintazrklssapolimorfizmus.Egybkntelgjelentsteretbiztostottunkaklnbztpusadatszerkezetekkezelsnek,mertgyvljk,hogyazadatszerkezetektgondolsnakkellkpeznimindenprogramfejlesztsgerict.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 4.AzelsprogramozsinyelvkivlasztsaSokprogramozsinyelvltezik.Mindegyiknekvannakelnyeishtrnyai.Biztos,hogyazlenneazidelis,ha tbb nyelvet hasznlnnk. Csak btortani tudjuk a tanrokat, hogy sznjanak r idt s mutassanak beklnbz nyelvekbl vett pldkat. El kell azonban fogadnunk, hogy mindenek eltt a szilrd alapokmegszerzsre kell trekednnk s a rendelkezsnkre ll id korltozott. Ezen a szemvegen t nzve adolgokataztniksszernek,hogyhaelszrcsakegynyelvethasznlunk,legalbbisazelstanvben.Demelyiknyelvetvlasszukelsnek?AmikorazjTudomnyoksInformatikatantrgytantervnekelksztsesornelkezdtnkgondolkodniezen a krdsen, mr elg hossz szemlyes programozsi tapasztalatot gyjtttnk ssze Visual Basickel (Micro$oft)sClarionnal(Top$peed).Delphivel(Borl@nd)isksrleteztnkegykicsit.Termszetesvolt,hogyelszrezeknekanyelveknekazegyikregondoltunk(aClariontpreferlva,amisajnoskevssismert).Haezeketakarnnkalapeszkzknthasznlniazltalnosprogramozstantshoz,akkorazokktkomolyhtrnnyaljrnnak: Azzletiszoftverekheztartoznak.Ezaztjelenti,hogynemcsakazezeketaszoftverekethasznlnikvnoktatsiintzmnynekkellenemindenmunkallomsszmralicencetvsrolni(amielgkltsgesnekgrkezik),hanemazokatanulkisimplicitmdonerrelennnekknyszertve,akikaprogramozsitudsukataziskolnkvlkvnjkalkalmazni,amitnemtudunkelfogadni. Specilisanegyetlenopercisrendszerhezktdnek,aWindows hoz.Nemportbilisakmsopercisrendszerekre(Unix,MacOS,stb.).Eznemilleszkedikabbaapedaggiaitervnkbe,hogyltalnos(sezrtszertegaz) kpzst adunk, amiben az informatikai invarinsokat amennyire lehetsges nyilvnvalvtesszk.Ezrt gy dntttnk, hogy megnzzk az alternatv knlatot, vagyis amit a szabad szoftver mozgalom1ingyenknl.Amittalltunk,aznagyonfellelkestettbennnket:azOpenSourcevilgbaningyenesinterpreterekscompilereklteznekegysornyelvre,radsulezekanyelvekmodernek,versenykpesek,portbilisak(azazklnbz opercis rendszerek alatt hasznlhatk, mint a Windows, Linux, MacOS ...) s nagyon jldokumentltak.VitnfellaC/C++adominnsnyelv.Eztanyelvetabszoltreferenciakntfogadjkelsmindenkomolyinformatikusnak elbb vagy utbb ssze kell vele akadni. A baj csak az, hogy nagyon ijeszt s bonyolult,tlsgosangpkzeli. Aszintaxisakevssolvashatsersen korltoz. Egy nagymret program megrsaC/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 smdosthat, ltalban a vilg klnbz rszein l lelkes, nkntes fejlesztk szzai egyttmkdsnek atermke. Mivel forrskdjt szmos specialista (egyetemi hallgat s oktat) boncolgatta, ezrt az esetektbbsgben a nagyon magas technikai sznvonal a jellemzje. A leghresebb szabad software a GNU/Linuxopercisrendszer,amineknpszersgenaprlnapran.5. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven Msrszt ennekanyelvnekakorszergyakorlatagyakranfolyamodikalkalmazsgenertorokhozsmsnagyon fejlett segdeszkzkhz, mint amilyen a C++Builder, Kdevelop, stb. Ezek a programfejlesztkrnyezeteknagyonhatkonynakbizonyulhatnakgyakorlottprogramozkkezben,detlsgosansoksszetetteszkztknlnaksolyanismeretekettteleznekfelafelhasznlrszrl,melyekkelegykezdnyilvnvalanmgnemrendelkezik.Kzttk elvszakezd,nemltjaaftlazerdt,amiazzalaveszllyeljr,hogyasegdeszkzkelfedikanyelvalapmechanizmusait.EzrtaC/C++tksbbrehagyjuk.Programozsi tanulmnyaink elejn szmunkra preferlhatbbnak tnik egy magasabb szint, kevsbkorltoz,jobbanolvashatszintaktikjnyelvhasznlata.NzzemegazolvasetrgykrbenJeffreyElknerHowtothinklikeacomputerscientistknyvnekelszavt(lsda362.oldalt).MiutnmegvizsgltuksegykicsitksrleteztnkaPerl sTcl/Tk nyelvekkel,vglanagyonkorszersnvekvnpszersgnekrvendPythonmellettdntttnk.APythonnyelvbemutatjaStfaneFermigier2.APythonegyportbilis,dinamikus,bvthet,ingyenesnyelv,amilehetvtesziaprogramozsmodulrissobjektumorientltmegkzeltst.1989tafejlesztiGuidovanRossumsszmosnkntes.AnyelvjellemziRszletezzkegykicsitanyelv,pontosabbanktjelenlegiimplementcijnakjellemzit: APythonportbilis nemcsakklnbzUnixvltozatokra,hanemMacOS, BeOS, NeXTStep, MSDOS sklnbzWindowsvltozatokrais.EgyjfordttrtakJavabanJpythonnakhvjkamiJavabytekdothozltre. Ingyenes,ugyanakkorkorltozsnlklhasznlhatkereskedelmiprojektekben. Egyarntmegfelelnhnyszortzsorosscripteknekstbbtzezersoroskomplexprojekteknek. Szintaxisa nagyon egyszer, fejlett adattpusokat kombinl (listkat, sztrakat, ...). Nagyon tmr,ugyanakkorjlolvashatprogramokrhatkvele.AzazonosfunkcijCsC++(vagyppenJava)programhossznak gyakran a harmadatde az egyenrtk (bsgesen kommentlt s a standard szablyoknakmegfelelen prezentlt) Python program, ami ltalban 510szer rvidebb fejlesztsi idt s lnyegesenegyszerbbkarbantartstjelent. A programoz beavatkozsa nlkl kezeli az erforrsokat (memria, filehandlerek, ...) egy hivatkozsszmll mechanizmus segtsgvel (ami hasonlt egy szemtgyjthz (garbage collector)), 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 van beptve, amilnyegesenleegyszerstiahibakezelst.2 Stfane Fermigier az AFUL (Association Francophone des Utilisateurs de Linux et des logiciels libres =FranciaajkLinuxsszabadsoftwareFelhasznlkEgyeslete)elnke.EzaszvegaProgrammez!magazinban1998 decemberben megjelent cikk kivonata, ami a http://www.linuxcenter.org/articles/9812/python.htmlwebcmeniselrhet.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 6. A Python dinamikus (az interpreter ki tud rtkelni Python kifejezseket s utastsokat tartalmazkarakterlncokat), ortogonlis (kevsfogalommalnagyszmkonstrukcirhatle), reflektv (tmogatjaametaprogramozst(pldulavgrehajtssornkpesattribtumokatvagymetdusokathozzadni/eltvoltaniegyobjektumhoz/bl,vagyppenmegvltoztatniazosztlyt))sintrospektv(szmosfejleszteszkzmintadebuggersaprofilermagbanaPythonbanvanimplementlva). APythondinamikustpusads,minta Scheme vagya SmallTalk.Aprogramozltalmanipulltmindenobjektumnakaprogramvgrehajtskorjlmeghatrozotttpusavan,amitnemkellelredefinilni. Jelenlegktimplementcijavan.Azegyikinterpretlt,melybenaprogramokportbilisutastsokravannaklefordtva, majd egy virtulis gp hajtja ket vgre (mint a Java esetben, azonban van egy lnyegesklnbsg: mivel a Java statikus tpusads, ezrt jval egyszerbb egy Javaprogram vgrehajtsnak afelgyorstsa,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 grafikusinterfaceek. APythonfolyamatosanfejld nyelv,amimgttlelkesfelhasznlksfejlesztkkzssgell,akiknektbbsge tmogatja a szabad szoftvereket. A nyelv alkotja ltal Cben rt s karbantartott interpreterrelprhuzamosanegymsik,Javabanrtinterpretertisfejlesztenek. VglaPythonXMLkezelsrealkalmasnyelv.Tbbklnbzverzi?Amintemltettem,aPythontfolyamatosanfejlesztik.Afejlesztsacljaatermktkletestse.Ezrtnemkellaztgondolni,hogyelbbvagyutbbmindenprogramunkatmdostanikell,hogyazokategyj,azelzverzikkal inkompatibiliss vlt verzihoz adaptljuk. A knyv pldi egymst kveten, egy viszonylaghossz idszak alatt kszltek. Egyeseket a Python 1.5.2, mg msokat az 1.6, 2.0, 2.1, 2.2 s vgl a 2.3verzijvalrtuk.Ennek ellenre valamennyi problma mentesen mkdik ez utbbi verzi alatt s bizonyra nagyobbmdostsoknlklfognakmkdniakvetkezverzikalattis.Teleptseazutolsverzitsszrakozzonjl!7. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAPythonterjesztseBibliogrfiaA Python klnbz verzii (Windowsra, Unixra, stb.), az eredeti oktat anyaga, a kziknyve, afggvnyknyvtrak 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, 288pages,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, 620pages,ISBN:0596002815 Python:Howtoprogram, byHarveyM.Deitel,etal,PrenticeHall;February4,2002,1292pages,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,669pages,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:3540435085GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 8.Atanrnak,akioktatsisegdletkntakarjahasznlniaknyvetAjegyzettelazaclunk,hogyszlesretrjukakapukat.Tanulmnyainknakezenaszintjnfontosnaktnikannakbemutatsa,hogyaszmtgpprogramozsafogalmaksmdszerekrisitrhza,melybenmindenkimegtallhatjaanekiszimpatikusterletet.Nemgondoljukazt,hogymindenhallgatnakpontosanugyanazokatadolgokatkellmegtanulni.Inkbbaztszeretnnk,hogymindegyikkneksikerljnkifejleszteniegykicsiteltrszaktudst,amilehetvteszi,hogymindnmaguk,mindpedigtanultrsaikelttrtkeljkmagukatshaegynagyobb lptk projektben val egyttmkdst ajnlunk nekik, akkor hozz tudjanak jrulni a specilistudsukkal.Mindenesetrealegfbbgondunkannakkelllenni,hogysikerljnflkeltennkazrdekldst,amimesszealegnagyobbhaszonegyolyannehztrgykresetbenmintaszmtgpprogramozs.Nemakarunkgytenni,mint akik azt hiszik hogy dikjaik azonnal lelkesedni fognak a szp algoritmusok rsa irnt. Inkbb arrlvagyunkmeggyzdve,hogyazrdekldstcsakattlapillanattlkezdvelehettartsanfenntartani,amikortlkpessvlnakarra,hogynminllsggaleredeti,szemlyesprojektfejlesztshezkezdhetnek.Ezekameggondolsokvezettekminketegyolyantantrgyszerkezetkialaktshoz,amitegyesektalnkicsitkaotikusnak fognak tallni. A vezrfonal a kitn How to think like a computer scientist, amit kicsitkibvtettnk az adatbe/kivitelre s klnsen a Tkinter grafikus interfacere vonatkoz elemekkel. Aztszeretnnk, ha dikjaink mr programozs tanulmnyaik els vnek vgtl kezdve tudnnak kis grafikusalkalmazsokatkszteni.Egszenkonkrtanezaztjelenti,gygondoljukatantrgyelsvbentfutjukajegyzetelsnyolcfejezett.Ez azt ttelezi fel, hogy elg gyors temben megtrgyalunk egy sor fontos fogalmat (adattpusok,programvgrehajtsvezrlutastsok, fggvnyeksciklusok),denemfoglalkozunkazzaltlsokat, hogyatanulktkletesenmegrtsenekmindenegyesfogalmat,mielttrtrnkakvetkezre.Inkbbmegprbljukrvezetniketaszemlyeskutatssksrletezszre.Sokszorhatkonyabblesz,haazegyesfogalmakatsfontosmechanizmusokatadottszituciban,vltozatossszefggsekkzttjraelmagyarzzuk.Elkpzelsnkszerintflegamsodikvaz,amikormegprbljukamegszerzettismereteketelmlytenisstruktrlni. Az algoritmusokat rszletesen elemezzk. A projekteket, feladat meghatrozsokat s elemzmdszereketkonzultcikonbeszljkmeg.Megkveteljkbizonyosmunkkesetnajegyzknyvrendszereshasznlattsatechnikaijelentsekksztst.A vgcl mindegyik tanul szmra egy komoly, eredeti programozsi projekt kivitelezse lesz. Ezrttreksznkafontosfogalmakelmletitrgyalsnakelgkornatanvelejntrtnbefejezshez,hogymindenkinekelgidlljonarendelkezsre.Fontosannakamegrtse,hogyjegyzetbenkzltszmosinformciamiegysorspecilisterletetrint(grafikusinterfaceek,kommunikci,adatbzisokkezelse,stb.)fakultatvtananyag.Ezekcsakjavaslatoksirnyjelzk,amiketazrtvettnkbeaknyvbe,hogysegtsnkadikjainknakatanulmnyaikatlezrszemlyreszabottprojektjkkivlasztsbansmegkezdsben.Nemksreljkmegegyadottnyelvvagytechnikaiterletspecialistinakkpzst:csakegykisrltstszeretnnknyjtaniazokraazrisilehetsgekre,amikazoknakknlkoznak,akikveszikafradsgotsprogramozitudsratesznekszert.9. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAknyvpldiAknyvpldinakforrskdjaletlthetaszerzilletveafordtwebsitejrl:http://www.ulg.ac.be/cifen/inforef/swi/python.htmhttp://learnpython.openproject.huKsznetnyilvntsA jegyzet egy rsze szemlyes munka eredmnye, mg ms jval jelentsebb rsze informcik sjindulattanrokskutatkltalrendelkezsrebocstotttletekgyjtemnye.Amintfntebbmrjeleztem,azegyiklegfontosabbforrsomA.Downey,J.Elkner&C.Meyers: Howtothinklikeacomputerscientist kurzusavolt.Mgegyszerksznetezeknekalelkestanroknak.Bevallom,GuidovanRossum(aPythonfszerzjnek)eredeti oktat anyaga, valamint a Python felhasznlk (rendkvl aktv) kzssgtl szrmaz pldk sklnfle dokumentumok is nagymrtkben inspirltak. Sajnos lehetetlen felsorolni valamennyi szveghivatkozst,deszeretnmelismersemrlbiztostanivalamennyikszerzit.Ksznetilleti mindazokat,akikaPythonskiegszti,valamintadokumentcifejlesztsndolgoznak,GuidovanRossummalkezvetermszetesen,deatbbieketsemkifelejtve(Szerencsretlsgosansokanvannak,semhogyvalamennyiknevtfeltudnmittsorolni).Ksznet illeti mg kollgimat Freddy Klichet, Christine Ghiott s David Carrerat a Ligei St. JeanBerchmans Intzet tanrait, akik dikjaikkal egytt vllalkoztak r, hogy belevetik magukat ennek az jkurzusnakakalandjbasakiknekszintnszmosjobbtjavasoltukvolt.KlnksznmChristopheMorvannakazIUTdeMarnelaValletanrnakrtkesvlemnytsbtortst.Nagyon ksznm szerkesztmnek Florence Leroynak az O'Reilly kiadnl, hogy szakrten javtottafogalmazsihibimatsbelgicizmusaimat.VglmegksznmfelesgemSuzeltrelmtsmegrtst.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 10.AfordtelszavaA Python a leggyorsabban fejld nyltforrs, ltalnos cl objektum orientlt programozsi nyelv. Aprogramozk14%ahasznlja.Szintaxisarendkvlegyszer,knnyentanulhat.Awww.python.orgrlingyenletlthetsmindenkorltozsnlklszabadonfelhasznlhat,mdosthat,terjeszthet.Azinternetenrengetegdokumentci,pldaprogramtallhat,amiksegtikakezdkelindulst.A gyakorlati let szmos terletn alkalmazzk pl.: hlzati alkalmazsok, webfejleszts, numerikus studomnyos alkalmazsok, prototipus fejleszts, gyors alkalmazs fejleszts (RAD = Rapid ApplicationDevelopment),stb.Grard Swinnen knyve pedaggiailag tgondolt, rendkvl logikus bevezets a Python programozsinyelvbe.Viszonylagkisterjedelmeellenreszmosalkalmazsiterletreadrltstapldaprogramoksalaposelemzsk segtsgvel. A knyv szerves rszt kpezik a pldk, illetve a kln is letlthet mkdpldaprogramok.Afordtssalazvoltaclom,hogyegyiskolaitantsraisalkalmaskivlknyvettegyekmagyarnyelvenhozzfrhetv az rdekldknek. Az olvas fordtssal kapcsolatos szrevteleit ksznettel veszem [email protected],2006.janur10.DarczyPter11. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.Fejezet: Programozkntgondolkodni3Mieltt elkezdjk a programozs tanulst, be kell vezessek nhny fogalmat, melyek ismeretre atovbbiakbanszksgnklesz.Szndkosanegyszerstemamagyarzatokat,hogyneterheljemtlazolvast.Aprogramozsnemnehz:elghozzegykismdszeressgskitarts.1.1AprogramozsA tantrgy clja, hogy megtantson programozknt gondolkozni. Ez a gondolkodsmd olyan sszetetteljrsokatkombinl,mintamilyeneketamatematikusok,amrnkk,satudsokalkalmaznak.Aprogramozamatematikushozhasonlanformlisnyelvekethasznlazokfejtsek(vagyazalgoritmusok)lersra.Amrnkhzhasonlanterveketgondolki,azalkotrszekblszerkezeteketlltssze,srtkeliazok teljestmnyt. Mint a tuds megfigyeli az sszetett rendszerek viselkedst, magyarzatokat vzol fl,ellenrziajslatokat.Aprogramozftevkenysgeaproblmamegolds.Ezklnbzkpessgeketsismereteketignyel: egyproblmtklnbzmdokonkelltudnunkmeg/jrafogalmazni, innovatvshatkonymegoldsokatkelltudnunkelkpzelni, ezeketamegoldsokatvilgosanskomplettmdonkelltudnunkkifejezni.Aszmtgpprogramozsalnyegbenabblll,hogyrszletesenmegmagyarzzukegygpnekaminemrtimegazemberinyelvet,csupnkaraktersorozatokautomatikuskezelsrekpes,hogymitkelltennie.Aprogramelrergztettkonvencikezekegyttestprogramozsinyelvneknevezznkszigorbetartsvalkdoltutastsoksorozata.Agprendelkezikegyeljrssalamigydekdoljaezeketazutastsokat,hogyanyelvmindenszavhozegypontosanmeghatrozottakcitrendel.Azolvasmegtanulprogramozni,amimrnmagbanhasznos,mertfejlesztiazintelligencit.Majdodigiseljut,hogyaprogramozstkonkrtprojektekmegvalstsrahasznlja,amibenbiztosrmtfogjalelni.1.2Gpinyelv,programozsinyelvAszmtgpktllapotelektromosjelek(pldulegyminimlisvagyegymaximlisfeszltsg)sorozatainhajtvgreegyszermveleteket.Ezekajelsorozatokegymindenvagysemmitpuslogiktkvetnek.gytekinthetjkket,mintolyanszmoksorozatt,melyekmindigcsaka0saz1rtkeketvehetikfel.Azilyenszmrendszertkettes(binris)szmrendszerneknevezzk.A szmtgp a bels mkdse sorn csakbinris szmokat tud kezelni. Minden ms tpus informcitbinrisformtumvkelltalaktanivagykdolni.Eznemcsakakezelendadatokra(szvegek,kpek,hangok,szmok,stb.)igaz,hanemaprogramokrais,vagyisazokraazutastssorozatokrais,amiketazrtadunkmegagpnek,hogymegmondjukneki,mitkellcsinlniazadatokkal.Az egyetlen nyelv, amit a szmtgp valban megrt tnyleg nagyon tvol van attl amit mi3 EnnekafejezetnekajelentsrsztDowney,ElknersMeyersHowtothinklikeacomputerscientistjblfordtottam.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 12.hasznlunk. 1esek s 0k (ezek a bitek) hossz sorozata, amiket gyakran 8, 16, 32 vagy ppen 64esvelcsoportostvahasznl.Ezagpinyelvszmunkrarthetetlen.Ahhoz,hogyegyszmtgppelbeszljnk,olyanfordtrendszereketkellalkalmaznunk,melyekkpesekaszmunkrarthetbbkucsszavakat(rendszerintangolszavakat)alkotkaraktersorozatokatbinrisszmokkalaktani.Ezeknekafordtrendszereknek,amiketegysorkonvencialapjnimplementlnak,nyilvnvalanszmosvltozataltezik.Attl fggen, hogy milyen eljrst alkalmaz a fordt: hvjuk interpreternek vagy compilernek (lsdlentebb).Aprogramozsinyelv nagyonpontosszablyokhozrendelt(nknyesenvlasztott)kulcsszavaknakakszlete.Aztrjale,hogyanrakhatjuksszeezeketaszavakatolyanmondatokk,amiketazinterpretervagyacompileragpnyelvre(binrisszmokra)letudfordtani.Az absztrakci szintje alapjn beszlhetnk alacsonyszint (pl.: Assembler) vagy magas szintnyelvekrl (pl.:: Pascal, Perl, Smalltalk, Clarion, Java...). Egyalacsonyszintnyelvet nagyon elemi, nagyongpkzeliutastsokalkotjk.Egymagasszintnyelvutastsaiabsztraktabbakvagyhatkonyabbak.Ezaztjelenti,hogyazinterpretervagyacompilermindenutaststnagyszmelemigpiutastsrafordtle.AzolvaselsprogramozsinyelvkntaPythontfogjamegtanulni.Ezegymagasszintnyelv.Abinriskdratrtnfordtsasszetetteljrssmindigidignyes.Ezknyelmetlennektnhet.Valjbanamagasszintnyelveknekrendkvlielnyeikvannak:egymagasszintnyelvenaprogramrssokkalegyszerbb,jvalkevesebbidbekerl;annakavalsznsge,hogyhibkatejtnkjvalcseklyebb,minthaegyalacsonyszintnyelven 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 vagyopercis rendszereken. Egy alacsonyszint nyelven rt program mindig csak egy gptpuson tud mkdni.Ahhoz,hogyegymsikgptpusonmkdjnteljesentkellrni.13. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.3CompillssinterpretlsAprogramot,ahogyanaztegyszerkesztprogrammal(egyfajtaspecilizlt szvegszerkesztvel)megrjukmostantlfogvaforrsprogramnak(vagyforrskdnak)nevezzk.Mintmremltettem,ktftechnikaltezikarra, hogy egy ilyen forrskdot a gp ltal vgrehajthat binris kdra fordtsunk: az interpretci s acompilatio. Azinterpretciesetnmindenegyesalkalommal,amikorvgreakarjukhajtatniaprogramot,azinterpreterprogramot kell hasznlnunk. Ennl a techniknl a fordt a forrsprogram minden egyes elemzett sortnhny gpi nyelv utastsra lefordtja, amiket azonnal vgre is hajt. Semmilyen trgyprogram semgenerldik Acompills ateljesforrsszvegegyszerilefordtsblll.Afordtprogramelolvassaaforrsprogramsszessortsegyjkdotlltel,amittrgykdnak(objectkd)hvunk.Ezutbbitmostmracompilertlfggetlenlvgrehajtathatjukstrolhatjukegyfileban(vgrehajthatfile)Mindegyiktechniknakvannakelnyeishtrnyai:Azinterpretciidelisamikoregynyelvettanulunk,vagyegyprojekttelksrleteznk.Ezzelatechnikvalkzvetlenltesztelhetaforrskdmindenmegvltoztatsaanlkl,hogytmennnkegycompillsifzison,amimindigidignyes.Ezzel szemben, amikor egy projektnek sszetett funkcii vannak, amiket gyorsan kell vgrehajtani, acompilatitrszestjkelnyben.Nyilvnval,hogyegycompilltprogrammindiglnyegesengyorsabbanfogmkdni, mint az interpretlt vltozata, mivel a szmtgpnek a vgrehajts eltt nem kell minden egyesutaststjrabinriskdralefordtani.Egyesmodernnyelvekmegprbljkaktmdszertkombinlni,hogymindegyikblalegjobbathozzkki.EzahelyzetaPythonsaJavaesetbenis.AmikoregyforrskdotadunktaPythonnak,azelszregygpi kdhozhasonlkzbenskdot.n. bytecodeothozltre,amitaztnegyinterpreternekadtvgrehajtsra.Aszmtgpszempontjblabytecode otnagyonegyszergpinyelveninterpretlni.Ezazinterpretcitehtsokkalgyorsabblesz,mintegyforrskdinterpretcija.Ennekamdszernekazelnyeirzkelhetek:GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 14. Az,hogyllandanrendelkeznkegyinterpreterrel,lehetvteszibrmilyenkisprogramrszlet kzvetlentesztelst. Egy alkalmazs brmelyik alkotjnak helyes mkdst igazolhatjuk annak ltrehozstkveten. A lefordtott bytecode interpretcija nem olyan gyors, mint egy igazi binris kd, de szmos programszmra,belertveagrafikusprogramokatis,nagyonmegfelel. Abytecode portbilis.Ahhoz,hogyegyPythonvagyegyJavaprogramklnbzgpekenvgrehajtdjonelghamindegyikgpenrendelkezsrellegyadaptltinterpreter.Az elmondottak egy kicsit bonyolultnak tnhetnek, az viszont j hr, hogy mindezt a Pythonfejlesztkrnyezet automatikusan vgzi el. Elg, ha berjuk a parancsokat a klaviatrn, majd nyomunksaPythonmagravllaljaazokfordtstsinterpretlst.15. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.4ProgramfejlesztsHibakeress(debug)A programozs nagyon sszetett s mint minden emberi tevkenysg sorn, ennek sorn is szmos hibtkvetnkel.Anekdotaiokokblaprogramozsihibkatbug4oknaknevezzk.Adetektlsukrasjavtsukrahasznlttechnikkegyttestdebugnaknevezzk.Hromfletpushibaltezhetegyprogramban.Illendmegtanulnimegklnbztetniket:1.4.1 SzintaxishibkAPythoncsakakkortudvgrehajtaniegyprogramot,haaszintaxisa teljesenkorrekt.Ellenkezesetbenaprogramvgrehajtslellsegyhibazenetetkapunk.Aszintaxiskifejezsazokraaszablyokrautal,melyeketanyelvszerzirgztettekaprogramstruktrjravonatkozan.Mindennyelvnekvanszintaxisa.Pldulamagyarnyelvbenegymondatmindignagybetvelkezddiksrsjellelvgzdik.ezrtezamondatktszintaxishibttartalmazA kznsges szvegekben nhny kis szintaxishibnak nincs jelentsge. St elfordulhat (pldul aversekben),hogyszndkosankvettekelszintaxishibkat.Eznemgtoljamegaszvegmegrtst.Ezzelszembenegyszmtgpprogrambanalegkisebbszintaxishibaamkdslellst(kiakads)segyhibazenetkirsteredmnyezi.Azolvasprogramoziplyafutsaelsheteibenbiztosansokidtfogeltlteniaszintaxishibikeressvel.Gyakorlattaljvalkevesebbhibtfogelkvetni.Tartsuk szben, hogy az alkalmazott szavaknak s szimblumoknak nmagukban semmilyen jelentsksincs: 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,legyenekazokakrmilyenkicsikis,jrakellenefordtaniateljesprogramot.1.4.2 SzemantikaihibkA msodik hibatpus a szemantikai hiba vagy logikai hiba. Ha ilyen tpus hiba van valamelyikprogramunkban,akkoraprogramtkletesenhajtdikvgreabbanazrtelemben,hogysemmilyenhibazenetetsemkapunk,deazeredmnynemazamitvrunk:mstkapunk.Valjbanaprogramaztteszi,amitmondtunkneki,hogyhajtsonvgre.Aproblmaaz,hogyamitmondtunk,hogy hajtson vgre nem felel meg annak, amit szerettnk volna, hogy a program vgrehajtson. A programutastsainaksorrendjenemfelelmegakitzttclnak.Aszemantika(alogika)nemkorrekt.Alogikaihibkkeressenehzfeladatlehet.Elemeznikellazoutputotsmegkellprblniegymsutnreproduklniazokatamveleteket,amiketagpazegyesutastsokutnvgrehajtott.4 A"bug" angol eredet kifejezs, olyan kis, kellemetlen rovarokat jelent, mint amilyenek a poloskk. Az elsszmtgpek elektroncsvei meglehetsen nagy feszltsget ignyeltek. Szmos alkalommal megtrtnt, hogyezek a rovarok bemsztak az ramkrk kz s ramtst kaptak, sznn gett testk rvidzrakat s gyrthetetlenmeghibsodsokatokozott.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 16.1.4.3 VgrehajtskzbenfellphibkA hibk harmadik tpust a vgrehajts kzben fellp hibk (Runtime error) kpezik. Ezek csak akkorlpnek fel, amikor a program mkdse sorn specilis krlmnyek llnak el (pldul a program egy mrnemltezfiletksrelmegolvasni).Ezeketahibkat kivteleknek (exception) ishvjk,mertezekltalbanjelzik,hogyvalamikivtelestrtnt(amitnemlttunkelre).Tbbszrfogunktallkozniilyentpushibvalamikoregyrenagyobbmretprojekteketfogunkprogramozni.1.5HibakeresssksrletezsAtanuls sorn elsajttandegyiklegfontosabbkszsg ahatkony programhiba keress (debugols). Eznhaidegest,demindignagyonsokrtszellemitevkenysg,aminekasornlesltsrlkelltanubizonysgottenni.Emlkeztetegyrendrsgikihallgatsra.Megvizsgljukatnyeketsmagyarzfeltevseketkelltennnk,hogyrekonstruljukatapasztalteredmnyeketadfolyamatokatsesemnyeket.Hasonlt a tudomnyos ksrletekre. Van egy elkpzelsnk arrl, hogy mi nem mkdik, mdostjuk aprogramunkatsjrakiprbljuk.Kialaktottunkegyfelttelezst,amilehetvtesziannakmegjslst,hogymitkelleredmnyezzenamdosts.Haajslatbeigazoldik,tettnkegylpstegymkdprogramirnyba.Ha a jslatunk tvesnek bizonyul, akkor egy jabb hipotzist kell alkotnunk. Ahogyan azt Sherlock Holmesmondja: Amikor kizrtuk a lehetetlent, annak kell lennie az igazsgnak, ami megmarad, mg ha azvalszntlenis(A.ConanDoyle,Angyesjel).Egyeseknekaprogramozssdebugolspontosanugyanaztadolgotjelenti.Ezzelaztakarjkmondani,hogyaprogramozsugyanannakaprogramnakazllanmdostsblsjavtsblll,mindaddig,mgvglaprogramgyviselkedik,ahogyanakarjuk,hogyviselkedjen.Azelkpzelsaz,hogyaprogramkszts mindig egy mr mkd (azaz debugolt) vzzal kezddik, amihez rtegrl rtegre kismdostsokattesznkhozz,fokozatosanjavtjukahibkat,hogyvglafolyamatmindegyikszakaszbanegymkdprogramunklegyen.Pldul tudjuk, hogy a Linux egy tbb ezer kdsorbl ll opercis rendszer (teht egy nagy program).Ennekellenrekezdetbengyindultmintegykicsi,egyszerprogram,amitLinusTorvaldsarrafejlesztettki,hogyteszteljeazIntel80386processzorsajtossgait.LarryGreenFieldszerint(TheLinuxuser'sguide,btaverzi1):Linuselsprogramjainakegyikeegykisprogramvolt,aminekafeladataazAAAAkarakterlncBBBBkaraklnccvalalaktsavolt.Ezaz,amiksbbaLinuxszvlt!.Azelzeknemjelentikazt,hogyhomlyoselkpzelsblkiindulvaszukcesszvenapproximlvaakarnnkprogramozni.Amikoregyjelentsprogramprojektbekezdnk,mindenernkkelarrakelltrekednnk,hogyalehetlegjobbrszletesfeladatmeghatrozstrjukmeg,amiazelkpzeltalkalmazstervnfogalapulni.Klnbzmdszereklteznekerreaproblmaelemzsre,azonbanezektanulmnyozsameghaladjaennekajegyzetnekakereteit.Tovbbiinformcikrtshivatkozsokrtforduljonazolvasatanrhoz.17. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven1.6TermszetessformlisnyelvekAzokatermszetesnyelvek,amiketkommunikcirahasznlnakazemberek.Nemkonstrultnyelvek(mgakkorsem,haegyesekbenmegprblnakrendszertteremteni):termszetesmdonfejldnek.Aformlisnyelveketspecilisalkalmazsokatszemeltttartvafejlesztettkki.gypldulamatematikusokltalhasznltjellsrendszeregyolyanformlisnyelv,amiklnsenhatkonyanfejezikiaklnbzszmoks mretek kztti relcikat. A vegyszek egy formlis nyelvet hasznlnak a molekulk szerkezetnekbemutatsra,stb.Aprogramozsinyelvekazokaformlisnyelvek,amiketalgoritmusoklersrafejlesztettekki.Mintmrfntebbjeleztem,aformlisnyelvekszintaxisarendkvlszigorszablyoknakengedelmeskedik.Pldul a 3+3=6 egy matematikailag korrekt brzolsmd, mg a $3=+6 nem az. Ugyangy a H2O kmiaikpletkorrekt,deaZq3G2nem.Aszintaxisszablyokatnemcsakanyelvszimblumaira(pldulaZqkmiaiszimblumnemmegengedett,mertsemmilyenelemneksemfelelmeg),hanemazokkombinlsimdjraisalkalmazzuk.Ezrt,jlleheta6+=+/5matematikai egyenlet csak megengedett szimblumokat tartalmaz, azonban azok inkorrekt elrendezsesemmitsemjelent.Egymondatolvassakorelkelljutnunkodig,hogyelkpzeljkamondatlogikaiszerkezett(mgakkorishaeztazesetektbbsgbennemtudatosantesszk).PldulamikorApnzdarableesett.mondatotmondjuk,megrtjk, hogy A pnzdarab az alany s a leesett az lltmny. Az elemzs lehetv teszi, hogymegrtskamondatjelentst,logikjt(szemantikjt).AnalgmdonaPythoninterpreternekelemeznikellaforrsprogramunkszerkezett,hogyajelentstkihmozzabelle.Atermszetessaformlisnyelvekneksokkzsjellemzjevan(szimblumok,szintaxis,szemantika),denagyonjelentsklnbsgekisvannakkzttk:Ktrtelmsg.A termszetes nyelvek tele vannak ktrtelmsgekkel, amik az esetek tbbsgben a szvegkrnyezetsegtsgvelmegszntethetk.Plduleltrjelentsttulajdontunkazrsznakegytermkrl,illetveegyrvzrl szl szvegben. Egy formlis nyelv nem tartalmazhat ktrtelmsgeket. Minden utastsnakegyetlen,szvegkrnyezettlfggetlenjelentsevan.Redundancia.A termszetes nyelvekben sok a redundancia azrt, hogy ezeket a ktrtelmsgeket s az informcitvitelbeli szmos hibt s vesztesget kompenzljk (mondatainkban tbbszr klnbz formbanmegismteljk ugyanazt, hogy biztosak legynkbenne, hogy megrttettk magunkat). A formlis nyelveksokkaltmrebbek.Irodalmisg.Az irodalmi szvegek tele vannak kpekkel s metaforkkal. Egy formlis nyelvben ezzel szemben akifejezseket sz szerint kell venni. Ha egy bizonyos szvegkrnyezetben azt mondom, hogy leesett aktforintos,lehetsges,hogyszsincsigaziktforintosrl,sempedigleessrl.Ezzelszembenegyformlisnyelvbenakifejezseketszszerintkellrteni.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 18.Atermszetesnyelvekhasznlathozszokvasokszornehezenalkalmazkodunkaformlisnyelvekszigorhoz.Ezazegyiknehzsg,amintlkelljutni,hogyeljussunkegyhatkonyprogramanalitikusgondolkodsmdjig.Ajobbmegrtsrdekbenhasonltsunksszemgnhnyszvegtpust:Vers:Aversekbenaszavakatmindzeneisgk,mindjelentskmiatthasznljksakeresetthatsfkntrzelmi.Tobzdnakametaforkbansktrtelmsgekben.Przaiszveg:A szavak szszerinti jelentse fontosabb bennk, s a mondatok gy vannak struktrlva, hogymegszntesskaktrtelmsgeket,deezsohasemsikerlteljesen.Gyakranszksgesekaredundancik.Szmtgpprogram:A szveg jelentse egyrtelm s szszerinti. Tkletesen megrthet csak a szimblumok s a szerkezetelemzservn.Tehtautomatizlnilehetazelemzst.Nhny javaslat, hogy hogyan olvassunk szmtgpprogramot (vagy brmilyen formlis nyelven rtszveget).Tartsukszben,hogyaformlisnyelveksokkaltmrebbek,mintatermszetesnyelvek,amiaztjelenti,hogyazolvassukhoztbbidrevanszksg.Radsulastruktraezeknlnagyonfontos.ltalbanazsemjtlet,haegymenetbenazelejtlavgigolvasunkelegyprogramot.Ehelyettgyakoroljukaprogramelemzstfejbenaszimblumokazonostsvalsaszerkezetrtelmezsvel.Vglemlkezznkr,hogymindenrszletnekjelentsgevan.Klnsenfigyelnnkkellakissnagybetkrevalamintazrsjelekhasznlatra.Mindenilyenhiba(mgaltszlaglegkisebbis,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 segtsgvel kzvetlenlfolytathatunkveleprbeszdet.gyigengyorsanfelfedezhetjkanyelvszmoslehetsgt.Ksbbmegtanuljuk,hogyankellltrehoznisdiszkreelmenteniprogramokat(scripteket).Azinterpretertkzvetlenlaparancssorblindthatjuk(egyLinuxshellben,vagyWindowsalattegyDOSablakbl):elg,habegpeljka"python"parancsot(feltve,hogyaprogramfelvanteleptve)).Hagrafikusinterfacethasznlunk,mintaWindows,Gnome,WindowMakervagyKDE,valsznleginkbbegyterminlablakbanfogunkdolgozni,vagyegyspecializltfejlesztkrnyezetben,mintamilyenazIDLE.Terminlablakban(Linux5alatt)akvetkezjelenikmeg:WindowsalattazIDLEfejlesztkrnyezetkinzeteazalbbikprehasonlt:5 Windows alatt vlaszthatunk a Guido Van Rossum ltal rt IDLE fejlesztkrnyezet, amit magam elnybenrszestek,saMarkHammondltalfejlesztett PythonWin kztt.Lteznekmskifinomult fejlesztkrnyezetekis,mintakivlBoaConstructor (ezhasonlanmkdik,mintaDelphi),degyvlem,hogyeznemvalkezdknek.TovbbifelvilgostsrtaPythonwebsiteotrdemesmegnzni.LinuxalattinkbbaWindowMakergrafikuskrnyezetetrszestemelnyben(mintaKDEtvagyaGnomeot,amiktlsokerforrstvesznek ignybe). MegnyitunkegyegyszerterminlablakotaPythoninterpreter indtshoz vagyascriptekvgrehajtshozsakitnNeditprogramothvjuk,amiascriptekszerkesztsreval.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 20.A>>>jelafprompt,amiaztjelzi,hogyazinterpreterkszenllegyutastsvgrehajtsra.Pldul az interpretert azonnal egyszer irodai kalkultorknt hasznlhatjuk. Ellenrizzk az albbiparancsokat(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.Azrjelekmkdnek.Alaprtelmezsbenviszontazosztsegszoszts,amiaztjelenti,hogyhaegszargumentumokatadunkmeg,akkorazeredmnyegy(csonkolt)egszlesz,mintafentiutolspldban.Haaztakarjuk,hogyaPythonazargumentumtvalsszmkntrtelmezze,akkoreztgytudatjukvele,hogyaszmbaegytizedesponttesznk6.Prbljukkipldul:>>> 20.0 / 3 # (hasonltsuk ssze az eredmnyt az el zpldval) >>> 8./5Haegymveletetvegyestpusargumentumokkalhajtunkvgre(egszekkelsvalsokkal),akkoraPythonazoperandusokatautomatikusanvalstpusvalaktjatmielttelvgziamveletet.Prbljukki:>>> 4 * 2.5 / 3.36 Valamennyiprogramozsinyelvben:atizedesszepartormindigegypont.Azinformatikbanavalsszmokatgyakranlebegpontosszmoknak,vagyfloattpusaknaknevezik.21. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven2.2AdatoksvltozkAksbbiekbenleszalkalmunkrszletezniaklnbznumerikusadattpusokat,deeltteegynagyonfontosfogalomrlbeszlnk:Egyszmtgpprogramlnyegtazadatmanipulcikkpezik.Ezekazadatoknagyonklnbzeklehetnek(lnyegben minden, ami digitalizlhat7), de a szmtgp memrijban vgleg binris szmok vges sorozatvegyszersdnek.Ahhoz,hogyaprogram(brmilyennyelvenislegyenmegrva)hozztudjonfrniazadatokhoz,nagyszmklnbztpusvltozthasznl.Egyprogramozsinyelvbenegyvltozmajdnemmindegymilyenvltoznvkntjelenikmeg,aszmtgpszmraegymemriacmetjellhivatkozsrlvansz,vagyisegymeghatrozotthelyrlaRAMban.Ezen a helyen egy jl meghatrozott rtk van trolva. Ez az igazi adat, ami binris szmok sorozataformjbanvantrolva,deamiazalkalmazottprogramozsinyelvszembennemfelttlenlegyszm.Szintebrmilyenobjektumlehet,amielhelyezhetaszmtgpmemrijban,mintpldul:egyegsz,egyvals,egykomplexszm,egyvektor,egykarakterlnc,egytblzat,egyfggvny,stb.Aprogramozsinyelvklnbzvltoztpusokat(egsz,vals,karakterlnc,lista,stb.)hasznlaklnbzlehetsges tartalmak egymstl trtn megklnbztetsre. A kvetkez oldalakon ezeket fogomelmagyarzni.7 Igaznmitdigitalizlhatunk? Ezegyrendkvlfontoskrds, amitazltalnosszmtstechnikakurzusonkellmegtrgyalnunk.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: A vltoznv az (a z , A Z) betk s a (0 9) szmok sorozata, aminek mindig betvel kellkezddni. Csakazkezetnlklibetkamegengedettek.Aszkzk,aspeciliskarakterek,mintpl.:$,#,@,stb.nemhasznlhatk.Kivtela_(alhzs). Akissnagybetkklnbznekszmtanak.Figyelem:Jozsef,jozsef,JOZSEFklnbzvltozk.gyeljnkerre!Vljonszoksunkk,hogyavltozneveketkisbetkkelrjuk(akezdbettis8).Egyegyszerkonvencirlvan sz, de ezt szles krben betartjk. Nagybetket csak magnak a sznak abelsejben hasznljunk, hogyfokozzukazolvashatsgot,mintpldul:tartalomJegyzk.Tovbbi szably: nem hasznlhat vltoznvknt az albb felsorolt 28 foglalt sz (ezeket a Pythonhasznlja):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,hogyandefinilhatunkegyvltoztshogyanrendelhetnkhozzrtket.Avltozhozvalrtkhozzrendelsvagyrtkadskifejezsek egyenrtkek.Egyolyan mveletet jellnek,amelykapcsolatotteremt a vltoznvsa vltozrtke(tartalma)kztt.APythonbanszmosmsnyelvhezhasonlanahozzrendelsmvelettazegyenlsgjelreprezentlja9:>>> n = 7 # n-nek a 7-et adjuk rtkl >>> msg = "Mi jsg ?" # A "Mi jsg ?" rtket adjuk msg-nek>>> pi = 3.14159 # pi nevvltozhoz hozzrendeljk az rtkt Afentipythonosrtkadmveletekklasszikusak.Miutnezeketvgrehajtottuk,aszmtgpmemrijnakklnbzhelyein: hromvltoznvvan:n,msgspi hrombytesorozatvan,melyekbena 7 egszszm,aMijsg? karakterlncsa3,14159valsszmvankdolva.A fenti hrom rtkad utasts mindegyiknek a hatsa tbb mvelet vgrehajtsa a szmtgpmemrijban:: vltoznvltrehozsasbejegyzseamemriba; vltoznvhezjlmeghatrozotttpusrendelse(eztakvetkezoldalonfogommagyarzni); egyspecilisrtkltrehozsastrolsaamemriban; kapcsolat ltestse a vltoznv s a megfelel rtk memriahelye kztt (mutatk bels rendszeresegtsgvel)Azelmondottakatazalbbillapotdiagrammalszemlltethetjk:n msg pi 7Mijsg?3.14159Ahromvltoznvamemriaegyspecilisrszbenaz.n.nvtrben(namespace)trolthivatkozs,mga megfelel rtkek msutt, egymstl gyakran tvol helyezkednek el. A ksbbiekben alkalmunk leszpontostanieztakoncepcit.9 Fontos, hogy megrtsk, hogy itt semmifle egyenlsgrl sincs sz. Egy ms szimbolizmust is vlaszthattunkvolna,mintplduln>> n7>>> msg"Mi jsg ?">>> pi3.14159Az interpreter egy msodlagos funkcionalitsrl van itt sz, aminek az a clja, hogy megknnytse azletnket,amikoregyszerparancssorgyakorlatokatvgznk.Programbanmindigaprintutaststhasznljuk:>>> print msgMi jsg ?Vegykszreaktflekiratsimddalkapotteredmnykzttiaprklnbsget.Aprintutastsszigorancsakavltozrtktrjaki,gyahogyanazkdolvavolt,mgamsikmdszer(az,amelyikcsakavltoznvbersblll)azidzjeleketis(azrt,hogyemlkeztessenavltoztpusra:erremgvisszafogoktrni).2.6AvltozktpusadsaA Pythonban nem szksges a vltozk hasznlata eltt a tpusuk definilsa rdekben specilisprogramsorokatrni.Elghahozzrendelnkegyrtketegyvltoznvhez.APythonavltoztautomatikusanazzalatpussalhozzaltre,amialegjobbanmegfelelazrtknek.Azelzgyakorlatbanpldulazn,msgspi vltozk mindegyikt automatikusan hozta ltre klnbz tpusokkal (rendre egsz szm,karakterlnc,lebegpontosszmtpusokkal).EzegyrdekessajtossgaaPythonnak,amialapjnaprogramnyelveknekahhozacsoportjhozsoroljuk,amelyikheza Lisp, Scheme snhny msnyelvtartozik. APython dinamikus tpusads nyelv,szembenastatikus tpusads nyelvekkel mint amilyenek a C++ vagy a Java. Ezekben a nyelvekben elszr mindigspecilis utastsokkal deklarlni (definilni) kell a vltozk nevt s tpust s csak ezutn lehet tartalmatrendelnihozzjuk,aminektermszetesenkompatibilisnekkelllenniadeklarlttpussal.Astatikustpusadstacompilltnyelvekrszestikelnyben,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 tizedesjegyeket tizedesponttal vlasztjuk el az egszrsztl, ahogy az az angol nyelvterleten szoksos. A vesszt 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,automatikusanavalstpustrendeliaza sazegsztpustabvltozhoz.A plda msodik sorban az j y vltozhoz rendeljk hozz egy kifejezs eredmnyt, ami a * , + s /opertorokatkombinljaaza,b,3s5operandusokkal.Azopertorokspecilisszimblumok,amiketolyanegyszermatematikaimveletekreprezentlsrahasznlunk,mintazsszeadsvagyaszorzs.Azoperandusokazrtkek,amiketazopertoroksegtsgvelkombinlunk.APythonmindenegyeskifejezstkirtkel,amitberunkneki,legyenazakrmilyenbonyolult sennekakirtkelsnek az eredmnye mindig egyrtk. Ehhezazrtkhez automatikusan hozzrendel egytpust, amifggattl,hogymivanakifejezsben.Afentipldbanyvalstpuslesz,mertakirtkeltkifejezslegalbbegyvalsvltozttartalmaz.NemcsakangymatematikaialapmveletopertoratartozikaPythonopertoraihoz.Hozzjukkellvenniahatvnyozsopertort**,nhnylogikaiopertort,akarakterlncokonmkdopertorokat,azazonossgotstartalmazsttesztelopertorokat,stb.Minderrlaksbbiekbenjrafogokbeszlni.Rendelkezsnkrellamoduloopertor,amita%szimblumjell.Ezazopertoregyszmnakegymsikszmmalvalegszosztsblszrmazmaradktadjameg.Prbljukki:>>> 10 % 3 (jegyezzk meg, hogy mi trtnik !)>>> 10 % 5Aksbbiekbennagyonhasznoslesz,amikoraztvizsgljuk,hogyegya szmoszthateegybszmmal. Elgaztmegnzni,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:TanuljunkmegprogramozniPythonnyelven2.9AmveletekprioritsaHa egy kifejezsben egynl tbb opertor van, akkor a mveletek vgrehajtsnak sorrendje a prioritsi szablyoktlfgg.APythonbanaprioritsiszablyokugyanazok,mintamiketmatematikbltanultunk: zrjelek.Ezekalegmagasabbprioritsak.Azttesziklehetv,hogyazltalunkkvntsorrendbentrtnjenegykifejezskirtkelse.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,hogyalaprtelmezsbenaPythonegszosztstvgez.) Haktopertorazonospriorits,akkoravgrehajtsukbalrljobbratrtnik.gyaz59*100/60kifejezsbenelszraszorzst,majdeztkveten,az 5900/60osztstvgziel,aminekazeredmnyet 98.Haelszrazosztstvgeznel,akkorazeredmny59lenne(emlkezznkr,hogyittegyegszosztsrllennesz).GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 28.2.10KompozciEddig egy programozsi nyelv klnbz elemeit tanulmnyoztuk : a vltozkat, a kifejezseket s azutastsokat,deaztnemvizsgltuk,hogyhogyanlehetezeketegymssalkombinlni.Egy magasszint programozsi nyelv egyik erssge, hogy klnbz elemek kombinlsval sszetettutastsokathozhatunkltre.gypldul,hatudjukhogyanadunksszektszmotshogyanratunkkiegyrtket,akkoraktutaststegyetlenutastsskombinlhatjuk:>>> print 17 + 3>>> 20Ez a nyilvnvalnak tn tulajdonsg fogja lehetv tenni az sszetett algoritmusok vilgos s tmrprogramozst.Plda:>>> h, m, s = 15, 27, 34>>> print "az jfl ta eltelt msodpercek szma = ", h*3600 + m*60 + sFigyelem:vanegymegszortsarranzve,hogymiketlehetkombinlni:Amitegykifejezsbenazegyenlsgjelbaloldalnhelyeznkel,annakmindigegyvltoznakkelllenni,nempedigegykifejezsnek.Ezabblatnyblfakad,hogyazegyenlsgjelneknemugyanazajelentse,mintamatematikban.Mintmremltettem,egyrtkadsimveletjelrlvansz(egybizonyostartalmattesznkegyvltozba),nempedigegyegyenlsgjelrl.Azegyenlsgjelet(pldulegyfelttelellenrzsben)egykicsitksbbfogombemutatni.gypldulazm+1=butastsszablytalan.A matematikban viszont elfogadhatatlan a = a + 1 et rni, pedig ez az rsmd igen gyakori aprogramozsban. 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 kelltisztznunk.29. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven3.Fejezet: AzutastsfolyamvezrlseAz els fejezetben lttuk, hogy az elemz programoz alaptevkenysge a problmamegolds. Egyinformatikaiproblmamegoldshozatevkenysgeketmindigbizonyossorrendbenkellvgezni.Amegfelelstruktrbanssorrendbenlerttevkenysgeketalgoritmusnaknevezzk.A tevkenysgek vgrehajtsi sorrendjt meghatroz utastscsoportok a vezrl struktrk. A modernprogramozsbancsakhromvanbellk:aszekvenciasakivlaszts,melyeketebbenafejezetbenrokle,sakvetkezfejezetbentrgyaltismtls.3.1Utastsszekvencia10Hanemmondunkmst,akkoregyprogramutastsaiegymsutnabbanasorrendbenlesznekvgrehajtva,ahogyanascriptbenlevoltakrva.Aztaz tvonalat,amitaPythonaprogramvgrehajtssornkvet utastsfolyamnaknevezzk.Azeztmdostutastsokazutastsfolyamvezrlutastsok.NormlisanaPythonazutastsokatazelstlazutolsigvgrehajtja,kivvehaegyfelttelesutastssaltallkozik,mintamilyenazifutasts,amitezutnfogoklerni(aprogramhurkokkapcsnfogunkveletallkozni).Egyilyenutastslehetvfogjatenniaprogramnak,hogyakrlmnyektlfggenmsvgrehajtsiutakatkvessen.3.2KivlasztsvagyfelttelesvgrehajtsHaigaznhasznosprogramokatszeretnnkrni,akkorolyantechnikkravanszksg,amiklehetvteszikaprogramvgrehajts klnbz irnyokba trtn tirnytst attl fggen, hogy milyen felttelekkeltallkozunk.Ehhezolyanutastsokkellenek,amikkeltesztelnilehetegybizonyosfeltteltskvetkezmnykntmdostanilehetaprogramviselkedst.Az if utasts a legegyszerbb ezek kzl a feltteles utastsok kzl. Ksrlet kppen rjuk be a Pythoneditorbaakvetkezktsort:>>> a = 150>>> if (a > 100):...Azelsutastsazavltozhozhozzrendelia150rtket.Eddigsemmijnincs.Amikor viszont berjuk a msodik sort, azt tapasztaljuk, hogy a Python jfajta mdon viselkedik. Ha nemfelejtettk le a : karaktert a sor vgrl, akkor megllapthatjuk, hogy a fpromptot (>>>) most egymsodlagosprompthelyettesti,amihrompontblll11.Haazeditorunknemteszimegautomatikusan,akkormosttabullnunkkell(vagy4betkztkellrnunk)mielttberjukakvetkezsort,gyhogyazazelzsorhozkppestbeljebblegyen(vagyisbelegyenhzva).Kpernynknakvetkezknekkelllenni:10 Jelenesetbenaszekvenciakifejezsegymstkvetutastsoksorozattjelli.EbbenaknyvbeneztazelnevezstegyPythonfogalomszmratartjukfnn,amimagbafoglaljaakarakterkncokat, tupleket s listkat (lsdaksbbiekben).11 APythonwindowsoseditornakbizonyosverziibanamsodlagospromptnemjelenikmeg.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 30.>>> a = 150>>> if (a > 100):... print "a meghaladja a szzat"...Nyomjunkmgegyt.Aprogramvgrehajtdiksakvetkeztkapjuk:a meghaladja a szzatKezdjkjraagyakorlatot,demosta=20szalazelssorban:mostaPythonsemmitsemrki.Aztakifejezst,amitzrjelekkztettnk,mostantlfogvafelttelneknevezzk.Azifennekafelttelnekatesztelstteszilehetv.Haafeltteligaz,akkora:utnbeljebbigaztottutaststhajtjavgreaPython.Haafelttelhamis,semmisemtrtnik.Jegyezzkmeg,hogyazittalkalmazottzrjelekopcionlisakaPythonban.Ezeketazolvashatsgjavtsardekbenalkalmaztam.Msnyelvekbenktelezklehetnek.Kezdjkjra,rjunkmgktsortazelzekhez,gyahogyanaztalbbltjuk.gyeljnkr,hogyanegyediksor bal szlen kezddik (nincs behzs), mg az tdik megint be van hzva (a harmadik sorral azonosmrtkben):>>> a = 20>>> if (a > 100):... print "a meghaladja a szzat"... else:... print "a nem haladja meg a szzat"...Nyomjunkmgegyszert.Aprogrammgegyszervgrehajtdiksezalkalommalkirja:a nem haladja meg a szzatAzolvasmr bizonyra kitalltaaz else (klnben)utasts egyalternatv vgrehajtsprogramozstteszi 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: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,nempedigazegyszeres egyenlsgjellel12. (Az egyszeres egyenlsgjel egy rtkad opertor.) Ugyanezt a szimbolizmustfogjuktallniaC++bansaJavaban).3.4sszetettutastsokUtastsblokkokAz if utastssal hasznlt konstrukci az els sszetett utastsunk. Hamarosan msflkkel is fogunktallkozni.APythonbanmindensszetettutastsnakmindigugyanazaszerkezete:egyfejsor,amikettspontravgzdik,ezalattkvetkezikegyvagytbbutasts,amiafejsoralattbevanhzva.Plda:Fejsor:a blokk elsutastsa ... ...... ...a blokk utols utastsaHaafejsoralatttbbbehzottutastsvan,akkormindegyiknekpontosanugyanannyirakellbehzvalenni(pldul 4 karakterrel kell beljebb lenni). Ezek a behzott utastsok alkotjk azutastsblokkot. Azutastsblokk: egy logikai egyttest kpez utastsok sorozata, ami csak a fejsorban megadott felttelekteljeslseesetnhajtdikvgre.Azelzbekezdspldjbanazifutaststtartalmazsoralattiktbehzottsoregylogikaiblokkotalkot:ezaktsorcsakakkorhajtdikvgre,haazifelteszteltfeltteligaz,vagyishaa2velvalosztsmaradkanulla.12 Emlkeztet:a%opertoramoduloopertor:egyegszosztsmaradktszmolja.gypldul, a%2 a2velvalosztsmaradktadja.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.Azeztalnegykanriszvegkirshozazszksges,hogyatrzsnevvltozagerincesekrtket,sazosztlynevvltozamadarakrtkettartalmazza.A9.sormondattmindenesetbenkirja,mivelugyanannakazutastsblokknakarsze,mintaz1.sor.3.6APythonnhnyszintaktikaiszablyaAzelzekalapjnsszefoglalunknhnyszintaktikaiszablyt:3.6.1 AzutastsoksablokkokhatraitasortrsdefiniljaSzmosprogramozsinyelvbenmindensortspeciliskarakterrelkellbefejezni(gyakranpontosvesszvel).APythonbanasorvgejel13 jtszaeztaszerepet.(Aksbbiekbenmajdmegltjuk,hogyhogyanhghattezaszably,hogyegysszetettkifejezsttbbsorraterjessznkki.Egyutastssortkommenttelisbefejezhetnk.EgyPythonkommentmindiga#karakterrelkezddik.Amia#karaktersaLF(linefeed)karakterkzttvan,afordtfigyelmenkvlhagyja.Anyelvektbbsgbenazutastsblokkotspecilisjelekkelkellhatrolni(nhaabeginsendutastsokkal)AC++bansJavaban,pldul,azutastsblokkotkapcsoszrjelekkelkellhatrolni.Ezlehetvteszi,hogyaz utastsblokkokat egyms utn rjunk anlkl, hogy a behzsokkal s a sorugrsokkal foglalkoznnk.Azonbanezzavaros,nehezenolvashatprogramokrshozvezethet.Ezrtmindenprogramoznak,akiezeketanyelvekethasznljaazttancsolom,hogyalkalmazzkasorugrsokatsabehzsokat is ablokkokjvizulishatrolsra.13 Ezakaraktersemakpernyn,semanyomtatottlistkonnemjelenikmeg.Ennekellenrejelenvansbizonyosesetekben problmkat okoz, mert nincs azonos mdon kdolva a klnbz opercis rendszerekben. Errlksbbfogokbeszlni,amikoraszvegfileokrltanulunk(116.oldal)33. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenA Pythonban hasznlnunk kell a sorugrsokat s a behzsokat, viszont nem kell ms blokkhatrolszimblumokkal foglalkoznunk. Vgeredmnyben a Python olvashat kdok rsra s olyan j szoksokfelvtelreknyszertbennnket,amiketmegfogunkriznimsprogramozsinyelvekhasznlatasornis.3.6.2 sszetettutasts=Fej,kettspont,behzottutastsokblokkjaAkvetkezfejezettlkezdvesokszorleszalkalmunkazutastsblokkfogalmnakazelmlytsresgyakorlatokvgzsreebbenatrgykrben.Aszemkztismasszefoglaljaazelvet: Az utastsblokkok mindig egy jldefinilt utastst tartalmazfejsorhoz kapcsoldnak (if, elif, else, while, def, ...), ami kettspontravgzdik. A blokkokat behzs hatrolja: egyazon blokk minden sornakpontosanugyangykellbehzvalenni(vagyisugyanolyanszmbetkzzelkelljobbraeltolvalennik14).Abehzsraakrmennyiszkzt hasznlhatunk, a programok tbbsge a 4 tbbszrseitalkalmazza. Jegyezzkmeg,hogyalegklsblokknak(1.blokk)abalmargnkelllenni(semmibesincsbegyazva).3.6.3 Aspaceeketsakommenteketrendszerintfigyelmenkvlhagyjaaz interpreterA sor elejn lv a behzsra szolgl szkzktl eltekintve az utastsok s kifejezsek belsejbenelhelyezett szkzket majdnem mindig figyelmen kvl hagyjuk (kivve, ha ezek egy karakterlnc rsztkpezik).Ugyanezvonatkozikakommentekre:ezekmindiga#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.1IsmteltrtkadsMg nem jeleztem explicit mdon: annyiszor rendelhetnk j rtket egy vltozhoz, ahnyszor csakakarunk.Azismteltrtkadsavltozrgirtktegyjrtkkelhelyettesti.>>> magassag = 320>>> print magassag320>>> magassag = 375>>> print magassag375Ezjrafelhvjaafigyelmnketarraatnyre,hogyazegyenlsgjeletaPythonbanrtkadsrahasznljukshogysemmiesetresemkellaztsszekeverniamatematikbanhasznltegyenlsgjellel.Csbtamagassag=320utaststegyenlsgrevonatkozlltskntinterpretlni,deaznemaz! Elszris,azegyenlsgkommutativ, mgazrtkadsnemaz.gyamatematikbanaz a=7 s 7=arsaegyenrtk,mgazolyanprogramutasts,minta375=magassagilleglis. Msodszor, az egyenlsglland, mg az rtkadst helyettesteni lehet, amint azt lttuk. Ha amatematikbanegylevezetselejnaz a=b egyenlsgetlltjuk, akkoraz a azelkvetkezegszokfejtsalattllandmarad.Aprogramozsbanazelsrtkadsktvltozrtkeitegyenlvtehetisegykvetkezutastsazutnazegyikvagyamsikrtktmegvltoztathatja.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.Tegykfelpldul,hogymostmegszeretnnkvltoztatniazascvltozkrtkeit.(Pillanatnyilagartke3,scrtke5.Aztszeretnnk,hogyezfordtvalegyen.)Mittegynk?(4) Gyakorlat4.1. rjamegaszksgesazutastssorokat,amikakvnteredmnytadjk.Azgyakorlatsornazolvasbiztosantalltegymegoldsimdszert,satanravalsznlegmegfogjarkrni, hogy kommentlja azt az osztlyban. Mivel egy megszokott mveletrl van sz, ezrt a programozsinyelvek gyakran egy rvidtst knlnak a vgrehajtsra (pldul specilis utastsokat, mint a Basic nyelvSWAP utastsa). A Pythonban, a tbbszrs rtkads lehetv teszi ennek a csernek a rendkvl elegnsprogramozst:>>> a, b = b, a(Termszetesenugyanabbanazutastsbanmsvltozkrtktisfeltudnnkegyidejlegcserlni).35. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven4.2CiklikusismtldsekawhileutastsAzegyikdolog,amitaszmtgpekalegjobbancsinlnak,azazazonosfeladatokhibanlkliismtlse.Azismtld feladatok programozsra lteznek eljrsok. Az egyik legalapvetbbel fogjuk kezdeni: a whileutastssalltrehozottciklussal.rjukbeakvetkezutastst:>>> a = 0>>> while (a < 7): # (ne felejtsk el a kett spontot !) ...a = a + 1 # (ne felejtsk el a behzst !)...print aNyomjunkmgegyszert.Mitrtnik?Mielttelolvassaakvetkezoldalmagyarzatt,sznjonregykisidtsrjaleafzetbeeztazutastssorozatot.rjaleakapotteredmnytissprbljamegalehetlegrszletesebbenmegmagyarzni.MagyarzatokA while jelentse: amg. Ez az utasts jelzi a Pythonnak, hogy az utna kvetkez utastsblokkot mindaddigfolyamatosankellismtelnie,amgazavltoztartalma7nlkisebb.Mintazelzfejezetbentrgyaltifutasts,awhileutastsisegysszetettutaststkezdmeg.Akettspontasorvgnamegismtlendutastsblokkotvezetibe,aminekktelezenbeljebbigaztvakelllenni.Ahogyanazt az elz fejezetben megtanultuk, egyazon blokk valamennyi utastsnak azonos mrtkben kell behzvalenni(vagyisugyanannyiszkzzelkelljobbraeltolvalennik).Megkonstrultuk teht els programhurkunkat, ami bizonyos szm alkalommal megismtli a behzottutastsokblokkjt.Ezakvetkezkppenmkdik: AwhileutastsesetnaPythonazrjelbenlevfelttelkirtkelsvelkezdi.(Azrjelopcionlis.Csakamagyarzatvilgossttelerdekbenhasznlom) Haafelttelhamis,akkorakvetkezblokkotfigyelmenkvlhagyjasaprogramvgrehajtsbefejezdik15. Haafeltteligaz,akkoraPythonaciklustestetalkotteljesutastsblokkotvgrehajtja,vagyis: aza=a+1utastst,ami1gyelincrementljaazavltoztartalmt(ami azt jelenti, hogy az a vltozhoz hozzrendelnk egy j rtket, ami egyenl az a 1gyelmegnveltelzrtkvel). aprintutastst,amikiratjaazavltozaktulisrtkt amikorezaktutastsvgrehajtdott,akkortanivoltunkazelsiterrcinak,saprogramhurok,vagyisavgrehajtsvisszatrawhileutaststtartalmazsorra.Azotttallhatfeltteltjrakirtkelisgytovbb.Hapldnkban,aza>> n = 3>>> while n < 5:...print "hello !"37. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven4.3TblzatksztsKezdjkjraazelsgyakorlattal,deazalbbikismdostssal:>>> a = 0>>> while a < 12:... a = a +1... print a , a**2 , a**3 Az1tl12igterjedszmokngyzetnekskbneklistjtkellmegkapnunk.Jegyezzkmeg,hogyaprintutastslehetvteszi,hogyugyanabbaasorbatbbkifejezstrassunkki,egyiketamsikutn:elgvesszvelelvlasztaniket.APythonautomatikusanbeszregyszkztakirtelemekkz.4.4EgymatematikaisormegalkotsaAzalbbikisprogramaFibonaccisorelstzelemtratjaki.Egyolyanszmsorrlvansz,amelynekminden tagja egyenl az t megelz kt tag sszegvel. Elemezzk ezt a (tbbszrs rtkadst helyesenalkalmaz)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.Azolvasnagyongyakranfogaprogramjaibanolyanciklusokatrni,mintamilyeneketittelemznk.Fontosdologrl van sz, amit tkletesen kell tudni kezelni. Legyen benne biztos, a gyakorlatok segtsgvelfokozatosanelfogjutniodig.Amikoregyilyentermszetproblmtvizsglunk,termszetesenmegkellnznnkazutastssorokat,defkntaciklusbanrintettklnbzvltozkegymstkvetllapotaitkellelemeznnk.Ezkorntsemmindigegyszer. Hogy segtsek ezt vilgosabb tenni, vegyk a fradsgot s rajzoljunk egy, az albbihoz hasonl,llapottbltaFibonaccisorprogramunknak:Vltozk a b cKezdrtkek 1 1 1Aziterrcisornegymsutnfelvettrtkek1 2 22 3 33 5 45 8 5... ... ...Helyettestkifejezsekb a+b c+1Egyilyentblzatbankzzelvgezzkelaszmtgpmunkjt,sorrlsorramegadvaazokatazrtkeket,amiket az egyes vltozk az egymst kvet iterrcikban fl fognak venni. Azzal kezdjk, hogy a tblzattetejre felrjukaz rintett vltozk nevt. Akvetkez sorba ezen vltozk kezd rtkei kerlnek (azok azGrardSwinnen:TanuljunkmegprogramozniPythonnyelven 38.rtkek, amikkel a ciklus indulsa eltt rendelkeztek). Vgl legalulra azok a kifejezsek kerlnek, amiketmindenegyesciklusbanazegyesvltozkllapotnakmdostsrahasznltunk.Kitltjkazelsiterrciknakmegfelelnhnysort.Egysorrtkeinekameghatrozshozelgazelzsorrtkeit,sazegyesoszlopokaljntallhathelyettestkifejezstfelhasznlni.gyellenrizzk,hogyamitkapunkazakeresetteredmnye.Hanemezahelyzet,akkormshelyettestkifejezseketkellkiprblni.Gyakorlatok:4.2. rjonegyprogramot,amikiratjaa7esszorztblaels20tagjt.4.3. rjonegyprogramot,amieurbankifejezettpzsszegeketkanadaidollrbavlttsazeredmnyt egy tblzatba rja ki. A tblzatban a pzsszegek geometriai haladvnyszerintnvekedjenekgy,mintazalbbipldban:1euro=1.65dollar2euro=3.30dollar4euro=6.60dollar8euro=13.20dollarstb.(16384euronlkellmegllni)4.4. rjonegy programot, amikiregy12szmblllsorozatot, aminekmindentagja vagyegyenlazelztaggal,vagyannakhromszorosa.4.5Azelsscriptek,avagy:Hogyanrizzkmegprogramjainkat?EddigaPythontmindiginteraktvmdbanhasznltuk(vagyisazutastsokatmindenalkalommalkzvetlenlazinterpreterbertukbeanlkl,hogyazokatksbbegyfilebamentettkvolna).Ezlehetsgetadottarra,hogykzvetlen ksrletezssel nagyon gyorsan megtanuljuk a nyelv alapjait. Ez az eljrs egy nagyknyelmetlensggel jr: minden utastssorozat, amit bertunk helyrehozhatatlanul eltnik amikor lezrjuk azinterpretert.Mieltttovbbhaladnnkmegtanuljukprogramjainkmerevlemezenvagyfloppynlvfilebavalmentst,hogyegymstkvetfzisokbanttudjukketdolgozni,msgpekrettudjukketvinni,stb.Ehhezmostantlfogvavalamilyenszvegszerkesztvelfogjukazutastssorozatainkatszerkeszteni(pldulLinuxalattJoeval,Nedittel,Katetel,...MSDOSalattEdittel,...WindowsalattWordpaddel,vagymgjobbegyolyanfejlesztkrnyezetbeliszvegszerkeszt,mintazIDLEvagyaPythonWin).Tehtrunkegyscriptet,amitaztnelmenthetnk,mdosthatunk,msolhatunk,stb.,mintbrmilyenmsszveget,amitaszmtgppelkezelnk16.16 Szvegszerkeszttazzalafelttellelhasznlhatnnk,hogyamentsttisztaszvegknt(plaintext)vgeznnk(laptrdelsi tagek nlkl). Kvnatosabb azonban egy valdi inteligens ANSI szvegszerkesztt hasznlni,mintamilyenaneditvagyazIDLE.EzekaPythonszintaxisnakmegfelelensznezikaforrsszveget,amisegtiaszintaxishibkelkerlst.AzIDLEben:File Newwindow(vagyCTRLN)valmegnyitunkegyjablakot, amibeascriptnketfogjukrni.Avgrehajtshozascriptmentseutn:Edit Runscript(vagyCTRLF5). 39. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenAzalbbibraaNedithasznlattillusztrljaGnome(Linux)alatt:Utna,amikorszeretnnkaprogramunkattesztelni,elgleszelindtaniaPythoninterpretert,argumentumkntascriptettartalmazfilenevtmegadva.Pldul,haazEnScriptemnevfilebamentettnkelegyscriptet,akkorelgleszakvetkezparancsotberniegyterminlablakba,hogyascriptvgrehajtdjon:python EnScriptemHogymgjobbancsinljuk,adjunkafilenakolyannevet,ami.pykiterjesztsrevgzdik.Hatiszteletbentartjukeztakonvencit,akkor(Windows, KDE,Gnome, alatt)afilemanagerben(ExploreraWindows vagy Konqueror a KDE alatt) a filenvre vagy a megfelel ikonra kattintva elindthatjuk a scriptvgrehajtst.Ezekagrafikusfilemanagerektudjk,hogymindenalkalommal,amikorafelhasznlmegprblmegnyitniegy.pykiterjesztsfilet,elkellindtskaPythoninterpretert.(Eztermszetesenaztfelttelezi,hogyezek megfelelen voltak konfigurlva.) Ugyanez a konvenci ezen kvl lehetv teszi az intelligensszvegszerkesztknekaPythonscriptekautomatikusfelismerstsaszintaktikussznezsalkalmazst.EgyPythonscriptolyanutastsszekvencikatfogtartalmazni,mintamilyenekkeleddigksrleteztnkMivelezeketazutastssorokatarrasznjuk,hogymegrizzksksbbakrmagunk,akrmsokjraolvassk,ezrtmelegen ajnlott, hogy scriptjeinket a lehet legjobban szvegezzk meg, bsgesen kommentezzk. Aprogramozs f nehzsge a korrekt algoritmusok elksztse. Ahhoz, hogy az algoritmusokat j felttelekmellett tudjuk ellenrizni, javtani, mdostani, stb., lnyeges, hogy szerzjk a lehet legteljesebben slegvilgosabbanrjaleket.Ezeknekalersoknakalegjobbhelyemagaascript(gyazoknemveszhetnekel).Egy j programoz mindig gyel arra, hogy sok kommentet szrjon be a scriptjeibe. Ezzel az eljrssalnemcsakazesetlegesmsolvasknakknnytimegazalgoritmusaiolvasst,demagtisknyszertiarra,hogymgvilgosabbgondolatailegyenek.Egyscriptbeszintebrhovabrmilyenkommentetbeszrhatunk.Elgeljktenniegy#karaktert.AmikoraPython interpreter rtall erre a karakterre, ami utna kvetkezik azt figyelmen kivlhagyja az aktulis sorvgig.rtskmeg,hogyfontos,hogyaprogramozs menetesorn rjunkkommenteket.Nevrjukmegascriptbefejezst,hogymajdutnarjukhozzazokat.Azolvaslassankntrfogjnni,hogyaprogramozrendkvlsokidttltasajtkdjajraolvassval(azrt,hogymdostsa,hibtkeressenbenne,stb.)Eztazjraolvasstnagybanegyszerstiaszmosmagyarzatsmegjegyzs.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 40.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.Kiindulskoraza, b sc integer tpusak,mertkisegszrtkeket:3,2s1: rendelnkhozzjuk.A8.iterrcitlkezdveazonbana b s a automatikusanlongtpusakklesznek alaktva:a6oss7estagokszorzsnakeredmnyemrjvalafentebbemltett2millirdoshatrflttvan.A sor egyre nagyobb szmokkal folytatdik, de a szmols sebessge cskken. A long tpusknt troltszmokmretktlfggenvltozmennyisghelyetfoglalnakelaszmtgpmemrijban.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 44.5.1.2 AfloattpusAvalsszm,vagylebegpontosnumerikusadattpussal,amitangolulfloatingpointnumberneknevezneksamitemiattfloatnakfogunknevezniaPythonban,mrtallkoztunk.Ezatpusnagyonnagyvagynagyonkisszmokkal(pldultudomnyosadatokkal)trtnszmolsokatteszlehetvllandpontossggal.Ahhoz,hogyaPythonegynumerikusadatotfloattpusnaktekintsen,elegend,haaszmegytizedespontot,vagy10nekegyhatvnykitevjttartalmazza.Pldulakvetkezrtkeket:3.1410..0011e1003.14e10aPythonautomatikusanfloattpuskntrtelmezi.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.Jegyezzkmeg,hogyaz olyanstringeket,melyekbenaposztrofokvannak,idzjelekkelhatroljuk,mgazidzjelekettartalmazstringeketaposztrofokkalhatroljuk.Aztisjegyezzkmeg,hogyaprintutastsakirtelemekkzegybetkztszrbe.A\(backslash)nhnykiegsztfinomsgotteszlehetv: Lehetvteszi,hogyegyparancsot,aminemfrelegysorban,azttbbsorbarjunk(ezbrmilyentpusparancsrarvnyes). Egykarakterlncbelsejbenabackslashspeciliskarakterek(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. Mgegyszermegismtlem:akis/nagybetlnyegesavltoznevekben(Szigorantiszteletbenkelltartanunkakezdetikis/nagybetvlasztst).47. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenHromszorosidzjelek:Hogyegykarakterlncbaknnyebbenszrjunkbespecilisvagyegzotikuskaraktereketanlkl,hogyabackslashtalkalmaznnk,vagymagtabackslashttudjukbeszrni,akarakterlncot hromszorosaposztroffalvagyhromszorosidzjellelhatrolhatjuk:>>> 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 esett kpezik. Egysszetett adat egy olyan entits, ami egyszerbb entitsok egyttest egyetlen struktrban egyesti: egykarakterlnc esetben pldul ezek az egyszerbb entitsok nyilvn maguk a karakterek. A krlmnyektlfggenakarakterlncotholmintegyetlenobjektumot,holmintklnllkarakterekegyttestakarjukkezelni.Egyolyanprogramozsinyelvet,mintaPythonttehtelkellltniolyaneljrsokkal,amiklehetvteszikegykarakterlncegyeskaraktereihezvalhozzfrst.Ltnifogjuk,eznemolyanbonyolult:Egy karakterlncot a Python a szekvencik kategria egy objektumnak tekint. A szekvencik elemekrendezett egyttesei. Ez egyszeren azt jelenti, hogy egy string karakterei mindig egy bizonyos sorrendbenvannakelrendezve.Kvetkezskntastringmindenegyeskarakternekmeghatrozhataszekvenciabelihelyeegyindexsegtsgvel.Ahhoz, hogy egy adott karakterhez hozzfrjnk, a karakterlncot tartalmaz vltoz neve utn szgleteszrjelberjukakarakterstringbelipozcijnakmegfelelnumerikusindexet.Figyelem : amint azt egyebtt ellenrizhetjk, az informatikban az adatokat majdnem mindig nulltl kezdveszmozzuk(nempedigegytl).Ezahelyzetegystringkaraktereiesetben:Plda:>>> ch = "Stphanie">>> print ch[0], ch[3]S pGrardSwinnen:TanuljunkmegprogramozniPythonnyelven 48.5.2.3 ElemimveletekkarakterlncokonAPythonnakszmos, karakterlncokkezelsreszolglfggvnyevan(kis/nagybetstalakts,rvidebbkarakterlncokravaldarabols,szavakkeresse,stb.).Aksbbiekbenelfogunkmlyedniebbenatrgykrben(lsd129.oldalt).Pillanatnyilag megelgedhetnk azzal, hogy tudjuk, klnkln hozzfrhetnk egy karakterlnc mindenegyeselemhez,aminteztfentebbmagyarztam.Tudjunkrla,hogyakvetkezketismegtehetjk: tbbrvidkarakterlncblsszerakhatunkegyhosszabbat.Eztamveletetsszekapcsolsnak(concatenationak)nevezzksa+opertorthasznljukraPythonban.(Ezazopertorszmokraalkalmazvaazsszeadsmveletre,mgkarakterlncokraalkalmazvaazsszekapcsolsraszolgl). Plda:a='Akishalbl'b='nagyhallesz'c=a+bprintcAkishalblnagyhallesz meghatrozhatjukegykarakterlnchosszt(vagyisakarakterekszmt)alen()fggvnyhvsval:>>>printlen(c)29 Egyszmotreprezentlkarakterlncotszmmalakthatunk.Plda:>>>ch='8647'>>>printch+45==>***error***nemadhatunksszeegystringetsegyszmot>>>n=int(ch)>>>printn+658712#OK:2szmotsszeadhatunkEbbenapldbanazint()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.gypldul,gastonblg*a*s*t*o*nlesz.5.9. rjonegyprogramot,amiegyjvltozbafordtottsorrendbenmsoljategykarakterlnckaraktereit.gypldulzorglubblbulgrozlesz.5.10. 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.Azsszetettadatokat arrahasznljuk, hogy struktrltan csoportostunk rtkegytteseket. Lpsrllpsre fogjuk megtanulni mssszetettadattpusokhasznlatt:alistkt,atuplektsasztrakt(dictionnair)17.Ehromadattpuskzlmostcsakazelstfogjukelgrvidentrgyalni.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!).Ebbenatekintetbenalistafogalmameglehetsenklnbzikatmb(array)vagyazindexeltvltozfogalmtl,amivelmsprogramozsinyelvekbentallkozunk.Jegyezzk meg, hogy a listk is szekvencik, gy mint a karakterlncok, vagyis objektumok rendezettcsoportjai. A listt alkot klnbz elemek mindig ugyanabban a sorrendben vannak elrendezve,mindegyikkhz kln hozz tudunk frni, ha ismerjk a listabeli indexket. Ezeknek az indexeknek aszmozsanulltlindul,nempedigegytl,akarakterlncokhozhasonlan.Pldk:>>> nap = ['htf ', 'kedd', 'szerda', 1800, 20.357, 'cstrtk', 'pntek'] >>> print nap[2]szerda>>> print nap[4]20.357Astringektl(amikegynemmdosthatadattpustkpeznek/erreaksbbiekbentbbszrleszalkalmunkvisszatrni/)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:TanuljunkmegprogramozniPythonnyelvenAlistameghatrozottelemtakvetkezmdonhelyettesthetjkmselemmel:>>> nap[3] = 'Jlius'>>> print nap['htf ', 'kedd', 'szerda', 'Jlius', 20.357, 'cstrtk', 'pntek'] Alen() belsfggvny,amivelmrastringeknltallkoztunk,alistkraisalkalmazhat.Alistbanlevelemekszmtadjavissza:>>> len(nap)7 Egymsikbelsfggvnyadel()18segtsgvel(azindexealapjn)brmelyikelemettrlhetjkalistbl:>>> del(nap[4])>>> printnap['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek'] Ugyangylehetsgvanarra,hogyhozzfzznkegyelemetegylisthoz,deahhoz,hogyeztmegtegykmegkellgondolni,hogyalistaegyobjektum,aminekazegyikmetdustfogjukhasznlni.Azobjektumsmetdusfogalmakataksbbiekbenfogommegmagyarzni,demostmegtudommutatni,hogyezhogyanmkdikegylistaspecilisesetben:>>> nap.append('szombat')>>> print nap['htf ', 'kedd', 'szerda', 'Jlius', 'cstrtk', 'pntek', 'szombat'] >>>Afentipldaelssorbanazappend()metdustalkalmaztuka'szombat'argumentummalanapobjektumra. Haemlkeztetekarra,hogyazappendszhozzfzstjelent,akkorrthet,hogyazappend()metdusegyolyanfggvnyfajta,amivalamilyenmdonalistatpusobjektumokhozvankapcsolva,vagyazobjektumokbavanintegrlva.Afggvnnyelhasznlt argumentumtermszetesenazazelem,amitalistavghezakarunkfzni.Aksbbiekbenmegfogjukltni,hogyegszsorilyenmetdusvan(vagyisolyanfggvnyekamiklistatpusobjektumokbavannakintegrlva,vagyinkbbbecsomagolva).Jegyezzkmeg,hogyegymetdustgyalkalmazunkegyobjektumra,hogyegyponttalkapcsoljukketssze.(Ellllannakavltoznakaneve,amiegyobjektumrahivatkozik,utnaapont,majdametdusneve,ezutbbitmindigegyzrjelprkveti).18 Lteznekolyantechnikklistkfeldarabolsra,elemcsoportokbeszrsra,elemekeltvoltsra,stb.,amikegysajtosszintaxist hasznlnak, amelybencsakazindexekfordulnakel. Ezeketa(karakterlncokraisalkalmazhat)technikkat ltalnosan slicingnek (szeletelsnek) hvjuk. gy hasznljuk ket, hogy a szgletes zrjelbe tbbindexet runk. gya nap[1:3] a['kedd', 'szerda'] alcsoportot jelli. Ezeket aspecilis technikkat egy kicsit ksbbfogomlerni(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, 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) 19 A Pythonban a ''fggvny'' szt klnbsgttel nlkl hasznljuk egyszer a valdi fggvnyek, mskor azeljrsok(procedure)jellsreAksbbiekbenmegfogjukhatrozniaklnbsgetaktkzelifogalomkztt.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 54.6.2FggvnymodulimportlsaMrtallkoztunkanyelvbebeptettfggvnyek fogalmval,mintamilyenpldulalen() fggvny,amiakarakterlnc hosszt adja meg. Magtl rtetd, hogy nem lehet azsszes elkpzelhet fggvnyt a Pythonstandardbabelevenni,mivelezekblvgtelensokvan:egybknthamarosanmegfogjuktanulni,hogyanhozzukltre magunk j fggvnyeket. A nyelvbe beptett fggvnyek szma viszonylag csekly: ezek azok, amiknagyongyakranhasznlhatk.Atbbiekmoduloknaknevezettklnfileokbanvannakcsoportostva.Amodulokteht fileok, amik fggvnycsoportokat fognakegybe. A ksbbiekben majdmegltjuk, hogyknyelmesebb egy nagymret programot tbb kisebb mret rszre felbontani, hogy egyszerstsk akarbantartst.EgyjellegzetesPythonalkalmazstehtegyfprogramblsegyvagytbbmodulblll,melyekmindegyikekiegsztfggvnyekdefinciittartalmazza.NagyszmmodultadnakhivatalosanaPythonnal.Msmodulokatmsszolgltatknltallhatunk.Gyakranegymssal rokonsgban lv fggvnycsoportokat prblnak meg ugyanabba a modulba sszefogni, amitknyvtrnakneveznk.Amath modulpldulszmosolyanmatematikaifggvnydefincijttartalmazza,mintasinus,cosinus, tangens, ngyzetgyk, stb. Ezeknek a fggvnyeknek a hasznlathoz elg a scriptnk elejre beszrni akvetkezsort:from math import *EzasorjelziaPythonnak,hogyazaktulisprogrambabelekellvenniamathmodulmindenfggvnyt(eztjelzia*).Ezamodulegymatematikaifggvnyknyvtrattartalmaz.Ascriptbepldulazalbbiakatrjuk:gyok = sqrt(szam) ezagyoknevvltozhozrendeliaszamngyzetgykt,sinusx = sin(szog) ezasinusxnevvltozhozrendeliaszog(radinban!)sinust,stb.Plda:# Demo : a modul fggvnyeinek hasznlatafrom math import *szam = 121szog =Ascriptvgrehajtsakorakvetkezketrjaki:ngyzetgyk 121 = 11.0sinus 0.523598775598 radian = 0.555. GrardSwinnen:TanuljunkmegprogramozniPythonnyelvenEzarvidpldamrnagyonjlillusztrljaafggvnyekfontosjellemzit:+ afggvnyvalamilyennvsahozzkapcsoltzrjelekformjbanjelenikmegplda:sqrt()+ azrjelekbenegyvagytbbargumentumotadunktafggvnynekplda:sqrt(121)+ afggvnynekvanegyvisszatrsirtke(aztismondjuk,hogyvisszaadegyrtket) plda:11.0Mindezeketakvetkezoldalakonfogomkifejteni. Ezekamatematikaifggvnyekcsakazelspldkafggvnyekre. Egy pillantst vetve a Python knyvtrak dokumentcijba megllapthatjuk, hogy mostantlfogvamrszmosfggvnyllrendelkezsnkre,nagyszmfeladatbelertvenagyonsszetettmatamatikaialgoritmusokat megoldsra (a Pythont ltalnosan hasznljk az egyetemeken magas szint tudomnyosproblmk megoldsra). Nem fogom e fggvnyek rszletes listjt megadni. Egy ilyen lista knnyenhozzfrhetaPythonhelprendszerben:HTMLdokumentciPythondokumentciModulindexmathAkvetkezfejezetbenmegtanuljuk,hogyhogyanhozhatunkltremagunkfggvnyeket.(6) Gyakorlatok:(Megjegyzs:Mindegyikgyakorlatbanhasznljaadatbevitelrearaw_input()fggvnyt!)6.1. rjonegyprogramot,amim/secskm/hbaszmoljatafelhasznlltalmrfld/hbanmegadottsebessget..(1mrfld=1609mter)6.2. rjonegyprogramot,amikiszmoljaakerlettsaterlettannakahromszgnek,melynek3oldaltafelhasznladjameg.(Ismtls:egyhromszgterlettakvetkezformulasegtsgvelszmoljukki:S=. dda) db)dc)aholdakerletfelt,a,b,cazoldalakhossztjelli).6.3. rjonegyprogramot,amikiszmoljaegyadotthosszsgmatematikaiingaperidusidejtAperidusidszmolsraszolglformulaakvetkez: T=2n. lg,ahol:lazingahosszasgaszabadessgyorsulsaaksrlethelyn.6.4. rjonegyprogramot,amirtkeketteszegylistba.Ennekaprogramnakciklusbankellmkdnigy,hogymindaddigkriazrtkeket,amgafelhasznltlgynemdnt,hogybefejezsknt t.Aprogramalistakirsvalfejezdikbe.Mkdsiplda:rjonbeegyrtket:25rjonbeegyrtket:18rjonbeegyrtket:6284rjonbeegyrtket:[25,18,6284]GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 56.6.3Egykispihenaturtle(tekns)modullalLttuk, a Python egyik nagyszer tulajdonsga, hogy klnbzmodulok importlsval rendkvlegyszerenlehethozzadniszmosjfunkcionalitst.Ennekillusztrcijakntmostegykicsitmsobjektumokkalfogunkszrakozni,mintaszmok.Megfogunkvizsglni egy Python modult, ami tekns grafikk ltrehozst teszi lehetv, vagyis olyan geometriairajzokt,mintamilyeneketegykisvirtulisteknshagymagautn,aminekazelmozdulsaitamonitoronegyszerutastsokkalvezrelhetjk.Ateknsaktivlsagyerekjtk.Ahosszmagyarzathelyettinkbbprbljukkimris:>>> from turtle import *>>> forward(120)>>> left(90)>>> color('red')>>> forward(80)A gyakorlat nyilvn sokkalbeszdesebb,haciklusokathasznlunk:>>> reset()>>> a = 0>>> while a =80% A80%>N>=60% B60%>N>=50% C50%>N>=40% DN>> def tabla7():... n = 1... while n >> tabla7()kiratja: 7142128354249566370Eztafggvnytannyiszorhasznlhatjuk,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 7023 Egy fggvnynevet mindig zrjelnek kell kvetni, mg akkor is, ha a fggvny semmilyen paramtert semhasznl. Ez egy rsbeli konvencibl ered, ami kikti, hogy brmely szmtgp programozssal foglalkozszvegbenegyfggvnynevetmindigegyreszrjelprnakkellkvetni.Eztakonvencitkvetjkebbenaknyvben.GrardSwinnen:TanuljunkmegprogramozniPythonnyelven 64.Azelsfggvnytehthvhategymsodikat,amiegyharmadikathvhatsgytovbb.Talnmgnemltjaazolvasennekahasznt,dektrdekestulajdonsgotmrmegfigyelhet: Egyjfggvnyltrehozsalehetsgetadegyutastscsoportelnevezsre.gyegymsodlagos,sszetettalgoritmusegyetlenparancsmgrejtsvelamineknagyonexplicitnevetadhatunkegyszersthetjkaprogramgerinct. Egy j fggvny ltrehozsa az ismtld kdrszek kiszblse rvn a program egyszerststszolglhatja.Pldul,haugyanabbanaprogrambantbbszrkikellratnia7esszorztblt,akkornemkellmindenalkalommaljrarniazalgoritmust,amielvgzieztamunkt.Egy fggvny teht egy j testreszabott utasts, amit mi magunk szabadon adunk hozz a programozsinyelvnkhz.65. GrardSwinnen:TanuljunkmegprogramozniPythonnyelven7.1.2 ParamteresfggvnyAzutolspldinkbanegyfggvnytdefiniltunksalkalmaztunka7esszorztblatagjainakkiratsra.Tegykfel,hogyugyaneztszeretnnkmegtennia9esszorztblval.Termszetesenrhatunkegyjfggvnyterre,dehaksbba13asszorztblravanszksgnk,akkormegintjrakezdhetjk.Nemvolnardemesebbegyetlenolyanfggvnytdefinilni,amikrsreakrmelyikszorztbltkitudnratni?Amikorhvjukafggvnyt,termszetesenmegkelltudnunknekiadni,hogymelyikszorztbltkvnjukkiratni.Aztazinformcit,amitafggvnynekahvsakoradunkt:argumentumnaknevezzk.Mrtbbszrtallkoztunkolyanbeptettfggvnyekkel,amikargumentumothasznlnak.Asin(a)fggvnypldulazaszgsinustszmolja.Asin(a)fggvnytehtazanumerikusrtkethasznljaargumentumknt.Egy ilyen fggvny defincijban elre gondoskodnunk kell egy specilis vltozrl, ami az tadottargumentumot fogadja. Ezt a specilis vltozt paramternek nevezzk. Ennek a vltoznak a szoksosszintaktikai szablyoknak megfelelen vlasztunk nevet (nem tartalmazhat kezetes karaktereket, stb.) s afggvnydefincitkvetzrjelberjuk.Aminketrdeklesetbenakvetkeztkapjuk:>>> def tabla(alap):...n = 1...while n >> tabla(13)13 26 39 52 65 78 91 104 117 130>>> tabla(9)9 18 27 36 45 54 63 72 81 90Ezekbena pldkban afggvny hvsakor zrjelben megadott rtk (az argumentum) automatikus