You are on page 1of 147

Bevezets a Python3-ba

Robert CORDEAU version 2.71... 2012. februr 29.

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

Bevezets a Python 3-ba

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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. Azonostk s kulcsszavak . . . . . . . . . . . . . . . . . . . . . . . . 10 c Robert Cordeau iii

Bevezets a Python 3-ba 2.2.1. Azonostk . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

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

Bevezets a Python 3-ba 7. Objektum orientlt programozs 68

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

E.1. WEB-es forrsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 F. Fogalmak 136

c Robert Cordeau

ix

Bevezets a Python 3-ba

1. fejezet Bevezets az informatikba


Ez a fejezet bemutatja a Python fbb jellemzit, elhelyezi a Pythont a programozsi nyelvek trtnetn bell, meghatrozza a szkriptrs sajtossgait, denilja az algoritmus fogalmt s a rendelkezsre ll klnbz implementcik felsorolsval zrul.

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

1.2.
1.2.1.

Anyagi krnyezet s program


A szmtgp

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

Bevezets a Python 3-ba

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.

A programnyelvek rvid trtnete

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 ...

1.2. bra. Az interpreter mkdse

c Robert Cordeau

Bevezets a Python 3-ba

1.4.2.

A Python-programok ellltsnak technikja

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

Bevezets a Python 3-ba

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

Bevezets a Python 3-ba

2.1. bra. Az IDLE kirtkel ciklusa

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 foglalt szavai

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

A Python 3-nak kt standard egsztpusa van : az int s a bool.

2.4.1.

Az int tpus

Az int tpus mrett csak a gp memrija korltozza.




Az egsz konstansok alaprtelmezetten decimlis szmok, de a kvetkez alapok is hasznlhatk :

  

>>> 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

Bevezets a Python 3-ba 20 % 3 # 2 ( modulo ) abs ( 3 2 0) # a b s z o l u t e r t e k

 

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 :

 

>>> 0 b10110011 # b i n a r i s 179 >>> 0 o263 # o k t a l i s 179 >>> 0xB3 # h e x a d e c i m a l i s 179

2.4.2.

A bool tpus

Kt rtke lehet : False, True, sszehasonlt opertorok :




 

2 > 8 # False 2 <= 8 < 15 # True

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

Bevezets a Python 3-ba p r i n t ( math . f a c t o r i a l ( 9 ) ) # 362880 p r i n t ( math . l o g ( 1 0 2 4 , 2 ) ) # 1 0 . 0

 

2.5.2.

A complex tpus

A komplex szmok descartesi jellssel vannak felrva, amit kt lebegpontos szm alkot; Az imaginrius rszt j kveti :


 

p r i n t (1 j ) # 1 j p r i n t ((2+3 j ) + (47 j ) ) # (64 j ) p r i n t ((9+5 j ) . r e a l ) # 9 . 0 p r i n t ((9+5 j ) . imag ) # 5 . 0 p r i n t ( ( abs (3+4 j ) ) ) # 5 . 0 : module

Egy specilis matematikai modul cmath van a komplex szmoknak fenntartva:




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.


 

a = 2 # a z t mondjuk : a e r t e k u l kapja 2t b = 7 . 2 math . l o g ( math . e / 4 5 . 1 2 ) 2math . p i c = b a

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 rtkads nem sszehasonlts !

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

(a) Hrom rtkads

(b) A c adatot trltk

(c) Az a adatot trltk

2.2. bra. Az rtkads brkkal illusztrlva

2.6.4.


Az rtkads vltozatai

Az egyszer rtkads mellett a kvetkez formkat is hasznlhatjuk :

# 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

Bevezets a Python 3-ba x , y = coorMouse ( ) # fuggveny e r t e k e n e k t o b b s z o r o z e s e

 

2.6.5.

rtkadsok (grakus magyarzatok)

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

Hossz : s = " abcde " len ( s ) # 5 18 c Hungarian Translation Darczy Pter

 

Bevezets a Python 3-ba Konkatenls :




  

s1 = " abc " s2 = " d e f g " s3 = s1 + s2 # a b c d e f g

Ismtls : s4 = " Fi ! " s5 = s4 3 # Fi ! Fi ! Fi ! p r i n t ( s5 )

 

2.7.3.

Karakterlncok : fggvnyek kontra metdusok

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 :


 

ch1 = " abc " l o n g = l e n ( ch1 ) # 3

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 :


 

ch2 = " abracadabra " ch3 = ch2 . upper ( ) # "ABRACADABRA"

2.7.4.

Egy ch karakterlnc llapott vizsgl metdusok

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

Bevezets a Python 3-ba


  

p r i n t ( " cHAise basSe " . i s u p p e r ( ) ) # F a l s e

istitle() : rtke True ha ch-ban minden sznak csak a kezdbetje nagybet:


  

p r i n t ( " Chaise Basse " . i s t i t l e ( ) ) # True

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 :


 

p r i n t ( " abracadabra " . s t a r t s w i t h ( ab ) ) # True p r i n t ( " abracadabra " . endswith ( a ra ) ) # F a l s 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 :


 

p r i n t ( s . c e n t e r ( 2 0 , ) ) # cHAise basSe p r i n t ( s . r j u s t ( 2 0 , @ ) ) # @@@@@@@@cHAise basSe

zfill(width) : a ch stringet baloldalon 0-val egszti ki a width maximlis hosszig :


  

p r i n t ( s . z f i l l ( 2 0 ) ) # 00000000 cHAise basSe

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

Bevezets a Python 3-ba




 

p r i n t ( " " . j o i n ( [ cHAise , basSe ] ) ) # cHAise basSe

2.7.6.

Karakterlncok : egyszer indexels

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.3. bra. Egy karakterlnc indexelse

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

2.4. bra. Rszkarakterlncok ellltsa

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.


Pldk binris adatokra s metdusaikra :

 

# 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

Bevezets a Python 3-ba

2.5. bra. Kdok, glyphek, karakterek s byteok 2.5)

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.

2.6. bra. Bementek, kimenetek

24

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

"Kalkultor zemmdban" a Python beolvas-kirtkel-kir, de a print() fggvny nlklzhetetlen a scriptekben a kiratsokhoz :




 

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

Bevezets a Python 3-ba

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

 

# i n a k t v escape s z e k v e n c i a s t r i n g b e n p r i n t ( r " d \144 \ x64 " ) # d \144 \ x64

26

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

3. fejezet Az utastsfolyam vezrlse


Egy Python szkriptet fellrl lefel sorban vgrehajtott utastsok sorozata alkot. Minden utastssort egy vagy tbb zikai sor kpez, melyeket egy backslash \ vagy egy nyit [ ( { karakterrel folytathatunk, ami mg nincs lezrva. Az egymst kvet utastsok sorban trtn vgrehajtsa mdosthat annak rdekben, hogy kivlaszthassunk vagy megismtelhessnk kdrszleteket. Ennek a fejezetnek ez a trgya.

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 :

somme = 0 . 0 nb_valeurs = 0 for v in valeurs : nb_valeurs = nb_valeurs + 1 somme = somme + v a l e u r s

c Robert Cordeau

27

Bevezets a Python 3-ba moyenne = somme / nb_valeurs

 

Figyelem Minden utasts, ami ugyanolyan mrtkban van behzva, ugyanahhoz a blokkhoz tartozik.

3.1. bra. sszetett utastsok




Gyakran szksg van az sszetett utastsok egymsba gyazsra :

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 :

  

 

i f x : # jobb mint ( i f x i s True : ) vagy ( i f x == True : ) pass

3.2.2.

Egy alternatva tmr szintaxisa

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

Bevezets a Python 3-ba

3.3.
3.3.1.

Ciklusok
Programhurok : while

Egy programrsz ismtlse :




 

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:


 

n = i n t ( i n p u t ( I r j o n be egy eg s z e t [ 1 . . 1 0 ] : ) ) w h i l e not ( 1 <= n <= 1 0 ) : n = i n t ( i n p u t ( K rem r j o n be egy eg s z e t [ 1 . . 1 0 ] : ) )

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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.

Ciklus rvidrezrsa : continue

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.

Ciklusok teljes szintaxisa

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

Bevezets a Python 3-ba




 

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

Egy plda lista bejrsval :

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.

Egy kivtel teljes szintaxisa :

 

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

Bevezets a Python 3-ba




 

x = 2 i f not ( 0 <= x <= 1 ) : r a i s e Val ueErr or ( " x n i n c s benne [ 0 . . 1] ben " )

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

4. fejezet Standard kontnerek


A msodik fejezet az egyszer adattpusokat mutatta be. A Python azonban sokkal tbbet nyjt a felhasznlnak : a kontnereket. ltalban fogalmazva egy kontner ms objektumok trolsra sznt objektum. Ez a fejezet a szekvencikat, az asszociatv tblzatokat, a halmazokat s a szvegfjlokat rszletezi.

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

Bevezets a Python 3-ba

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

 

Bevezets a Python 3-ba

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

Bevezets a Python 3-ba

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, szintaxis s pldk

Denci Egy szktett lista egyenrtk egy olyan for ciklussal, ami ugyanazt a listt lltja el az append() metdussal. A szktett listk hrom formban hasznlhatk.


Az els forma - szmok egyszer listja :

  

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

Bevezets a Python 3-ba A Pythonra nagyon jellemz felhasznls :

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

Bevezets a Python 3-ba

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)

# egy h i v a t k o z s # [1 , 2 , 3 , 4] # egy " f e l s z nes " m s o l a t # [1 , 2 , 3 , 4 , 5] # [1 , 2 , 3 , 4]

 

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

Bevezets a Python 3-ba

(a) Egy egsz hozzrendelse

(b) Kzbens sszeads

(c) Megnvelt rtk hozzrendelse

4.1. bra. Inkrementlis rtkads egy nem-mdosthat objektumnak

(a) Egy lista hozzrendelse

(b) Kzbens lista ltrehozsa a memriban

(c) Inkrementlis hozzrendels

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;

A Python a standard dict tpust knlja fel a felhasznlnak.

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba Pldk sztrak ltrehozsra

 

# 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

Nhny sztrakra alkalmazhat metdus :

 

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

Bevezets a Python 3-ba

4.7.

Halmazok (set)

Denci Klnbz, hash-elhet elemek rendezetlen iterrlhat gyjtemnye.

4.3. bra. Mveletek halmazokon




 

X, Y = s e t ( abcd ) , s e t ( sbds ) p r i n t ( "X =" , X) # X = { a , c , b , d } p r i n t ( "Y =" , Y) # Y = { s , b , d } : e g y e t l e n elem s p r i n t ( c i n X) # True p r i n t ( a i n Y) # F a l s e p r i n t (X Y) # { a , c } p r i n t (Y X) # { s } p r i n t (X | Y) # { a , c , b , d , s } p r i n t (X & Y) # { b , d }

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

Bevezets a Python 3-ba

4.8.2.

A le-ok kezelse

File-ok megnyitsa s lezrsa




A szvegle-ok megnyitsnak mdjai :

 

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.
  

A lezrsra egyetlen metdus van:

f1 . close ()

Soros kirs Metdusok :

 

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

Bevezets a Python 3-ba Soros olvass Metdusok :

 

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

A kvetkez technikk klaszikusak s igen hasznosak.




Kulcsok s rtkek kinyerse egy sztr ciklussal trtn bejrsval :

  

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) :

 

f o r i i n r e v e r s e d ( range ( 1 , 1 0 , 2 ) ) : p r i n t ( i , end=" " ) # 9 7 5 3 1

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

A format() metdussal mindenfle kirats vezrelhet.




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

Bevezets a Python 3-ba Formzs lista segtsgvel :

  

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 ! s } { 0 ! r } " . format ( " t e x t e \n " ) ) texte t e x t e \n Numerikus formzs :

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

c Hungarian Translation Darczy Pter

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) )

# [ The sword o f ] # 000123456789 # ###123456789

c Robert Cordeau

49

Bevezets a Python 3-ba

5. fejezet Fggvnyek s nvterek


5.1. Denci s szintaxis

Megjegyzs A fggvnyek minden procedurlis nyelv alapvet szerkezeti elemei.

Denci Egy nv alatt csoportostott s krsre vgrehajtott utastsok egyttese.

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 Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

(a) Elkerli a kdismtlst

(b) Kiemeli a be- s kimeneteket

(c) Az import teszi lehetv a kdjrafelhasznlst

(d) Javtja a kdtervezst

5.1. bra. A fggvnyek hasznlatnak elnyei

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.

5.2. bra. Argumentumtads hozzrendelssel

52

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

5.2.2.

Egy vagy tbb paramter, visszatrsi rtk nincs

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.


Egy vagy tbb paramter, visszatrsi rtk hasznlata

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 :

import math d e f su r f a c e V o l u me S p h e r e ( r ) : s u r f = 4 . 0 math . p i r 2 v o l = s u r f r /3 return surf , vol c Robert Cordeau 53

Bevezets a Python 3-ba

 

# F program radius = f l o a t ( input ( radius : )) s , v = s u rf a c e V o l u m e Sp h e r e ( r a d i u s ) p r i n t ( "A gmb f e l s z ne { : g} , a t r f o g a t a { : g} " . format ( s , v ) )

5.2.4.


Fggvny tadsa paramterben

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.

Paramterek alaprtelmezett rtkkel

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 " )

# L e h e t s g e s h v sok : 54 c Hungarian Translation Darczy Pter

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.


Tetszleges szm argumentum : egy tuple tadsa

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

Bevezets a Python 3-ba

5.2.7.


Tetszleges szm argumentum : egy sztr tadsa

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.

Nevek feloldsa : az LGI szably

A nevek keresse elszr loklisan (L), majd globlisan (G), vgl a Pythonon bell (internal) (I) trtnik :

56

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

5.3. bra. Az LGI szably




Pldk rvnyessgi krkre

# x s f u n c hozz r e n d e l s e a modulban t r t n i k : g l o b l i s a k d e f f u n c ( y ) : # y s z hozz r e n d e l s e f u n c ban : l o k l i s a k g l o b a l x # l e h e t v t e s z i x m dos t s t a k v e t k e z sorban x += 2 z = x + y return z x = 99 p r i n t ( f u n c ( 1 ) ) # 102

  

# x s f u n c hozz r e n d e l s e a modulban t r t n i k : g l o b l i s a k d e f f u n c ( y ) : # y s z hozz r e n d e l s e a f u n c ban : l o k l i s a k # a f u n c ban : l o k l i s rv n y e s s g i k r z = x + y return z x = 99 p r i n t ( f u n c ( 1 ) ) # 100

 

c Robert Cordeau

57

Bevezets a Python 3-ba




# x s f u n c hozz r e n d e l s e a modulban t r t n i k : g l o b l i s a k d e f f u n c ( y ) : # y , x , z hozz r e n d e l s e a f u n c ban : l o k l i s a k x = 3 # e z az j x l o k l i s m a s z k o l j a a g l o b l i s xe t z = x + y return z x = 99 print ( func ( 1 ) ) # 4

 

58

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

6. fejezet Modulok s csomagok


Egy Python program ltalban tbb forrsle-bl ll, amiket moduloknak neveznk. A lekiterjeszts .py. Ha korrekten vannak kdolva, akkor a moduloknak fggetleneknek kell lenni egymstl, hogy ms programokban felhasznlhatk legyenek. Ez a fejezet bemutatja hogyan kell a modulokat kdolni s egy msik modulba importlni. Meg fogjuk ismerni a csomag (package) fogalmt, ami lehetv teszi tbb modul csoportostst.

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

Bevezets a Python 3-ba

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 :
  

from math import pi , s i n , l o g

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba




 

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

Bevezets a Python 3-ba

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

Bevezets a Python 3-ba

 

import i o c h a i n e = i o . S t r i n g I O ( " egy \ n k e t t xxx\nhrom\n " ) s c a n n e r ( ch ai n e , e l s o S z o )

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 " )
     

( options , args ) = parser . parse_args ( ) A parancssorok :

python 6_025 . py h

illetve python 6_025 . py h e l p

  

ugyanazt a dokumentcit lltjk el :

 

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

Bevezets a Python 3-ba for k in s : d [ k ] += 1 print (d . items ( ) ) # d i c t _ i t e m s ( [ ( i , 4 ) , ( p , 2 ) , ( s , 4 ) , ( m , 1 ) ] ) s mg annyi ms terlet ...

 

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.

Egy plda : az unum knyvtr

Ez a knyvtr lehetv teszi az S.I. mrtkegysgrendszer gyelembevtelvel trtn szmolsokat.




Egy interaktiv plda :

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

Bevezets a Python 3-ba 1 3 7 . 5 2 1 3 6 7 5 2 1 [m/ s ] >>> a = v/ t >>> a 1 1 . 7 5 3 9 6 3 0 3 6 [m/ s2 ] >>>

 

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

Bevezets a Python 3-ba

7. fejezet Objektum orientlt programozs


Az Objektum Orientlt Programozs : az objektumok, az osztlyok megrtse rvn lehetv teszik a valsg jobb modellezst. Ezekkel az osztlyokkal olyan objektumokat konstrulhatunk, amik interakciban vannak egymssal s a klvilggal Az objektumok ltrehozsa az egysgbezrsnak (encapsulation) ez egy olyan mechanizmus, ami lehetv teszi, hogy az objektumok tulajdonsgait s az azokat kezel metdusokat egy egysgknt kezeljk s elzrjuk ket a klvilgtl - ksznheten egymstl fggetlenl trtnik. Az oszlyok alkalmazsval maximlisan elkerlhetjk a globlis vltozk alkalmazst. Vgezetl, az osztlyok gazdasgos s hatkony eszkzk j objektumoknak mr meglv objektumokbl trtn ltrehozsra.

7.1.

A procedurlis megkzelts elgtelensge

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

 

Bevezets a Python 3-ba De hogyan rtelmezzk ezt a hrom adatot ?

 

c e r c l e = ( x , y , rayon ) # vagy c e r c l e = ( rayon , x , y )

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)

 

Viszont megmarad az rvnytelen adatok problmja (pldnkban a negatv sugr) : 


 

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 :

.imag s .real az atributumai;

szmos metdusa van, mint pl. conjugate();

specilis metdusai vannak : +, -, /, ...

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

Bevezets a Python 3-ba

7.3.
7.3.1.

Osztlyok s objektumok ltrehozsa


A class utasts

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.

Objektumok ltrehozsa s attributumai

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

Bevezets a Python 3-ba

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.

Opertor jradenils (Opertoroverloading)

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

Bevezets a Python 3-ba

7.5.4.

Plda az opertor jradenilsra (opertoroverloadingra)

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

Bevezets a Python 3-ba

7.6.2.

Plda az rklsre s a polimorzmusra

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.

Visszatrs a kiindulsi pldra


A circle osztly : tervezs

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

Unied Modeling Language : az objektumtervezs grakus megjelentse

76

c Hungarian Translation Darczy Pter

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) :


 

i f __name__ == "__main__" : p1 , p2 = Point ( ) , Point ( 3 , 4 ) p r i n t ( p1 == p2 ) # F a l s e p r i n t ( p2 , p2 . d i s t a n c e _ o r i g i n e ) # ( 3 , 4 ) 5 . 0

A property dekortornak ksznheten a oat visszatrsi rtket ad metdusok attributumokknt lesznek kezelve :


c l a s s C i r c l e ( Point ) : d e f __init__ ( s e l f , r a d i u s , x=0, y =0): c Robert Cordeau 77

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

Bevezets a Python 3-ba # C i r c l e (2 , 3 , 4) 12.5663706144 12.5663706144 p r i n t ( c1 . d i s t a n c e _ b o r d _ o r i g i n e , c1 . r a d i u s ) # 3 . 0 2 c1 . r a d i u s = 1 # a sug r m dos t sa p r i n t ( c1 . d i s t a n c e _ b o r d _ o r i g i n e , c1 . r a d i u s ) # 4 . 0 1

 

7.8.

Az objektum orientlt tervezs fogalma

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

Denci A leszrmaztats az alosztlyok specializcival trtn ltrehozst rja le.

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

8. fejezet Halad technikk


Ez a fejezet bemutat nhny halad programozsi technikt abbl a hrom paradigmbl, amit a Python tmogat : a procedurlis, az objektum s a funkcionlis programozsbl.

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.

Menk ksztse sztrral

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba Az adminisztrcis men forrskdja




" " " 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

Bevezets a Python 3-ba

8.1.3.

Rekurzv fggvnyek

Denci Egy rekurziv fggvny hvhatja nmagt.

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

Megjegyzs A matematikai dencit nagyon pontosan msolja a kd :




 

def f a c t o r i a l (n ) : i f n == 0 : # a l a p e s e t : a b e f e j e z s f e l t t e l e return 1 e l s e # rekurz v eset r e t u r n n f a c t o r i a l ( n1)

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.

Szemben az iterrativ dencival : n! = n*(n-1)*(n-2)*...*2*1

84

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

8.1. bra. A 4! rekurzv kiszmtsnak modellje

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.


A kvetkez genertorplda annyi rtket ad meg, amennyit krnk :

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 : y i e l d n e x t _ qu a r t e r n e x t_ q u a r t er += 0 . 2 5 i f __name__ == "__main__" : result = [ ] for x in quarters ( ) : r e s u l t . append ( x ) i f x == 1 . 0 : break

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.

Egymsba gyazott fggvnyek (closure)

A Pythonban a fggvnydenci szintaxisa megengedi a fggvnydencik egymsba gyazst. Kt alkalmazst klnbztetnk meg : 86 c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba A fggvnygyr-idima visszatrsi rtke egy begyazott fggvny :




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

Bevezets a Python 3-ba

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 ) ) )

 

Egy egyszer plda :

# 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

Bevezets a Python 3-ba

 

# 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 :

 

>>> c l a s s A: d e f __call__ ( s e l f , un , deux ) : r e t u r n un + deux >>> a = A( ) >>> c a l l a b l e ( a ) True >>> a ( 1 , 6 ) 7

 

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 map, lter s reduce fggvnyek

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

Lsd Wikipedia Lsd Wikipedia

94

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba >>>

 

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 :


 

>>> [1 , >>> >>> [1 ,

f i l t e r ( lambda x : x > 0 , [ 1 , 2, 3 , 4]) 3] [ x f o r x i n [ 1 , 2, 3 , 4] i f x > 0 ] 3]

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 :


>>> d e f somme ( x , y ) : p r i n t x , + , y return x + y >>> 1 + 3 + 6 + 10 >>> >>> 10 r e d u c e ( somme , [ 1 , 2 , 3 , 4 ] ) 2 3 4

sum ( [ 1 , 2 , 3 , 4 ] )

 

c Robert Cordeau

95

Bevezets a Python 3-ba

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

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

9. fejezet Grakus OO programozs


Az opercis rendszerekben s az alkalmazsokban elterjedten hasznlt grakus interface-ek programozhatk Pythonban. A Pythonban hasznlhat klnbz grakus knyvtrak (GTK+, wxPython, Qt ...) kztt, a tkinter knyvtr (a standard Python interface a Tk GUI toolkithez) szles krben alkalmazott, mivel minden Python-disztribciban alaprtelmezetten teleptve van. A tkinter lehetv teszi egyszer grakus interface-ek ltrehozst. A knyvtr importlsa utn a feladatunk a widget-ek ltrehozsra, kongurlsra s pozcionlsra, a widget-ekhez kapcsolt fggvnyek/metdusok kdolsra, majd az esemnykezel programhurokba val belpsre korltozdik.

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

Bevezets a Python 3-ba

9.1. bra. Szekvencilis s esemnyvezrelt programozs

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. bra. Egy egyszer plda 98 c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

A tkinter-nek hrom pozcikezelje van :

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

Bevezets a Python 3-ba

(a) A grakus interface

(b) A grakus terv

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.


Vgl a script ltrehoz egy alkalmazsobjektumot.

# 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

Bevezets a Python 3-ba

9.3.2.

IDLE, egy plda menvel

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 .

(a) Az IDLE interpreter

(b) Az IDLE editor

9.4. bra. IDLE

1 2

Egyes linuxdisztribcikban az IDLE egy klnll csomag. De tlsgosan terjedelmes ahhoz, hogy ebben a jegyzetben trgyaljuk ...

106

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

10. fejezet Az agile development fogalma


Az "Agile Development" gyjtfogalom, ami szmos iterrarv s inkrementlis szoftverfejlesztsi stlust takar. A legnpszerbb "Agile Development" mdszerek kz tartozik az Extreme Programming (XP), Scrum, Crystal, ... stb. Br az emltett mdszerek egyediek a specilis problma megkzeltsk tekintetben, azonban vannak kzs jellemzik : - valamennyien iterrarvak s inkrementlisak - a folyamatos visszacsatols, ami fokozatos nomtst tesz lehetv Mindannyian folyamatos tervezst, tesztelst, integrcit s a folyamatos projektilletve a szoftverfejleszts egyb formit alkalmazzk. Mindannyian arra koncentrlnak, hogy kpess tegyk az embereket az egyttmkdsre s a gyors s hatkony dntshozatalra. Nagyon rvid iterrcikkal ptkeznek, egyszerre csak egy-kt funkcit implementlnak. Az iterrcis ciklus vgn egy mkdkpes programverzi a kimenet. 2001-ben 17 neves szoftver fejleszt alaptotta meg az "Agile Allience"-t s fogalmazta meg a "Manifesto for Agile Software Development"-et. A legfontosabb elvek : Els rend szempont a megrendel maradktalan kielgtse Flexibilits a kvetelmnyek vltozsval szemben Mkd szoftver gyors tadsa (inkrementlisok) Az zleti szakembereknek s a fejlesztknek napi kapcsolatban kell lennik c Robert Cordeau 107

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

Bevezets a Python 3-ba

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.

Unit tesztek s funkcionlis tesztek

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

Bevezets a Python 3-ba

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

c Hungarian Translation Darczy Pter

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

Bevezets a Python 3-ba

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

c Hungarian Translation Darczy Pter

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

Bevezets a Python 3-ba

10.1. bra. Plda HTML formtum outputra

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

Bevezets a Python 3-ba grehajts eredmnyrl egy kpernykpet.




Els plda : doctest1.py

" " "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

Bevezets a Python 3-ba

 

i f __name__ == __main__ : _test ( )

A script vgrehajtsnak eredmnye :

 

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

Bevezets a Python 3-ba Harmadik plda : example.py




""" 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

c Hungarian Translation Darczy Pter

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.

A dokumentls vezrelt fejleszts

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

Bevezets a Python 3-ba

A. Fggelk Karakterkszlet s kdols


Lttuk, hogy a szmtgp minden informcit kdol, amit binrisan manipull. Az egsz szmok kdolshoz elg az alap megvltoztatsa, a lebegpontos szmok kdolshoz egy szabvnyt hasznlunk (IEEE 754), azonban a helyzet sszetettebb a karakterek esetben. A humn nyelvek s rsbeli megjelensk sokflesge egy hozzjuk adaptlt kdolst tesz szksgess. Az els elkpzels az, hogy konstruljunk egy tblzatot, ami a megjelentend szimblumokat sszekti egy (ltalban egy byte-on kdolt) szmmal : Szimblum Szm A legnevezetesebb a 7 biten kdolt ASCII tblzat (128 kd) (lsd A.1 brt), de szmos ms tblzatot is konstrultak (EBCDIC, ISO-8852-1...). Az Unicode tblzat A Python 3 -ban a karakterlncok (az str() tpus) Unicode stringek. A Unicode-szabvnyban a karakterek numerikus azonosti egyediek s univerzlisak. Mivel tbb szzezer klnbz karakterrl van sz (kb. 6000 nyelv ltezik), ezrt ezek nyilvnvalan nem kdolhatk egy bjton. A Unicode-szabvny semmilyen szablyt sem rgzt a kdols szmra fenntartott byte-ok ill. bitek szmra vonatkozan, egyedl az egyes karakterekhez rendelt numerikus azonost rtkt adja meg (lsd A.2 brt). Kdols Miutn sszegyjtttk az sszes szimblumot s hozzrendeltnk egy szmot, tallnunk kell nekik egy binris reprezentcit. 124 c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

A.1. bra. ASCII tblzat

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

Bevezets a Python 3-ba

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).


 

import s y s p r i n t ( s y s . s t d o u t . e n c o d i n g ) # cp1252 ( Windows XP/ SciTE )

c Robert Cordeau

127

Bevezets a Python 3-ba Teht megadjuk a scriptekben :


  

# c o d i n g : cp1252

Vagy (ami a Python 3 esetben alaprtelmezett):


  

# c o d i n g : UTF8

A.3. bra. A cp1252 karakterkszlet

128

c Hungarian Translation Darczy Pter

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

Bevezets a Python 3-ba

B. Fggelk A logikai fggvnyek


A Boole-logika A XIX. szzadban George Boole matematikus teljesen talaktotta a logikt egy formlis formlis rendszerr. Ma a Boole-algebrnak szmos alkalmazsa van informatikban s az elektromos ramkrk tervezsben. Ez egy ktrtk logika. Legyen B = { 0, 1 } dencis halmaz, melyen deniljuk a NO, AND s OR opertorokat. A vltozk rtkeit nha False-sal s True-val jelljk. Az opertorokat nha rendre mint a, a.bsa + b jelljk. Az igazsgtblk Az alap boole-opertorok igazsgtblja: Unris NOT-opertor a 0 1 NOT(a) 1 0

Binris AND s OR-opertorok a 0 0 1 1 b 0 1 0 1 a OR b a AND b 0 0 1 0 1 0 1 1

130

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba Kizr, ekvivalencia s implikci-opertorok a 0 0 1 1 b 0 1 0 1 a XOR b 0 1 1 0 a b a = b 1 1 0 1 0 0 1 1

c Robert Cordeau

131

Bevezets a Python 3-ba

C. Fggelk Aritmetikai alapok


Denci A szmbrzolsi rendszer vagy szmrendszer meghatrozza, hogy hogyan brzolhat egy adott szm klnbz alapszmot hasznl szmrendszerekben. Egy szmjegy tnyleges rtke /helyirtke/ attl fgg, hogy a szm melyik pozcijban ll, ugyanis ekkor az alaki rtk mg megszorzdik az alapszm adott pozcija szerint hatvnyval. Ha b a szmrendszer alapja, akkor a szmot az a1 bk +a2 bk1 +a3 bk2 + . . . + ak + 1b0 formban fejezzk ki, a szm szmjegyeit a1 a2 a3 . . . ak+1 sorrendben rjuk le. A hasznlt szmjegyek a termszetes szmok, 0 s b-1 kztt. A bk s bk szmok a k-adik pozcihoz tartoz gynevezett nagysgrendek.

132

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

Bevezets a Python 3-ba

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

(a) Trols tkzs nlkl

(b) tkzs kezelse lineris prbval

D.2. bra. Egy sztr kulcsainak hash-else 134 c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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/

Python 3.1 szintaxis sszefoglals :


http://perso.limsi.fr/pointal/python:abrege

c Robert Cordeau

135

Bevezets a Python 3-ba

F. Fggelk Fogalmak

136

c Hungarian Translation Darczy Pter

Bevezets a Python 3-ba

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

You might also like