Professional Documents
Culture Documents
Bevezets a Python 3-ba Az informatika : A formlis logika s a hegesztplca tallkozsa. Maurice Nivat Ksznetnyilvnts Grard Swinnen btortsa nlkl soha sem mertem volna belekezdeni a Python tantsnak kalandjba. Ksznet rte. A jegyzetnek nagy hasznra vltak Laurent Pointal (LIMSI) knyrtelen kritiki, Michelle Kessous, Michelle Cordeau s Georges Vincents (IUT dOrsay, Fizikai Mrsek Tanszk) gyelmes tolvassa. Ksznm Tarek Ziadnak, hogy lehetv tette publikcii felhasznlst. Ksznm a Dunod kiadnak, hogy megengedte a 118 oldalakon lv pldk publiklst.
c Robert Cordeau
Elsz
A Python 3 verzijval megsznik a 2.x verzikkal val kompatibilits annak rdekben, hogy kikszbljk a nyelv eredeti gyengit. A projekt vezrfonala "az elavult metdusok megszntetsvel cskkenteni a redundancikat a Python mkdsben". Kiknek kszlt ez a jegyzet ? Ez a jegyzet az IUT dOrsay (Institut Universitaire de Technologie) Fizikai Mrsek szakn tanul hallgatknak tartott Python-elads anyagt kveti. Br napjainkban a harmadik fl ltal knlt knyvtrak repertorja nem olyan gazdag (tbbek kztt a numpy knyvtr nem ll rendelkezsre), hasznosnak tnik egy ltalnos kurzust szentelni a Python 3-as verzijnak. Licensz A jegyzet publiklsa a Paternit 2.0 France (Creative Commons 2.0) szerint trtnik, ami online elrhet a http://creativecommons.org/licenses/by/2.0/ fr/ cmen vagy postai ton a Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA cmen.
ii
Tartalomjegyzk
Tartalomjegyzk 1. Bevezets az informatikba 1.1. A Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Anyagi krnyezet s program . . . . . . . . . . . . . . . . . . . . . . . 1.2.1. A szmtgp . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2. Ktfajta program . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. A nyelvek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1. Klnbz szint programnyelvek . . . . . . . . . . . . . . . . 1.3.2. A programnyelvek rvid trtnete . . . . . . . . . . . . . . . . 1.4. Programok ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1. Kt technika . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2. A Python-programok ellltsnak technikja . . . . . . . . . 1.4.3. Programok ltrehozsa . . . . . . . . . . . . . . . . . . . . . . 1.5. Algoritmus s program . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1. Dencik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.2. Programok megjelentse . . . . . . . . . . . . . . . . . . . . . 1.6. Python-implementcik . . . . . . . . . . . . . . . . . . . . . . . . . . 2. A Python-szmolgp 2.1. Programvgrehajtsi mdok . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Egy Python-kd kt vgrehajtsi mdja . . . . . . . . . . . . iii 1 1 3 3 3 4 4 4 4 4 6 6 7 7 7 7 9 9 9
2.2.2. Nvadsi stlusok . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.3. A Python 3 foglalt szavai . . . . . . . . . . . . . . . . . . . . . 11 2.3. A kifejezs fogalma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4. Egsz adattpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.1. Az int tpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.2. A bool tpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.5. Lebegpontos tpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5.1. A float tpus . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5.2. A complex tpus . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.6. Vltozk s rtkads . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.6.1. A vltozk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.6.2. Az rtkads . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.6.3. Az rtkads nem sszehasonlts ! . . . . . . . . . . . . . . . 16 2.6.4. Az rtkads vltozatai . . . . . . . . . . . . . . . . . . . . . . 17 2.6.5. rtkadsok (grakus magyarzatok) . . . . . . . . . . . . . . 18 2.7. Karakterlncok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.7.1. Karakterlncok : bemutats . . . . . . . . . . . . . . . . . . . 18 2.7.2. Karakterlncok : mveletek . . . . . . . . . . . . . . . . . . . 18 2.7.3. Karakterlncok : fggvnyek kontra metdusok . . . . . . . . 19 2.7.4. Egy ch karakterlnc llapott vizsgl metdusok . . . . . . . 19 2.7.5. j karakterlncot ad metdusok . . . . . . . . . . . . . . . . 20 2.7.6. Karakterlncok : egyszer indexels . . . . . . . . . . . . . . . 22 2.7.7. Rszkarakterlncok kivgsa . . . . . . . . . . . . . . . . . . . 22 2.8. Binris adatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.9. Bemenetek, kimenetek . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.9.1. Bemenetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.9.2. Kimenetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.9.3. Escape-szekvencik . . . . . . . . . . . . . . . . . . . . . . . . 26 iv c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba 3. Az utastsfolyam vezrlse 3.1. sszetett utastsok 3.2. Vlaszts 27
. . . . . . . . . . . . . . . . . . . . . . . . . . . 27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1. Vlaszts : if - [elif] - [else] . . . . . . . . . . . . . . . 29 3.2.2. Egy alternatva tmr szintaxisa . . . . . . . . . . . . . . . . . 29 3.3. Ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3.1. Programhurok : while . . . . . . . . . . . . . . . . . . . . . . 30 3.3.2. Bejrs : for . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4. Utastsszekvencik megszakadsa . . . . . . . . . . . . . . . . . . . . 31 3.4.1. Egy ciklus megszaktsa : break . . . . . . . . . . . . . . . . . 31 3.4.2. Ciklus rvidrezrsa : continue . . . . . . . . . . . . . . . . . 31 3.4.3. Ciklusok teljes szintaxisa . . . . . . . . . . . . . . . . . . . . . 31 3.4.4. Kivtelek (exceptions) . . . . . . . . . . . . . . . . . . . . . . 32 4. Standard kontnerek 35
4.1. Szekvencik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.1.1. Mi a szekvencia ? . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2. Listk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.1. Denci, szintaxis s pldk . . . . . . . . . . . . . . . . . . . 36 4.2.2. Inicializls s tesztek . . . . . . . . . . . . . . . . . . . . . . 36 4.2.3. Metdosok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2.4. Listarszek manipullsa . . . . . . . . . . . . . . . . . . . . . 37 4.3. Szktett listk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.3.1. Denci, szintaxis s pldk . . . . . . . . . . . . . . . . . . . 38 4.4. Tuple-k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.5. Visszatrs a hivatkozsokhoz . . . . . . . . . . . . . . . . . . . . . . 40 4.6. Asszociatv tmbk . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.6.1. Az asszociatv tmb tpus . . . . . . . . . . . . . . . . . . . . 42 4.6.2. A sztrak (dict) . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.7. Halmazok (set) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 c Robert Cordeau v
Bevezets a Python 3-ba 4.8. Szvegle-ok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.8.1. A le-ok : bevezets . . . . . . . . . . . . . . . . . . . . . . . 44 4.8.2. A le-ok kezelse . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.9. Iterrls a kontnereken . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.10. Formzott kirats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5. Fggvnyek s nvterek 50
5.1. Denci s szintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.2. Argumentumok tadsa . . . . . . . . . . . . . . . . . . . . . . . . . 52 5.2.1. ltalnos mechanizmus . . . . . . . . . . . . . . . . . . . . . . 52 5.2.2. Egy vagy tbb paramter, visszatrsi rtk nincs . . . . . . . 53 5.2.3. Egy vagy tbb paramter, visszatrsi rtk hasznlata . . . . 53 5.2.4. Fggvny tadsa paramterben . . . . . . . . . . . . . . . . . 54 5.2.5. Paramterek alaprtelmezett rtkkel . . . . . . . . . . . . . . 54 5.2.6. Tetszleges szm argumentum : egy tuple tadsa . . . . . . 55 5.2.7. Tetszleges szm argumentum : egy sztr tadsa . . . . . . 56 5.3. Nvterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.1. Objektumok rvnyesgi kre . . . . . . . . . . . . . . . . . . 56 5.3.2. Nevek feloldsa : az LGI szably . . . . . . . . . . . . . . . . 56 6. Modulok s csomagok 59
6.1. Modulok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1.1. Modul importlsa . . . . . . . . . . . . . . . . . . . . . . . . 60 6.1.2. Pldk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.2. Standard knyvtr . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.2.1. A standard knyvtr . . . . . . . . . . . . . . . . . . . . . . . 62 6.3. Harmadik fl knyvtrai . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.3.1. Nagy heterogenits . . . . . . . . . . . . . . . . . . . . . . . . 66 6.3.2. Egy plda : az unum knyvtr . . . . . . . . . . . . . . . . . . 66 6.4. Csomagok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 vi c Hungarian Translation Darczy Pter
7.1. A procedurlis megkzelts elgtelensge . . . . . . . . . . . . . . . . 68 7.2. Terminolgia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 7.3. Osztlyok s objektumok ltrehozsa . . . . . . . . . . . . . . . . . . 71 7.3.1. A class utasts . . . . . . . . . . . . . . . . . . . . . . . . . . 71 7.3.2. Objektumok ltrehozsa s attributumai . . . . . . . . . . . . 71 7.3.3. Visszatrs a nvterekre . . . . . . . . . . . . . . . . . . . . . 71 7.4. Metdusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 7.5. Specilis metdusok . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.5.1. A specilis metdusok . . . . . . . . . . . . . . . . . . . . . . 73 7.5.2. Az inicializtor . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.5.3. Opertor jradenils (Opertoroverloading) . . . . . . . . . 74 7.5.4. Plda az opertor jradenilsra (opertoroverloadingra) . . 75 7.6. rkls s polimorzmus . . . . . . . . . . . . . . . . . . . . . . . . . 75 7.6.1. rkls s polimorzmus . . . . . . . . . . . . . . . . . . . . . 75 7.6.2. Plda az rklsre s a polimorzmusra . . . . . . . . . . . . . 76 7.7. Visszatrs a kiindulsi pldra . . . . . . . . . . . . . . . . . . . . . 76 7.7.1. A circle osztly : tervezs . . . . . . . . . . . . . . . . . . . . 76 7.7.2. A circle osztly . . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.8. Az objektum orientlt tervezs fogalma . . . . . . . . . . . . . . . . . 79 7.8.1. Kompozci . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 7.8.2. Leszrmaztats . . . . . . . . . . . . . . . . . . . . . . . . . . 80 8. Halad technikk 81
8.1. Procedurlis technikk . . . . . . . . . . . . . . . . . . . . . . . . . . 81 8.1.1. A dokumentls javtsa . . . . . . . . . . . . . . . . . . . . . 81 8.1.2. Menk ksztse sztrral . . . . . . . . . . . . . . . . . . . . 82
8.1.3. Rekurzv fggvnyek . . . . . . . . . . . . . . . . . . . . . . . 84 8.1.4. A genertorok s a genertor-kifejezsek . . . . . . . . . . . . 85 8.1.5. Egymsba gyazott fggvnyek (closure) . . . . . . . . . . . . 86 c Robert Cordeau vii
Bevezets a Python 3-ba 8.1.6. A dekortorok . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 8.2. Technikai objektumok . . . . . . . . . . . . . . . . . . . . . . . . . . 89 8.2.1. __slots__ s __dict__ . . . . . . . . . . . . . . . . . . . . . 89 8.2.2. A functor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 8.2.3. Az accessor-ok . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 8.3. Fggvnytechnikk . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 8.3.1. A lambda direktva . . . . . . . . . . . . . . . . . . . . . . . . 93 8.3.2. A map, lter s reduce fggvnyek . . . . . . . . . . . . . . . 94 8.3.3. Parcilis fggvny-alkalmazsok . . . . . . . . . . . . . . . . . 96 9. Grakus OO programozs 97
9.1. Esemnyvezrelt programok . . . . . . . . . . . . . . . . . . . . . . . 97 9.2. A tkinter knyvtr . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 9.2.1. Bemutats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 9.2.2. A tkinter widget-ek . . . . . . . . . . . . . . . . . . . . . . . . 99 9.2.3. Widget-ek pozcionlsa . . . . . . . . . . . . . . . . . . . . . 99 9.3. Kt plda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 9.3.1. tkPhone, egy men nlkli plda . . . . . . . . . . . . . . . . 100 9.3.2. IDLE, egy plda menvel . . . . . . . . . . . . . . . . . . . . . 106 10.Az agile development fogalma 107
10.1. A tesztek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 10.1.1. Unit tesztek s funkcionlis tesztek . . . . . . . . . . . . . . . 109 10.1.2. A tesztvezrelt fejleszts . . . . . . . . . . . . . . . . . . . . . 110 10.2. A dokumentls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 10.2.1. A reST formtum . . . . . . . . . . . . . . . . . . . . . . . . . 114 10.2.2. A doctest modul . . . . . . . . . . . . . . . . . . . . . . . . . 116 10.2.3. A dokumentls vezrelt fejleszts . . . . . . . . . . . . . . . . 122 Fggelk viii 124 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba A. Karakterkszlet s kdols B. A logikai fggvnyek C. Aritmetikai alapok D. A hash-fggvnyek E. Forrsok 124 130 132 133 135
c Robert Cordeau
ix
1.1.
A Python
Trtnet 1991 : Guido van Rossum a CWI-ben (Hollandia) az ABC programozsi nyelvbl s az AMOEBA (elosztott opercis rendszer) projektbl kiindulva publiklja a Pythont 1996 : A Numerikus Python megjelense 2001 : A PSF (Python Software Fundation) megszletik Egymst kvetik a verzik... A modulok szles vlasztka ll rendelkezsre, vente kollokviumokat rendeznek, a Pythont szmos egyetemen oktatjk s vllalkozsok alkalmazzk ... 2008 vge : A Python 2.6 s a Python 3.0 prhuzamos megjelense 2011 : v2.7 s v3.2 Nylt forrs (Open Source) nyelv Open Source CNRI licensz, ami GPL kompatibilis, de a copyleft korltozs nlkl. A Python mg kereskedelmi felhaszlsok esetn is szabad s ingyenes Guido van Rossum Benevolent Dictator for Life (BDFL), ami azt jelenti, hogy az open source fejlesztk kzssgnek olyan respektlt tagja, aki meghatrozza a projekt fejlesztsnek ltalnos irnyt. Jelens a fejlesztk kzssge Szmos standard eszkz ll rendelkezsre : Batteries Included loza c Robert Cordeau 1
Bevezets a Python 3-ba Interaktiv Szmos interaktv interpreter ltezik Fontos dokumentcik online elrhetk Gyors s inkrementlis fejleszts A tesztels s a hibakeress egyszer Interaktv adatelemzs Gyors interpretlt nyelv Lefordtott byte-kd rtelmezse Szmos, C-ben, C++-ban illetve FORTRAN-ban rt optimalizlt knyvtrbl szrmaz modul van A nyelv egyszer Szintaxisa vilgos s koherens A forrskdban a behzsok meghatrozk Automatikus memriakezels (garbage collector) Dinamikus ers tpusads : nincs tpusdeklarls Objektum orientlt Hatkony objektummodell, de nem ktelez Nagyon egyszer az alkalmazsok tbb le-ba trtn struktrlsa : egyszerek a mdostsok s a kiterjesztsek Az osztlyok, a fggvnyek s a metdusok els osztlynak nevezett objektumok. Ezeket az objektumokat ugyangy kezelik, mint az sszes tbbi objektumot (hozzrendelhetjk, paramterknt tadhatjuk) Nyitott a vilgra C/C++/FORTRAN-hoz illeszthet Tbb fontos alkalmazs szkriptnyelve Kivlan portolhat Knyvtrak Tbb ezer knyvtr van minden alkalmazsi terleten
1.2.
1.2.1.
A szmtgp dencijt a kvetkez kppen egyszersthetjk : Denci Elektronikus alkotkbl ll determinisztikus automata A szmtgp egyebek mellett a kvetkez alkotelemeket tartalmazza : mikroproceesszort CU (Contol Unit)-tal s ALU (Arithmetic Logic Unit)-kal, rt, gyors cashmemrit; rhat-olvashat memrit (RAM), ami a program vgrehajtshoz szksges utastsokat s adatokat tartalmazza; A RAM 8 bites szavakba szervezett cellkbl ll; perifrikat : be-/s kimeneteket, lland memrikat (merevlemez, pendrive, CD-ROM ...), hlzat ...
1.2.2.
Ktfajta program
Kt programtpust klnbztetnk meg : Az opercis rendszer : azoknak a programoknak az egyttese, amik a hardwares a software-erforrsokat kezelik. Az opercis rendszer prbeszdes segtsget ajnl fel a felhasznl s a szmtgp kztt : szveges (parancsrtelmez) vagy grakus (ablakkezel) interface-t. Gyakran multitaskok, nha tbbfelhasznlsak. Az alkalmazi programokat specilis feladatoknak szentelik. Ezeket parancsok sorozata alkotja, amiket egy forrsprogram tartalmaz, amit gy alaktanak t, hogy a szmtgp vgre tudja hajtani. c Robert Cordeau 3
1.3.
1.3.1.
A nyelvek
Klnbz szint programnyelvek
Minden processzornak van egy sajt, kzvetlenl vgrehajthat nyelve : a gpi nyelv. Ez 0-kbl s 1-ekbl ll s nem portbilis, viszont ez az egyetlen nyelv, amit a szmtgp kpes megrteni az assembly nyelv a gpi nyelv alfanumerikus kdolsa. Olvashatbb, mint a gpi nyelv, de nem mindg portbilis. Egy assemblerrel fordtjk le gpi nyelvre a magas szint nyelvek. Gyakran normalizltak, lehetv teszik egyik gprl a msikra trtn portolst. Egy fordtval vagy egy rtelmezvel (interpreter) gpi nyelvre vannak lefordtva.
1.3.2.
50-es vek (ksrleti megkzelts) : FORTRAN, LISP, COBOL, ALGOL... 60-as vek (univerzlis nyelvek) : PL/1, Simula, Smalltalk, Basic... 70-es vek () : C, PASCAL, ADA, MODULA-2... 80-es vek (ojektum orientlt programozs) : C++, LabView, Eiel, Perl, VisualBasic... 90-es vek (interpretlt obektum orientlt nyelvek) : Java, tcl/Tk, Ruby, Python... 2000-es vek (kereskedelmi szoftverek) : C#, VB.NET... Programnyelvek szzait alkottk meg, de az ipar ezeknek csak tredkt hasznlja.
1.4.
1.4.1.
Programok ltrehozsa
Kt technika
A compills (fordts) a forrskd trgykdra trtn fordtst jelenti. legalbb ngy fzisbl ll (hrom analzis-fzis - lexiklis, szintaxis s szemantikai elemzs 4 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba egy trgykdgenerlsi fzis). A gpi kd ltrehozshoz mg egy fzisra van szksg : a linkek szerkesztsre. A linkek szerkesztse az az eljrs, aminek a sorn az trgykd llomnyaibl vgrehajthat fjlokat illetve dinamikus vagy statikus knyvtrakat lehet ltrehozni. A fordts knyszer, viszont az eredmnye nagy vgrehajtsi sebessg.
1.1. bra. A fordts menete A trgykra trtn fordts bizonyos szimblumok azonostst ksbbre hagyja. Mieltt vgrehajtatnnk ezeket a trgykdleokat, fel kell oldani ezeket a szimblumokat s egy knyvtrhoz kell ket kapcsolni. A link lehet : - statikus : a trgykdfjl s a knyvtr ugyanabba a vgrehajthat fjlba van linkelve. - dinamikus : a trgykdfjl linkelve van a knyvtrral, de nem ugyanabba a vgrehajthat fjlba; a linkek a vgrehajthat llomny elindtsakor jnnek ltre. Egyes modern nyelveknak (Java, .NET nyelvek) nincs szksgk erre a fordtsi fzisra s dinamikusan oldjk fel a cmeket (hosszabb szmtsi id rn). Az interpretls (rtelmezs) azt jelenti, hogy a forrskd minden egyes sora az elemzssel egyidejleg vgrehajthat utastsra lesz lefordtva. Semmilyen trgykd sem generldik. Ez a technika nagyon rugalmas, de a generlt kdok nem hatkonyak : a program minden egyes vgrehajtsakor hasznlni kell az interpretert ...
c Robert Cordeau
1.4.2.
Keverktechnika : a lefordtott bjtkd rtelmezse. J kompromisszum a fejleszts egyszersge s a vgrehajts gyorsasga kztt. a bjtkd (egy kzbens forma) minden olyan szmtgpre tvihet, amin van virtulis Python gp.
1.3. bra. A lefordtott bjtkd rtelmezse Egy program vgrehajtshoz a Python betlti a .py (vagy .pyw) forrskdot a RAM-ba, szintaktikai elemzst vgez, ellltja a bjtkdot, vgl vgrehajtja azt. A program ltal importlt minden modul esetben a Python elszr ellenrzi, hogy ltezik-e egy elzetesen lefordtott bjtkd (egy .pyo vagy .pyc fjlban), aminek a dtuma megfelel a .py fjlnak. Ha van ilyen, akkor a Python ezt hasznlja, ha nincs, akkor elvgzi a .py modul szintaktikai vizsglatt s azt a bjtkdot hasznlja, amit ltrehozott. A gyakorlatban nem szksges explicit mdon lefordtani egy modult, a Python transzparens mdon kezeli ezt a mechanizmust.
1.4.3.
Programok ltrehozsa
A szoftvermrnk a programkszts mdszereit tanulja. Tbb modell kpzelhet el. Egyebek mellett : a procedurlis mdszer. Fellrl lefel s alulrl felfel elemezzk a problmt (rszproblmkra bontjuk s maximlisan jra hasznostjuk a rszalgoritmusokat). Teht egy sszetett problmt egyszerbb rszproblmkra bontuk. Ez a modell elszr az akcikat struktrlja. az objektum-mdszer. Felismerjk azokat a konstrukcikat (osztlyokat) (class), amik a problma adatokat (attributumok) s akcikat (metdusok) tartalmaz alkotinak (objektumok) ltrehozsra szolglnak. Az osztlyok egy hierarchikus rendben alposztlyokbl szrmaznak ( rkls s polimorzmus). 6 c Hungarian Translation Darczy Pter
1.5.
1.5.1.
Algoritmus s program
Dencik
Denci Algoritmus : Vges szm utasts vges szm vgrehajtsbl ll lpsek sorozata, mely lehetv teszi egy problma megoldst. Egy algoritmus vges idtartam alatt befejezdik.
Denci Program : egy algoritmus fordtsa egy olyan nyelvre, amit egy szmtgp le tud fordtani vagy rtelmezni tud. Gyakran gy rjk meg, hogy tbb rszre bontjk. A rszek kzl az egyik - a f-program - vezrli a tbbit.
1.5.2.
Programok megjelentse
A forrsprogram emberek szmra kszl. Az olvasst megknnytend kommentekkel kell elltni. A nem trivilis rszek (s csak ezek) jelentst egy kommenttel kell megmagyarz-ni. A komment egy # karakterrel kezddik s a sor vgig tart : # # Ez egy komment # 9 + 2 # Ez egy msik
1.6.
Python-implementcik
CPython : Classic Python, C-ben van kdolva, klnbz rendszerekre van portolva Python3000 : Python 3, a CPython j implementcija Jython : JVM-re rt (JAVA bjtkdot hasznl) c Robert Cordeau 7
Bevezets a Python 3-ba IronPython : Python.NET, C#-ban van rva, a MSIL-t (MicroSoft Intermediate Language) hasznlja Stackless Python : kikszbli a C nyelv stack-t (lehetv teszi a rekurzlst gy, ahogyan akarjuk) Pypy : eurpai kutatsi projekt Pythonban rt Python interpreterre
2. fejezet A Python-szmolgp
Mint minden nyelv, a Python is lehetv teszi az adatok manipullst a foglalt szavainak s az adattpusoknak ksznheten. Ez a fejezet bemutatja az azonostk kpzsnek szablyait, az egyszer adattpusokat ( a kontnereket a 4. fejezetben fogjuk trgyalni) valamint a(z unicode s binris) karakterlncokat. Utoljra, de nem utols sorban ez a fejezet kitr a vltozk, objektumhivatkozsok s rtkads nem trivilis fogalmaira.
2.1.
2.1.1.
Programvgrehajtsi mdok
Egy Python-kd kt vgrehajtsi mdja
Vagy egy fjlba rgztnk egy editor segtsgvel Python-utastsokat (ekkor egy Python-szkript -rl beszlnk), amit egy paranccsal vagy egy editor menpontjaknt hajtatunk vgre;
vagy egy interpretert (pldul IDLE) hasznlunk arra, hogy azzonnal eredmnyt kapjunk. Az IDLE-be egy Python-interpreter van beptve, ami vgrehajtja a kirtkels ciklust (REPL, = read, eval, print, loop).
c Robert Cordeau
2.2.
2.2.1.
Azonostk s kulcsszavak
Azonostk
A tbbi programozsi nyelvhez hasonlan a Python is azonostkat hasznl az objektumai megnevezshez. Denci Egy Python-azonost egy nem res, tetszleges hosszsg karaktersorozat, ami egy kezd karakterbl s nulla vagy tbb folytat karakterbl ll. Tudni kell, hogy kezd karakter lehet brmelyik Unicode (Lsd A fggelket) bet s az alhzs karakter (_); folytat karakter lehet egy kezd karakter, egy szm vagy egy pont. Figyelem Az azonostk rzkenyek a kis- s nagybetkre s nem lehetnek kulcsszavak.
2.2.2.
Nvadsi stlusok
Fontos, hogy koherens nvadsi konvencikat alkalmazzunk az azonostk elnevezsekor. Ebben a dokumentumban a kvetkez stlust hasznljuk : UPPERCASE vagy UPPER_CASE a konstansok; 10 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba TitleCase az osztlyok; UneExceptionError a kivtelek; camelCase fggvnyek, metdusok s grakus interface-ek; unmodule_m modulok; lowercase vagy lower_case minden ms azonost esetben. Kerljk a kvetkezkarakterek hasznlatt : l, O s I(kis l, nagy o s i). Vgl, a kvetkez jellsek foglaltak : _xxx # bels hasznlatra __xxx # egy osztly attributuma __xxx__ # specilis foglalt nv
Pldk : NB_ITEMS = 12 # UPPER_CASE class MyClass: pass # TitleCase def maFunction(): pass # camelCase my_id = 5 # lower_case
2.2.3.
A Python 3.1.2-ben 33 foglalt sz van : and del as elif assert else break except class False continue finally def for from None True global nonlocal try if not while import or with in pass yield is raise lambda return
2.3.
A kifejezs fogalma
Denci A kifejezs egy kdrsz, amit a Python-interpreter kitud rtkelni, hogy c Robert Cordeau 11
Bevezets a Python 3-ba egy rtket kapjon. A kifejezsek lehetnek egyszerek ill. sszetettek. Konstansok, azonostk s opertorok kombincijbl llnak.
Kt plda egyszer s egy plda sszetett kifejezsre : id1 = 15.3 i d 2 = maFonction ( i d 1 ) i f id2 > 0: i d 3 = math . s q r t ( i d 2 ) else : id4 = id1 5.5 id2
2.4.
Egsz adattpusok
2.4.1.
Az int tpus
>>> 2009 # d e c i m a l i s 2009 >>> 0 b11111011001 # b i n a r i s 2009 >>> 0 o3731 # o k t a l i s 2009 >>> 0 x7d9 # h e x a d e c i m a l i s 2009 Aritmetikai mveletek 20 20 20 20 20 20 + 3 # 23 3 # 17 3 # 60 3 # 8000 / 3 # 6.666666666666667 // 3 # 6 ( e g e s z o s z t a s ) 12 c Hungarian Translation Darczy Pter
Jl jegyezzk meg a kt osztsopertor szerept : / : lebegpontos osztst eredmnyez // : egszosztst eredmnyez. Hasznlatos szmrendszerek Egy 10 alap szmrendszerben rt egsz (pldul a 179) a kvetkez szintaxis hasznlatval rhat fel binris, oktlis s hexadecimlis alakban :
2.4.2.
A bool tpus
Logikai opertorok (shortcut-elv) : not, or s and. Az and s az or igazsgtbljt meggyelve azt vesszk szre, hogy : ha az kifejezs els tagjnak az rtke False, akkor a False and kifejezs2 rtke False lesz. Teht nem kell a kifejezst kiszmolni. radsul ha az kifejezs els tagjnak az rtke True, akkor a True or kifejezs2 rtke True lesz.
Ezt az optimalizlst hvjk shortcut-elvnek : ( 3 == 3 ) o r ( 9 > 2 4) # True ( az e l s o t a g t o l kezdve ) ( 9 > 24 ) and ( 3 == 3 ) # F a l s e ( az e l s o t a g t o l kezdve ) 13
c Robert Cordeau
Bevezets a Python 3-ba A logikai s az sszehasonlt mveleteket azrt rtkajk ki, hogy False ill. True boolean eredmnyeket adjanak. Boolean kifejezsek A boolean kifejezseknek kt lehetsges rtke van : False vagy True A Python akkor rendeli a False rtket egy boolean kifejezshez, ha az : a False konstans; a None konstans; egy res szekvencia ill. halmaz; egy 0 rtk numerikus adat. Minden ms rtke True
2.5.
2.5.1.
Lebegpontos tpusok
A float tpus
Egy float tpus adatot a tizedespont vagy az exponencilis jells jelez : 2.718 .02 3 e8 6 . 0 2 3 e23
A float tpus adatokon ugyanazok a mveletek vgezhetk el, mint az int tpusakon; A float tpus adatok vges pontossgak, ami az sys.float_info.epsilon -ban van megadva; A math modul importlsa lehetv teszi a szoksos matematikai mveleteket:
import math p r i n t ( math . s i n ( math . p i / 4 ) ) # 0 . 7 0 7 1 0 6 7 8 1 1 8 6 5 4 7 5 p r i n t ( math . d e g r e e s ( math . p i ) ) # 1 8 0 . 0 14 c Hungarian Translation Darczy Pter
2.5.2.
A complex tpus
A komplex szmok descartesi jellssel vannak felrva, amit kt lebegpontos szm alkot; Az imaginrius rszt j kveti :
import cmath p r i n t ( cmath . phase (1 + 0 j ) ) # 3.14159265359 p r i n t ( cmath . p o l a r ( 3 + 4 j ) ) # ( 5 . 0 , 0.9272952180016122) p r i n t ( cmath . r e c t ( 1 . , cmath . p i / 4 ) ) # (0.707106781187+0.707106781187 j )
2.6.
2.6.1.
Vltozk s rtkads
A vltozk
Attl kezdve, hogy vannak adattpusaink, vltozkra van szksgnk az adatok trolsra. A valsgban a Python nem a vltoz fogalmt, hanem inkbb az objektumhivatkozs fogalmt knlja fel. Amg az objektum nem mdosthat (mint az egszek, oat-ok, stb.), addig nincs emltst rdeml klnbsg. Meg fogjuk ltni hogy a helyzet megvltozik a mdosthat objektumok esetben ... c Robert Cordeau 15
Bevezets a Python 3-ba Denci A vltoz egy rtkhez kapcsolt azonost. Egy objektum hivatkozs, ami egy memriacmen van.
2.6.2.
Az rtkads
Denci A = jellel (aminek semmi kze sincs a matematikban hasznlt egyenlsgjelhez !) rendelnk hozz egy rtket egy vltozhoz. Egy rtkads sorn a baloldali tag megkapja a jobboldali tagot, ami szksgess teszi a jobboldali tagnak megfelel rtk kiszmtst mieltt azt a baloldali taghoz rendelnnk.
Egy vltoz rtke, amint azt a neve is jelzi, az idk folyamn megvltozhat (az elz rtk elvsz) :
a = a + 1 # 3 ( inkrementalas ) a = a 1 # 2 ( dekrementalas )
2.6.3.
Az rtkadsnak hatsa van (a vgrehajtsa sorn mdostja a program bels llapott), de nincs rtke (nem tudjuk egy kifejezsben hasznlni) : >>> a = 2 >>> x = ( a = 3 ) + 2 SyntaxError : i n v a l i d syntax
Az sszehasonltsnak rtke van, ami felhasznlhat egy kifejezsben, de nincs hatsa (a program fejldst reprezentl bels automatizmust nem mdostja) : >>> x = ( a == 3 ) + 2 >>> x 2
16
2.6.4.
Az rtkads vltozatai
# egyszeru ertekadas v = 4 # inkrementalis ertekadas v += 2 # azonos : v = v + 2 v e l # ha vr e mar e l o z o l e g h i v a t k o z t u n k # ertekadas jobbrol balra c = d = 8 # tobbszoros celvaltozo # parhuzamos e r t e k a d a s egy s z e k v e n c i a n a k e , f = 2.7 , 5.1 # tuple g , h , i = [ G , H , I ] # l i s t a c Robert Cordeau 17
2.6.5.
A 2.2 brn a krk a vltozkat, a ngyszgek az adatokat jelltk. Az rtkadsok kapcsoljk az azonostkat az adatokhoz : ha egy adat a memriban nincs tbb hozzkapcsolva egy azonosthoz, akkor a Python-szemtgyjt (garbage collector) automatikusan trli.
2.7.
2.7.1.
Karakterlncok
Karakterlncok : bemutats
Denci Az str nem mdosthat adattpus egy Unicode karakterszekvencit reprezentl. A nem mdosthatsg azt jelenti, hogy ha egy adatot ltrehoztunk a memriban, akkor azt a ksbbiekben nem lehet megvltoztatni. Hrom karakterlncszintaxis ltezik. Jegyezzk meg, hogy a -t hasznlhatjuk a " helyett, ami lehetv teszi az egyik jells hasznlatt a msikon bell : s y n t a x e 1 = " E l s o forma n e w l i n e k a r a k t e r r e l \n " s y n t a x e 2 = r " Masodik forma n e w l i n e k a r a k t e r n e l k u l \n " syntaxe3 = " " " Harmadik , t o b b s o r o s forma """ i d e z o j e l e k = " L eau v i v e " a p o s z t r o f o k = Forme " avec des a p o s t r o p h e s "
2.7.2.
Karakterlncok : mveletek
2.7.3.
Egy karakterlncon (s ltalnosabban egy szekvencin) fggvnyek (procedurlis felfogs) vagy metdusok (objektum felfogs) segtsgvel hajt-hatunk vgre mveleteket. Ahhoz, hogy egy fggvnyt hasznljunk, a () opertort alkalmazzuk :
Metdust egy objektumra alkalmazunk a pont-jells hasznlatval. A pontot azutn az adat/vltoz utn tesszk, amire a metdust alkalmazzuk, ezt kveti a metdus neve s a () opertor :
2.7.4.
A kvetkez metdusok visszatrsi rtke boolean, vagyis True vagy False. Az [xxx] jells egy opcionlis elemet jell, amit a metdus alkalmazsakor elhagyhatunk. isupper() s islower() : rtke True ha ch csak nagybett/kisbett tartalmaz: c Robert Cordeau 19
isalnum(), isalpha(), isdigit() s isspace() : rtke True ha ch csak alfanumerikus, csak bet-, csak szmkaraktereket vagy space-eket tartalmaznak
print ( " 3 chaises basses " . isalpha ( ) ) # False p r i n t ( " 54762 " . i s d i g i t ( ) ) # True
startswith(prefix[, start[, stop]]) s endswith(suffix[, start[, stop]]) : megvizsgljk, hogy a start s stop paramterekkel denilt rszkarakterlnc a prefix-szel kezddik-e illetve suffix-szal vgzdik-e :
2.7.5.
j karakterlncot ad metdusok
lower(), upper(), capitalize() s swapcase() : rendre egy kisbetkbl, nagybetkbl, egy nagybetvel kezdd kisbets, vagy egy invertlt karakterlnot hoznak ltre :
# az sben l e v o s t r i n g g e l t e s z t e l j u k a metodusokat s = " cHAise basSe " print ( s . lower ( ) ) # chaise basse p r i n t ( s . upper ( ) ) # CHAISE BASSE p r i n t ( s . c a p i t a l i z e ( ) ) # Chaise b a s s e p r i n t ( s . swapcase ( ) ) # ChaISE BASsE
expandtabs([tabsize]) : a tabultorokat tabsize (alaprtelmezetten 8) darab szkzzel helyettesti 20 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba center(width[, fillchar]), ljust(width[, fillchar]) s rjust(width[, fillchar]) : rendre egy kzpre, balszlre vagy jobbszlre igaztott s a fillchar karakterrel (vagy alaprtelmezetten szkz karakterrel) kiegsztett karakterlncot ad :
strip([chars]), lstrip([chars]) s rstrip([chars]) : trlik a chars (vagy alaprtelmezetten a szkzkarakter) minden kombincijt rendre a karakterlnc elejrl s a vgrl, az elejrl vagy a vgrl :
p r i n t ( s . s t r i p ( c e ) ) # HAise basS
find(sub[, start[, stop]]) : a sub karakterlnc indext adja meg a starttl stop-ig tart rszkarakterlncban. Ha nem tallja a sub karakterlncot, akkor az rtke -1. Az rfind() ugyanezt teszi a karakterlnc vgtl kezdve, azaz megadja a legnagyobb indexrtket, aminl a sub karakterlnc az s[start,end] -en bell megtallhat. index() s rindex() ugyanezt teszik, de egy hibt (exception) generlnak ha nem talljk a sub karakterlncot :
print ( s . find ( se b )) # 4
replace(old[, new[, count]]) : a new-val helyettesti az old count szm (alaprtelmezetten sszes) pldnyt :
p r i n t ( s . r e p l a c e ( HA , ha ) ) # c h a i s e basSe
split(seps[, maxsplit]) : maxsplit rszre darabolja fel a karakterlncot. rsplit() ugyanezt teszi, a karakterlnc darabolst a vge fell kezdi el. A splitlines() a karakterlncot a sortrseknl darabolja fel.
p r i n t ( s . s p l i t ( ) ) # [ cHAise , basSe ]
join(seq) : gy konkatenlja a seq kontner karakterlncait, hogy kzbe iktatja azt a stringet, amire a metdust alkalmazzuk : c Robert Cordeau 21
2.7.6.
Egy karakterlnc indexelshez a [ ] opertort hasznljuk, amiben az index egy eljeles egszszm, ami 0-tl indul s megadja egy karakter pozicijt : s = " Rayon X" print ( s [ 0 ] ) print ( s [ 2 ] ) print ( s [ 1]) print ( s [ 3]) # # # # # l e n ( s ) == 7 > R y X n
2.7.7.
Rszkarakterlncok kivgsa
A [ ] opertor 2 vagy 3 - : karakterrel elvlasztott - paramterrel lehetv teszi rszkarakterlncok ellltst egy stringbl : s = " Rayon X" # l e n ( s ) == 7 > s [ 1 : 4 ] # ayo ( az 1 b e l e e r t e n d o , a 4 nem) s [ 2 : ] # X ( a 2 b e l e e r t e n d o , a s t r i n g v e g e i g ) s [ : 3 ] # Ray ( az e l e j e t o l a v e g e i g a 3 n i n c s benne ) s [ 3 : ] # on X ( a 3 i n d e x t o l a v e g e i g ) s [ : : 2 ] # RynX ( az e l e j e t o l a v e g e i g , 2 t o l 2 i g )
22
2.8.
Binris adatok
A Python 3 kt binris tpust kinl : a byte (nem mdosthat) s a byte-array (mdosthat) tpust. Egy binris adat (a [0 ...255] intervallunba es) eljel nlkli egszekbl ll. Ezek a "C-szer" adattpusok igen alkalmasak nagy mennyisg adat trolsra. Radsul a python hatkony eszkzkkel rendelkezik az ilyen tpus adatok kezelshez. A kt tpus meglehetsen hasonlt a str tpusra s rendelkezik az utbbi metdusainak tbbsgvel. A mdosthat bytearray tpusnak a list tpussal kzs metdusai vannak.
# b i n a r i s adatok b_word = b " Animal " # b p r e f i x . s z e l : byte t i p u s p r i n t ( b_word ) # b Animal f o r b i n b_word : p r i n t ( b , end=" " ) # 65 110 105 109 97 108 ( ASCII ) print () bWord = b y t e a r r a y ( b_word ) # egy u j bytetombot ad . . . bWord . pop ( ) # ami r e n d e l k e z i k a s z o k a s o s metodusokkal print () p r i n t (bWord , " \n " ) # b y t e a r r a y ( b Anima ) data = b " 5 H i l l s \ x35 \ x20 \ x48 \ x69 \x6C\x6C\ x73 " p r i n t ( data . upper ( ) ) # b 5 HILLS 5 HILLS p r i n t ( data . r e p l a c e ( b " i l l " , b " a t " ) ) # b 5 Hats 5 Hats Klnbsget kell tenni a kdok, glyph-ek, karakterek s byte-ok kztt (lsd c Robert Cordeau 23
2.9.
Bemenetek, kimenetek
A felhasznlnak szksge van a programmal trtn interakcira (lsd 2.6). "Konzolmdban" (a grakus interface-eket a ksbbiekben fogjuk megnzni), kpesnek kell lennnk informcik megadsra vagy bersra, amit ltalban egy billentyzetrl trtn beolvasssal hajtunk vgre. A msik irnyban kpesnek kell lennnk informcik kiratsra illetve kivitelre, ami ltalban a kpernyre trtn rsnak felel meg.
24
2.9.1.
Bemenetek
A kpernyre trtn rsrl van sz : az input() standard fggvny megszaktja a programot, kir esetleg egy prompt-ot s vrja, hogy a felhasznl berjon egy adatot s lezrja az Enter-rel. Az input() standard fggvny mindg egy text md bemenetet llt el (egy karakterlncot), aminek aztn megvltoztathatjuk a tpust (tpustalaktsnak) is nevezzk :
nb_etudiant = i n p u t ( " I r j a be a h a l l g a t k s z m t : " ) p r i n t ( type ( nb_etudiant ) ) # < c l a s s s t r > ( egy s t r i n g ) f 1 = i n p u t ( " \ n I r j o n be egy f l o a t o t : " ) f 1 = f l o a t ( f 1 ) # t pus t a l a k t s f l o a t t # vagy r videbben : f 2 = f l o a t ( i n p u t ( " I r j o n be egy f l o a t o t : " ) ) p r i n t ( type ( f 2 ) ) # < c l a s s f l o a t >
2.9.2.
Kimenetek
import s y s a, b = 2, 5 print (a , b) # 2 5 p r i n t ( " Osszeg : " , a + b ) # Osszeg : 7 p r i n t ( a b , " a k l nbs g " ) # 3 a k l nbs g print (a , " es " , b , " szorzata : " , a b) # 2 s 5 s z o r z a t a : 10 p r i n t ( ) # egy j s o r t r k i # az j s o r h e l y e t t egy be t k z k i r a t s hoz : p r i n t ( a , end=" " ) p r i n t ( " \ n F a t a l i s hib a ! " , f i l e =s y s . s t d e r r ) # f i l e ba p r i n t ( "On a <" , 232 , "> c a s ! " , sep="###" ) # On a <###4294967296###> c a s !
c Robert Cordeau
25
2.9.3.
Escape-szekvencik
Egy karakterlnc belsejben a backslash ( \ ) karakter segtsgvel adhatunk specilis jelentst bizonyos karaktersorozatoknak : Szekvencia \newline \\ \ \" \a \b \f \n \N{name} \r \t \uxxxx \Uxxxx \v \ooo \xhh Jelents gyelmen kvl hagyja Backslash (\) Single quote ( ) Double quote ( " ) ASCII Bell (BEL) ASCII Backspace (BS) ASCII Formfeed (FF) ASCII Linefeed (LF) A name nev karakter a Unicode adatbzisban ASCII Carriage Return (CR) ASCII Horizontal Tab (TAB) Karakter 16 bites xxxx hexadecimlis rtkkel (csak Unicode) Karakter 32 bites xxxx hexadecimlis rtkkel (csak Unicode) ASCII Vertical Tab (VT) Karakter ooo oktlis rtkkel Karakter hh hexadecimlis rtkkel 2.1. tblzat: Escape-szekvencik
Escape-szekvencik hasznlata : p r i n t ( " \N{pound s i g n } \u00A3 \U000000A3 " ) p r i n t ( " d \144 \ x64 " ) # d d d
26
3.1.
sszetett utastsok
Szintaxis Egy sszetett utasts a kvetkez rszekbl ll : egy fejsorbl, amit egy kettspont zr le; egy utastsblokkbl, ami a fejsorhoz kppest be van hzva.
Plda :
c Robert Cordeau
27
Figyelem Minden utasts, ami ugyanolyan mrtkban van behzva, ugyanahhoz a blokkhoz tartozik.
from math import a = 1 b = 8 c = 3 i f a == 0 : i f b != 0 : p r i n t ( " \nx = { : . 2 f } " . format(c /b ) ) else : p r i n t ( " \ nNincs megold s . " ) else : d e l t a = b2 4 a c i f delta > 0.0: rac_delta = sqrt ( delta ) p r i n t ( " \nx1 = { : . 2 f } \ t x2 = { : . 2 f } " . format ((br a c _ d e l t a ) / ( 2 a ) , (b+r a c _ d e l t a ) / ( 2 a ) ) ) 28 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba e l i f delta < 0.0: p r i n t ( " \nA gy k nem v a l s . " ) else : p r i n t ( " \nx = { : . 2 f } " . format(b /(2 a ) ) )
3.2.
3.2.1.
Vlaszts
Vlaszts : if - [elif] - [else]
Egy alternatva kivlasztsa : i f x < 0: print ( "x negativ " ) e l i f x % 2: p r i n t ( " x p o z i t i v s p r a t l a n " ) else : p r i n t ( " x nem n e g a t i v s p r o s " ) Egy boolean vltoz tesztelse :
3.2.2.
Ahhoz, hogy pldul megtalljuk kt szm kzl a kisebbiket, hasznlhatjuk a (Cbl vett) ternlis opertort :
x, y = 4, 3 # K l a s s z i k u s r smd : if x < y: kisebb = x else : kisebb = y # A t e r n l i s oper t o r a l k a l m a z sa : kisebb = x i f x < y e l s e y p r i n t ( " Kisebb : " , k i s e b b ) # 3
c Robert Cordeau
29
3.3.
3.3.1.
Ciklusok
Programhurok : while
x , cpt = 257 , 0 p r i n t ( " l o g 2 ( " , x , " ) k z e l t s e = " ) while x > 1: x //= 2 # d i v i s i o n avec t r o n c a t u r e c p t += 1 # increment l s p r i n t ( cpt , " \n " ) # 8
Klasszikus alkalmazs : egy numerilus rtk bevitelnek a szrse (meg kell adnunk a tpust mert az input() egy karakterlncot visz be:
3.3.2.
Bejrs : for
Egy iterlhat objektum bejrsa (minden kontner amit elemrl elemre akr sorban, akr nem sorban bejrhatunk tpus szerint) :
for l e t t r e in " ciao " : p r i n t ( l e t t r e , end=" " ) # c i a o for x in [2 , a , 3 . 1 4 ] : p r i n t ( x , end=" " ) # 2 a 3 . 1 4 f o r i i n range ( 5 ) : p r i n t ( i , end=" " ) # 0 1 2 3 4
30
3.4.
3.4.1.
Utastsszekvencik megszakadsa
Egy ciklus megszaktsa : break
A Python azonnal kilp a break utastst tartalmaz ppen fut for vagy while ciklusbl : f o r x i n range ( 1 , 1 1 ) : # 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 i f x == 5 : break p r i n t ( x , end=" " ) p r i n t ( " \nA c i k l u s megszakad # A k v e t k e t k e t r j a k i : # 1 2 3 4 # A c i k l u s megszakad x = 5r e x =" , x , "r e " )
3.4.2.
Az utastst tartalmaz ppen fut for vagy while ciklus kvetkez itercijra ugrik; a ciklus fejsorra : f o r x i n range ( 1 , 1 1 ) : # 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 i f x == 5 : continue p r i n t ( x , end=" " ) p r i n t ( " \nA c i k l u s t u g r o t t a az 5 t " ) # Ki r a t j a : # 1 2 3 4 6 7 8 9 10 # A c i k l u s t u g r o t t a az 5 t
3.4.3.
while - else A while s a for ciklusnak lehet egy else rsze, ami csak akkor hajtdik vgre, ha a ciklus szablyszeren fejezdik be, magyarul megszakts nlkl : c Robert Cordeau 31
y = i n t ( i n p u t ( I r j o n be egy p o z i t v eg s z e t : ) ) w h i l e not ( y > 0 ) : y = i n t ( i n p u t ( K rem r j o n be egy p o z i t v eg s z e t : ) ) x = y // 2 while x > 1: i f y % x == 0 : p r i n t ( " {} nak s z o r z t nyez j e {} " . format ( y , x ) ) break # i t t van a megszak t s ! x = 1 else : p r i n t ( y , " pr mszm" ) for - else
sequence = [ 2 , 5 , 9 , 7 , 11] t o _ s e a r c h = i n t ( i n p u t ( " I r j o n be egy eg s z e t : " ) ) f o r i in sequence : i f i == t o _ s e a r c h : to_save = i break # i t t van a megszak t s ! else : p r i n t ( to_search , " n i n c s benne " , sequence , "ben " ) to_save = None # to_save v r t ke te h t t o _ s e a r c h vagy None : p r i n t ( " To_save =" , to_save )
3.4.4.
Kivtelek (exceptions)
Annak rdekben, hogy felksztsk az alkalmazsokat szokatlan krlmnyek kztt trtn mkdsre, szksg van az rzkeny kdrszek vgrehajtsi hibinak kezelsre. A kivtelkezel (exception) mechanizmus elvlasztja egyrszt azt az utastssorozatot, amit akkor kell vgrehajtani, amikor minden rendben megy; msrszt egy vagy tbb - hiba esetn vgrehajtand - utastssorozatot. Amikor egy hiba lp fel, akkor egy exception objektum halad t a kivtel 32 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba terjedsi mechanizmuson s a programvgrehajts az ad hoc hibakezel utastssoroknak addik t. A mechanizmus kt lpsben mkdik : egy kivtel generldik a hiba szlelsekor; a hiba megfelel kezelse. Szintaxis A norml utastsok sorozatt egy try blokkban helyezzk el. Ha a Python egy hibt szlel (exception generlsa), ennek kezelse a megfelel except blokkban trtnik.
from math import s i n f o r x i n range ( 4 , 5 ) : # 4, 3, 2, 1, 0 , 1 , 2 , 3 , 4 try : p r i n t ( { : . 3 f } . format ( s i n ( x ) / x ) , end=" " ) e x c e p t Z e r o D i v i s i o n E r r o r : # mind g e l l l t egy k i v t e l t p r i n t ( 1 . 0 , end=" " ) # k e z e l i a 0 k i v t e l t
# 0.189 0 . 0 4 7 0 . 4 5 5 0 . 8 4 1 1 . 0 0 . 8 4 1 0 . 4 5 5 0 . 0 4 7 0.189 A Python ltal generlt ssszes kivtel az Exception osztly alosztlynak pldnya. Az alosztlyok hierarchija mintegy hsz standard kivtelt tartalmaz.
try : . . . # #norm l v g r e h a j t s k dr s z e x c e p t <exception_1> as e1 : . . . # az 1 k i v t e l k e z e l s e e x c e p t <exception_2> as e2 : . . . # a 2 kiv t e l kezel se ... else : . . . #hiba h i nyban v g r e h a j t a n kd finally : . . . #mind g v g r e h a j t a n d kd A raise utastssal szndkosan hozhatunk ltre kivtelt : c Robert Cordeau 33
Megjegyzs Egy except blokkban az rtk nlkli raise lehetv teszi, hogy ne blokkoljuk a kivtelt, a kivtel tovbbterjedst. Kontextuskezel : Ez a szintaxis azzal egyszersti a kdot, hogy biztostja, hogy bizonyos mveletek vgre lesznek hajtva az adott utastsblokk eltt s utn. Ezt a mechanizmust egy klasszikus pldval illusztrljuk melyben fontos a haszlt fjlok lezrsa :
i l i mporte de f e r m e r l e f i c h i e r u t i l i s : # e h e l y e t t a kd h e l y e t t : f h = None try : f h = open ( f i l e n a m e ) f o r l i n e in fh : process ( line ) e x c e p t EnvironmentError as e r r : print ( err ) finally : i f f h i s not None : fh . c l o s e () # e g y s z e r bb a k v e t k e z t r n i : try : with open ( f i l e n a m e ) as f h : f o r l i n e in fh : process ( line ) e x c e p t EnvironmentError as e r r : print ( err )
34
4.1.
4.1.1.
Szekvencik
Mi a szekvencia ?
Denci A szekvencia olyan kontner, ami egszszmokkal indexelt rendezett elemeket tartalmaz. A Pythonnak hrom elre denilt szekvenciatpusa van : karakterlncok; listk; tuple-ek
c Robert Cordeau
35
4.2.
4.2.1.
Listk
Denci, szintaxis s pldk
Denci Adott esetben heterogn, mdosthat elemek gyjtemnye Szintaxis Az elemeket vessz vlasztja el s szgletes zrjelben vannak.
c o l o r s = [ t r e f l e , carreau , coeur , pique ] p r i n t ( c o l o r s ) # [ t r e f l e , carreau , coeur , pique ] c o l o r s [ 1 ] = 14 p r i n t ( c o l o r s ) # [ t r e f l e , 14 , coeur , pique ] l i s t 1 = [ a , b ] li st 2 = [4 , 2.718] l i s t 3 = [ l i s t 1 , l i s t 2 ] # l i s t k l i s t j a print ( l i s t 3 ) # [ [ a , b ] , [4 , 2 . 7 1 8 ] ]
4.2.2.
Inicializls s tesztek
Az ismtls, a tartalmazs opertornak (in) s az iterrci opertornak range() hasznlata : t r u c , machin = [ ] , [ 0 . 0 ] 3 print ( truc ) # [ ] ( res l i s t a ) p r i n t ( machin ) # [ 0 . 0 , 0 . 0 , 0 . 0 ] l 1 = l i s t ( range ( 4 ) ) p r i n t ( " l 1 =" , l 1 ) # l 1 = [ 0 , 1 , 2 , 3 ] l 2 = l i s t ( range ( 4 , 8 ) ) p r i n t ( " l 2 =" , l 2 ) # l 2 = [ 4 , 5 , 6 , 7 ] l 3 = l i s t ( range ( 2 , 9 , 2 ) ) p r i n t ( " l 3 =" , l 3 ) # l 3 = [ 2 , 4 , 6 , 8 ] p r i n t ( 2 i n l 1 , 8 i n l 2 , 6 i n l 3 ) # True F a l s e True f o r i i n range ( l e n ( l 3 ) ) : p r i n t ( i , l 3 [ i ] , sep="" , end=" " ) # 02 14 26 38 36 c Hungarian Translation Darczy Pter
4.2.3.
Metdosok
Nhny listamdost utasts : nombres = [ 1 7 , 3 8 , 1 0 , 2 5 , 7 2 ] nombres . s o r t ( ) p r i n t ( nombres ) # [ 1 0 , 1 7 , 2 5 , 3 8 , 7 2 ] nombres . append ( 1 2 ) nombres . r e v e r s e ( ) nombres . remove ( 3 8 ) p r i n t ( nombres ) # [ 1 2 , 7 2 , 2 5 , 1 7 , 1 0 ] p r i n t ( nombres . i n d e x ( 1 7 ) ) # 3 nombres [ 0 ] = 11 nombres [ 1 : 3 ] = [ 1 4 , 1 7 , 2 ] p r i n t ( nombres . pop ( ) ) # 10 p r i n t ( nombres ) # [ 1 1 , 1 4 , 1 7 , 2 , 1 7 ] p r i n t ( nombres . count ( 1 7 ) ) # 2 nombres . extend ( [ 1 , 2 , 3 ] ) p r i n t ( nombres ) # [ 1 1 , 1 4 , 1 7 , 2 , 1 7 , 1 , 2 , 3 ]
4.2.4.
Listarszek manipullsa
Szintaxis Ha egy lista tbb elemt trlni, helyettesteni akarjuk, vagy tbb elemet be akarunk illeszteni a listba, akkor egy rtkads baloldali tagjban meg kell adnunk egy listarszt s a jobboldali tagban egy listt kell magadnunk.
mots = [ jambon , s e l , m i e l , c o n f i t u r e , b e u r r e ] mots [ 2 : 4 ] = [ ] # t r l s egy r e s l i s t a hozz r e n d e l s v e l p r i n t ( mots ) # [ jambon , s e l , b e u r r e ] mots [ 1 : 3 ] = [ s a l a d e ] p r i n t ( mots ) # [ jambon , s a l a d e ] mots [ 1 : ] = [ mayonnaise , p o u l e t , tomate ] p r i n t ( mots ) # [ jambon , mayonnaise , p o u l e t , tomate ] mots [ 2 : 2 ] = [ m i e l ] # b e s z r s a 3 . p o z i c i ba p r i n t ( mots ) # [ jambon , mayonnaise , m i e l , p o u l e t , tomate ]
c Robert Cordeau
37
4.3.
Szktett listk
Egy szktett lista egy olyan kifejezs, ami lehetv teszi, hogy nagyon tmr formban hozzunk ltre egy listt. Ez a jellsmd fedi egy szktett halmaz matematikai dencijt : {x2 |x [2, 10]} [x**2 for x in range(2, 11)]
4.3.1.
Denci Egy szktett lista egyenrtk egy olyan for ciklussal, ami ugyanazt a listt lltja el az append() metdussal. A szktett listk hrom formban hasznlhatk.
r e s u l t 1 = [ x+1 f o r x i n une_seq ] # ugyanaz a hat sa , mint : result2 = [ ] f o r x i n une_seq : r e s u l t 2 . append ( x+1) A msodik forma - szmok listja szrssel :
r e s u l t 3 = [ x+1 f o r x i n une_seq i f x > 2 3 ] # ugyanaz a hat sa , mint : result4 = [ ] f o r x i n une_seq : i f x > 23: r e s u l t 4 . append ( x+1) A harmadik forma - kt, szmokbl ll lista kombincija :
r e s u l t 5 = [ x+y f o r x i n une_seq f o r y i n une_autre ] # ugyanaz a hat sa , mint : result6 = [ ] f o r x i n une_seq : f o r y i n une_autre : r e s u l t 6 . append ( x+y ) 38 c Hungarian Translation Darczy Pter
v a l e u r s _ s = [ " 12 " , " 78 " , " 671 " ] # s t r i n g e k b l l l l i s t a k o n v e r z i j a eg s z e k b l l l l i s t v valeurs_i = [ i n t ( i ) f o r i in valeurs_s ] # [ 1 2 , 78 , 671] # l i s t a s s z e g nek k i s z m t sa a be p t e t t sum f ggv n n y e l p r i n t ( sum ( [ i n t ( i ) f o r i i n v a l e u r s _ s ] ) ) # 761 # ugyanaz a hat sa , mint : s = 0 for i in valeurs_s : s = s + int ( i ) p r i n t ( s ) # 761 # egy 2D l i s t a i n i c i a l i z l sa m u l t i _ l i s t e = [ [ 0 ] 2 f o r l i g n e i n range ( 3 ) ] print ( multi_liste ) # [[0 , 0] , [0 , 0] , [0 , 0 ] ]
4.4.
Tuple-k
Denci Rendezett s nem mdosthat adott esetben heterogn elemek gyjtemnye Szintaxis Az elemeket vessz vlasztja el s kerek zrjelben vannak.
mon_tuple = ( a , 2 , [ 1 , 3 ] )
A tuple-ket ugyangy hasznljuk mint a listkat, de a bejrsuk gyorsabb; Hasznosak konstansok denilsakor; Figyelem Mint a karakterlncok, a tuple-k sem mdosthatk !
c Robert Cordeau
39
4.5.
Visszatrs a hivatkozsokhoz
Mr lttuk, hogy az rtkads ltszlag egyszer mvelete a Pythonban egy vals nehzsg. i = 1 msg = " Quoi de n e u f ? " e = 2.718
A fenti pldban az rtkadsok tbb mveletet foglalnak magukba : egy ad hoc tpus objektum (jobboldali tag) ltrehozsa a memriban; az adat trolsa a ltrehozott objektumba; egy vltoznv ltrehozsa (baloldali tag); ennek a vltoznvnek az sszekapcsolsa az rtket tartalmaz objektummal. Ennek a mechanizmusnak az egyik kvetkezmnye az, ha egy mdosthat objektumnak adunk rtket, akkor az egyik objektumon vgrehajtott minden vltoztats a msik objektumot is mdostani fogja : f a b l e = [ " Je " , " p l i e " , " mais " , " ne " , " romps " , " p o i n t " ] phrase = f a b l e phrase [ 4 ] = " casse " p r i n t ( f a b l e ) # [ Je , p l i e , mais , ne , c a s s e , p o i n t ]
Ha egy objektumnak egy igazi msolatt akarjuk ltrehozni, akkor a copy modult kell hasznlni : import copy a = [1 , 2 , 3] b = a b . append ( 4 ) print (a) c = copy . copy ( a ) c . append ( 5 ) print ( c ) print (a)
Azon ritka alkalmakkor, amikor azt is akarjuk, hogy az objektum minden eleme s atributuma kln s rekurzv mdon legyen msolva, akkor a copy.deepcopy() fggvnyt alkalmazzuk. 40 c Hungarian Translation Darczy Pter
4.2. bra. Inkrementlis rtkads egy mdosthat objektumnak A hozzrendelsrl elmondottak grakai kiegsztse Inkrementlis rtkads egy nem-mdosthat objektumnak (egy egszszm esete : ??) : Bemutattuk a kzbens sszeads lpst.
c Robert Cordeau
41
Bevezets a Python 3-ba Inkrementlis rtkads egy mdosthat objektumnak (egy lista esete : ??) : Bemutattuk a kzbens lista ltrehozsnak lpst.
4.6.
4.6.1.
Asszociatv tmbk
Az asszociatv tmb tpus
Denci Az asszociatv tmb olyan adattpus, ami kulcs : rtk prok trolst teszi lehetv. Az adathoz val hozzfrs a kulcs segtsgvel nagyon gyors, mert a kulcs csak egyszer fordulhat el a tmbben. Jellemzi : egy kulcs elfordulst tesztel opertor (in) ; a (len()) fggvny, ami megadja a trolt kulcs : iterrlhat (bejrhat), de nem rendezett. rtk prok szmt;
4.6.2.
A sztrak (dict)
Szintaxis kulcs : rtk prok vesszvel elvlasztva, kapcsos zrjel hatrolja. A sztrak egy sszetett adattpust kpeznek, de nem szekvencik. A listkhoz hasonlan a sztrak is mdosthatk, de a trolt adatprok nem foglalnak el egy megvltoztathatatlan sorrendet, az helyket egy specilis algoritmussal kezeli a Python. (Lsd a hash-fggvnyeknl.) Egy kulcs lehet alfabetikus, numerikus ... brmilyen hash-elhet tpus. Az rtkek lehetnek numerikus rtkek, szekvencik, sztrak, de fggvnyek, osztlyok vagy objektumok is.
42
# k u l c s / r t k p rok b e s z r sa d1 = {} # egy r e s s z t rba d1 [ " name " ] = 3 d1 [ " s i z e " ] = 176 p r i n t ( d1 ) # { name : 3 , s i z e : 176} # kiterjesztett defin ci d2 = { " name " : 3 , " s i z e " : 176} p r i n t ( d2 ) # { name : 3 , s i z e : 176} # s z k t e t t d e f i n c i d3 = {x : x 2 f o r x i n ( 2 , 4 , 6)} p r i n t ( d3 ) # { 2 : 4 , 4 : 1 6 , 6 : 36} # n v v e l megadott param t e r e k haszn l a t a d4 = d i c t ( name=3, s i z e =176) p r i n t ( d4 ) # { s i z e : 1 7 6 , name : 3} # k u l c s / r t k p rok l i s t j nak a l k a l m a z sa d5 = d i c t ( [ ( " name " , 3 ) , ( " s i z e " , 1 7 6 ) ] ) p r i n t ( d5 ) # { name : 3 , s i z e : 176} Metdusok
t e l = { j a c k : 4 0 9 8 , sape : 4139} t e l [ guido ] = 4127 p r i n t ( t e l ) # { sape : 4 1 3 9 , j a c k : 4 0 9 8 , guido : 4127} p r i n t ( t e l [ j a c k ] ) # 4098 d e l t e l [ sape ] t e l [ i r v ] = 4127 p r i n t ( t e l ) # { j a c k : 4 0 9 8 , i r v : 4 1 2 7 , guido : 4127} p r i n t ( l i s t ( t e l . keys ( ) ) ) # [ j a c k , i r v , guido ] p r i n t ( s o r t e d ( t e l . keys ( ) ) ) # [ guido , i r v , j a c k ] p r i n t ( sorted ( t e l . values ( ) ) ) # [4098 , 4127 , 4127] p r i n t ( guido i n t e l , j a c k not i n t e l ) # True F a l s e
c Robert Cordeau
43
4.7.
Halmazok (set)
4.8.
4.8.1.
Szvegle-ok
A le-ok : bevezets
A szmtgp csak a RAM-ban lv programokat hajtja vgre. Az informcik tarts megrzshez azonban permanens memrit kell hasznlni, pldul merevlemezt, ash-memrit, DVD-t, ... Mint a programnyelvek tbbsge, a Python a le fogalmt hasznlja. Ez a Pythonban egy elre denilt tpus, ezrt nincs szksg kls modul importlsra. A szvegle-okra (portbilis, egy editorral olvashat) korltozdik a trgyals, de jelzem , hogy a binrisan kdolva trolt le-ok tmrebbek s gyorsabb a kezelsk. 44 c Hungarian Translation Darczy Pter
4.8.2.
A le-ok kezelse
f 1 = open ( " monFichier_1 " , " r " , e n c o d i n g= u t f 8 ) # o l v a s s f 2 = open ( " monFichier_2 " , "w" , e n c o d i n g= u t f 8 ) # r s f 3 = open ( " monFichier_3 " , " a " , e n c o d i n g= u t f 8 ) # hozz f z s
A Python alaprtelmezetten text mdban (t jelli) hasznlja a le-okat (a binris le-ok esetben a b mdot kell megadni). Az opcionlis encoding biztostja a byte s str tpusok kztti talaktst. A leggyakoribb kdolsok az utf-8 (a Python 3 ezt a kdolst preferlja), latin1, ascii ... Amg a le nincs lezrva, addig a tartalma nincs kimentve a diszkre.
f1 . close ()
f = open ( " t r u c . t x t " , "w" ) s = t o t o \n f . w r i t e ( s ) # az s s t r i n g e t k i r j a fbe l = [ a , b , c ] f . w r i t e l i n e s ( l ) # az l l i s t a s t r i n g j e i t k i r j a fbe f . close () # a p r i n t f i l e o p c i haszn l a t a f 2 = open ( " t r u c 2 . t x t " , "w" ) p r i n t ( " abcd " , f i l e =f 2 ) f2 . close ()
c Robert Cordeau
45
f = open ( " t r u c . t x t " , " r " ) s = f . r ead ( ) # az eg s z f i l e t > s t r i n g s = f . r ead ( 3 ) # l e g f e l j e b b n byteo t > s t r i n g s = f . r e a d l i n e ( ) # a k v e t k e z s o r t > s t r i n g s = f . r e a d l i n e s ( ) # az eg s z f i l e t > s t r i n g e k l i s t j a f . close () # Egy f i l e s o r a i n a k e g y e s s v e l t r t n k i r sa f = open ( " t r u c . t x t " ) # a l a p r t e l m e z e t t e n " r " md for ligne in f : p r i n t ( l i g n e [ : 1 ] ) # a s o r e l e j r e ugr shoz f . close ()
4.9.
Iterrls a kontnereken
k n i g h t s = { " Gallahad " : " t he pure " , " Robin " : " th e brave " } f o r k , v in knights . items ( ) : print (k , v) # Gallahad t h e pure # Robin th e brave Kulcsok s rtkek kinyerse egy lista ciklussal trtn bejrsval :
f o r i , v i n enumerate ( [ " t i c " , " t a c " , " t o e " ] ) : p r i n t ( i , v , end=" " , sep=">" ) # 0> t i c 1>t a c 2>t o e Kt (vagy tbb) szekvencia ciklussal trtn prostsa :
q u e s t i o n = [ " name " , " q u e s t " , " f a v o r i t e c o l o r " ] answers = [ " L a n c e l o t " , " th e Holy G r a i l " , " b l u e " ] f o r q , a i n z i p ( q u e s t i o n , answers ) : p r i n t ( " What i s your {}? I t i s { } . " . format ( q , a ) ) # What i s your name? I t i s L a n c e l o t . # What i s your q u e s t ? I t i s t h e Holy G r a i l . # What i s your f a v o r i t e c o l o r ? I t i s b l u e . 46 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba Egy invertlt szekvencia bejrsa (az eredeti szekvencia vltozatlan) :
Egy olyan szekvencia bejrsa, amiben az eredeti szekvencia minden eleme csak egyszeres fordul el (az eredeti szekvencia vltozatlan) : b a s k e t = [ " a p p l e " , " orange " , " a p p l e " , " p ear " , " orange " , " banana " , " orange " ] f o r f in sorted ( set ( basket ) ) : p r i n t ( f , end=" " ) # a p p l e banana orange pear
4.10.
Formzott kirats
Egyszer helyettestsek :
p r i n t ( " {} {} {} " . format ( " z r o " , " un " , " deux " ) ) # z r o un deux p r i n t ( " {2} {0} {1} " . format ( " z r o " , " un " , " deux " ) ) # deux z r o un p r i n t ( " Je m a p p e l l e {} " . format ( " Bob " ) ) # Je m a p p e l l e Bob p r i n t ( " Je m a p p e l l e {{{}}} " . format ( " Bob " ) ) # Je m a p p e l l e {Bob} p r i n t ( " {} " . format ( "" 1 0 ) ) # Helyettestsek nevestett mezkkel :
a, b = 5, 3 p r i n t ( " The s t o r y o f { c } and {d} " . format ( c=a+b , d=ab ) ) # The s t o r y o f 8 and 2
c Robert Cordeau
47
s t o c k = [ p a p i e r , e n v e l o p p e , chemise , e n c r e , buvard ] p r i n t ( " Nous avons de l { 0 [ 3 ] } e t du { 0 [ 0 ] } en s t o c k \n " . format ( s t o c k ) ) # Nous avons de l e n c r e e t du p a p i e r en s t o c k Formzs sztr segtsgvel :
p r i n t ( "My name i s { 0 [ name ] } " . format ( d i c t ( name= Fred ) ) ) # My name i s Fred d = d i c t ( animal = l phant , p o i d s = 12000) p r i n t ( " L { 0 [ animal ] } p s e { 0 [ p o i d s ] } kg\n " . format ( d ) ) # L l phant p s e 12000 kg Helyettests nevestett atributumokkal :
import math import s y s p r i n t ( " math . p i = { . p i } , e p s i l o n = { . f l o a t _ i n f o . e p s i l o n } " . format ( math , s y s ) ) # math . p i = 3 . 1 4 1 5 9 2 6 5 3 5 9 , e p s i l o n = 2 . 2 2 0 4 4 6 0 4 9 2 5 e 16 Szvegkonverzik, str() s repr() :
p r i n t ( " {0} { 0 : b} { 0 : o} { 0 : x} " . format ( 1 7 9 ) ) # 179 10110011 263 b3 n = 100 pi = 3.1415926535897931 p r i n t ( " {} , e t {} " . format ( n , p i ) ) # 1 0 0 , e t 3 . 1 4 1 5 9 2 6 5 3 5 9 p r i n t ( " {} , e t {} " . format ( n , p i ) ) # 1 0 0 , e t 3 . 1 4 1 5 9 2 6 5 3 5 9 p r i n t ( " {0} , {1} e t {0} " . format ( n , p i ) ) # 1 0 0 , 3 . 1 4 1 5 9 2 6 5 3 5 9 e t 100
48
Bevezets a Python 3-ba p r i n t ( " { : . 4 e } " . format ( p i ) ) # 3 . 1 4 1 6 e+00 p r i n t ( " { : g} " . format ( p i ) ) # 3 . 1 4 1 5 9 msg = "R s u l t a t s u r { : d} c h a n t i l l o n s : { : . 2 f } " . format ( n , p i ) p r i n t ( msg ) # R s u l t a t s u r 100 c h a n t i l l o n s : 3 . 1 4 Klnbz formzsok : # # # # # # [ The sword o f t r u t h ] [ The sword o f t r u t h ] [ The sword o f t r u t h ] [ The sword o f t r u t h ] [The sword o f t r u t h ] [ The sword o f t r u t h . . . . . . . ]
s = " The sword o f t r u t h " p r i n t ( " [ { } ] " . format ( s ) ) p r i n t ( " [ { : 2 5 } ] " . format ( s ) ) p r i n t ( " [ { : > 2 5 } ] " . format ( s ) ) p r i n t ( " [ { : ^ 2 5 } ] " . format ( s ) ) p r i n t ( " [ { : ^ 2 5 } ] " . format ( s ) ) p r i n t ( " [ { : . < 2 5 } ] " . format ( s ) ) l o n g = 12 p r i n t ( " [ { } ] " . format ( s [ : l o n g ] ) ) m = 123456789 p r i n t ( " {:0=12} " . format (m) ) p r i n t ( " {:#=12} " . format (m) )
c Robert Cordeau
49
Szintaxis Ez egy sszetett utasts : d e f nomFonction ( p a r a m e t r e s ) : " " " Documentation de l a f o n c t i o n . " " " <b l o c _ i n s t r u c t i o n s >
Az utastsblokk ktelez. Ha res, akkor a pass utastst alkalmazzuk. A (fakultatv) dokumentls melegen ajnlott.
Mindg denilnunk kell egy fggvnyt, amikor egy utastsblokk tbbszr elfordul a kdban; tulajdonkppen a kzs kdrszlet "kiemelsrl" van sz.
50
c Robert Cordeau
51
Bevezets a Python 3-ba A kvetkez elnyeik vannak : Elkerlik az ismtldseket : "faktorizlhatjuk" a kd egy rszt, ami a script vgrehajtsa sorn ismtldik; Kiemelik az adatokat s az eredmnyeket : a fggvny bemenetei s kimenetei; Lehetv teszik a kd ismtelt felhasznlst : az importmechanizmus; Egy sszetett feladatot egyszerbb feladatokra bontjk : az alkalmazs tervezse.
5.2.
5.2.1.
Argumentumok tadsa
ltalnos mechanizmus
Megjegyzs rtktads hozzrendelssel : a fggvnydenci minden paramtere rendre megfelel a fggvnyhvs egy paramternek. A megfeleltets hozzrendelssel trtnik.
52
5.2.2.
return utasts nlkli plda, amit gyakran eljrsnak (procedure) neveznk. Ebben az esetben a fggvny visszatrsi rtke impliciten None : d e f t a b l e ( base , begin , end ) : " " " Ki r j a a <base> s z o r z t b l t <begin> t l <end> i g . " " " n = begin w h i l e n <= end : p r i n t ( n , x , base , = , n base , end=" " ) n += 1
# P l d a a f ggv nyh v s r a : t a b l e ( 7 , 2 , 1 1) # 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 # 7 x 7 = 49 8 x 7 = 56 9 x 7 = 63 10 x 7 = 70 11 x 7 = 77
5.2.3.
Plda egyetszeres return hasznlatra : from math import p i d e f cube ( x ) : r e t u r n x 3 d e f volumeSphere ( r ) : r e t u r n 4 . 0 p i cube ( r ) / 3 . 0
# Sug r bek r s e s a t r f o g a t k i r sa r a d i u s = f l o a t ( i n p u t ( Sug r : ) ) p r i n t ( "A gmb t r f o g a t a =" , volumeSphere ( r a d i u s ) ) Plda tbbszrs return hasznlatra :
5.2.4.
d e f t a b u l a t e ( f u n c t i o n , lowerBound , upperBound , s t e p s ) : " " "A <f u n c t i o n > r t k e i n e k k i r a t sa . Sz ks g van egy ( lowerBound < upperBound ) s ( s t e p s > 0) r t kre " " " h , x = ( upperBound lowerBound ) / f l o a t ( s t e p s ) , lowerBound w h i l e x <= upperBound : y = function (x) p r i n t ( " f ( { : . 2 f }) = { : . 2 f } " . format ( x , y ) ) x += h d e f myFunction ( x ) : r e t u r n 2x 3 + x 5 t a b u l a t e ( myFunction , 5, 5 , 10 ) # f ( 5.00) = 260.00 # f ( 4.00) = 137.00 # ... # f (5.00) = 250.00
5.2.5.
Az alaprtelmezetten nem-mdosthat rtkeket elszeretettel hasznljk, mert a paramter els fggvnyhvs ltal vgrehajtott mdostsa a kvetkez alkalmakkor lthat : d e f i n i t P o r t ( speed =9600 , p a r i t y=" p a i r e " , data =8, s t o p s =1): p r i n t ( " I n i . " , speed , " b i t s / s r e " , " p a r i t s : " , p a r i t y ) p r i n t ( data , " a d a t b i t " , s t o p s , " s t o p b i t " )
Bevezets a Python 3-ba initPort () # I n i . 9600 b i t s / s r e p a r i t s : p a i r e # 8 adatbit 1 stopbit i n i t P o r t ( p a r i t y=" n u l l e " ) # I n i . 9600 b i t s / s r e p a r i t s : n u l l e # 8 adatbit 1 stopbit i n i t P o r t (2400 , " p a i r e " , 7 , 2) # I n i . 2400 b i t s / s r e p a r i t s : p a i r e # 7 adatbit 2 stopbit
5.2.6.
d e f somme( a r g s ) : " " "A <t u p l e > r t k e i n e k s s z e g e a v i s s z a t r s i r t k . " " " resultat = 0 f o r nombre i n a r g s : r e s u l t a t += nombre return r e s u l t a t # P l d k f ggv nyh v s r a : p r i n t ( somme ( 2 3 ) ) # 23 p r i n t ( somme ( 2 3 , 4 2 , 1 3 ) ) # 78 Megjegyzs : Ha a fggvnynek tbb argumentuma van, a tuple az utols pozciban van. A fggvnyhvskor egy tuple-t is tadhatunk paramterknt (valjban egy szekvencit), ami egy "klasszikus" fggvny paramterlistv alakul t : d e f somme ( a , b , c ) : r e t u r n a+b+c # P l d a f ggv nyh v s r a : elements = (2 , 4 , 6) p r i n t ( somme( e l e m e n t s ) ) # 12
c Robert Cordeau
55
5.2.7.
d e f unDict ( k a r g s ) : return kargs # P l d k f ggv nyh v s r a # n e v e s t e t t param t e r e k k e l : # p r i n t ( unDict ( a =23 , b=42)) # { a : 2 3 , b : 42} # egy s z t r megad s v a l : # mots = { d : 8 5 , e : 1 4 , f : 9 } p r i n t ( unDict ( mots ) ) # { e : 1 4 , d : 8 5 , f : 9} Megjegyzs : Ha a fggvnynek tbb argumentuma van, a sztr a legutols pozciban van (egy esetleges tuple mgtt).
5.3.
5.3.1.
Nvterek
Objektumok rvnyesgi kre
Megjegyzs rvnyessgi kr : az objektumok nevnek ltrehozsa az els hozzrendelskor trtnik, de nem lthatk csak bizonyos memriaterleteken bell.
Globlis rvnyessgi kr : ez a __main__ modul. Egy sztr kezeli a globlis objektumokat : a globals() utasts szolgltatja a vltoz : rtk-prokat; Globlis rvnyessgi kr : a fggvnyek (s osztlyok) bels objektumai loklisak. A globlis objektumok nem mdosthatk a loklis rvnyessgi krkben. A locals() utasts szolgltatja a vltoz : rtk-prokat.
5.3.2.
A nevek keresse elszr loklisan (L), majd globlisan (G), vgl a Pythonon bell (internal) (I) trtnik :
56
c Robert Cordeau
57
58
6.1.
Modulok
Denci Modul : olyan fggetlen le, ami lehetv teszi egy program tbb script-re trtn felbontst. Ez a mechanizmus lehetv teszi hatkony fggvny s osztlyknyvtrak ltrehozst.
A modulok elnyei: a kd jra trtn felhasznlsa; a dokumentci s a tesztek bepthetk a modulba; megosztott szolgltatsok vagy adatok ellltsa; a rendszer nvternek megosztsa. c Robert Cordeau 59
6.1.1.
Modul importlsa
Ktfle szintaxis lehetsges : az import <nom_module> parancs a modul sszes objektumt importlja :
import t k i n t e r
a from <nom_module> import obj1, obj2... parancs csak a modul obj1, obj2... objektumait importlja :
A modulok importlsa a kvetkez sorrendben tancsolt : a standard knyvtr moduljai; harmadik fl knyvtri moduljai ; sajt modulok.
6.1.2.
Pldk
Az "autot-test" fogalma A cube_m.py egy modul. Figyeljk meg az "autot-test" hasznlatt, ami lehetv teszi a modul tesztelst: d e f cube ( y ) : " " " Kisz molja az <y> param t e r kb t . " " " r e t u r n y 3
# Autot e s t i f __name__ == "__main__" : # F a l s e import l s k o r == f i g y e l m e n k v l hagyja > h e l p ( cube ) # k i r a t j a a f ggv ny d o c s t r i n g j t p r i n t ( " cube de 9 : " , cube ( 9 ) ) # cube de 9 : 729 A modul hasznlata. Importljuk a cube_m.py le-ban lv fggvnyt :
60
from cube_m import cube f o r i i n range ( 1 , 4 ) : p r i n t ( i , " k be =" , cube ( i ) , end=" " ) # 1 k be = 1 2 k be = 8 3 k be = 27 Egy interface a gnuplot-hoz
A szabadon terjeszthet gnuplot alkalmazssal grbket lehet kiratni. A kvetkez fggvny egy interface, ami lehetv teszi le-ok kimeneti adatainak kiratst: import os def plotFic ( courbes ) : dem = open ( "_. dem " , "w" ) # minden r a j z n l j r a f e l h a s z l h a t f i l e dem . w r i t e ( " s e t g r i d \n " ) plot_data = [ " % s with %s " % ( c [ 0 ] , c [ 1 ] ) f o r c i n c o u r b e s ] dem . w r i t e ( " p l o t " + , . j o i n ( plot_data ) ) dem . w r i t e ( \ npause 1 " \ Enter \ a f o l y t a t shoz " \ n ) dem . w r i t e ( " r e s e t " ) dem . c l o s e ( ) os . system ( " wgnuplot _. dem " ) A kvetkez auto-test bemutatja a hasznlatt :
i f __name__ == __main__ : f , g , h = open ( " d1 . dat " , "w" ) , open ( " d2 . dat " , "w" ) , open ( " d3 . dat " , "w" ) f o r i i n range ( 2 0 1 ) : x = 0.1 i 5.0 y = x 3 20 x 2 f . w r i t e ( "%g %g\n " %(x , y ) ) y = x 3 30 x 2 g . w r i t e ( "%g %g\n " %(x , y ) ) y = x 3 40 x 2 h . w r i t e ( "%g %g\n " %(x , y ) ) h . close ( ) ; g . close ( ) ; f . close () p l o t F i c ( [ ( d1 . dat , p o i n t s ) ] ) p l o t F i c ( [ ( d1 . dat , l i n e s ) , ( d2 . dat , p o i n t s ) , ( d3 . dat , l i n e s ) ] ) 61
c Robert Cordeau
6.2.
6.2.1.
Standard knyvtr
A standard knyvtr
Azt szoktk mondani, hogy a Pythont "elemekkel egyt" (batteries included) adjk; olyan kiterjedt a standard knyvtra : tbb mint 200 csomagbl s modulbl ll, amik vlaszt adnak a legvltozatosabb aktulis problmkra. Nhny hasznos funkci felletes bemutatsa : Karakterlncok kezelse A string modul olyan konstansokat ad meg, mint az ascii_lowercase, digits... s a Formatter osztly, amibl karakterlncok formzsra specializlt alosztlyokat lehet leszrmaztatni. A textwrap modult szvegformzsra hasznljk : minden egyes sor hosszt, a behzst szablyozza. A struct modul segtsgvel szmokat, boolean rtkeket s karakterlncokat lehet talaktani binris reprezentcijukk az alacsony szint (gyakran C-be rt) knyvtrakkal trtn kommunikci cljbl. A difflib modul segtsgvel hasonlthatunk ssze szekvencikat. Standard "di" vagy HTML a kimenetk. Vgl nem feledkezhetnk meg a re modulrl, amivel a regulris kifejezseket lehet kezelni. Plda : az io.StringIO Ez a modul a leobjektumok interface-vel kompatibilis objektumokat szolgltat. Plda egy le sorrl sorra trtn kezelsre vagy egy karakterlncnak ugyanazzal a scanner() fggvnnyel kezelsre : def scanner ( fajl_objektum , sor_kezelo ) : f o r l i n e in fajl_objektum : sor_kezelo ( l i n e ) i f __name__==__main__ : def elsoSzo ( l i n e ) : print ( l i n e . s p l i t ( ) [ 0 ] ) f a j l = open ( " data . dat " ) scanner ( f a j l , elsoSzo ) 62 c Hungarian Translation Darczy Pter
A parancssor kezelse Kt modullal lehetsges a parancssort kezelni : a getopt, C-bl rklt rgebbi modullal s az jabb, sokkal hatkonyabb optparse modullal : from o p t p a r s e import O p t i o n P a r s e r parser = OptionParser ( ) p a r s e r . add_option ( "f " , " f i l e " , d e s t=" f i l e n a m e " , h e l p=" w r i t e r e p o r t t o FILE " , metavar=" FILE " ) p a r s e r . add_option ( "q " , "q u i e t " , a c t i o n=" s t o r e _ f a l s e " , d e s t=" v e r b o s e " , d e f a u l t=True , h e l p=" don t p r i n t s t a t u s messages t o s t d o u t " )
python 6_025 . py h
Usage : 6\_025 . py [ o p t i o n s ] Options : h , h e l p show t h i s h e l p message and e x i t f FILE , f i l e =FILE w r i t e r e p o r t t o FILE q , q u i e t don t p r i n t s t a t u s messages t o s t d o u t
c Robert Cordeau
63
Bevezets a Python 3-ba Matematikai s numerikus tpus knyvtrak A Python standardknt a fraction s a decimal modulokat nyjtja a felhasznlnak: from f r a c t i o n s import F r a c t i o n import d e c i m a l as d p r i n t ( F r a c t i o n ( 1 6 , 10)) # 8/5 p r i n t ( F r a c t i o n ( 1 2 3 ) ) # 123 p r i n t ( F r a c t i o n ( 3/7 ) ) # 3/7 p r i n t ( F r a c t i o n ( .125 ) ) # 1/8 p r i n t ( F r a c t i o n ( 7e6 ) ) # 7/1000000 d . getcontext ( ) . prec = 6 p r i n t ( d . Decimal ( 1 ) / d . Decimal ( 7 ) ) # 0 . 1 4 2 8 5 7 d . g e t c o n t e x t ( ) . p r e c = 18 p r i n t ( d . Decimal ( 1 ) / d . Decimal ( 7 ) ) # 0 . 1 4 2 8 5 7 1 4 2 8 5 7 1 4 2 8 5 7
A mr ltott math s a cmath knyvtrakon tl a random knyvtr tbb vletlenszmfggvnyt tartalmaz. Az id s a dtumok kezelse A calendar, time s datetime modulok tartalmazzk az aktulis id- s dtumkezel fggvnyeket : import c a l e n d a r , datetime , time moon_apollo11 = d a t e t i m e . d a t e t i m e ( 1 9 6 9 , 7 , 2 0 , 2 0 , 1 7 , 4 0) p r i n t ( moon_apollo11 ) p r i n t ( time . a s c t i m e ( time . gmtime ( 0 ) ) ) # Thu Jan 01 0 0 : 0 0 : 0 0 1970 ( " epoch " UNIX) e l o z o _ p e n t e k = d a t e t i m e . date . today ( ) egy_nap = d a t e t i m e . t i m e d e l t a ( days =1) w h i l e e l o z o _ p e n t e k . weekday ( ) != c a l e n d a r .FRIDAY: e l o z o _ p e n t e k = egy_nap p r i n t ( e l o z o _ p e n t e k . s t r f t i m e ( "%A, %d%b% ) ) Y" # Friday , 09Oct 2009 Algoritmusok s a collection adattpusok A bisect modul rendezett szekvencik keresfggvnyeit tartalmazza. Az array modul egy a listra hasonlt, de annl gyorsabb - mivel a tartalma homogn tpust knl a felhasznlnak. 64 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba A heapq modul a heap queue algoritmus, ami prioritsi sor algoritmusknt is ismert, implementcijt tartalmazza. A heap-ek binris fk, melyek mindegyik szl csompontja kisebb rtk mint brmelyik gyermekcsompontjuk. A 0 index mindg a legkisebb index : import heapq import random heap = [ ] f o r i i n range ( 1 0 ) : heapq . heappush ( heap , random . r a n d i n t ( 2 , 9 ) )
p r i n t ( heap ) # [ 2 , 3 , 5 , 4 , 6 , 6 , 7 , 8 , 7 , 8 ]
A C struktrit kvetve mostantl kezdve a Pyton a collections modul rvn a nevestett tuple fogalmt is felknlja a felhasznlnak : import c o l l e c t i o n s
# a t pus l e r sa : Point = c o l l e c t i o n s . namedtuple ( " Point " , " x y z " ) # egy pontp l d nyt l t r e h o z u n k : p o i n t = Point ( 1 . 2 , 2 . 3 , 3 . 4 ) # ki ratjuk : p r i n t ( " p o i n t : [ { } , {} , { } ] " . format ( p o i n t . x , p o i n t . y , p o i n t . z ) ) # point : [ 1 . 2 , 2.3 , 3 . 4 ]
Termszetesen lehetsg van egymsba gyazott nevestett tuple-ekre. A defaultdict tpus lehetv tesz halad alkalmazsokat : from c o l l e c t i o n s import d e f a u l t d i c t
s = [ ( y , 1) , ( b , 2) , ( y , 3) , ( b , 4) , ( r , 1)] d = defaultdict ( l i s t ) for k , v in s : d [ k ] . append ( v ) print (d . items ( ) ) # dict_items ( [ ( y , [ 1 , 3 ] ) , ( r , [ 1 ] ) , ( b , [ 2 , 4 ] ) ] ) s = mississippi d = defaultdict ( int ) c Robert Cordeau 65
6.3.
6.3.1.
Harmadik fl knyvtrai
Nagy heterogenits
A standard Python-disztribciba beptett modulok mellett minden terlethez tallunk knyvtrakat : tudomny; adatbzisok; funkcionlis tesztek s minsgellenrzs; 3D; ... A http://pypi.python.org/pypi (The Python Package Index) weboldal modulok s csomagok ezreit sorolja fel.
6.3.2.
Welcome i n Unum C a l c u l a t o r ( v e r 0 4 . 0 0 ) >>> d = 1609 M >>> t = 1 1 . 7 S >>> v = d/ t >>> v 66 c Hungarian Translation Darczy Pter
6.4.
Csomagok
Denci Egy csomag (package) egy olyan modul, ami ms modulokat tartalmaz. Egy csomag moduljai lehetnek alcsomagok (sub-packages,) amik egy fastruktrt alkotnak.
sszefoglalan : a csomag egyszeren egy folder, ami modulokat s egy - a csomag fastruktrjt ler - __init__.py le-t tartalmaz.
c Robert Cordeau
67
7.1.
Egy plda Egy krt szeretnnk brzolni, amihez hrom informcira van szksgnk: a kzppontjnak koordintira s a sugarra : c e r c l e = (11 , 60 , 8) 68 c Hungarian Translation Darczy Pter
A problma megoldsa s a kd jobb olvashatsga rdekben hasznlhatunk nevestett tuple-eket : from c o l l e c t i o n import namedtuple C e r c l e = namedtuple ( " C e r c l e " , " x y rayon " ) c e r c l e = Cercle (11 , 60 , 8) # a l k a l m a z s i p l d a : distance = distance_origine ( cercle . x , cercle . y)
c e r c l e = C e r c l e ( 1 1 , 6 0 , 8)
Ha a krknek vltoztatni kell a jellemzit, akkor egy mdosthat tpus, lista vagy sztr, mellett kell dntennk, ami mg mindig nem oldja meg az rvnytelen adatok problmjt . . . Szksgnk van teht egy mechanizmusra, ami gy csomagolja be a krt reprezentl adatokat s az erre az j adattpusra (class) alkalmazhat metdusokat, hogy csak az rvnyes mveletek legyenek alkalmazhatk.
7.2.
Terminolgia
Az OOP szhasznlata Az osztly (class) egy j adattpus ekvivalense. Mr ismerjk az int-et s a str -t. Egy objektum vagy pldny egy class tpus vltoz. Pldul a "truc" egy pldnya a str osztlynak. Az osztlyok tbbsge egysgbe zrja az adatokat s az objektumra alkalmazhat metdusokat. Pldul egy str tpus objektum tartalmaz egy Unicode karakterlncot (az adatokat)s szmos metdust, mint amilyen pldul az upper(). Egy objektumot gy denilhatunk, mint egy kapszult, ami alatt egy adatokat s metdusokat tartalmaz "csomagot" kell rni : c Robert Cordeau 69
Bevezets a Python 3-ba objektum = [atributumok + metdusok] Sok osztlynak vannak kiegszt jellemzi, mint pldul a karakterlncok konkatenlsa, ami egyszeren a + opertort alkalmazza. Ezeket specilis metdusokkal rik el. Pldul a + opertor azrt hasznlhat, mert jra deniltuk az __add()__ metdust. Az objektumoknak ltalban ktfle atributuma van : az adatokat egyszeren attributumoknak, az alkalmazhat fggvnyeket metdusoknak nevezzk. Pldul a complex class egy objektumnak :
Az atributumok rendszerint pldnyvltozknt vannak implementlva, amik minden objektum esetben specikusak. A property mechanizmus ellenrztt hozzfrst jelent az adatokhoz, ami lehetv teszi azok rvnyessgnek vizsglatt s a biztonsgoss ttelt. Az OOP hatrozott elnye, hogy egy Python-class mindg specializlhat, leszrmaztathat belle egy osztly, ami minden atributumot (adatokat s metdusokat) rkl a szuper class-tl. Mivel minden atributum jradenilhat, ezrt a leszrmaztatott osztlynak s a szlosztlynak lehet azonos nev metdusa, de ezek klnbz mveleteket hajthatnak vgre (overloading) s a Python dinamikusan fog alkalmazkodni az rtkadstl kezdve. Tbb klnbz objektumtpus esetben az azonos metdusnv hasznlatt javasolva a polimorzmus egy sokkal ltalnosabb programozst tesz lehetv. A fejlesztnek, amikor egy metdust programoz, nem kell ismernie az objetum pontostpust, amire a metdus alkalmazva lesz. Elegend azt tudni, hogy ez az objektum fogja implementlni a metdust. Vgl a Python tmogatja a duck typing programozsi logikt : "ha valami gy jr, s gy hpog, mint egy kacsa, akkor az kacsa". Ez azt jelenti, hogy a Pythont csak az objektumok viselkedse rdekli. (Vagyis az, hogy hvhatak legyenek rajtuk a megfelel metdusok.) Pldul egy leobjektum ltrehozhat az open() -nel vagy az io.StringIO egy pldnyval. A kt megkzelts ugyanazt az API-t (Application Programming Interface) nyjtja, az az ugyanazokat a metdusokat. 70 c Hungarian Translation Darczy Pter
7.3.
7.3.1.
Szintaxis sszetett utasts : fej (docstring-gel) + behzott kd : c l a s s C: " " " Documentation de l a c l a s s e . " " " x = 23
Ebben a pldban C az osztly neve (ami megllapods szerint nagybetvel kezddik) s x osztlyatributum, ami ami a C-re loklis.
7.3.2.
A class-ok objektumgyrak : mieltt objektumokat gyrtunk, eltte konstrulunk egy zemet ! A class nevre trtn hivatkozssal hozunk ltre egy objektumot (azaz az zem lltja el):
a = C( ) # a C c l a s s egy objektuma p r i n t ( d i r ( a ) ) # k i r j a az a objektum a t t r i b u t u m a i t p r i n t ( a . x ) # k i r 23 a t . x a c l a s s egy a t t r i b u t u m a a . x = 12 # m dos t j a az o b j . egy a t t r i b u t u m t ( f i g y e l e m . . . ) p r i n t (C. x ) # 2 3 , a c l a s s a t t r i b u t u m a v l t o z a t l a n a . y = 44 # j objektumattributum b = C( ) # b a C c l a s s egy j objektuma p r i n t ( b . x ) # 2 3 . b i s m e r i c l a s s a t t r i b u t u m t , de . . . p r i n t ( b . y ) # A t t r i b u t e E r r o r : bnek n i n c s y a t t r i b u t u m a
7.3.3.
Visszatrs a nvterekre
Pontosan gy, mint a fggvnyeknek, az osztlyoknak is sajt nvterk van : c Robert Cordeau 71
Bevezets a Python 3-ba Minden osztlynak sajt nvtere van. Azokat a vltozkat, amik rszei az osztly nvternek, osztlyattributumoknak nevezzk. Minden objektumpldnynak (amit egy osztlybl hoztak ltre) sajt nvtere van. Azokat a vltozkat, amik rszei ennek a nvtrnek pldnyattributumnak nevezzk. Az osztlyok hasznlhatjk (de nem mdosthatjk) a fszinten denilt vltozkat. Az objektumpldnyok hasznlhatjk (de nem mdosthatjk) az osztly- s a fszinten denilt vltozkat. A moduloknak, az osztlyoknak s az objektumoknak a nvtereket sztrakkal implementltk. Nem minstett nevek : (plda : dimension a hozzrendels az aktulis loklis rvnyessgi krben hozza ltre vagy vltoztatja meg a nevet. Az LGI szablynak megfelelen keresi a Python ket. Minstett nevek : (plda : dimension.height a hozzrendels az attributumot az objektum nvterben hozza ltre vagy mdostja. Egy attributumot a Python az objektumban keres, majd mindazokban az osztlyokban, melyektl az objektum fgg (de nem keresi a modulokban). A kvetkez plda kiratja a C osztlyhoz kapcsold sztrat, majd egy C objektumhoz kapcsold attributumok listjt : c l a s s C: x = 20 p r i n t (C. __dict__ ) # { __dict__ : <a t t r i b u t e __dict__ o f C o b j e c t s >, # x : 2 0 , __module__ : __main__ , # __weakref__ : <a t t r i b u t e # __weakref__ o f C o b j e c t s >, __doc__ : None} a = C( ) print ( dir (a )) # [ __class__ , __delattr__ , __dict__ , __doc__ , # __getattribute__ , __hash__ , __init__ , # __module__ , __new__ , __reduce__ , __reduce_ex__ , # __repr__ , __setattr__ , __str__ , __weakref__ , x ]
72
7.4.
Metdusok
Szintaxis Egy metdust gy runk meg, mint az osztly testnek egy fggvnyt. Az els paramter ktelezen a self. A self azt az objektumot reprezentlja, amire a metdus alkalmazva lesz. Ms szval : a self az ojektumpldny hivatkozsa.
c l a s s C: x = 23 # x e t y : o s z t l y a t t r i b u t u m y = x + 5 d e f a f f i c h e ( s e l f ) : # a f f i c h e ( ) met dus s e l f . z = 42 # objektump l d ny a t t r i b u t u m p r i n t (C. y ) # egy met dusban megadjuk egy o s z t l y a t t r i b u t u m # e l r s i t j t a m o d u l s z i n t t l kezdve , print ( s e l f . z ) # de nem adjuk meg p l d nyattributum e l r s i t j t ob = C( ) # l t r e h o z z u k az ob objektump l d nyt ob . a f f i c h e ( ) # 28 42 ( a h v s r a az ob hozz r e n d e l i a s e l f e t )
7.5.
7.5.1.
Specilis metdusok
A specilis metdusok
Ezeknek a metdusoknak elredenilt nevk van, ami eltt s utn kt alhzskarakter ll. Ezek a metdusok : a ltrehozott objektumpldnyok inicializlsra; a kirats mdostsra; opertoroverloadingra; ... valk. c Robert Cordeau 73
7.5.2.
Az inicializtor
Egy objektom inicializlsakor az __init__ metdust automatikusan hvja a Python. gy lehetv vlik minden szksges inicializls : c l a s s C: d e f __init__ ( s e l f , n ) : s e l f . x = n # az x p l d nyattributum i n i c i a l i z l sa egy_peldany = C( 4 2 ) # k t e l e z param t e r , n hez r e n d e l v e p r i n t ( egy_peldany . x ) # 42
Ez az inicializls alatt automatikusan hvott eljrs : soha sem tartalmaz return utastst.
7.5.3.
Az opertoroverloading lehetv teszi, hogy egy opertornak az operandusaitl fggen ms legyen az rtelmezse. Pldul + opertor lehetv teszi : x = 7 + 9 # eg s z e k s s z e a d sa s = ab + cd # konkaten c i A Python kvetkez metdusai overload-olhatk : minden tpus esetben (__call__, __str__, ...); szmok esetben (__add__, __div__, ...); szekvencik esetben (__len__, __iter__, ...);
Legyen obj1 s obj2 kt objektum, a kvetkez specilis metdusok a szoksos aritmetikai mveletek vgrehajtst teszik lehetv : Nv Specilis metdus Alkalmazs negls __neg__ -obj1 sszeads __add__ obj1 + obj2 kivons __sub__ obj1 - obj2 szorzs __mul__ obj1 * obj2 oszts __div__ obj1 / obj2 egszoszts __floordiv__ obj1 // obj2 74 c Hungarian Translation Darczy Pter
7.5.4.
c l a s s Vector2D : d e f __init__ ( s e l f , x , y ) : self .x = x self .y = y d e f __add__( s e l f , a u t r e ) : # v e k t o r i l i s s s z e a d s r e t u r n Vector2D ( s e l f . x + a u t r e . x , s e l f . y + a u t r e . y ) d e f __str__ ( s e l f ) : # egy 2D v e k t o r k i r sa r e t u r n " Vektor ( { : g } , { : g }) " % ( s e l f . x , s e l f . y ) v1 = Vector2D ( 1 . 2 , 2 . 3 ) v2 = Vector2D ( 3 . 4 , 4 . 5 ) p r i n t ( v1 + v2 ) # Vector ( 4 . 6 , 6 . 8 )
7.6.
7.6.1.
rkls s polimorzmus
rkls s polimorzmus
Denci Az rkls az a mechanizmus, ami lehetv teszi egy j osztly ellltst egy mr ltez osztlybl, mely az utbbitl eltr vagy tovbbi funkcikkal rendelkezik.
Denci A polymorzmus a klnbz rklt osztlyokhoz tartoz, de azonos nev metdusok szmra a lehetsg eltr feladat vgrehajtsra. Ezt a tulajdonsgot az overload-technika biztostja.
c Robert Cordeau
75
7.6.2.
A kvetkez pldban a Square osztly a Rectangle osztlytl rkl s az __init__ metdus polymorf : c l a s s Rectangle : d e f __init__ ( s e l f , l e n g t h =30 , width =15): s e l f . L , s e l f . l , s e l f . nom = l e n g t h , width , " r e c t a n g l e " c l a s s Square ( R e c t a n g l e ) : d e f __init__ ( s e l f , s i d e =10): R e c t a n g l e . __init__ ( s e l f , s i d e , s i d e ) s e l f . nom = " s q u a r e " r = Rectangle () p r i n t ( r . nom) # r e c t a n g l e c = Square ( ) p r i n t ( c . nom) # s q u a r e
7.7.
7.7.1.
Elszr kifejesztnk egy Point nev osztlyt, ami az object szlosztlytl rkl. Utna a Circle osztly alaposztlyaknt hasznlhatjuk fel a Point osztlyt. Az albbi UML-smkban 1 a dlt betvel szedett metdusok rklttek, a norml betvel szedettek jak, a vastag betvel szedettek jradeniltak (overloaded).
7.7.2.
A circle osztly
A Point osztly kdja : c l a s s Point : d e f __init__ ( s e l f , x=0, y =0): self .x, self .y = x, y
1
76
Bevezets a Python 3-ba @property def distance_origine ( s e l f ) : r e t u r n math . hypot ( s e l f . x , s e l f . y ) d e f __eq__( s e l f , o t h e r ) : r e t u r n s e l f . x == o t h e r . x and s e l f . y == o t h e r . y d e f __str__ ( s e l f ) : r e t u r n " ( { 0 . x ! s } , { 0 . y ! s }) " . format ( s e l f )
7.1. bra. A Circle osztly UML-terve A property dekortor alkalmazsa csak olvassi hozzfrst tesz lehetv a distance_origine() metdus eredmnyhez, amit gy egyszer attributumnak tekint a Python (mivel nincs zrjel) :
A property dekortornak ksznheten a oat visszatrsi rtket ad metdusok attributumokknt lesznek kezelve :
Bevezets a Python 3-ba s u p e r ( ) . __init__ ( x , y ) s e l f . radius = radius @property d e f a r e a ( s e l f ) : r e t u r n math . p i ( s e l f . r a d i u s 2 ) @property d e f c i r c u m f e r e n c e ( s e l f ) : r e t u r n 2 math . p i s e l f . r a d i u s @property def distance_bord_origine ( s e l f ) : r e t u r n abs ( s e l f . d i s t a n c e _ o r i g i n e s e l f . r a d i u s )
A kvetkez szintaxis alkalmazsval a radius metdus olvashat-rhat attributumknt hasznlhat. Vegyk szre, hogy a radius() metdus vdett attributumot ad visszatrsi rtknek : __radius, amit a setter (mdost metdus) fog megvltoztatni.
@property def radius ( s e l f ) : r e t u r n s e l f . __radius @radius . s e t t e r def radius ( s e l f , radius ) : a s s e r t r a d i u s > 0 , " a sug r s z i g o r an p o z i t i v " s e l f . __radius = r a d i u s Plda a Circle-objektumok hasznlatra:
d e f __eq__( s e l f , o t h e r ) : r e t u r n ( s e l f . r a d i u s == o t h e r . r a d i u s and s u p e r ( ) . __eq__( o t h e r ) ) d e f __str__ ( s e l f ) : r e t u r n ( " { 0 . __class__ .__name__} ( { 0 . r a d i u s ! s } , { 0 . x ! s } , " " { 0 . y ! s }) " . format ( s e l f ) ) i f __name__ == "__main__" : c1 = C i r c l e ( 2 , 3 , 4 ) p r i n t ( c1 , c1 . area , c1 . c i r c u m f e r e n c e ) 78 c Hungarian Translation Darczy Pter
7.8.
Aszerint, hogy milyen kapcsolatokat fogunk ltrehozni az alkalmazsunk objektumai kztt, ktfle mdon tervezhetjk meg osztlyainkat : a kompozci a : (van neki egy ...) illetve a (hasznl egy ...) relcin alapul; a szrmazik az : ez egy ...) relcin alapul. Termszetesen ez a kt konstrukci egytt is lhet s sokszor ez is a helyzet !
7.8.1.
Kompozci
Denci A kompozci tbb klnbz osztly kztti egyttmkds egy asszocicin (hasznl egy ...) vagy egy agregcin (van neki egy ...) keresztl.
A kompozit osztly hasznot hz ms olyan osztlyok funkciinak a hozzadsbl, mely osztlyokban semmi kzs nincs. A Python implementci ltalban a kompozit osztly konstruktorban lv osztlypldnyokat hasznlja. Plda
c l a s s Point : d e f __init__ ( s e l f , x , y ) : s e l f . px , s e l f . py = x , y c l a s s Segment : " " " Az e l t r Point o s z t l y t haszn l kompozit o s z t l y . " " " d e f __init__ ( s e l f , x1 , y1 , x2 , y2 ) : s e l f . o r i g = Point ( x1 , y1 ) c Robert Cordeau 79
Bevezets a Python 3-ba # a s z a k a s z n a k " van egy " kezd pontja , s e l f . extrem = Point ( x2 , y2 ) # s " van egy " v g p o n t j a d e f __str__ ( s e l f ) : r e t u r n ( " Segment : [ ( { : g } , { : g } ) , ( { : g } , { : g } ) ] " . format ( s e l f . o r i g . px , s e l f . o r i g . py , s e l f . extrem . px , s e l f . extrem . py ) ) s = Segment ( 1 . 0 , 2 . 0 , 3 . 0 , 4 . 0 ) p r i n t ( s ) # Segment : [ ( 1 , 2 ) , ( 3 , 4 ) ]
7.8.2.
Leszrmaztats
Ebben az esetben az rklsi mechanizmust alkalmazzuk. A Python implementci ltalban a szlosztly konstruktort hvja a leszrmaztatott osztly konstruktorban, akr nvszerint, akr a super utastssal. Plda
c l a s s Rectangle : d e f __init__ ( s e l f , l e n g t h =30 , width =15): s e l f . L , s e l f . l , s e l f . name = l e n g t h , width , " r e c t a n g l e " c l a s s Square ( R e c t a n g l e ) : # e g y s z e r r k l s " " "A R e c t a n g l e szuper c l a s s s p e c i a l i z l t a l o s z t l y a . " " " d e f __init__ ( s e l f , s i d e =20): # A Square szuper c l a s s e nak k o n s t r u k t o r t h vjuk : s u p e r ( ) . __init__ ( s i d e , s i d e ) s e l f . name = " s q u a r e " # az a t t r i b u t u m j r a d e f i n i l sa
80
8.1.
8.1.1.
Procedurlis technikk
A dokumentls javtsa
A printApi() felhasznli fggvny szri az element rendelkezsre ll metdusait s a kapcsold docstring-eket olvashatbb formban rja ki, mint a help() : d e f p r i n t A p i ( element ) : methods = [ e l f o r e l i n d i r ( element ) i f not e l . s t a r t s w i t h ( _ ) ] f o r meth i n methods : p r i n t ( g e t a t t r ( element , meth ) . __doc__) i f __name__ == "__main__" : printApi ( [ ] )
""" L . append ( o b j e c t ) append o b j e c t t o end L . count ( v a l u e ) > i n t e g e r r e t u r n number o f o c c u r r e n c e s o f v a l u e L . extend ( i t e r a b l e ) extend l i s t by appending e l e m e n t s from t he i t e r a b l e L . i n d e x ( value , [ s t a r t , [ s t o p ] ] ) > i n t e g e r c Robert Cordeau 81
Bevezets a Python 3-ba return f i r s t index of value . R a i s e s ValueE rror i f th e v a l u e i s not p r e s e n t . L . i n s e r t ( index , o b j e c t ) i n s e r t o b j e c t b e f o r e i n d e x L . pop ( [ i n d e x ] ) > item remove and r e t u r n item a t i n d e x ( d e f a u l t l a s t ) . R a i s e s I n d e x E r r o r i f l i s t i s empty o r i n d e x i s out o f range . L . remove ( v a l u e ) remove f i r s t o c c u r r e n c e o f v a l u e . R a i s e s ValueE rror i f th e v a l u e i s not p r e s e n t . L . r e v e r s e ( ) r e v e r s e IN PLACE L . s o r t (cmp=None , key=None , r e v e r s e=F a l s e ) s t a b l e s o r t IN PLACE ; cmp( x , y ) > 1, 0 , 1 """
8.1.2.
Egy sztr kulcs:rtk prjt a kvetkez mdon hasznlhatjuk fel egy men implementlsra : - a kulcs legyen a men egy elemnek a neve; - a megfelel rtk egy hivatkozs : egy argumentum nlkli eljrs hvsa. A plda egy FIFO programozst mutatja be. Ezt az adatstruktrt egy jegypnztrnl vrakoz sor illusztrlja : az els rkezt szolgljk ki elszr.
A fggvnymodul forrskdja :
" " " Egy FIFO queue a d m i n i s z t r c i s modulja " " " queue = [ ] # i n i c i a l i z l s d e f intoQueue ( ) : queue . append ( i n t ( i n p u t ( " I r j o n be egy eg s z e t : " ) ) ) d e f fromQueue ( ) : i f l e n ( queue ) == 0 : print ( " \ nLehetetlen : res a sor ! " ) else : p r i n t ( " \nA %d . elem t r l v e van " % queue . pop ( 0 ) ) d e f writeQueue ( ) : p r i n t ( " \ nqueue : " , queue )
82
" " " Egy FIFO queue implement l sa egy l i s t v a l . Egy ( s z t r a t haszn l ) men argumentum n l k l i e l j r s o k a t h v """ # import from queue_FIFO_menu_m import intoQueue , fromQueue , writeQueue # main program writeQueue ( ) CMDs = { a : intoQueue , v : writeQueue , s : fromQueue } menu = " " " (A) ppend (V) iew ( S ) upprimer (Q) u i t Your c h o i c e ? " " " w h i l e True : w h i l e True : try : c h o i c e = i n p u t ( menu ) . s t r i p ( ) [ 0 ] . l o w e r ( ) except : choice = q i f c h o i c e not i n avsq : p r i n t ( " I n v a l i d o p t i o n ! Try a g a i n " ) else : break i f c h o i c e == q : p r i n t ( " \ Quit ! " ) break CMDs[ c h o i c e ] ( )
c Robert Cordeau
83
8.1.3.
Rekurzv fggvnyek
Pldul egy N elem tblzat elemeinek nvekv sorrendbe rendezseelszr kivlasztjuk a legkisebb elemet, majd rendezzk a maradk N-1 elem tblzatot. Br gyakran nehezebb megrteni s kdolni ezt a mdszert, mint a klasszikus iterratvnak nevezett mdszert, bizonyos esetekben ez a mdszer a legkzvetlenebb alkalmazsa a matematikai dencinak. A kvetkez klasszikus plda a faktorilis fggvny dencija rekurzival 1 :
1,
n! =
ha n = 0, n (n 1)!, ha n 1
Ebben a denciban az n! rtke nem ismert, amg el nem rjk a rekurzi befejez felttelt (itt n == 0). A program mindaddig halmozza a rekurzv fggvnyhvsokat, mg el nem ri a befejezs felttelt, majd a legutols fggvnyhvstl kezdve kiszmolja a fggvnyrtkeket. Az bra ezt a mechanizmust szemllteti.
84
8.1.4.
A genertorok s a genertor-kifejezsek
A genertorok A genertorok egy olyan eszkzt adnak a keznkbe, amivel megvalsthat a ksleltetett kirtkelsnek ("lazy evaluation" vagy call-by-need) nevezett kirtkelsi stratgia. Ennek az a lnyege, hogy mindaddig kslelteti egy kifejezs kirtkelst, amg az rtkre tnylegesen szksg lesz. Ez sokkal hatkonyabbnak bizonyulhat (memriahasznlatban), mint pldul egy nagy lista egyszerre trtn kiszmolsa.
c Robert Cordeau
85
Bevezets a Python 3-ba p r i n t ( " Eredm n y l i s t a : " , r e s u l t ) # Eredm n y l i s t a : [ 0 . 0 , 0 . 2 5 , 0 . 5 , 0 . 7 5 , 1 . 0 ] Egy kezdrtk is tadhat a genertornak :
# import import s y s d e f q u a r t e r s ( n e xt _ q u a r te r = 0 . 0 ) : w h i l e True : r e c e i v e d = ( y i e l d ne x t _ q u ar t e r ) i f r e c e i v e d i s None : n e x t_ q u a r t er += 0 . 2 5 else : n e x t_ q u a r t er += r e c e i v e d i f __name__ == "__main__" : result = [ ] generator = quarters () while len ( r e s u l t ) < 5: x = next ( g e n e r a t o r ) i f abs ( x 0 . 5 ) < s y s . f l o a t _ i n f o . e p s i l o n : x = g e n e r a t o r . send ( 1 . 0 ) # j r a i n i c i a l i z l j a a gener t o r t r e s u l t . append ( x ) p r i n t ( " Eredm n y l i s t a : " , r e s u l t ) # Eredm n y l i s t a : [ 0 . 0 , 0 . 2 5 , 1 . 5 , 1 . 7 5 , 2 . 0 ]
A genertorkifejezsek Szintaxis Egy genertorkifejezsnek majdnem azonos a szintaxisa a szktett listk szintaxisval; a klnbsg az, hogy egy genertorkifejezs zrjelbe van zrva.
8.1.5.
A Pythonban a fggvnydenci szintaxisa megengedi a fggvnydencik egymsba gyazst. Kt alkalmazst klnbztetnk meg : 86 c Hungarian Translation Darczy Pter
d e f c r e a t e _ p l u s ( add ) : " " " Fggv nygy r " " " def plus ( increment ) : " " " Be g y a z o t t f ggv ny : a c r e a t e _ p l u s ( ) l o k l i s n e v e i t haszn l j a . " " " r e t u r n i n c r e m e n t + add return plus # F program # k t k l nb z f ggv nygy r g e n e r l sa # p = create_plus (23) q = create_plus (42) # alkalmaz s # p r i n t ( " p ( 1 0 0 ) =" , p ( 1 0 0 ) ) p r i n t ( " q ( 1 0 0 ) =" , q ( 1 0 0 ) )
A fggvnygyr egy osztlyt ad visszatrsi rtkl : # classes c l a s s CaseNormal ( o b j e c t ) : d e f aMethod ( s e l f ) : p r i n t ( " normal " ) c l a s s CaseSpecial ( object ) : d e f aMethod ( s e l f ) : print ( " special " ) # function d e f c a s e I s S u i t a b l e F o r ( isNormal=True ) : " " " Fggv nygy r , aminek v i s s z a t r s i r t ke egy o s z t l y . " " " r e t u r n CaseNormal ( ) i f isNormal e l s e C a s e S p e c i a l ( ) # F program # a n_ i ns t an c e = c a s e I s S u i t a b l e F o r ( ) a n_ i ns t an c e . aMethod ( ) # normal other_instance = caseIsSuitableFor ( False ) o t h e r _ i n s t a n c e . aMethod ( ) # s p e c i a l 87
c Robert Cordeau
8.1.6.
A dekortorok
A Python dekortorok olyan fggvnyek, amik egy fggvny, metdus vagy osztly hvsakor lehetv teszik elzetes mveletek vgrehajtst.
Szintaxis Legyen deco() egy dekortor. Egy fggvny dekorlshoz a kvetkezt kell rnunk: @deco d e f f u n c t i o n ( arg1 , arg2 , . . . ) : pass Ez az rsmd egyenrtk a kvetkez fggvnykompozcival :
d e f f u n c t i o n ( arg1 , arg2 , . . . ) : pass f u n c t i o n = deco ( f u n c t i o n ) # # Egy t bbsz r sen dekor l t g f ggv ny p l d j a @f1 @f2 @f3 def g ( ) : pass # A j e l l s egyen r t k a k v e t k e z v e l : g = f 1 ( f 2 ( f 3 ( g ) ) )
# f ggv nyek d e f unDecorateur ( f ) : d e f _ i n t e r n e ( a rg s , kwargs ) : p r i n t ( " Dekor l t f ggv ny ! " ) r e t u r n f ( a rg s , kwargs ) return _interne @unDecorateur d e f uneFonction ( a , b ) : return a + b def autreFonction (a , b ) : return a + b 88 c Hungarian Translation Darczy Pter
# F program =============================================== # dekor t o r haszn l a t a # p r i n t ( uneFonction ( 1 , 2 ) ) # f ggv nykompoz c i haszn l a t a # a u t r e F o n c t i o n = unDecorateur ( a u t r e F o n c t i o n ) print ( autreFonction (1 , 2)) """ Dekor l t f ggv ny ! 3 Dekor l t f ggv ny ! 3 """
8.2.
Technikai objektumok
Amint azt az elz fejezetben lttuk, a Python teljesen objektum orientlt nyelv. Minden alap- illetve leszrmaztatott tpus osztlyknt implementlt absztrakt adattpus. Ezen osztlyok mindegyike egyetlen szlosztlybl szrmazik, az object osztlybl.
8.2.1.
__slots__ s __dict__
Vizsgljuk meg a kvetkez kdot : c l a s s Point : __slot__ = ( " x " , " y " ) d e f __init__ ( s e l f , x=0, y =0): self .x = x self .y = y
Amikor egy osztlyt a __slot__ utasts alkalmazsa nlkl hozunk ltre, ahogyan azt idig tettk, a Python minden osztlypldny szmra transzparens mdon ltrehoz egy __dict__ nev privt sztrat s ez a sztr tartalmazza a pldnyok attributumait. Ez a magyarzat arra, hogy mirt lehet egy objektum attributumaihoz jabbakat hozztenni illetve bellk trlni. Ha viszont megelgednk olyan objektumokkal, melyek attributumaihoz se hozztenni, sem pedig bellk elvenni nem akarunk, akkor ltrehozhatunk privt c Robert Cordeau 89
Bevezets a Python 3-ba sztr nlkli osztlyokat, ami minden egyes objektumgenerlskor memrit fog megtakartani. Ezt valstja meg az albbi plda egy __slot__ osztlyattributum denilsval, aminek az rtke egy tuple, amit az attributumok nevbl ll.
8.2.2.
A functor
A Pythonban egy fggvnyobjektum vagy functor egy hivatkozs minden hvhat objektumra : fggvnyre, lambda-fggvnyre, metdusra, osztlyra. A beptett callable() fggvnnyel tesztelhetjk ezt a tulajdonsgot :
>>> d e f myFunction ( ) : p r i n t ( This i s " c a l l a b l e " ) >>> c a l l a b l e ( myFunction ) True >>> c h a i n = This i s " c a l l a b l e " >>> c a l l a b l e ( c h a i n e ) False Egy osztly pldnyait talakthatjuk functor-okk, ha az osztlyban denilva van a __call__() specilis metdus :
8.2.3.
Az accessor-ok
Az egysgbezrs problmja Az objektum orientlt paradigmban egy objektum llapota privt, ms objektumoknak nincs joguk azt sem megnzni, sem mdostani. Hagyomnyosan a kvetkez lthatsgokat klnbztetjk meg : 90 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba public; protected; private. A Pythonban minden attributum (adatok, metdusok) public ! Mostantl nomthatunk ezen a tnyen. Egy egyszer s hasznos megllapods : az egy alhzs karakterrel kezdd neveket fogjuk a protected attributum jellsre hasznlni. Pldul : _attrib. A Python semmire sem ktelez, a fejlesztn mlik a megllapods betartsa ! A Python javasol egy mechanizmust (name mangling) a private attributumok emullsra : az osztlyazonostk kt alhzs-karakterrel (__) kezddnek. Pldul : __ident. Ez a vdelem deklaratv marad s nem nyjt abszolt vdelmet. A property megolds Az egysgbezrs elvt a tulajdonsg fogalmval dolgoztk ki. Denci Egy tulajdonsg property egy pldny-attributum, aminek specilis funkcii vannak.
Ezt a megoldst kt szintaxis implementlja. Az els explicit mdon denilja az x tulajdonsgot s ngy paramtert (ren
dre) : c l a s s C: d e f __init__ ( s e l f ) : s e l f . _ma_propriete = None def getx ( s e l f ) : """ getter . """ r e t u r n s e l f . _x def setx ( s e l f , value ) : """ setter . """ s e l f . _x = v a l u e
c Robert Cordeau
91
Bevezets a Python 3-ba def delx ( s e l f ) : """ deleter . """ d e l s e l f . _x x = p r o p e r t y ( getx , s e t x , delx , " En vagyok az x t u l a j d o n s g . " )
# autot e s t =============================== i f __name__ == __main__ : t e s t = C( ) t e s t . x = 10 # s e t t e r print ( test . x) # getter p r i n t (C. x . __doc__) # documentation """ 10 En vagyok az x t u l a j d o n s g . """ A msodik, egyszerbb a dekortorok szintaxist alkalmazza. Megjegyzem, hogy a property dokumentcis stringje itt az x tulajdonsg docstringje : c l a s s C: d e f __init__ ( s e l f ) : s e l f . _x = None @property def x( s e l f ) : " " " En vagyok az x t u l a j d o n s g . " " " r e t u r n s e l f . _x @x . s e t t e r def x( s e l f , value ) : s e l f . _x = v a l u e @x . d e l e t e r def x( s e l f ) : 92 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba d e l s e l f . _x # autot e s t =============================== i f __name__ == __main__ : t e s t = C( ) t e s t . x = 10 # s e t t e r print ( test . x) # getter p r i n t (C. x . __doc__) # documentation """ 10 En vagyok az x t u l a j d o n s g . """
8.3.
8.3.1.
Fggvnytechnikk
A lambda direktva
Funkcionlis nyelvek (mint amilyen a Lisp) konstrukcija, a lambda direktva lehetv teszi egy anonim fggvny denilst, aminek a visszatrsi rtke egy kifejezsre van korltozva. Szintaxis lambda [paramterek]:kifejezs
Pldul ennek a fggvnynek "s" a visszatrsi rtke, ha az argumentuma nem 1, klnben egy res karakterlnc : s = lambda x : " " i f x == 1 e l s e " s " Tovbbi pldk :
>>> d e f makeIncrementor ( n ) : r e t u r n lambda x : x+n >>> f 2 = makeIncrementor ( 2 ) >>> f 6 = makeIncrementor ( 6 ) c Robert Cordeau 93
Bevezets a Python 3-ba >>> p r i n t ( f 2 ( 3 ) , f 6 ( 3 ) ) 5 9 >>> >>> L = [ lambda x : x 2 , lambda x : x 3 , lambda x : x 4 ] >>> f o r f i n L : p r i n t ( f ( 2 ) , end=" " ) 4 8 16
8.3.2.
A funkcionlis programozs egy programozsi paradigma, ami a szmtsokat matematikai fggvnyek kirtkelsnek tekinti s elutastja az llappotvltozst s az adatok megvltoztatst. A fggvnyek alkalmazst hangslyozza, szemben az imperatv programozssal, ami az llapotvltozsokat helyezi eltrbe 2 . A funkcionlis paradigma nem hasznl llapotokat egy program lersra, hanem egymsba gyazott fggvnyeket, amiket gy tekinthetnk mint "fekete dobozokat", amiket egymsba gyazhatunk. Minden doboznak tbb bemeneti paramtere van, de csak egyetlen kimenete van, minden bemeneti rtk n-esre csak egy lehetsges kimeneti rtket adhat ki. gy a fggvnyek nem bezetnek be mellkhatsokat. A program teht egy alkalmazs matematikai rtelemben, ami csak egyetlen eredmnyt ad minden egyes bemeneti rtkegyttesre 3 . A funkcionlis programozs hrom fogalmon nyugszik : mapping, ltering s reducing, amiket a Pythonban hrom fggvnyel implementltak : map(), filter() s reduce(). A map() fggvny :
map() - egy fggvnyt alkalmaz egy szekvencia minden elemre s visszatrsi rtkknt egy iterrtort ad :
>>> d e f r e n v o i T i t r e s ( element ) : r e t u r n element . t i t l e ( ) >>> map( r e n v o i T i t r e s , [ f i a t l u x , " l o r d o f t h e f l y " ] ) <map o b j e c t a t 0 x3602490> >>> [ element . t i t l e ( ) f o r element i n [ f i a t l u x , " l o r d o f t he f l y " ] ] [ F i a t Lux , Lord Of The Fly ]
2 3
94
Megjegyzem, hogy a map() helyettesthet egy szktett listval. A filter() fggvny : filter() - ltrehoz s visszaad egy iterrtort egy listn, ami a kiindulsi szekvencia mindazon elemeit tartalmazza, amik megfelelnek a kvetkez kritriumnak : function(element) == True :
Megjegyzem, hogy a filter() helyettesthet egy tesztes szktett listval. A reduce() fggvny : reduce() - a functools modul egy fggvnye. Egy kt argumentumos fggvnyt alkalmaz kumulatv mdon balrl jobbra egy szekvencia elemeire gy, hogy ezt a szekvencit egy rtkre reduklja, amit visszatrsi rtkknt ad :
sum ( [ 1 , 2 , 3 , 4 ] )
c Robert Cordeau
95
8.3.3.
Parcilis fggvny-alkalmazsok
A funkcionlis programozs konstrukcija, egy n-paramteres PFA (parcilis fggvnyalkalmazs) az els argumentumot rgztett paramterknt veszi s visszatrsi rtkl egy - a maradk n-1 paramtert hasznl - fggvnyobjektumot (vagy pldnyt) ad.
Egyszer plda :
>>> from f u n c t o o l s import p a r t i a l >>> baseTwo = p a r t i a l ( i n t , base =2) >>> baseTwo ( 10010 ) 18 A PFA-k nagyon hasznosak parcilis widget-modellek ellltsnl, amiknek gyakran szmos paramterk van. A kvetkez pldban jra deniljuk a Button osztlyt bizonyos paramtereit rgztve (amiket mindg fell lehet rni) : from f u n c t o o l s import p a r t i a l import t k i n t e r as tk r o o t = tk . Tk ( ) # i n s t a n c i a t i o n p a r t i e l l e de c l a s s e : MonBouton = p a r t i a l ( tk . Button , r o o t , f g= p u r p l e , bg= g r e e n ) MonBouton ( t e x t=" Bouton 1 " ) . pack ( ) MonBouton ( t e x t=" Bouton 2 " ) . pack ( ) MonBouton ( t e x t="QUITTER" , bg= re d , f g= b l a c k , command=r o o t . q u i t ) . pack ( f i l l =tk . X, expand=True ) r o o t . t i t l e ( "PFA ! " ) r o o t . mainloop ( )
96
9.1.
Esemnyvezrelt programok
Grakus objektumok programozsakor a script szekvencilis vgrehajtst egy esemnykezel programhurokkal helyettestik. (Lsd 9.1 brt.)
9.2.
9.2.1.
A tkinter knyvtr
Bemutats
Ez egy elg egyszer knyvtr, ami a John K. Ousterhout ltal 1988-ban a Berkeley University-n kifejlesztett Tcl nyelv gralus kiterjesztsbl, a Tk-bl szrmazik. Ez a kiterjeszts szles krben elterjedt a Tcl/Tk-n kvl. Hasznlhatjuk Perlben, Pythonban, Rubyban, stb. A Python esetben a kiterjesztst tneveztk tkinterre. c Robert Cordeau 97
A Tk-val prhuzamosan fejlesztettek egyb kiterjesztseket, melyek kzl egyeseket hasznlnak Pythonban. Pldul a standard Tix modul mintegy negyven widget-et knl a fejlesztnek. A Tcl/Tk nyelv igen fejlett. Az aktulis 8.5 verzi egy Ttk nev knyvtrat knl fel, ami lehetv teszi a widget-ek klnbz stlusokban trtn "felltztetst". Ez a modul a Python 3.1.1-ben is rendelkezsre ll. Egy egyszer tkinter plda. 9.2
import t k i n t e r wi dg et = t k i n t e r . Label ( None , t e x t= Bonjour monde g r a p h i q u e ! ) wi dg et . pack ( ) # a Label poz c i o n l sa wi dg et . mainloop ( ) # az esem n y k e z e l hurok e l i n d t sa
9.2.2.
A tkinter widget-ek
Denci A widget sz, ami a window s a gadget szavak sszevonsval keletkezett, egy knyvtr grakus alapelemeit jelli.
A tkinter fbb widget-jeinek listja: Widget Tk Frame Label Button Message Entry Checkbutton Radiobutton Scale PhotoImage BitmapImage Menu Menubutton Scrollbar Listbox Funkci a legmagasabb szint ablak ms widget-ek szervezsre szoll kontner zenetmez gomb szveggel vagy kppel tbb soros szveg kiratsra val mez adatbersra val mez kt llapot gomb kt - egymst kizr - llapot gomb tbbllapot csszka kpeknek widget-re val elhelyezsre szolgl bitmap-eknek widget-re val elhelyezsre szolgl a Menubutton-hoz kapcsoldik egy menopcit megnyit gomb grgetsv lehetv teszi a felhasznl ltal megadott adatok kivlasztst a legrdl listbl Text tbbsoros szveg szerkesztse Canvas zna rajzok s fotk szmra OptionMenu legrdl men ScrolledText a Text widget grgetsvval PanedWindow interface flekkel (tabs) LabelFrame egy keretet s egy cmet tartalmaz Spinbox tbbszrs kivlasztst lehetv tev widget 9.1. tblzat: A tkinter fbb widget-jei
9.2.3.
Widget-ek pozcionlsa
c Robert Cordeau
99
Bevezets a Python 3-ba Pozcikezel Funkci packer Minden egyes widget-et mretez s pozcionl egy widgetkontnerben az egyes widget-ek helyignynek megfelelen gridder Minden egyes widget-et mretez s pozcionl egy widgetkontner egy tblzatnak a celliban placer Minden egyes w widget-et mretez s pozcionl egy widgetkontnerben annak megfelelen, amit a w ignyel.
9.3.
9.3.1.
Kt plda
tkPhone, egy men nlkli plda
Egy telefonknyvet kezel scriptet fogunk rni. Az alkalmazs megjelenst a 9.3 bra mutatja. Grakus tervezs A grakus tervezs segteni fog a j widgetek kivlasztsnl. Elszr is termszetes dolog hrom znt megklnbztetni : 1. a kiratsra sznt fels znt; 2. a kzps zna egy nvsor szerint rendezett lista; 3. az als znt a fltte lv listt kezel gombok kpezik. Ezen znk mindegyikt egy-egy Frame() objektummal kdoltuk, amiket a packer metdussal pozcionltunk egyms al s mindhrmat egy Tk() objektumba foglaltunk bele (lsd a fenti brt) A grakus interface kdja A problmk elvlasztsa rdekben a kvetkez mdszer ajnlott : Megjegyzs Vlasszuk el egymstl a grakus interface s a callback-ek kdjt.
Els lpsknt kvetkezzen a grakus interface kdja. Az inicializtor ltrehoz egy phoneList attributumot, egy listt, amit az adatokat trol le adataival feltlt (ha a le nem ltezik, akkor ltrehozza azt), ltrehozza a root alapablakot s hvja a makeWidgets() metdust. Ez a metdus kveti a grakus tervezst s feltlti a frame-ek mindegyikt. A 100 c Hungarian Translation Darczy Pter
9.3. bra. tkPhone callback-ek resek (a minimlis pass utastst tartalmazzk). Mint minden j modul esetben, egy auto-teszttel ellenrizni lehet az interface j mkdst (ebben az esetben a j kinzetet) :
# c o d i n g : UTF8 import t k i n t e r as tk # class c l a s s Allo_IHM ( o b j e c t ) : " " " IHM de l a p p l i c a t i o n r p e r t o i r e t l phonique . " " " d e f __init__ ( s e l f , f i c ) : " " " I n i t i a l i s a t e u r / l a n c e u r de l a f e n e t r e de base " " " s e l f . phoneList = [ ] self . fic = fic # f = open ( f i c ) try : f = open ( f i c ) for l i n e in f : s e l f . p h o n e L i s t . append ( l i n e [ : 1]. s p l i t ( ) ) e x c e p t : # c r a t i o n du f i c h i e r de r p e r t o i r e c Robert Cordeau 101
Bevezets a Python 3-ba f = open ( s e l f . f i c , "w" ) finally : f . close () s e l f . phoneList . s o r t () s e l f . r o o t = tk . Tk ( ) s e l f . root . t i t l e ( " Allo ! " ) s e l f . r o o t . c o n f i g ( r e l i e f =tk . RAISED, bd=3) s e l f . makeWidgets ( ) s e l f . r o o t . mainloop ( ) d e f makeWidgets ( s e l f ) : " Configure et positionne l e s widgets " # frame " s a i s i e " ( en haut avec bouton d e f f a c e m e n t ) frameH = tk . Frame ( s e l f . r o o t , r e l i e f =tk .GROOVE, bd=2) frameH . pack ( ) tk . Label ( frameH , t e x t="Nom : " ) . g r i d ( row=0, column =0, s t i c k y=tk .W) s e l f . nameEnt = tk . Entry ( frameH ) s e l f . nameEnt . g r i d ( row=0, column =1, s t i c k y=tk .W, padx=5, pady=10) tk . Label ( frameH , t e x t=" Tel : " ) . g r i d ( row=1, column =0, s t i c k y=tk .W) s e l f . phoneEnt = tk . Entry ( frameH ) s e l f . phoneEnt . g r i d ( row=1, column =1, s t i c k y=tk .W, padx=5, pady=2) b = tk . Button ( frameH , t e x t=" E f f a c e r " , command= s e l f . c l e a r ) b . g r i d ( row=2, column =0, columnspan =2, pady=3) # frame " l i s t e " ( au m i l i e u ) frameM = tk . Frame ( s e l f . r o o t ) frameM . pack ( ) s e l f . s c r o l l = tk . S c r o l l b a r ( frameM ) s e l f . s e l e c t = tk . L i s t b o x ( frameM , yscrollcommand= s e l f . s c r o l l . s e t , h e i g h t =6) s e l f . s c r o l l . c o n f i g (command= s e l f . s e l e c t . yview ) s e l f . s c r o l l . pack ( s i d e=tk . RIGHT, f i l l =tk . Y, pady=5) 102 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba s e l f . s e l e c t . pack ( s i d e=tk . LEFT, f i l l =tk .BOTH, expand =1, pady=5) # r e m p l i s s a g e de l a L i s t b o x # f o r i in s e l f . phoneList : s e l f . s e l e c t . i n s e r t ( tk .END, i [ 0 ] ) s e l f . s e l e c t . bind ( "<DoubleButton1>" , lambda e v e n t : s e l f . a f f i c h e r ( e v e n t ) ) # frame " boutons " ( en bas ) frameB = tk . Frame ( s e l f . r o o t , r e l i e f =tk .GROOVE, bd=3) frameB . pack ( pady=3) b1 = tk . Button ( frameB , t e x t=" A j o u t e r " , command= s e l f . a j o u t e r ) b2 = tk . Button ( frameB , t e x t=" Supprimer " , command= s e l f . supprimer ) b3 = tk . Button ( frameB , t e x t=" A f f i c h e r " , command= s e l f . a f f i c h e r ) b1 . pack ( s i d e=tk . LEFT, pady=2) b2 . pack ( s i d e=tk . LEFT, pady=2) b3 . pack ( s i d e=tk . LEFT, pady=2) def ajouter ( s e l f ) : pass d e f supprimer ( s e l f ) : pass d e f a f f i c h e r ( s e l f , e v e n t=None ) : pass def clear ( s e l f ) : pass # autot e s t i f __name__ == __main__ : app = Allo_IHM ( phones . t x t ) # i n s t a n c i e l IHM
c Robert Cordeau
103
Bevezets a Python 3-ba Az alkalmazs kdja A kvetkez kppen fogjuk hasznlni a modult : Az elz modulbl importljuk az Allo_IHM osztlyt; ltrehozzunk egy leszrmaztatott Allo osztlyt; ennek az inicializtora azrt hvja a szlosztly inicializtort, hogy az elbbi rklje az utbbi minden jellemzjt; jra kell denilni a callback-eket.
# c o d i n g : UTF8 # imports import t k i n t e r as tk from tkPhone_IHM import Allo_IHM # classes c l a s s A l l o ( Allo_IHM ) : " " " R p e r t o i r e t l phonique . " " " d e f __init__ ( s e l f , f i c = phones . t x t ) : " C o n s t r u c t e u r de l IHM . " Allo_IHM . __init__ ( s e l f , f i c ) def ajouter ( s e l f ) : # maj de l a l i s t e ajout = [ " " , " " ] a j o u t [ 0 ] = s e l f . nameEnt . g e t ( ) a j o u t [ 1 ] = s e l f . phoneEnt . g e t ( ) i f ( a j o u t [ 0 ] == " " ) o r ( a j o u t [ 1 ] == " " ) : return s e l f . p h o n e L i s t . append ( a j o u t ) s e l f . phoneList . s o r t () # maj de l a l i s t e b o x s e l f . s e l e c t . d e l e t e ( 0 , tk .END) f o r i in s e l f . phoneList : s e l f . s e l e c t . i n s e r t ( tk .END, i [ 0 ] ) s e l f . clear () s e l f . nameEnt . f o c u s ( ) 104 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba # maj du f i c h i e r f = open ( s e l f . f i c , " a " ) f . w r i t e ( "%s%s \n " % ( a j o u t [ 0 ] , a j o u t [ 1 ] ) ) f . close () d e f supprimer ( s e l f ) : s e l f . clear () # maj de l a l i s t e retrait = [ " " , " " ] r e t r a i t [ 0 ] , r e t r a i t [ 1 ] = s e l f . phoneList [ i n t ( s e l f . s e l e c t . curselection ( ) [ 0 ] ) ] s e l f . p h o n e L i s t . remove ( r e t r a i t ) # maj de l a l i s t e b o x s e l f . s e l e c t . d e l e t e ( 0 , tk .END) f o r i in s e l f . phoneList : s e l f . s e l e c t . i n s e r t ( tk .END, i [ 0 ] ) # maj du f i c h i e r f = open ( s e l f . f i c , "w" ) f o r i in s e l f . phoneList : f . w r i t e ( "%s%s \n " % ( i [ 0 ] , i [ 1 ] ) ) f . close () d e f a f f i c h e r ( s e l f , e v e n t=None ) : s e l f . clear () name , phone = s e l f . p h o n e L i s t [ i n t ( s e l f . s e l e c t . curselection ( ) [ 0 ] ) ] s e l f . nameEnt . i n s e r t ( 0 , name ) s e l f . phoneEnt . i n s e r t ( 0 , phone ) def clear ( s e l f ) : s e l f . nameEnt . d e l e t e ( 0 , tk .END) s e l f . phoneEnt . d e l e t e ( 0 , tk .END) # f program # app = A l l o ( ) # l t r e h o z z a az a l k a l m a z s t
c Robert Cordeau
105
9.3.2.
Minden Python disztribucinak rsze az IDLE alkalmazs - egy Pythonban rt interpreter/editor 1 . Ez az alkalmazs egy komplett grakus interface-szel rendelkez mens alkalmazs (lsd 9.4 brt). A forrskdja hozzfrhet s s nmagban egy komplett tkinter tanfolyamot kpez 2 .
1 2
Egyes linuxdisztribcikban az IDLE egy klnll csomag. De tlsgosan terjedelmes ahhoz, hogy ebben a jegyzetben trgyaljuk ...
106
Bevezets a Python 3-ba Motivlt szakembereket gyjts a projekt kr, teremtsd meg a feltteleket a munkjukhoz Szorgalmazd a szemtl-szembeni prbeszdet a teamen bell az informci cserre A halads legjobb mrtke a mkd szoftver "Agile process" fenntarthat fejldst sztnz A fejlesztknek s a megrendelnek egy lland temet kell fenntartani a fejlesztsi folyamatban A kivl mszaki sznvonalra s a j tervre folyamatosan gyelni kell Egyszersg csak az igazn fontos feladat elvgzse Az nszervezd, aktv teamektl szrmaznak a legjobb megoldsok (szerkezetekre, kvetelmnyekre, tervekre) Rendszeres idkznknt a teamnek nvizsglatot kell tartani s viselkedst esetleg mdostani Ezen elveket kvet mdszerek: Extreme Programming Adaptive Software Development Dynamic Software Development Method Scrum Crystal Feature Driven Development Agile Modeling Ez a loza a projektfejleszts ciklusnak egszre rvnyes, most viszont csak a dokumentls s a tesztek problmjra fogunk szortkozni. 108 c Hungarian Translation Darczy Pter
10.1.
A tesztek
Attl kezdve, hogy egy program tljut a kismret script stdiumon, elkerlhetetlenl megjelenik a hibk s a tesztek problmja. Denci Egy teszt abbl ll, hogy a dokumentciban megadott jellemzt egy use casenek megfelel forgatknyv szerint hvunk s megvizsgljuk, hogy ez a jellemz gy viselkedik-e ahogyan azt terveztk.
Mdszer Az "agile development" lozjnak megfelelen a teszteket a kd rsval egyidben vagy elbb rjk meg. Tesztvezrelt fejlesztsrl (TDD = Test Driven Developpement) beszlnk.
10.1.1.
Kt tesztcsaldot klnbztetnk meg : Unit tesztek : Unit: egy program legkisebb klnllan tesztelhet rsze (procedurlis nyelv esetn egy fggvny, objektum orientlt nyelv esetn egy metdus). A tesztesetek egymstl fggetlenek, a teszteket a programozk rjk. Megllapods szerint minden modul kapcsolatban van a unit test modulok egyikvel, ami a csomag egy tests folderben van. Pldul : egy calculus.py nev modulnak lesz egy tests/test_calculus.py nev tesztmodulja. Funkcionlis tesztek : a teljes alkalmazst egy "fekete doboznak" veszik s gy manipulljk, ahogyan a vgfelhasznl tenn. Ezeknek a teszteknek ugyanazokon az interface-eken keresztl kell trtnni, mint amiket a felhasznlk hasznlnak, ezrt ezek a programre nzve specikusak s nehezebb ket kidolgozni. Megemlthetem a kvetkez projekteket : Mechanize : ez a knyvtr automatizlja a WEB-oldalak kivlasztst s a velk val interakcit Selenium : funkcionlis tesztek WEB-alkalmazsok szmra egy valdi bngszben; guitest : GTK alkalmazsokat tesztel; FunkLoad : egy benchmark s riportkszt rendszer c Robert Cordeau 109
10.1.2.
A tesztvezrelt fejleszts
Az unittest modul szolgltatja a PyUnit tool-t, amit ms nyelvekben is megtallhatunk : JUnit (Java), NUnit (.Net), JSUnit (Javascript). Ezek mind egy eredetileg a SmallTalk nyelv szmra kifejlesztett tool-bl - az SUnit-bl erednek. A PyUnit a TestCase alaposztlyt knlja fel a felhasznlnak. Minden, a TestCase-bl leszrmaztatott osztlyban implementlt s test_ prex-szel elltott metdust unittesztnek tekint. Egy egyszer plda. 1 A kdot unittest.py nven elmentve, a konzolrl python unittest.py -knt hajtathatjuk vgre. This i s a s i m p l e program t o demonstrate how t o c r e a t e a u n i t t e s t i n Python . For more i n f o r m a t i o n and documentation , p l e a s e s e e t he o f f i c i a l documentation page h e r e : h t t p : / / docs . python . o rg / l i b r a r y / u n i t t e s t . html import u n i t t e s t #I n c l u d e th e pyUnit u n i t t e s t framework d e f add ( a , b , c =0): A s i m p l e adding f u n c t i o n t o demo u n i t t e s t r e t u r n a+b+c # The f o l l o w i n g i s th e c l a s s i n which a l l # f u n c t i o n s w i l l be ran by u n i t t e s t c l a s s AddTest ( u n i t t e s t . TestCase ) : Main c l a s s f o r add t e s t i n g ; Can be added t o a s u i t e # The f u n c t i o n " setUp " w i l l always be ran i n o r d e r t o # s e t u p th e t e s t environment b e f o r e a l l th e t e s t s have run . d e f setUp ( s e l f ) : V e r i f y environment i s s e t u p p r o p e r l y # Printed i f t e s t f a i l s pass # The f u n c t i o n " tearDown " w i l l always be ran i n o r d e r t o # c l e a n u p th e t e s t environment a f t e r a l l th e t e s t s have run . d e f tearDown ( s e l f ) :
1 A plda forrsa : http://www.thelinuxdaily.com/2011/11/getting-started-with-python-unit-testing-pyunit/
110
Bevezets a Python 3-ba V e r i f y environment i s t o r e down p r o p e r l y # Printed i f t e s t f a i l s pass # F u n c t i o n s b e g i n n i n g with " t e s t " w i l l be ran # as a u n i t t e s t . def test_positive_add ( s e l f ) : V e r i f y t h a t adding p o s i t i v e numbers works # Printed i f t e s t f a i l s s e l f . a s s e r t E q u a l ( add ( 1 0 , 2 3 , 2 2 ) , 5 5 ) # Test w i l l f a i l i f " f a l s e " ( b o o l e a n ) s e l f . a s s e r t E q u a l ( add ( 1 1 , 2 3 ) , 3 4) s e l f . a s s e r t E q u a l ( add ( 1 , 1 , 1 7 ) , 19 ) # F u n c t i o n s b e g i n n i n g with " t e s t " w i l l be ran # as a u n i t t e s t . # @unittest . skip ( " demonstrating skipping " ) # Skip t h i s t e s t ( Python >= 2 . 7 ) d e f test_negative_add ( s e l f ) : V e r i f y t h a t adding n e g a t i v e numbers works # Printed i f t e s t f a i l s s e l f . a s s e r t E q u a l ( add ( 12 ,23) , 11 ) # F u n c t i o n s b e g i n n i n g with " t e s t " w i l l be ran # as a u n i t t e s t . # In t h i s ca s e , t h i s t e s t w i l l be s k i p p e d . #@ u n i t t e s t . s k i p ( " d e m o n s t r a t i n g s k i p p i n g " ) d e f test_negative_add_skip ( s e l f ) : V e r i f y t h a t adding n e g a t i v e numbers works # Printed i f t e s t f a i l s s e l f . a s s e r t E q u a l ( add ( 12 ,23) , 11 ) i f __name__==__main__ : u n i t t e s t . main ( ) Egy msik plda :
" " " Sz mol s o k a t v gz modul " " " # fonctions d e f a v e r a g e ( a r g s ) : c Robert Cordeau 111
Bevezets a Python 3-ba " " " Kisz molja az t l a g o t . " " " length = len ( args ) sum = 0 f o r ar g i n a r g s : sum += ar g r e t u r n sum/ l e n g t h def division (a , b ) : " " " Kisz molja a h nyadost . " " " r e t u r n a/b " " "A s z mol s o k a t v gz modul t e s z t m o d u l j a " " " # imports import u n i t t e s t import os import s y s dirName = os . path . dirname ( __file__ ) i f dirName == : dirName = . dirName = os . path . r e a l p a t h ( dirName ) upDir = os . path . s p l i t ( dirName ) [ 0 ] i f upDir not i n s y s . path : s y s . path . append ( upDir ) from c a l c u l s import average , d i v i s i o n # classes c l a s s C a l c u l T e s t ( u n i t t e s t . TestCase ) : def test_average ( s e l f ) : s e l f . a s s e r t E q u a l s ( average (1 , 2 , 3) , 2) s e l f . a s s e r t E q u a l s ( average (2 , 4 , 6) , 4) def test_division ( s e l f ) : s e l f . ass ertEquals ( d i v i s i o n (10 , 5) , 2) s e l f . a s s e r t R a i s e s ( ZeroDivisionError , d i v i s i o n , 10 , 0) def test_suite ( ) : t e s t s = [ u n i t t e s t . makeSuite ( C a l c u l T e s t ) ] 112 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba return unittest . TestSuite ( t e s t s ) i f __name__ == __main__ : u n i t t e s t . main ( ) Egy tesztsorozat vgrehajtshoz egy olyan scriptet kell rni, ami : megkeres minden tesztmodult: ezeknek a neve test_ prex-szel kezddik s egy test nev folderben vannak; a test_suite globlis fggvny suite visszatrsi rtkt begyjti; ltrehozza a tesztek sorozatainak sorozatt s elindtja a tesztsorozatot.
10.2.
A dokumentls
Egy projekt lettartama sorn tbb dokumentcitpust klnbztetnk meg : specikcis dokumentumokat (upstream documentation); a kdhoz kapcsold technikai (mainstream documentation); a felhasznli kziknyveket s ms magas szint dokumentumokat (downstream documentation).
A mainstream dokumentumok a kd ritmusban fejldnek s ezrt gy kell ket kezelni, mint a kdot : egy egyszer szvegszerkesztvel olvashatknak s szerkeszthetknek kell lennik. Kt fontos eszkz van a Python-alkalmazsok dokumentciinak ltrehozsra : a reStructuredText (vagy reST): egy rich text formtum; a doctests : kompatibilis a reST formtummal. Lehetv teszi a szveg kombinlst a tesztekkel. c Robert Cordeau 113
10.2.1.
A reST formtum
A reStructuredText formtum, amit szoksosan reSt-nek neveznek, egy szvegek formzsra hasznlt tag-rendszer.
A A L TEX-tl eltren a dokumentum minsgt "non intrusive" mdon javtja, azaz a le-ok kzvetlenl olvashatk maradnak.
A reST interpretert tartalmaz docutils projekt egy sor utility-t knl fel: a rst2html ): html kimenetet ad integrlt css-sel;
A a rst2latex : egy ekvivalens L TEX-le-t generl;
a rst2s5 : egy s5 formtum prezentcit hoz ltre, ami lehetv teszi interaktv prezentcik ltrehozst HTML-ben. Egy egyszer plda reST formtum textle-ra. Egyebek kztt megjegyzem, hogy : a f-tag az res sor, ami elvlasztja a szveg klnbz strukturit; a strukturls a klnbz szint rszek cmeinek = - _ : , stb. karakterekkel trtn alhzsval trtnik. Amikor az interpreter egy ilymdon alhzott szveget tall, az alkalmazott karaktert sszekti egy fejezetszinttel; egy cm alatt s felett ltalban ugyanaz a karaktersor van, mint a kvetkez pldban :
====================== F i c h i e r au format reST ====================== Section 1 ========= On e s t dans l a s e c t i o n 1 . Souss e c t i o n :::::::::::: C e c i e s t une souss e c t i o n .
114
Bevezets a Python 3-ba Soussouss e c t i o n ................. C e c i e s t une soussouss e c t i o n . . . e t c e c i un commentaire Section 2 ========= La s e c t i o n 2 e s t beaucoup p l u s i n t r e s s a n t e que l a s e c t i o n 1 . Section 3 ========= La s e c t i o n 2 e s t un peu v a n t a r d e : la s e c t i o n 1 est t r e s bien . Un t a b l e a u de t r o i s images au format " png " :::::::::::::::::::::::::::::::::::::::::: ======= ======= ======= Image 1 Image 2 Image 3 ======= ======= ======= | shamr | | e l y s T | | h e l e n | ======= ======= ======= . . | shamr | image : : shamr . png . . | e l y s T | image : : e l y s T . png . . | h e l e n | image : : h e l e n . png
Az rst2html utility erre a le-ra alkalmazva ugyanezt a le-t lltja el .html kiterjesztssel.
c Robert Cordeau
115
10.2.2.
A doctest modul
A A L TEX ltrehozja, Donald Knuth literate programming elvt vettk t a Pythonban az API-k dokumentcis stringekkel trtn dokumentlshoz. Az olyan programok, mint az Epydoc ezeket ki tudjk szrni a modulokbl a dokumentum ellltshoz.
Tovbb is mehetnk s alkalmazi pldkat is belefoglalhatunk a dokumentcis stringekbe, melyek interaktv session-k formjban vannak megrva. Nzznk meg hrom pldt. Mindegyik esetben megadom egyrszt a forrskdot a dokumentcis stringjvel, amiben a standard doctest modul lehetv teszi ezeknek a session-knek a kinyerst, majd elindtst annak ellenrzshez, hogy ezek mkdnek; msrszt a v116 c Hungarian Translation Darczy Pter
" " "A d o c t e s t pr bamodulja " " " # import import d o c t e s t # fonctions d e f somme ( a , b ) : " " " V i s s z a t r s i r t ke a + b . >>> somme ( 2 , 2 ) 4 >>> somme ( 2 , 4 ) 6 """ r e t u r n a+b i f __name__ == __main__ : p r i n t ( " \{: ^40\} " . format ( " Mode s i l e n c i e u x " ) ) d o c t e s t . testmod ( ) p r i n t ( "Ha minden rendben van , semmit sem l tunk ! " ) input () p r i n t ( " \{: ^40\} " . format ( " R s z l e t e z md " ) ) d o c t e s t . testmod ( v e r b o s e=True ) A doctest1.py script vgrehajtsnak eredmnye :
Mode s i l e n c i e u x Ha minden rendben van , semmit sem l tunk ! R s z l e t e z md Trying : somme ( 2 , 2 ) E x p e cti ng : 4 ok Trying : somme ( 2 , 4 ) E x p e cti ng : c Robert Cordeau 117
Bevezets a Python 3-ba 6 ok 1 i t e m s had no t e s t s : __main__ 1 items passed a l l t e s t s : 2 t e s t s i n __main__ . somme 2 t e s t s in 2 items . 2 p a s s e d and 0 f a i l e d . Test p a s s e d .
Msodik plda : doctest2.py " " " Module d e s s a i de d o c t e s t . " " "
# fonctions def accentEtrange ( texte ) : " " " Ajoute un a c c e n t t r a n g e un t e x t e . Les r s o n t T r i p l s , l e s e s u i v i d un u Exemple : >>> t e x t e = " Estc e que tu as r e g a r d l a t l h i e r s o i r ? I l y a v a i t un th ma s u r l e s r a m a s s e u r s d e s c a r g o t s en Laponie , i l s en bavent . . . " >>> a c c e n t E t r a n g e ( t e x t e ) Estceu queu tu as rRreugarRrd l a t l h i e u r R r s o i r R r ? I l y a v a i t un th ma surRr l e u s rRramasseuurRrs d e u s c a r R r g o t s eun Laponieu , i l s eun baveunt . . . C ette t e c h n i q u e permet d i n t e r n a t i o n n a l i s e r l e s a p p l i c a t i o n s pour l e s r e n d r e c o m p a t i b l e s avec c e r t a i n e s r g i o n s f r a n c a i s e s . """ t e x t e = t e x t e . r e p l a c e ( r , rRr ) p r i n t ( t e x t e . r e p l a c e ( e , eu ) ) def _test ( ) : import d o c t e s t d o c t e s t . testmod ( v e r b o s e=True ) 118 c Hungarian Translation Darczy Pter
Trying : t e x t e = " Estc e que tu as r e g a r d l a t l h i e r s o i r ? I l y a v a i t un th ma s u r l e s r a m a s s e u r s d e s c a r g o t s en Laponie , i l s en bavent . . . " E x p e cti ng n o t h i n g ok Trying : accentEtrange ( texte ) E x p e cti ng : Estceu queu tu as rRreugarRrd l a t l h i e u r R r s o i r R r ? I l y a v a i t un th ma surRr l e u s rRramasseuurRrs d e u s c a r R r g o t s eun Laponieu , i l s eun baveunt . . . ok 2 i t e m s had no t e s t s : __main__ __main__ . _ t e s t 1 items passed a l l t e s t s : 2 t e s t s i n __main__ . a c c e n t E t r a n g e 2 t e s t s in 3 items . 2 p a s s e d and 0 f a i l e d . Test p a s s e d .
c Robert Cordeau
119
""" This i s th e " example " module . The example module s u p p l i e s one f u n c t i o n , f a c t o r i a l ( ) . For example , >>> f a c t o r i a l ( 5 ) 120 """ def f a c t o r i a l (n ) : " " " Return t he f a c t o r i a l o f n , an e x a c t i n t e g e r >= 0 . I f th e r e s u l t i s s m a l l enough t o f i t i n an i n t , r e t u r n an i n t . E l s e r e t u r n a l o n g . \ h y p e r t a r g e t { page110 }{Egy} >>> [ f a c t o r i a l ( n ) f o r n i n range ( 6 ) ] [ 1 , 1 , 2 , 6 , 24 , 120] >>> f a c t o r i a l ( 3 0 ) 265252859812191058636308480000000 >>> f a c t o r i a l ( 1) Traceback ( most r e c e n t c a l l l a s t ) : ... V a l ueErro r : n must be >= 0 F a c t o r i a l s o f f l o a t s a r e OK, but th e f l o a t must be an e x a c t i n t e g e r : >>> f a c t o r i a l ( 3 0 . 1 ) Traceback ( most r e c e n t c a l l l a s t ) : ... V a l ueErro r : n must be e x a c t i n t e g e r >>> f a c t o r i a l ( 3 0 . 0 ) 265252859812191058636308480000000 I t must a l s o not be r i d i c u l o u s l y l a r g e : >>> f a c t o r i a l ( 1 e100 ) Traceback ( most r e c e n t c a l l l a s t ) : ... O v e r f l o w E r r o r : n t oo l a r g e """
120
Bevezets a Python 3-ba import math i f not n >= 0 : r a i s e Val ueErr or ( " n must be >= 0 " ) i f math . f l o o r ( n ) != n : r a i s e Val ueErr or ( " n must be e x a c t i n t e g e r " ) i f n+1 == n : # c a t c h a v a l u e l i k e 1 e300 r a i s e O v e r f l o w E r r o r ( " n t oo l a r g e " ) result = 1 factor = 2 w h i l e f a c t o r <= n : r e s u l t = f a c t o r f a c t o r += 1 return r e s u l t def _test ( ) : import d o c t e s t d o c t e s t . testmod ( v e r b o s e=True ) i f __name__ == "__main__" : _test ( ) p r i n t ( "OK" )
A script vgrehajtsnak eredmnye : Trying : f a c t o r i a l (5) E x p e cti ng : 120 ok Trying : [ f a c t o r i a l ( n ) f o r n i n range ( 6 ) ] E x p e cti ng : [ 1 , 1 , 2 , 6 , 24 , 120] ok Trying : f a c t o r i a l (30) E x p e cti ng : 265252859812191058636308480000000 ok Trying : f a c t o r i a l ( 1) c Robert Cordeau 121
Bevezets a Python 3-ba E x p e c ti ng : Traceback ( most r e c e n t c a l l l a s t ) : ... V al ueErro r : n must be >= 0 ok Trying : factorial (30.1) E x p e c ti ng : Traceback ( most r e c e n t c a l l l a s t ) : ... V al ueErro r : n must be e x a c t i n t e g e r ok Trying : factorial (30.0) E x p e c ti ng : 265252859812191058636308480000000 ok Trying : f a c t o r i a l ( 1 e100 ) E x p e c ti ng : Traceback ( most r e c e n t c a l l l a s t ) : ... O v e r f l o w E r r o r : n t oo l a r g e ok 1 i t e m s had no t e s t s : __main__ . _ t e s t 2 items passed a l l t e s t s : 1 t e s t s i n __main__ 6 t e s t s i n __main__ . f a c t o r i a l 7 t e s t s in 3 items . 7 p a s s e d and 0 f a i l e d . Test p a s s e d . OK
10.2.3.
Amint az lthat, innentl kezdve a kdba beptett dokumentci a kdfejleszts gyengjt jelenti : amikor a dokumentci mrete n, nem ltjuk a kdot ! A megolds ennek a dokumentcinak az thelyezse : a doctest.testfile() 122 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba fggvny lehetv teszi a dokumentcis le nevnek megadst. Ami tbblet, ezt a le-t reST formtumban rhatjuk, gy kt legyet tnk egy csapsra. Egyrszt fggvnybe (illetve metdusba) integrlt tesztjeink vannak, ms rszt ugyanaz a le napraksz dokumentcit szolgltat.
c Robert Cordeau
123
Az ASCII szmra egyetlen byte elegend lenne, de a Unicode millinyi lehetsgnek reprezentlsra karakterenknt tbb byte szksges. Az ASCII szmra egyetlen byte elegend lenne, de a Unicode millinyi lehetsgnek reprezentlsra karakterenknt tbb byte szksges. c Robert Cordeau 125
A.2. bra. A Unicode tblzat kivonata Mivel a szvegek tbbsge csak az ASCII tblzatot hasznlja, ami ppen az Unicode tblzat als rsznek felel meg, ezrt a leggazdasgosabb kdols az UTF-8. A 0 s 127 kz es kdokra az UTF-8 az ASCII tblzat byte-jait hasznlja. Specilis karakterekhez (128 s 2047 kztti kdok) az az UTF-8 kt byte-ot hasznl. A mg kevsb gyakori specilis karakterekhez (2048 s 65535 kztti kdok) az UTF-8 hrom byte-ot hasznl s gy tovbb. Szimblum Szm Bitek Plda az "" Unicode karakter UTF-8 kdolsra : 233 C3 A9 Gyakorlati alkalmazsok A be- s kimenetek Fontos, hogy meg tudjuk adni, programjaink pontosan milyen formban vrjk az adatokat. Az adatokat a tasztaturn keresztl billentyzzk be vagy valahonnan importljuk ket. Ugyangy ki kell tudnunk vlasztani az ltalunk exportlt adatok formtumt, amiket tetszleges perifriaeszkzn keresztl exportlunk, legyen sz egy nyomtatrl, egy diszkrl, egy monitorrl ... Ezeket a be- s kimeneti karakterlncokat mindg gy kell tekinteni, hogy konkrtan byte-sorozatokrl van sz s klnbz mechanizmusokat kell alkalmaznunk ezen 126 c Hungarian Translation Darczy Pter
Bevezets a Python 3-ba byte-sorozatoknak karakterlncc alaktsra illetve az ellenkez irny talaktsra. A Python mostantl fogva egy j adattpust bocst a rendelkezsnkre, a bytes tpust, amit specilisan byte-sorozatok (illetve karakterlncok) kezelsre terveztek. A karakterek termszetesen byte-okban lehetnek kdolva s a byte-ok karakterekbe lehetnek dekdolva (specilisan UTF-8 kdolssal, amit az imnt lttunk):
>>> c h a i n e = " Egy l p s \n " >>> o f = open ( " t e s t . t x t " , "w" ) >>> o f . w r i t e ( c h a i n e ) 10 >>> o f . c l o s e ( ) >>> o f = open ( " t e s t . t x t " , " rb " ) >>> o c t e t s = o f . read ( ) >>> type ( c h a i n e ) < c l a s s s t r > >>> p r i n t ( c h a i n e ) Egy l p s >>> l e n ( c h a i n e ) 10 >>> type ( o c t e t s ) < c l a s s b y t e s > >>> p r i n t ( o c t e t s ) b Egy l \ xc3 \ xa9p \ xc3 \ xa9s \n >>> l e n ( o c t e t s ) 12
A Python scriptek esete Mivel a Python-scriptek szvegek, ezrt fennll a veszly, hogy ms szabvny szerint vannak kdolva. Annak rdekben, hogy a Python korrekt mdon tudja ket interpretlni, rdemes pontosan megadni a karakterkszletet (ktelezen a script 2. vagy 3. sorban). Elzleg ismerni kell a rendszernk ltal hasznlt karakterkszletet (lsd a A.3 brt).
c Robert Cordeau
127
# c o d i n g : cp1252
# c o d i n g : UTF8
128
Bevezets a Python 3-ba Az Unicode-hibk elkerlshez Az Unicode-hibk elkerlsre szolgl technika abbl ll, hogy be-/kimenetek pillanatban jelezzk a kdolst. Pldul :
>>> c h a i n e = " Egy l p s \n " >>> o f = open ( " t e s t . t x t " , "w" , e n c o d i n g=" Latin 1" ) >>> o f . w r i t e ( c h a i n e ) 10 >>> o f . c l o s e ( ) >>> o f = open ( " t e s t . t x t " , " r " , e n c o d i n g=" Latin 1" ) >>> ch_lue = o f . read ( ) >>> o f . c l o s e ( ) >>> ch_lue Egy l p s \n
c Robert Cordeau
129
130
c Robert Cordeau
131
132
D. Fggelk A hash-fggvnyek
Mkdsi elv A hash fggvny egy f alkalmazs, aminek a bemenete klnbz hosszsg le-ok, amiket tmrt s kimenetknt egy rgztett hosszsg binris sorozatot ad ( lsd D.1 brt) : f : { 0, 1 } { 0, 1 }k ahol f rtelmezsi tartomnya a { 0, 1 } = { , 0, 1, 10, 11, 100, 101, ... } binris sorozatok halmaza, rtkkszlete a k db bitbl ll { 0, 1 }k = { 0...00, 0...01, 0...10, ..., 1...11 } binris szekvencik halmaza. Ennek az alkalmazsnak lehetv kell tenni a bemeneti le-ok azonostst : f (x) = f (y) akkor s csak akkor, ha x = y . Viszont a vges k hossz miatt nem tudjuk visszalltani a le-okat:ltezik kt klnbz x s y (klnbz le-ok) gy, hogy f (x) = f (y) (ugyanaz a binris szekvencia). Ekkor tkzsrl (collision) beszlnk. Gyakorlati megvalsts Kt problmt kell megoldani : egy elg hossz binris szekvencia vlasztsval cskkenteni kell az tkzsek szmt. Pldul k = 512-vel 2512 azaz 10154 cella ll rendelkezsre. egy megfelel algoritmussal a kezelni kell a fennmarad tkzseket.
c Robert Cordeau
133
D.1. bra. A hashing mkdsi elve Alkalmazs a sztrakra S memrink van m adat trolsra. Mindegyik adathoz asszociatv tmb segtsgvel tudunk hozzfrni, ahol a szgletes zrjelben szerepl informcit kulcsnak hvjk : S[0], S[1], ..., S[m 1]. Pldul karakterkulcsokkal a kvetkez mdon denilt hash-fggvnyt fogunk hasznlni : f : { a, b, c, ..., z } { 0, 1, 2, ..., m 1 }k A kvetkez informcik legyenek egy sztrban trolva ( lsd D.2 brt): lapin renard hrisson ours 12 2 4 1
D.2. bra. Egy sztr kulcsainak hash-else 134 c Hungarian Translation Darczy Pter
E. Fggelk Forrsok
E.1. WEB-es forrsok
ltalnos : . . .
www.python.org http://pypi.python.org/pypi/ http://code.google.com/p/pythonxy/wiki/Downloads?tm=2 http://rgruet.free.fr
Specilis EDI-k :
www.wingware.com/downloads/wingide-101 http://eric-ide.python-projects.org/eric-download.htm www.eclipse.org/downloads/ www.scintilla.org/SciTEDownload.html
Eszkzk :
www.gnuplot.info/
c Robert Cordeau
135
F. Fggelk Fogalmak
136
Irodalomjegyzk
[1] Swinnen, Grard Apprendre programmer avec Python 3. Eyrolles, 2010. [2] Summereld, Mark Programming in Python 3. Addison-Wesley, 2e dition, 2009. [3] Martelli, Alex Python en concentr. OReilly, 2004. [4] Lutz, Mark et Bailly, Yves Python prcis et concis OReilly, 2e dition, 2005. [5] Ziad, Tarek Programmation Python. Conception et optimisation, Eyrolles, 2e dition, 2009. [6] Ziad, Tarek Python : Petit guide lusage du dveloppeur agile Dunod, 2007. [7] Ziad, Tarek Expert Python Programming, Packt Publishing, 2008. [8] Younker, Je Foundations of Agile Python Development Apress, 2008.
c Robert Cordeau
137