100% found this document useful (1 vote)
233 views

Python Oktato v3

Learn Python programming

Uploaded by

td_toth_daniel
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
233 views

Python Oktato v3

Learn Python programming

Uploaded by

td_toth_daniel
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 107

index

next | Python oktat 3.4 documentation

Python oktat
A Python egy knnyen tanulhat, sokoldal programozsi nyelv. Jl hasznlhat magas szint
adatstruktrkkal rendelkezik, s egyszer ugyanakkor eredmnyes az objektum-orientlt programozs
nyelvi megvalstsa. A Python nyelvtana elegns, a nyelv dinamikusan tpusos. Parancsrtemlez jelleg
nyelv, mely a bjtfordtst is tmogatja (mint pl. a Java), idelis szkriptek ksztsre, tovbb nagyon
gyors alkalmazsfejlesztst tesz lehetv tbb platfromon, szertegaz terleteken.

A Python rtelmez s a sokrt, alaposan kidolgozott alap-knyvtr (Standard Library) szabadon


elrhet s felhasznlhat akr forrskdknt, akr binris formban minden jelentsebb platformra a
Python weboldalrl: http://www.python.org/. Ugyanitt hivatkozsok is vannak kls fejleszts
modulokra, programokra s eszkzkre, s kiegszt dokumentcikra.

A Python rtelmez egyszeren kiegszthet C vagy C++ nyelven (vagy ms, C-bl hvhat nyelven) j
fggvnyekkel s adattpusokkal. A Python maga is alkalmas kiegszt nyelv mr elkszlt alkalmazsok
bvtshez.

Ez az oktat megismerteti az olvasval a Python alapvet gondolkodsmdjt, nyelvi lehetsgeit s


rendszert. Segt a gyakorlott felhasznlv vlsban. A pldk a dokumentumba gyazottak, internet
elrs nem szksges az olvassukhoz.

A Python Reference Manual a nyelv rszletes defincijt tartalmazza. C- vagy C++-kiegsztsek


rshoz hasznos olvasnival az Extending and Embedding the Python Interpreter s a Python/C API
Reference. Ezenkvl van nhny knyv, amely a Pythonnal komolyan foglalkozik.

Ez nem egy minden apr rszletre kiterjed oktatanyag. Bemutatja a Python legfontosabb lehetsgeit, s
megismerteti veled a nyelv gondolkodsmdjt s stlust. Ha vgigcsinlod, kpes leszel Python
modulok s programok rsra, s ami a legfontosabb: a tovbbi tanulsra. Az oktat utn rdemes a
library-index fejezetben lert modulokkal megismerkedni.

A glossary fejezetet is rdemes tolvasni.

A magyar fordtssal kapcsolatban a Pr sz a magyar fordtsrl fejezetben olvashatsz.



1. tvgygerjeszt
2. A Python rtelmez hasznlata
2.1. Az rtelmez elindtsa
2.1.1. Argumentum tads
2.1.2. Interaktv (prbeszdes) md
2.2. Az rtelmez s krnyezete
2.2.1. Hibakezels
2.2.2. Vgrehajthat Python szkriptek
2.2.3. A forrskd karakterkszlete
2.2.4. Indtfjl prbeszdes zemmdban
3. Ktetlen bevezet a Pythonba
3.1. A Python hasznlata szmolgpknt
3.1.1. Szmok
3.1.2. Karakterlncok
3.1.3. Listk
3.2. Els lpsek a programozs fel
4. Tovbbi vezrl utastsok
4.1. Az if utasts
4.2. A for utasts
4.3. A range() fggvny
4.4. A break s a continue utastsok, az else g a ciklusokban
4.5. A pass utasts
4.6. Fggvnyek definilsa
4.7. Mg tbb tudnival a fggvnyek definilsrl
4.7.1. Alaprtelmezett (default) argumentumrtkek
4.7.2. Kulcsszavas argumentumok
4.7.3. Tetszleges hosszsg argumentumlistk
4.7.4. Argumentumlista kicsomagolsa
4.7.5. Lambda-formk
4.7.6. A dokumentcis karakterlncok
4.8. Intermezzo: kdolsi stlus
5. Adatstruktrk
5.1. Mg tbb dolog a listkrl
5.1.1. Lista hasznlata veremknt
5.1.2. A Listk hasznlata sorknt (queue)
5.1.3. Listartelmezs
5.1.4. Egymsba gyazott listartelmezsek
5.2. A del utasts
5.3. Tuple-ok s sorozatok
5.4. A halmazok (set)
5.5. Sztrak
5.6. Ciklustechnikk
5.7. Mg tbb dolog a felttelekrl
5.8. Sorozatok s ms tpusok sszehasonltsa
6. Modulok
6.1. Bvebben a modulokrl
6.1.1. Modulok vgrehajtja szkriptknt
6.1.2. A modulok keressi tvonala
6.1.3. ,,Lefordtott Python-fjlok
6.2. Standard modulok
6.3. A dir() fggvny
6.4. A csomagok
6.4.1. Egy csomagbl * importlsa
6.4.2. Csomagon belli hivatkozsok
6.4.3. Modulok, amelyek tbb, klnll knyvtr moduljaibl plnek fel
7. Bemenet s kimenet
7.1. Eszttikus kimenet kialaktsa
7.2. Fjlok rsa s olvassa
7.2.1. A fjl objektumok metdusai
7.2.2. A pickle modul
8. Hibk s kivtelek
8.1. Szintaktikai hibk
8.2. Kivtelek
8.3. Kivtelek kezelse
8.4. Kivtelek ltrehozsa
8.5. Felhasznl ltal ltrehozott kivtelek
8.6. Takart-lezr mveletek definilsa
9. Osztlyok
9.1. Nhny gondolat a szhasznlatrl
9.2. Hatkrk s nvterek a Pythonban
9.3. Els tallkozs az osztlyokkal
9.3.1. Az osztlydefinci szinaxisa
9.3.2. Osztlyobjektumok
9.3.3. A ltrehozott egyedek
9.3.4. Az objektummetdusok
9.4. rkls
9.4.1. Tbbszrs rkls
9.5. Privt vltozk
9.6. Egyebek...
9.7. Kivtelek alkalmazsa az osztlyokban
9.8. Bejrk
9.9. Genertorok
10. A Python alap-knyvtr rvid bemutatsa - Standard Library 1.
10.1. Fellet az opercis rendszerhez
10.2. Karakterhelyettest jelek dzsker karakterek
10.3. Parancssori paramterek
10.4. Hiba-kimenet tirnytsa, programfuts megszaktsa
10.5. Regulris kifejezsek - karakterlncok
10.6. Matematika
10.7. Internet elrs
10.8. A dtumok s az id kezelse
10.9. Tmrts - zip, gzip, tar...
10.10. Teljestmnymrs
10.11. Minsgellenrzs
10.12. Elemekkel egytt...
11. Az alap-knyvtr bemutatsa 2. rsz
11.1. A kimenet formzsa
11.2. Szveg-sablonok
11.3. Binris adatblokkok hasznlata
11.4. Tbbszlsg
11.5. Naplzs
11.6. Gyenge hivatkozsok
11.7. Listakezel eszkzk
11.8. Lebegpontos Aritmetika
12. What Now?
13. Interactive Input Editing and History Substitution
13.1. Tab Completion and History Editing
13.2. Alternatives to the Interactive Interpreter
14. Floating Point Arithmetic: Issues and Limitations
14.1. Representation Error

Pr sz a magyar fordtsrl
A fordtst Horvth rpd <horvath.arpad.szfvar kukac gmail.com> s Nyr Balzs <diogenesz at
pergamen.hu> ksztette. A fordts a 2.1-es verzij tutoriallal kezddtt. Ezt konvertltam t LaTeX
forrsbl reStructuredText-be. Mg lehetnek olyan rszek, amelyek csak a Python2-es verzijval megy.
Krem ezeket, s ms tvedseket, elrsokat, fordtsi hibkat jelezzk Horvth rpdnak.

Angol szavak/kifejezsek magyar megfeleli


A tuple szra nem talltunk igazn j magyar megfelelt. A Python3 knyvben szerepl rendezett sorozat
kifejezs kiss hosszadalmasnak tnik szmunkra, ezrt maradtunk a tuple kifejezsnl, amelyet az angol
kiejtsnek megfelelen ragoztunk.

Sztr

angol magyar
argument argumentum
built-in (function) beptett (fggvny)
control flow statements vezrl utastsok
string-literal literlis karakterlnc
backslash vissza-per jel
positional argument hely szerinti argumentum
keyword argument kulcsszavas argumentum
prompt prompt
tuple tuple tuple-t, tuple-nek...
sequence sorozat
object objektum
attribute (osztly) jellemz
data attribute adatjellemz
method metdus
exception kivtel
raise an exception kivtelt vlt ki
clause g
handler (az exeption-knl) kezel
token token
default alaprtelmezett
scope hatskr, hatkr, rvnyessgi kr
keyword argument kulcsszavas argumentum
right-hand side expression ???
sequence unpacking a sorozat sztpakolsa
shortcut operators ???
slice notation szelet jellsi md???
List Comprehensions listartelmezs
Library reference Referencia knyvtr
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

1. tvgygerjeszt
Ha valaha is rtl hossz shell szkriptet, felteheten ismered azt az rzst, hogy amikor j
alaptulajdonsgot szeretnl hozzadni, a program lassv s bonyolultt vlik; vagy az j tulajdonsg
magban foglal egy rendszerhvst vagy ms fggvnyt, amely csak C programbl rhet el... Gyakran a
problma nem olyan komoly, hogy a C-ben trtn jrarst indokoln; taln a programnak szksge van
vltoz hosszsg karakterlncokra vagy ms adattpusra (mint amilyen a fjlnevek rendezett listja),
melyet knny ltrehozni a shell-ben, de rengeteg munka C-ben, vagy taln nem ismered elgg a C
nyelvet.

Ms helyzet: taln tbb klnbz C knyvtrakkal kell dolgoznod, s a gyakori rs/fordts/tesztels/


jrafordts ciklus tl lass. Sokkal gyorsabban kellene szoftvert fejlesztened. Taln rtl egy programot
amely kpes kiegszt nyelv hasznlatra s te nem akarsz csak emiatt tervezni egy nyelvet, rni s
javtgatni egy fordtt (interpretert).

Ha valamelyik llts igaz rd, a Python megfelel nyelv lehet szmodra. A Pythont egyszer kezelni,
mgis igazi programnyelv, sokkal tbb szerkezetet hasznl s tbb tmogatst nyjt nagymret programok
szmra, mint a shell. Ezzel egyidben sokkal tbb hibaellenrzsi lehetsget tartalmaz mint a C, s
lvn nagyon magas szint nyelv magas szint beptett adattpusai vannak, gymint rugalmasan
mretezhet sorozatok s sztrak, amelyeket C-ben ltrehozni napokba tellene. Az ltalnosabban
megfogalmazott adattpusaival a Python jval nagyobb problmaterleten alkalmazhat mint az Awk vagy
akr a Perl, ugyanakkor sok dolog legalbb ugyanolyan knny Pythonban, mint ezekben a nyelvekben.

A Python lehetv teszi, hogy a programodat modulokra oszd fel, amelyek felhasznlhatk ms Python
programokban is. A nyelvhez tartoz alap-knyvtr alaposan kidolgozott modulgyjtemnyt tartalmaz,
melyeket a programod alapjul hasznlhatsz vagy pldknak a Python tanulshoz. Vannak beptett
modulok is mint a fjl I/O, rendszerhvsok, socket-ek kezelse s interfszek olyan grafikus fellethez,
mint a Tk.

A Python futsi id alatt rtelmezett (interpretlt) nyelv, amely idt takart meg neked a programfejleszts
alatt, mivel nincs szksg gpi kdra trtn fordtsra s a gpi kdok sszeszerkesztsre. Az rtelmez
interaktvan is hasznlhat, lehet ksrletezni a nyelv tulajdonsgaival, vagy fggvnyeket tesztelni az
alulrl felfel trtn programfejleszts sorn. Egyben egy gyes asztali szmolgp is!

A Python nagyon tmr s olvashat programok rst teszi lehetv. A Pythonban rt programok ltalban
sokkal rvidebbek mint a C vagy C++ megfeleljk, mert:

a magasszint adattpusok lehetv teszik egyetlen utastsban egy sszetett mvelet kifejtst;
az utastsok csoportostsa a sorok elejnek egyenl mrtk jobbra tolsval trtnik a kezd s
vgzrjelek helyett;
nem szksges a vltozk s argumentumok deklarlsa.

A Python bvthet: ha tudsz C-ben programozni, akkor knny j beptett fggvnyt vagy modult
hozzadni az rtelmezhz, vagy azrt, hogy a kritikus eljrsok a lehet leggyorsabban fussanak, vagy
pldul olyan knyvtrakra linkelni Pythonbl, amelyek csak binris formban rhetk el (amilyenek a
forgalmazspecifikus grafikai programok). Hogyha a nyelv valban mlyen megfogott, akkor a Python
rtelmezt hozzktheted egy C-ben rt alkalmazshoz, s azt a program kiterjesztseknt vagy parancs-
nyelvknt hasznlhatod.

A nyelv a ,,Monthy Python-k Repl Cirkusza nev BBC-s smsor utn kapta a nevt s semmi kze
nincs a nylas hllhz... Utalsokat tenni a dokumentciban a Monty Pythonra nemcsak szabad, hanem
ajnlott!

Most, hogy mr felkeltette az rdekldsedet a Python, remljk szeretnd megtekinteni valamivel


rszletesebben. Mivel a nyelvtanuls legjobb mdja annak hasznlata, meghvunk Tged egy kis
gyakorlsra.

A kvetkez fejezetben az rtelmez hasznlatnak minkntjt magyarzzuk. Ezek kiss unalmas dolgok,
de szksgesek ahhoz, hogy a ksbbiekeben mutatott pldkat kiprblhasd.

Az oktat tbbi rsze pldkon keresztl mutatja be a Python nyelv s a rendszer sok-sok tulajdonsgt,
kezdve az egyszer kifejezsekkel, utastsokkal s adattpusokkal folytatva a fggvnyekkel s a
modulokkal. Vgl rinti a legjabb programozsi mdszereket, mint pldul a kivtelkezels, s a
felhasznl ltal definilt osztlyok.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

2. A Python rtelmez hasznlata


2.1. Az rtelmez elindtsa
A Python rtelemez szoksos helye a /usr/local/bin/python3 vagy /usr/bin/python3 azokon a
gpeken, ahol elrhet; helyezd el a /usr/local/bin tvonalat a Unix shell keressi tvonaln, akkor
egyszeren a kvetkezt rhatod a Unix shellbe a Python indtshoz [1]
python3

(Az oktat a Linuxot is a Unixokhoz sorolja, azokra is rvnyesek az itt lertak. a fordt)

Gyakran tbb Python-vltozat is tallhat a gpen, ilyenkor ezek indthatak a kvetkez formkban:
python3.3
python3.4

Mivel a telepts helye teleptsi opci, ms helyen is lehet a program; ha nem tudod az rtelmezt
elindtani, krj segtsget egy nagyobb tuds embertl. (Pldul a /usr/local/python is egy gyakori
hely.)

Fjlvge karaktert (Control-D Unix-on, Control-Z Windows-on) rva a Python elsdleges promptjba,
az rtelmez nulla kilpsi sttusszal (zero exit status) lp ki. Ha ez nem mkdik, akkor az rtelmezt a
kvetkez utastssal hagyhatod el: quit().

Windows alatt a Python a telepts sorn gyakran a C:Python34 knyvtrba kerl (3.4-es verzi esetn),
br ez mdosthat a telept futtatsakor. Ha ezt a knyvtrat az tvonaladhoz szeretnd adni, csak rd a
kvetkez parancsot a a DOS-os parancssorba:
set path=%path%;C:\python34

(Windowson a Python teleptsvel telepl az IDLE fejleszti krnyezet, amely a mensorbl indthat.
rdemes lehet a kezdeti lpseket ezen gyakorolni. Az IDLE Unix al is telepthet. a fordt)

Az rtelmez sorszerkesztje nem tl kifinumult. Unix rendszereken gyakran elrhet a GNU readline
knyvtr, amely kifinomultabb szerkesztsi lehetsgeket szolgltat s a mr begpelt utastsok
megjegyzst. A szvegsori szerkeszts tmogatottsgnak taln leggyorsabb ellenrzse a Control-P
megnyomsa az els megjelen promptnl. Ha ez spol, akkor van; lsd az Appendix Interactive Input
Editing and History Substitution fejezete bemutatja az rvnyes billentyket. Ha semmi nem jelenik meg,
vagy csak egy ^P, akkor a szvegsori szerkeszts nem elrhet; ekkor csak a backspace karakterrel
trlhetsz karaktert az aktulis sorbl.

Az rtelmez a UNIX shellhez hasonlan mkdik: ha a szabvyos bemenettel van meghvva, akkor
interaktvan olvas s hajt vgre utastsokat; ha fjlnv argumentummal vagy egy fjllal, mint szabvnyos
bemenettel hvjuk meg, akkor szkript-knt lefuttatja a megadott fjlt.

Egy msik lehetsg az rtelmez indtsra a python -c parancs [arg] ... parancsor, amely
vgrehajtja az utasts(oka)t a parancs-ban, hasonlan a shell -c opcijhoz. Mivel a Python utastsok
gyakran tartalmaznak szkzket, vagy ms specilis karaktereket, amelyeknek specilis jelentsk van a
shell szmra, jobb, ha a parancs rszt egyszeres idzjelbe tesszk.

Nmelyik Python modul nll programknt is hasznlhat, ha gy hvod meg: python -m modul [arg]
... ez az utasts vgrehajtja a modul forrskdjt.

rdemes megjegyezni, hogy klnbsg van a python file s a python <file kztt. A msodik esetben
a program beviteli krseit (amilyenek a input() s raw_input() hvsok) a program a fjlbl veszi.
Mivel a fjlt az elemz (parser) a fjl vgig beolvassa a program indulsa eltt, a program azonnal fjl-
vge karakterrel fog tallkozni. Az els esetben (amely gyakran a kvnt mkds) a program azokat a
fjlokat vagy eszkzket hasznlja, amelyek a Python rtelmezhz csatlakoznak.

Sokszor hasznos, ha egy szkript fjl futtatsa utn rgtn interaktv zemmdba kerlnk. Ezt egyszer
elrni, a szkript neve eltt adjuk meg az -i kapcsolt.

2.1.1. Argumentum tads


Ha az rtelmezt szkript-fjllal indtjuk, akkor a szkript fjl neve s a nevet esetleg kvet argumentumok
a sys modul argv vltozjhoz rendeldnek, ez egy karakterlncokbl ll lista. Ennek hossza leglbb 1;
amennyiben sem szkrip-nevet, sem semmilyen argumentumot nem adunk meg, a sys.argv[0] vltoz
rtke res string lesz. Ha a szkript neveknt '-'-t adunk meg (ez a szabvnyos bemenetnek felel meg),
sys.argv[0] rtke '-' lesz. Argumentumknt -c parancs-ot megadva sys.argv[0] rtke '-c' lesz.
Ha a -m modul formt hasznjuk, akkor a sys.argv[0] vltozban a modul teljes neve kerl. A -c
parancs vagy a -m modul utn ll kapcsolkat az rtelmez nem dolgozza fel, hanem a sys.argv-ben
eltrolva a parancs-ra vagy modul-ra hagyja annak feldolgozst.

2.1.2. Interaktv (prbeszdes) md


Amikor a parancs a tty-rl (pl. billentyzet) rkezik, az rtelmez gynevezett interaktv (prbeszdes)
zemmdban mkdik. Ekkor az elsdleges prompt megjelentsvel kri a kvetkez parancs megadst.
Az elsdleges prompt szoksosan hrom egyms utn kvetkez nagyobb-jel (>>>); a sorok folytatshoz
ezek a folytatlagos sorok a msodlagos promptot jelenti meg, amelyek szoksos rtke hrom egyms
utn rt pont (...). Azt rtelmez elindulsakor, mieltt az elsdleges prompt megjelenne, egy dvzl-
szveget r ki, amely tartalmazza az rtelmez verziszmt s a jogi vdettsget:
$ python3.4
Python 3.4 (default, Sep 24 2012, 09:25:04)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Folytatlagos sorok szksgesek, ha tbbsoros szerkezeteket rsz be. Pldul a kvetkez if utasts
esetn:
>>> a_vilag_sik = True
>>> if a_vilag_sik:
... print("Vigyzz, nehogy leess!")
...
Vigyzz, nehogy leess!
2.2. Az rtelmez s krnyezete
2.2.1. Hibakezels
Hiba esetn az rtelmez hibazenetet kld s kirja a hiba nyomvonalt (stack trace). Prbeszdes
zemmdban az elsdleges promt jelenik meg; ha az adatok beolvassa fjlbl trtnt, kirja a
hibanyomvonalat s nulltl eltr kilpsi rtkkel tr vissza. (A programon bell fellp s a program
ltal kezelt kivtelek (except - try ) nem jelentenek hibt ebben a krnyezetben.) Vannak felttel nlkli,
gynevezett vgzetes hibk, amelyek azonnal, nulltl eltr visszatrsi rtkkel trtn
programmegszaktst s kilpst eredmnyeznek, ilyenek a bels inkonzisztencit okoz, valamint a
memribl kifut programok hibi. Minden hibazenet a szabvnyos hibakimenetre (standard
error) kerl, a futtatott parancsok rendes kimenete pedig a szabvnyos kimenetre (standard
output) rdik.

Ha az elsdleges, vagy a msodlagos promptnl a megszakts-karaktert gpeljk be (rendszerint Control-


C vagy a DEL billenty), az trli az eddigi bemenetet s visszaadja a vezrlst az elsdleges promtnak.
[2]

Ha a megszaktskrelmet valamely parancs/program vgrehajtsa alatt adjuk ki, az KeyboardInterrupt


kivtelt generl; ez programbl a try utastssal kaphat el.

2.2.2. Vgrehajthat Python szkriptek


A BSD-szer Unix rendszereken (Linuxon is) a Python-szkripteket ugyangy, mint a shell szkripteket -
kzvetlenl futtathatv lehet tenni, legels sorknt megadva ezt
#! /usr/bin/env python3

(felttelezve, hogy a Python rtelmez elrsi tvonala a felhasznl PATH vltozjban be van lltva s
a szkript fjl vgrehajthat tulajdonsggal br).

A fenti esetekben a fjlnak a #! karakterekkel kell kezddnie. Ezt a sort nhny platformon Unix-tpus
sorvggel ('\n') kell lezrni, nem pedig Windows-os ('\r\n') sorvggel. Megjegyezend, hogy a '#'
karakterrel a Pythonban a megjegyzseket kezdjk.

A szkriptnek a chmod paranccsal adhatunk vgrehajtsi engedlyt az albbi mdon:


$ chmod +x szkriptem.py

A Windows rendszeren nincs vgrehajthat md. A Python telept automatikusan a .py fjlokat a
python34.exe utastshoz trstja, gy egy Python-fjlon dupln kattintva az elindul szkriptknt. A
kiterjeszts .pyw is lehet, ilyenkor a konzolablak, amely nem fog megjelenni. , in that case, the console
window that normally appears is suppressed.

2.2.3. A forrskd karakterkszlete


Alapllapotban a Python forrsfjlokat UTF-8-as kdolsnak tekintjk. Ebben a karakterkdolsban a
legtbb nyelv karakterei hasznlhatak egyszerre egy sztringben, vltoznvben s megjegyzsben. A
standard knyvtr csak ASCII karaktereket hasznl vltoznvnek: ezt a megllapodst minden
hordozhat kdnak kvetnie kellete. Ahhoz, hogy az sszes karakter helyesen jelenjen meg, az
szvegszerkesztnek fel kell ismernie, hogy a fjl UTF-8-as, s olyan bettpust kell hasznlnia, amely
tartalmazza a fjlban szerepl sszes karaktert.

Lehetsges ettl eltr kdolst is megadni a forrsfjlban. Hogy ezt megtehessk, mg egy specilis
megjegyzs-sort helyezznk a #! sor utn, hogy definiljuk a kdolst:
# -*- coding: kdols -*-

A kdols megadsval a forrsfjlban mindent kdols kdolssal kerl rtelmezsre UTF-8 helyett. A
lehetsges kdolsok a Python Library Reference-ben tallhatak a codecs szakaszban.

Plduk, ha a kivlasztott szvegszerkeszt nem tmogatja az UTF-8 kdolst, s ms kdolsra, mondjuk


Windows-1252 kdolsra van szksg, az albbi rhat:
# -*- coding: cp-1252 -*-

s mris az sszes Windows-1252-ben tallhat karakter hasznlhat a forrsfjlban. A specilis


kdols-megjegyzsnek az els vagy msodik sorban kell lennie.

2.2.4. Indtfjl prbeszdes zemmdban


Prbeszdes (interaktv) zemmdban hasznlva a Pythont, sokszor kvnatos, hogy az rtelmez futtatsa
eltt bizonyos parancsok mindig lefussanak. Ez a PYTHONSTARTUP nev krnyezeti vltoz rtknek
megadsval trtnhet; itt kell megadni a futtatni kvnt parancsfjl nevt. Ez a megolds azonos a Unix
.profile fjl megoldsval.

Az indtfjl beolvassa csak prbeszdes zemmdban trtnik; nem trtnik beolvass ha a parancsok
fjlbl jnnek, vagy ha bemenetknt a /dev/tty explicit mdon lett megadva (amelyet egybknt
prbeszdes zemmdban az rtelmez alaphelyzetben hasznl). Az indtfjl a futsa sorn ugyanazt a
nvterletet (name space) hasznlja mint a prbeszdes zemmd, gy a benne definilt vagy bele
importlt objektumok vltozatlanul, tovbbi pontosts nlkl hasznlhatk prbeszdes zemmdban is.
Ebben a fjlban a sys.ps1 s sys.ps2 rtkeinek trsval vltoztathatod a promtok rtkeit.

Amennyiben az aktulis knyvtrbl egy msik indtfjlt is szeretnl futtatni, megteheted a globlis
indtfjl szerkesztsvel, ahogy ezt az albbi plda mutatja: if os.path.isfile('.pythonrc.py'):
execfile('.pythonrc.py').

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)

Lbjegyzet

On Unix, the Python 3.x interpreter is by default not installed with the executable named python,
[1]
so that it does not conflict with a simultaneously installed Python 2.x executable.
[2] A problem with the GNU Readline package may prevent this.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

3. Ktetlen bevezet a Pythonba


A kvetkez pldkban a kimenetet s a bemenetet az elsdleges s msodlagos promptok (>>> s ...)
megltvel, illetve hinyval klnbztetjk meg. A pldk kiprblshoz mindent be kell rnod a
promptok utn, amikor a prompt megjelenik; azok a sorok, amelyek eltt nincs prompt, a fordt
kimenetei.

Az nmagban ll msodlagos prompt a plda egyik sorban azt jelenti, hogy csak egy jsort kell tni;
ez jelzi egy tbbsoros utasts vgt.

Ennek a kziknyvnek sok pldjban mg azokban is, amelyeket interaktv mdon rtunk be
szerepelnek megjegyzsek. A Pythonban a megjegyzsek kettskereszttel ('#') kezddnek s a sor vgig
tartanak. Egy megjegyzs lehet sor elejn, vagy kvethet szkzt, tabultor-karaktert, de ha egy
karakterlnc belsejbe teszed, az nem lesz megjegyzs (lsd a pldban!). A kettskereszt karakter egy
karakterlncon bell csak egy kettskeresztet jelent.

Pr plda:
# ez az els megjegyzs
SPAM = 1 # ez a msodik megjegyzs
# ... s ez a harmadik.
STRING = "# Ez nem megjegyzs, mert idzjelekben van."

3.1. A Python hasznlata szmolgpknt


Prbljunk ki nhny Python utastst. Indtsuk el az rtelmezt, s vrjuk meg az elsdleges promptot:
>>>. (Nem kell sokig vrni.)

3.1.1. Szmok
A parancsrtelmez gy mkdik, mint egy sima szmolgp: be lehet rni egy kifejezst, s az kiszmolja
az rtkt. A kifejezsek nyelvtana a szoksos: a +, -, * s / mveletek ugyangy mkdnek, mint a
legtbb nyelvben (pldul Pascal vagy C); zrjeleket (()) hasznlhatunk a csoportostsra. Pldul:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # az oszts egsz szmok esetn is lebegpontos eredmnyt ad
1.6

Az egsz szmok (pl. 2, 4, 20) int tpusak, azok, amiknek trtrsze is van (e.g. 5.0, 1.6) a float
tpusba. Az oktat tovbbi rszben mg tbbet tanulunk meg a tpusokrl.

Az oszts (/) mindig lebegpontos rtkeket ad vissza. Lefel kerekt egszoszts elvgzshez,
amellyel egsz rtket kapunk a // opertor hasznlhat; az oszts maradkhoz a %:
>>> 17 / 3 # hagyomnyos oszts lebegpontos eredmnnyel
5.666666666666667
>>>
>>> 17 // 3 # az egszosztssal megszabadulunk a trtrsztl
5
>>> 17 % 3 # a % opertor az oszts maradkval tr vissza
2
>>> 5 * 3 + 2 # eredmny * oszt + maradk
17

A Pythonban a ** opertor hasznlhat a hatvny kiszmtsra [1]:


>>> 5 ** 2 # 5 ngyzete
25
>>> 2 ** 7 # 2 7-dik hatvnya
128

A C-hez hasonlan az egyenlsgjellel ('=') lehet rtket adni egy vltoznak. Az rtkads utn az
rtelmez jabb utastsra vr, ltszlag nem trtnik semmi:
>>> szelesseg = 20
>>> magassag = 5*9
>>> szelesseg * magassag
900

Ha egy vltoz nincs definilva (nincs rtk rendelve hozz), s hasznlni prbljuk, akkor hibazenetet
kapunk:
>>> n # try to access an undefined variable
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined

A programnyelv teljeskren tmogatja a lebegpontos szmokat; azok a mveletek amelyeknl


keverednek a tpusok, az egszeket lebegpontoss alaktjk:
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5

(A korbbi verzik oktatjban szerepl lerst a komplex szmokrl bent hagytuk ebben a fordtsban is.
a fordt)

A Python komplex szmokat is tud kezelni a kpzetes rszt a j vagy J jellel kpezhetjk. A komplex
szmot (vals+kpzetesj) formban rhatjuk:
>>> 1j * 1J
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
A komplex szmokat gyakran kt lebegpontos szmmal brzoljk: a kpzetes s a vals rsszel. A z
komplex szmnak ezeket a rszeit a z.real s z.imag utastsokkal olvashatjuk vissza.
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5

A lebegpontos s egsz tpus konverzis fggvnyek (float() s int()) nem mkdnek komplex
szmokra. A komplex-vals talaktsnak tbb lehetsgesmdja is van: ahhoz, hogy egy komplex szmbl
valsat csinlj, hasznld az abs(z) utastst, hogy megkapd a nagysgt (lebegpontosknt) vagy a
z.real utastst, ha a vals rsze kell.

>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
>>> a.real
3.0
>>> a.imag
4.0
>>> abs(a) # sqrt(a.real**2 + a.imag**2)
5.0
>>>
>>> float(8) # lebegopontos alakra konvertal. kimenete: 8.0

Interaktv mdban az utoljra kirt kifejezs rtke a _ (alsvons) vltozban van. gy, ha a Pythont
asztali szmolgpknt hasznlod, akkor egyszerbb folytatni a szmolsokat, pldul:
>>> ado = 12.5 / 100
>>> ar = 100.50
>>> ar * ado
12.5625
>>> ar + _
113.0625
>>> round(_, 2)
113.06
>>>

Ezt a vltozt csak olvashat vltozknt kezelhetjk. Ne adjunk rtket neki, mert ha adunk, akkor
ltrehozunk egy fggetlen helyi vltozt azonos nvvel, amely meggtolja a beptett vltoz elrst,
amely mgikus mdon viselkedik. (Ha egy globlis vltoz nevvel ltrehozunk egy helyi vltozt, akkor
az rtelmez a helyit hasznlja.)

Az int s float osztlyokon fell a Python tmogat egyb typusokat is, mint pldul a Decimal s
Fraction. A Python beptett tmogatssal rendelkezik a komplex szmok tekintetben, s a j vagy J
uttagot hasznja a kpzetes rsz jellsre (pl. 3+5j, 1j).

3.1.2. Karakterlncok
A szmok mellett a Python karakterlncokkal is tud mveleteket vgezni. A karakterlncokat egyszeres
('...') vagy dupla idzjelek ("...") kz lehet zrni. A kt jells kztt nincs jelents klnbsg [2].
A \ hasznlhat arra, hogy a karakterlncbeli idzjeleket levdjk:
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

Az interaktv parancsrtelmezben a kimeneti karakterlnc idzjelekben jelenik meg, s a specilis


karakterek vissza-perrel (\) levdve. Br ez nha klnbznek ltszik a bemenettl (az idzjel fajtja
megvltozhat), a kt karakterlnc egyenrtk. A karakterlnc dupla idzjelbe (") van zrva, ha a
karakterlnc tartalmaz egyszeres idzjelet, s duplt nem klnben egyszeres idzjelben van. A
print() fggvny egy sokkal olvashatbb kimenetet eredmnyez, elhagyva az idzjeleket s kirva a
levdett s specilis karaktereket:
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>> print('"Isn\'t," she said.')
"Isn't," she said.
>>> s = 'First line.\nSecond line.' # \n jsort jelent
>>> s # print() nlkl a \n benne van a kimenetben
'First line.\nSecond line.'
>>> print(s) # print()-tel az \n jsort hoz ltre
First line.
Second line.

Ha nem akarod, hogy a \ jellek kezdd karakterek specilis karakterknt rtelmezdjenek, akkor nyers
karakterlncokat hasznlhatsz egy r-et helyezve a kezd idzjel el:
>>> print('C:\some\name') # \n jsort jelent
C:\some
ame
>>> print(r'C:\some\name') # r van az idzjel eltt
C:\some\name

A literlis karakterlncok tbbsorosak is lehetnek. Egy lehetsg erre a hrmas idzjelek hasznlata:
"""...""" vagy '''...'''. Ilyenkor az jsorok automatikusan belekerlnek a karakterlncba, de ez a
viselkeds megszntethet, ha a sor vgre egy \-t adsz. A kvetkez plda
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")

az albbi kimenetet adja (vedd szre, hogy az els sorban nincs soremels):
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to

Karakterlncokat a + mvelettel ragaszthatunk ssze s *-gal ismtelhetnk.


>>> # 3-szor 'un' utn 'ium'
>>> 3 * 'un' + 'ium'
'unununium'

Kt egymst kvet literlis karakterlncot (azokat, amik idzjelben vannak, s nem egy vltozban,
vagy nem egy fggvny hoz ltre) az rtelmez magtl sszefz:
>>> 'Py' 'thon'
'Python'

De ez csak kt literlissal mkdik, vltozval vagy kifejezssel nem:


>>> prefix = 'Py'
>>> prefix 'thon' # nem tud vltozt s literlis karakterlncot sszefzni
...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
...
SyntaxError: invalid syntax

Ha vltozkat akarsz sszefzni, vagy vltozt literlissal, hasznlj + mveletet:


>>> prefix + 'thon'
'Python'

A literlisok sszefzse klnsen hasznos hossz sorok szttrsre:


>>> text = ('Tbb karakterlncot rhatunk zrjelbe, '
'hogy sszefzhessk azokat.')
>>> text
'Tbb karakterlncot rhatunk zrjelbe, hogy sszefzhessk azokat.'

A karakterlncokat indexelhetjk, az els karakterhez tartozik a 0 index, a kvetkezhz az 1-es index s


gy tovbb. Nincs kln karakter tpus; egy karakter egyszeren egy egy hosszsg karakterlnc:
>>> szo = 'Python'
>>> szo[0] # karakter a 0 pozciban
'P'
>>> szo[5] # karakter a 5 pozciban
'n'

Az indexek negatvak is lehetnek, ilyenkor jobbrl kezdnk el szmolni:


>>> szo[-1] # utols karakter
'n'
>>> szo[-2] # utols eltti karakter
'o'
>>> szo[-6]
'P'

Az indexelsen fell a szeletels is tmogatott. Mg az indexels egyetlen karaktert jell ki, a szeletels
egy rsz-karakterlncot:
>>> szo[0:2] # karakterek a 0 pozcitl (benne van) a 2-esig (az mr nem)
'Py'
>>> szo[2:5] # karakterek a 2 pozcitl (benne van) a 5-esig (az mr nem)
'tho'

A kezd index mindig belertend az eredmnybe, a vgs index pedig nem. Ez teszi lehetv, hogy
s[:i] + s[i:] mindig egyenl s-el:

>>> szo[:2] + szo[2:]


'Python'
>>> szo[:4] + szo[4:]
'Python'

A szeletek indexeinek hasznos alaprtkei vannak; a kihagyott els index alaprtke 0, az elhagyott
msodik index alaprtke a szeletelend karakterlnc hossza:
>>> szo[:2] # karakterek az elejtl a 2-esig (mr nincs benne)
'Py'
>>> szo[4:] # karekterek a 4-es pozcitl (benne van) a vgig
'on'
>>> szo[-2:] # karakterek az utols elttitl (belertve) a vgig
'on'

Jegyezd meg, hogy a -0 valban azonos a 0-val, gy ez nem jobbrl szmol!


>>> szo[-0] # mivel -0 s 0 egyenlek
'P'

A nem negatv indexek esetn a szelet hossza az indexek klnbsgvel egyenl, ha mindkett a valdi
szhatrokon bell van. Pldul a szo[1:3] hossza 2.

Ha olyan indexet hasznlunk, amely tl nagy, az eredmny hibt ad:


>>> szo[42] # a szo csak 7 karakteres
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range

Ellenben a tartomnyon kvli indexek a szeletekben rugalmasan kezeli a Python nyelv:


>>> word[4:42]
'on'
>>> word[42:]
''

A Python karakterlncait nem lehet megvltoztatni azok megvltoztathatatlanok. Ezrt, ha egy adott
index helyhez rtket rendelnk, hibt kapunk:
>>> szo[0] = 'J'
...
TypeError: 'str' object does not support item assignment
>>> szo[2:] = 'py'
...
TypeError: 'str' object does not support item assignment

If you need a different string, you should create a new one:: Ha msik karakterlncra van szksg,
alkothatunk egy jat:
>>> 'J' + szo[1:]
'Jython'
>>> szo[:2] + 'py'
'Pypy'

A beptett len() fggvny a karakterlnc hosszval tr vissza:


>>> s = 'legeslegelkposztsthatatlansgoskodsaitokrt'
>>> len(s)
47

See also

textseq
Strings are examples of sequence types, and support the common operations supported by such
types.
string-methods
Strings support a large number of methods for basic transformations and searching.
string-formatting
Information about string formatting with str.format() is described here.
old-string-formatting
The old formatting operations invoked when strings and Unicode strings are the left operand of the %
operator are described in more detail here.

3.1.3. Listk
A Python tbbfajta sszetett adattpust ismer, amellyel tbb klnbz rtket csoportosthatunk. A
legsokoldalbb a lista, amelyet vesszkkel elvlasztott rtkekknt rhatunk be szgletes zrjelbe zrva.
A lista elemeinek nem kell azonos tpusaknak lennik, br gyakran minden elem azonos tpus.
>>> a = ['spam', 'tojsok', 100, 1234]
>>> a
['spam', 'tojsok', 100, 1234]

Ahogy a karakterlncokat (s minden ms beptett sorozattpust), a listkat is indexelhetjk s


szeletelhetjk:
>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1] # a szeletels j listt ad
['tojsok', 100]
A listk az sszefzst is tmogatjk:
>>> a[:2] + ['sonka', 2*2]
['spam', 'tojsok', 'sonka', 4]
>>> 3*a[:3] + ['Boe!']
['spam', 'tojsok', 100, 'spam', 'tojsok', 100, 'spam', 'tojsok', 100, 'Boe!']

A karakterlncokkal ellenttben amelyek megvltoztathatatlanok a listk egyes elemeit


mdosthatjuk:
>>> a
['spam', 'tojsok', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'tojsok', 123, 1234]

A szeleteknek rtkeket is adhatunk s ez akr a lista elemszmt is megvltoztathatja:


>>> # Pr elem trsa:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Pr elem trlse:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Pr elem beszrsa:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> a[:0] = a # Beszrja magt (pontosabban egy msolatt) a sajt elejre.
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]

A beptett len() fggvny listkra is alkalmazhat:


>>> len(a)
8

A listk egymsba gyazhatak, azaz listba elhelyezhetnk listt elemknt:


>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'

3.2. Els lpsek a programozs fel


Termszetesen a Pythont sokkal sszetettebb feladatokra is hasznlhatjuk annl, minthogy kiszmoljuk 2+2
rtkt. Pldul rhatunk egy rvid ciklust a Fibonacci-sorozat kiiratsra:
>>> # Fibonacci-sorozat:
... # az elz kt elem sszege adja a kvetkezt
... a, b = 0, 1
>>> while b < 10:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8

Ebben a pldban a Python tbb j tulajdonsgt megtalljuk:


Az els sor egy tbbszrs rtkadst tartalmaz: a s b egyszerre veszi fel a 0 s 1 rtkeket. Az
utols sorban jbl ezt hasznljuk, hogy megmutassuk, hogy elbb a jobboldal rtkeldik ki, s csak
azutn megy vgbe az rtkads. A jobboldali kifejezsek jobbrl balra rtkeldnek ki.

A while ciklus addig hajtdik vgre, amg a felttel (itt: b < 10) igaz marad. A Pythonban ahogy a
C-ben is minden nulltl eltr egsz rtk igazat, a nulla hamisat jelent. A felttel lehet egy
karakterlnc vagy egy lista (gyakorlatilag brmilyen sorozat): minden aminek nem nulla a hossza
igaz, az res sorozatok hamisak. A pldban hasznlt felttel egy egyszer sszehasonlts. A
legalapvetbb sszehasonlt relcikat a C-vel azonosan jelljk: < (kisebb mint), > (nagyobb
mint), == (egyenlek), <= (kisebb vagy egyenl), >= (nagyobb vagy egyenl) s != (nem egyenl).

A ciklus magjt beljebb hzzuk: a behzs a Python jellse az utastsok csoportostsra. A


Python alaprtelmezett interaktv parancsrtelmezjben neked kell (nhny) szkzt bernod minden
behzott sor el. Gyakorlatban az sszetettebb programkdokat gyis szvegszerkesztvel fogod
elkszteni, a legtbb szvegszerkesztnek van eszkze az automatikus behzsra. Ha egy sszetett
utastst runk be prbeszdes (interaktv) mdban, azt egy res sornak kell kvetnie (mivel az
rtelmez nem tudja kitallni, lesz-e mg jabb sor). Jegyezd meg, hogy minden sort ugyanannyival
kell beljebb hzni. (Az IDLE integrlt fejleszti krnyezetben tallhat parancsrtelmez s az
ipython nev parancsrtelmez automatikusan behzza a ciklusmagot.)

A print() fggvny kirja annak a kifejezsnek az rtkt, amelyet megadtunk. Ez abban klnbzik
attl, mintha a kifejezst csak nmagban rnnk be (mint ahogy szmolgpknt hasznltuk), ahogy a
tbbszrs argumentumokat s a karakterlncokat kezeli. A karakterlncokat idzjelek nlkl rja
ki, s szkzket illeszt az egyes tagok kz, gy szpp teheted a kimenetet:
>>> i = 256*256
>>> print('Az i rtke:', i)
Az i rtke: 65536

Az end kulcsszavas argumentum hasznlhat arra, hogy megakadlyozzuk a print utn az jsor
kirst, vagy mst rjunk ki a print vgn:
>>> a, b = 0, 1
>>> while b < 1000:
... print(b, end=",")
... a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

Lbjegyzetek

Mivel a ** nagyobb precedencij, mint a -, a -3**2 mint -(3**2) fog rtelmezsre kerlni, gy
[1]
az eredmny -9. Hogy ezt elkerljk, s 9-et kapjunk, (-3)**2 formban kell rni.
Ms nyelvekkel szemben a specilis karakterek, mint a \n azonos jelentsek mind egyszeres
[2] ('...') mind dupla ("...") idzjelben. Az egyetlen klnbsg a kett kztt, hogy az egyszeres
idzjelben nem kell levdeni a " jelet (de a \' jelet igen) s viszont.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

4. Tovbbi vezrl utastsok


Az imnt emltett while utasts mellett a Python ismeri a ms nyelvekben szerepl leggyakoribb vezrl
utastsokat is nmi vltoztatssal.

4.1. Az if utasts
Taln a legjobban ismert utaststpus az if utasts. Plda:
>>> x = int(raw_input("rjon egy szmot: "))
>>> if x < 0:
... x = 0
... print('Negatv, lecserltem nullra')
... elif x == 0:
... print('Nulla')
... elif x == 1:
... print('Egy')
... else:
... print('Egynl tbb.')
...

Hinyozhat, de lehet egy vagy akr egynl tbb elif rsz, a else rsz szintn elmaradhat. Az elif
kulcssz amely az else if rvidtse hasznos a felesleges behzsok elkerlsre. Egy if ...elif ...
elif ... sor helyettesti a ms nyelvekben tallhat switch s case utastsokat.

4.2. A for utasts


A for utasts klnbzik attl, amely a C-ben s a Pascalban tallhat. Ahelyett, hogy mindig egy
szmtani sorozattal dolgozna (mint a Pascalban), vagy hogy megadn a lehetsget a felhasznlnak, hogy
sajt maga hatrozza meg mind az itercis lpst, mind a kilpsi felttelt (ahogy a C-ben van) a Python
for utastsa vgighalad a sorozat (pl. szvegek listja) sszes elemn olyan sorrendben, ahogy a listban
szerepelnek. Pldul:
>>> # Megmrjk a szavak hosszt:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
... print(x, len(x))
...
cat 3
window 6
defenestrate 12

Nem biztonsgos dolog megvltoztatni a sorozatot, amelyen ciklussal vgighaladunk (ez csak
megvltoztathat sorozattal, pldul listval trtnhet meg). Ha mgis szksges megvltoztatnod a listt,
akkor a msolatt hasznld a for ciklusban. A szelet (slice) jellsi mddal ezt knyelmesen megteheted:
>>> for x in a[:]: # egy msolatot csinl az eredeti listrl
... if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']

4.3. A range() fggvny


Ha egy szmsorozaton kell vgighaladnunk, a range() beptett fggvny lehet szolglatunkra. Ez egy
szmtani sorozatot llt el:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4

A megadott vgpont sohasem rsze a listnak; range(10) 10 rtket hoz ltre, pontosan egy tzelem
sorozat indexeit. Lehetsg van r, hogy a sorozat ms szmmal kezddjn, vagy hogy ms lpskzt
adjunk meg (akr negatvat is):
range(5, 10)
5-tl 9-ig

range(0, 10, 3)
0, 3, 6, 9

range(-10, -100, -30)


-10, -40, -70

Ha egy sorozat indexein akarunk vgighaladni, hasznljuk a range() s len() fggvnyeket a


kvetkezkppen:
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

4.4. A break s a continue utastsok, az else g a ciklusokban


A break utasts ahogy a C-ben is a break-et tartalmaz legbels for vagy while ciklusbl ugrik ki.

A ciklusszervez utastsoknak lehet egy else guk. Ez akkor hajtdik vgre, ha a ciklus vgighaladt a
listn (for esetn), illetve ha a felttel hamiss vlt (when esetn), de nem hajtdik vgre, ha a ciklust a
break utastssal szaktottuk meg. Ezt a kvetkez pldval szemlltetjk, amely a prmszmokat keresi
meg:
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'felbonthat:', x, '*', n//x)
... break
... else:
... # a ciklus nem tallt osztt
... print(n, 'prmszm.')
...
2 prmszm.
3 prmszm.
4 felbonthat: 2 * 2
5 prmszm.
6 felbonthat: 2 * 3
7 prmszm.
8 felbonthat: 2 * 4
9 felbonthat: 3 * 3

(Igen, ez a helyes kd. Nzd meg alaposan: az else g a for ciklushoz, s nem az if utastshoz
tartozik.)

Egy ciklusban az else g inkbb a try utasts else gra hasonlt, mint az if utastsra: a try utasts
else ga akkor fut le, ha nincs kivtel, egy ciklus else ga pedig akkor, ha nem hajtdik vgre break.
Bvebben a try utastsrl s a kivtelekrl: Kivtelek kezelse.

A continue utasts, amely szintn a C-bl szrmazik, a kvetkez itercival folytatja a ciklust:
>>> for num in range(2, 10):
... if num % 2 == 0:
... print("Pros szmot talltam:", num)
... continue
... print("Szmot talltam:", num)
Pros szmot talltam: 2
Szmot talltam: 3
Pros szmot talltam: 4
Szmot talltam: 5
Pros szmot talltam: 6
Szmot talltam: 7
Pros szmot talltam: 8
Szmot talltam: 9

4.5. A pass utasts


A pass utasts nem csinl semmit. Akkor hasznlhat, ha szintaktikailag szksg van egy utastsra, de a
programban nem kell semmit sem csinlni. Pldul:
>>> while True:
... pass # Elfoglalt - billentyzetrl rkez megszaktsra (Ctrl+C) vr.
...

Gyakran hasznljuk arra, hogy minimlis osztlyt hozzunk ltre:


>>> class UresOsztalyom:
... pass
...

A pass utastst hely fenntartsra is hasznlhatod fggvny vagy feltteles rsz esetn, amikor j kdon
dolgozol, lehetv tve, hogy jval elvontabb szinten gondolkodj. A pass kulcsszt figyelmen kvl
hagyja a programfuts:
>>> def initlog(*args):
... pass # Ne feljetsem el implementlni!
...

4.6. Fggvnyek definilsa


Ltrehozhatunk egy fggvnyt, amely egy megadott rtkig rja ki a Fibonaccisorozatot:
>>> def fib(n): # Kir egy Fibonacci-sorozatot n-ig
... "Kir egy Fibonacci-sorozatot n-ig."
... a, b = 0, 1
... while b < n:
... print(b, end="")
... a, b = b, a+b
...
>>> # Hvjuk meg a fggvnyt amit ppen ltrehoztunk:
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

A def kulcssz a fggvny defincijt jelzi. Ezt egy fggvnynvnek, majd zrjelben a paramterek
listjnak kell kvetnie. Az utastsok amelyek a definci testt alkotjk a kvetkez sorban
kezddnek, s behzssal kell kezdeni azokat.

A fggvny testnek els utastsa lehet egy literlis karakterlnc is; ez a karakterlnc a fggvny
dokumentcis karakterlnca, angolul rviden docstring. (Bvebben a docstring-rl a kvetkez
fejezetben: A dokumentcis karakterlncok.) Vannak eszkzk, amelyek a docstring-et hasznljk
ahhoz, hogy az online vagy a nyomtatott dokumentcit automatikusan elksztsk, vagy hogy a
felhasznlt segtsk a kdban trtn interaktv bngszshez. J szoks, hogy a docstringet belerjuk a
kdba, krnk tged hogy te is szokjl r.

A fggvny vgrehajtsa egy j szimblumtblt hoz ltre a fggvny helyi vltozi szmra.
Pontosabban: minden rtkads a fggvnyben a helyi szimblumtblban troldik; a vltozkra val
hivatkozsok esetn elszr a Python helyi szimblumtblban, aztn a globlis szimblumtblban, vgl
a beptett nevek tbljban keresgl. gy globlis vltozknak nem adhatunk kzvetlenl rtket egy
fggvnyben (hacsak nem nevezzk meg egy global utastsban), jllehet hivatkozhatunk r.

A fggvnyhvs aktulis paramterei (argumentumai) bekerlnek a hvott fggvny helyi


szimblumtbljba amikor azt meghvjuk, gy az argumentumok mindig rtkeket adnak t (ahol az rtk
mindig az objektumra trtn hivatkozs, nem az objektum rtke). [1] Ha a fggvny egy msik fggvnyt
hv, akkor az j hvshoz egy j helyi szimblumtbla jn ltre.

A fggvnydefinci a fggvny nevt berja az aktulis szimblumtblba. A fggvnynv rtknek van


egy tpusa, amelyet a fordt a felhasznl ltal definilt fggvnyknt ismer fel. Ezt az rtket trsthatjuk
egy msik vltozhoz, amely ekkor szintn fggvnyknt hasznlhat. Ez egy ltalnos tnevezsi
eljrsknt szolgl:
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89

Ms nyelvektl jve kifogsolhatja valaki, hogy a fib nem fggvny, hanem eljrs, mivel nem tr vissza
semmilyen rtkkel.

Valjban azok a fggvnyek is, amelyekben nincs return utasts, visszaadnak egy rtket, br egy elg
unalmasat. Ez az rtk a None (egy beptett nv). A None rtk kirst ltalban elnyomja az rtelmez,
ha csak ezt az rtket kell kirnia. Errl meggyzdhetnk, ha akarunk a print() fggvny hasznlatval:
>>> print(fib(0))
None

Knnyen rhatunk olyan fggvnyt, amely visszatr a Fibonacci-sorozat rtkeit tartalmaz listval
ahelyett, hogy kiratn azokat:
>>> def fib2(n): # Visszaadja a Fibonacci-sorozatot n-ig
... "A Fibonacci-sorozat n-nl kisebb elemeit adja vissza egy listban."
... eredmeny = []
... a, b = 0, 1
... while b < n:
... eredmeny.append(b) # lsd lejjebb
... a, b = b, a+b
... return eredmeny
...
>>> f100 = fib2(100) # hvjuk meg
>>> f100 # rjuk ki az eredmnyt
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Ez a plda nhny j vonst mutatja a Pythonnak:


A return utasts egy rtkkel tr vissza a fggvny futsnak bejezsekor. A return utasts
argujmentum nlkl None rtket ad vissza. Ha egy fggvny lefutott, s nem hajtott vgre return
utastst, akkor is None rtkkel tr vissza.

A eredmeny.append(b) utasts meghvja az eredmeny lista objektum egy metdust. A metdus


egy olyan fggvny, amely egy objektumhoz ,,tartozik, obj.metdusnv alakban rjuk, ahol az obj
valamelyik objektum (lehet egy kifejezs), s a metdusnv egy olyan metdus neve, amelyet az
objektumtpus definil. Klnbz tpusoknak klnbz metdusai vannak. Klnbz tpusoknak
lehet azonos nev metdusa mindenfle ktrtelmsg veszlye nlkl. (Lehetsg van r, hogy
definiljunk sajt objektumokat s metdusokat osztlyok hasznlatval, lsd Osztlyok)

A pldban szerepl append() metdus a lista-objektumokra lett definilva; ez hozzfz egy j


elemet a lista vghez. Ebben az esetben azonos az eredmeny = eredmeny + [b] alakkal, de
sokkal hatkonyabb.

4.7. Mg tbb tudnival a fggvnyek definilsrl


Lehetsgnk van fggvnyeket definilni vltoz szm argumentummal. Ennek hrom formja van,
amelyek varilhatk.
4.7.1. Alaprtelmezett (default) argumentumrtkek
A leghasznosabb alak az, ha egy vagy tbb argumentumnak is meghatrozott alaprtket adunk meg (azaz
egy olyan rtket, amit ez az argumentum felvesz, ha nem adunk rtket neki). Ez gy egy olyan fggvnyt
hoz ltre, amelyet kevesebb argumentummal is meghvhatunk, mint amennyivel definiltuk:
def ask_ok(szoveg, probalkozasok=4, hibauzenet='igen vagy nem!'):
while 1:
ok = raw_input(szoveg)
if ok in ('i', 'igen','I','IGEN'):
return True
if ok in ('n', 'nem', 'N','NEM'):
return False
probalkozasok = probalkozasok - 1
if probalkozasok < 0:
raise IOError('rtelmetlen felhasznl')
print(hibauzenet)

Ez a fggvny tbbfle mdon hvhat meg:


megadhatjuk csak a ktelez argumentumot: ask_ok('Valban ki akarsz lpni?')


csak egy elhagyhat argumentumot adunk meg: ask_ok('Fellrhatom a fjlt?', 2).
minden argumentumot megadunk: ask_ok('Fellrhatom a fjlt?', 2, 'igen-nel vagy
nem-mel vlaszolj!').

Az elz program egyben plda az in kulcssz hasznlatra is. gy tesztelhetjk, hogy a sorozat vajon
tartalmaz-e egy adott rtket, vagy nem.

Az alaprtkeket a fordt akkor hatrozza meg, amikor a fggvny defincijval elszr tallkozik,
emiatt ezek kiszmtsa csak egyszer trtnik meg! gy pldul a kvetkez program eredmnye 5 lesz:
i = 5

def f(arg=i):
print(arg)

i = 6
f()

Fontos figyelmeztets: Az alaprtkeket a fordt csak egyszer hatrozza meg! Emiatt klnbsg van,
ha az alaprtk megvltoztathat objektum, mint amilyen a lista, sztr vagy a legtbb pldnyosodott
osztly. Pldul az albbi fggvny sszegyjti az egyms utni hvsok sorn neki adott paramtereket:
def f(a, L=[]):
L.append(a)
return L

print(f(1))
print(f(2))
print(f(3))

A program kimenete:
[1]
[1, 2]
[1, 2, 3]

Ha nem akarod az alaprtkeket lthatv tenni az egymst kvet hvsok szmra, akkor inkbb ehhez
hasonlan rd a fggvnyt:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L

4.7.2. Kulcsszavas argumentumok


A fggvnyeket akr kulcssz=rtk formban megadott, gynevezett kulcsszavas argumentumok
hasznlatval is meghvhatunk. Pldul a kvetkez fggvny:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action,)
print("if you put", voltage, "Volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")

meghvhat az sszes albbi mdon:


parrot(1000) # 1 hely szerinti argumentum
parrot(voltage=1000) # 1 kulcsszavas argumentum
parrot(voltage=1000000, action='VOOOOOM') # 2 kulcsszavas argumentum
parrot(action='VOOOOOM', voltage=1000000) # 2 kulcsszavas argumentum
parrot('a million', 'bereft of life', 'jump') # 3 hely szerinti argumentum
parrot('a thousand', state='pushing up the daisies') # 1 hely szerinti, 1 kulcsszava

de a kvetkez hvsok mind rvnytelenek:


parrot() # a ktelez argumentum hinyzik
parrot(voltage=5.0, 'dead') # nem-kulcsszavas argumentum kulcsszavas utn
parrot(110, voltage=230) # ktszeres rtkads egy argumentumnak
parrot(actor='John Cleese') # ismeretlen kulcssz

A fggvnyhvsok esetn a kulcsszavas argumentumoknak a hely szerintiek utn kell llniuk. Minden
kulcsszavas argumentumnak olyannak kell lennie, amely egyezik a fggvny ltal elfogadott valamelyik
argumentummal (pl. az actor nem rvnyes argumentum a parrot fggvny szmra), s a sorrendjk
lnyegtelen. Akr lehetnek ktelez argumentumok is (pl. parrot(voltage=1000) is rvnyes).

Egy hvs sorn nem kaphat egy argumentum egynl tbb alkalommal rtket. Itt van egy plda, amely nem
hajtdik vgre emiatt a megkts miatt:
>>> def function(a):
... pass
...
>>> function(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'
Ha van egy **nv alak formlis paramter utolsknt, akkor egy ilyen nev sztrban troldik az
sszes kulcsszavas argumentum, amelynek a kulcsszava nem illeszkedik egyetlen formlis paramterre
sem. Ez egytt hasznlhat egy *nv alak formlis paramterrel (ez a kvetkez alszakaszban lesz
lerva) amely belerakja egy tuple-ba az sszes olyan nem-kulcsszavas argumentumot, amely nincs benne a
formlis paramterlistban. A *nv-nek mindg a **nv eltt kell lennie. Pldul, ha egy ilyen fggvnyt
definilunk:
def sajtuzlet(sajtfajta, *argumentumok, **kulcsszavak):
print("-- Van nknl", sajtfajta, '?')
print("-- Sajnlom, teljesen kifogytunk a", sajtfajta+'bl')
for arg in argumentumok:
print(arg)
print("-" * 40)
kulcsok = sorted(kulcsszavak.keys())
for kw in kulcsok:
print(kw, ":", kulcsszavak[kw])

Ez meghvhat gy is:
sajtuzlet('Plpusztai', "Ez nagyon bds, uram.",
"Ez nagyon, NAGYON bds, uram.",
vevo='Sajti Jnos',
boltos='Plinks Mihly',
helyszin='Sajtbolt')

s termszetesen ezt fogja kirni:


-- Van nknl Plpusztai ?
-- Sajnlom, teljesen kifogytunk a Plpusztaibl
Ez nagyon bds, uram.
Ez nagyon, NAGYON bds, uram.
----------------------------------------
boltos : Plinks Mihly
helyszin : Sajtbolt
vevo : Sajti Jnos

Megjegyzend, hogy a kulcsszavak nev sztr tartalmnak kinyomtatsa eltt a kulcsok vltozba a
kulcsszavak sztr kulcsszavainak rendezett listjt raktuk; ha nem ezt tesszk, akkor az a sorrend,
ahogy az argumentumokat kiiratjuk hatrozatlan lenne.

4.7.3. Tetszleges hosszsg argumentumlistk


Vgl itt a legritkbban hasznlt lehetsg, amikor egy fggvnynek tetszleges szm argumentuma lehet.
Ezeket az argumentumokat egy tuple-ba helyezi el a Python. A vltoz szmossg argumentum eltt
akrhny (akr egy sem) egyszer argumentum is elfordulhat.
def tobb_adat_irasa(file, separator, *args):
file.write(separator.join(args))

Normlis esetben ezek az gynevezett variadikus argumentumoknak kell a formlis paramterek


legvgn llniuk, mivel ezek gyjtik ssze az sszes maradk bemen argumentumot, amelyet a
fggvnynek megadtunk. Minden formlis paramter, amelye az *args paramter utn ll, csak
kulcsszval hvhat meg, nem lehet hely szerinti argumentumknt meghvni.
>>> def osszefuz(*args, sep="/"):
... return sep.join(args)
...
>>> osszefuz("fld", "mars", "venus")
'fld/mars/venus'
>>> osszefuz("fld", "mars", "venus", sep=".")
'fld.mars.venus'

4.7.4. Argumentumlista kicsomagolsa


Ennek fordtottja trtnik, ha listba vagy tuple-ba becsomagolt argumentumokat ki kellene csomagolni
olyan fggvny meghvshoz, amely elklntett, helyhez- kttt vltozkat vr. Pldul a beptett
range() fggvny egymstl elklntve vrja a start s stop rtkeket. Ha ezek nem egymstl
elvlasztva llnak rendelkezsre, akkor a break fggvnyhvsban a * mveletjelet tegyk az sszetett-
tpus vltoz neve el, ez kicsomagolja a listbl vagy tuple-bl az adatokat.
>>> range(3, 6) # normlis fggvnyhvs, klnll paramterekkel
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # listbl kicsomagolt paramterekkel trtn fggvnyhvs
[3, 4, 5]

4.7.5. Lambda-formk
A lambda kulcsszval rvid nvtelen fggvnyeket lehet ltrehozni. me egy fggvny, amely a kt
argumentumnak sszegvel tr vissza: lambda a, b: a+b. A lambda-formkat mindenhol hasznlhatjuk,
ahol fggvnyobjektumok szerepelhetnek. Szintaktikailag egyetlen kifejezs szerepelhet bennk. rtelmt
tekintve hab a normlis fggvnyek tortjn. A begyazott fggvnyekhez hasonlan ltja az t meghv
krnyezet minden vltozjt.
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42) # make_incrementor magyarul kb.: csinlj nvel-t
>>> f(0)
42
>>> f(1)
43

A fenti plda arra hasznlja a lambda-kifejezst, hogy egy fggvnyt adjon vissza. Ezen kvl lehetsget
biztost, hogy egy fggvnyt adhassunk t argumentumknt:
>>> szamok = [(1, "egy"), (2, "kett"), (3, "hrom"), (4, "ngy")]
>>> szamok.sort(key = lambda szam: szam[1])
>>> szamok
[(1, 'egy'), (3, 'hrom'), (2, 'kett'), (4, 'ngy')]

A fenti plda a msodik (azaz 1-es index) tag szerint rendezi sorba a prokat.

4.7.6. A dokumentcis karakterlncok


A dokumentcis karakterlncok tartalmval s formjval kapcsolatban egy kialakult s bevlt szoksrl
beszlhetnk.
Az els sor mindig az objektum cljnak rvid, tmr sszegzse. Rvidsge miatt nem kell tartalmaznia
az objektum nevt vagy tpust, hiszen ezek az adatok ms ton is kinyerhetk (kivve, ha az objektum
neve a fggvny mkdst ler ige). A szveg nagybetvel kezddik s ponttal vgzdik.

Ha a dokumentcis karakterlnc (docstring) tbb sorbl ll, a msodik sor res lesz ezzel vizulisan
elklntjk az sszefoglalt a lers tovbbi rsztl. Az res sort egy vagy tbb rsz kvetheti, ahol
lerjuk az objektum hvsnak mdjt, a mellkhatsokat stb.

Maga a Python rtelmez nem szedi le a helykzket a tbbsoros literlis karakterlncbl ha ezek
kiszrse szksges, akkor ehhez kln szvegfeldolgoz programot kellene hasznlni. Ezt a problmt a
kvetkez konvenci hasznlatval kezeljk. Az els sor utn a legels nem res sorban megjelen
szveg behzsi tvolsga hatrozza meg az egsz dokumentcis szveg behzst. (A legels sort azrt
nem hasznljuk erre a clra, mert a szveg els betje ltalban szorosan kveti a karakterlncot nyit
macskakrmt, ennek eltolsa nem lenne nyilvnval dolog.) A docstring fejrszt kvet minden els
sornak elejrl levgunk pont ennyi helykzt. Ha ennl kevesebb helykzt tartalmaz valamely sor br
ilyennek nem kne lennie csak a helykzk trldnek, karakter nem vsz el. A behzsok egyenlsgt
ajnlott mindig a tabultorokat kibontva ellenrizni (ltalban 1 tabultort 8 helykzzel helyettestnk).

Itt van egy plda a tbbsoros docstring-re:


>>> def fuggvenyem():
... """Nem csinl semmit, de ez dokumentlva van.
...
... Valban nem csinl semmit.
... """
... pass
...
>>> print(fuggvenyem.__doc__)
Nem csinl semmit, de ez dokumentlva van.

Valban nem csinl semmit.

4.8. Intermezzo: kdolsi stlus


Most mr egy hosszabb s sszetettebb Python kdot szeretnl rni, itt az id, hogy beszljnk a kdolsi
stlusrl. A legtbb nyelven tbbfle mdon lehet rni (pontosabban formzni); nmelyik sokkal
olvashatbb mint msikak. Az, hogy a kdunkat msok szmra is olvashatv tegyk mindig j tlet, s
egy helyes kdolsi stlus elfogadsa sokat segt ebben.

A Python szmra a PEP 8 [http://www.python.org/dev/peps/pep-0008] vlt a stlus tmutatjv, amelyet a legtbb


projekt kvet; egy nagyon olvashat s szemnek kellemes kdolsi stlust javasol. Minden Python-
fejlesztnek el kellene olvasnia valamikor. Itt tallod a legfontosabb pontjait:

Hasznlj 4-szkz behzst, de tabultorokat ne!

A 4 szkz j kzpt a kis behzs (amely nagyobb egymsbagyazsi mlysget enged meg) s a
nagy behzs (egyszerbb olvasni) kztt. A tabultorok keveredst okozhatnak, gy jobb, ha
elkerljk.
Trjk gy a sorokat, hogy ne lpjk tl a 79 karakter hosszsgot!

Ez segti azokat a felhasznlkat, akiknek kisebb a kijelzjk, s lehetv teszi, hogy tbb
programfjlt jelentsnk meg egyms mellett nagyobb kijelzn.

Hasznlj res sorokat, hogy elvlaszd a fggvnyeket s az osztlyokat, valamint a nagyobb


blokkokat egy fggvnyen bell!

Ha lehet a megjegyzseket a sajt sorba rd!

Hasznlj dokumentcis karakterlncokat!

Hasznlj szkzket a mveleti jelek krl s a vesszk utn a = f(1, 2) + g(3, 4)!

Kvetkezetesen nevezd el az osztlyokat s a fggvnyeket! Szoks szerint TeveJelolesModot


alkalmazunk az osztlyoknl s kisbetuket_alahuzassal a fggvnyek esetn. Mindig a self-et
hasznld az els metdusargumentumnak (lsd az Els tallkozs az osztlyokkal fejezetet az
osztlyokrl s a metdusokrl).

Ne hasznlj klnleges kdolsokat, ha a kdodat vrhatan nemzetkzi krnyezetben is hasznlni


fogjk! A Python alaprtelmezett UTF-8 kdolsa, vagy az ASCII minden esetben jl mkdik.

Szintn ne hasznlj nem-ASCII karaktert az azonostkban, ha csak a legkisebb eslye is van, hogy
ms nyelvet beszl emberek fogjk olvasni vagy karbantartani a kdot!

Lbjegyzet

Valjban az objektumhivatkozssal trtn hvs jobb elnevezs lenne, mivel, ha egy


[1] megvltoztathat objektumot adunk t, a hv ltni fogja az sszes vltozst, amit a hvott fggvny
vgez (elem beszrsa listba).
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

5. Adatstruktrk
Ez a fejezet az eddig tanultakbl pr dolgot rszletesebben is ler, s pr j dolgot is megmutat.

5.1. Mg tbb dolog a listkrl


A lista adattpusnak a mr megismerteken kvl tbb metdusa (method) is van. Az sszes metdus
ismertetse:

list.append(x)
Egy elemet hozzad a lista vghez; megegyezik az a[len(a):] = [x] utastssal.

list.extend(L)
A lista vghez hozzfzi az L listt (mindegyik elemt egyenknt); ugyanaz, mint az a[len(a):] =
L.

list.insert(i, x)
Beszr egy elemet az adott helyre. Az els argumentum az elem indexe, amely el beszrjuk, gy
a.insert(0, x) a lista elejre szr be, s az a.insert(len(a), x) ugyanazt jelenti mint az
a.append(x).

list.remove(x)
Eltvoltja a legels olyan elemet a listbl, amelynek rtke x. Hiba, ha nincs ilyen.

list.pop([i])
Eltvoltja az adott helyen lv elemet a listbl, s visszaadja az rtkt. Ha nem adtunk meg
indexet, akkor az a.pop() az utols elemmel tr vissza. (Ekkor is eltvoltja az elemet.) (A
fggvny-argumentum megadsnl hasznlt szgletes zrjel azt jelenti, hogy a paramter megadsa
tetszleges, s nem azt, hogy a [] jeleket be kell gpelni az adott helyen. Ezzel a jellssel gyakran
tallkozhatsz a Python Standard Library-ban (Szabvnyos Python knyvtrban) )

list.index(x)
Visszatr az els olyan elem indexvel, aminek az rtke x. Hiba, ha nincs ilyen.

list.count(x)
Visszaadja x elfordulsnak a szmt a listban.

list.sort()
Rendezi a lista elemeit. A rendezett lista az eredeti listba kerl.

list.reverse()
Megfordtja az elemek sorrendjt a listban - szintn az eredeti lista mdosul.
Egy plda, amely tartalmazza a legtbb metdust:
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

5.1.1. Lista hasznlata veremknt


A lista metdusai megknnytik a lista veremknt trtn hasznlatt ahol az utols lerakott elemet
vesszk ki elszr (,,utoljra be, elszr ki, angol rvidtse LIFO). Ahhoz, hogy a verem tetejre egy
elemet adjunk, hasznljuk az append() utastst.

A lista legels/legfels elemnek kivtelhez hasznljuk a pop() utastst mindenfle index nlkl.
Pldul:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

5.1.2. A Listk hasznlata sorknt (queue)


A listt hasznlhatjuk gy is mint egy sort, ahol az els hozzadott elemet vesszk ki elszr (first-in,
first-out, FIFO). Ahhoz, hogy elemet hozzadjunk a sor vghez, hasznljuk az append() utastst. A sor
els elemt visszakaphatjuk a pop() utastssal, ha az argumentuma 0. Pldul:
>>> sor = ["Maca", "Jnos", "Mihly"]
>>> sor.append("Teri") # Teri megrkezett
>>> sor.append("Gergely") # Gergely megrkezett
>>> sor.pop(0)
'Maca'
>>> sor.pop(0)
'Jnos'
>>> sor
['Mihly', 'Teri', 'Gergely']

5.1.3. Listartelmezs
A listartelmezs ttekinthet utat biztost a listk ltrehozshoz. Gyakori alkalmazsuk, hogy j listt
ksztsnk, amelyben minden elemet gy hozunk ltre, hogy egy sorozat vagy egy iterlhat objektum
sszes tagjn valamilyen mveletet vgznk, vagy az elemek egy rszhalmazt vesszk, amelyek bizonyos
feltteleknek megfelelnek.

Pldul, ha a ngyzetszmok listjt akarjuk ltrehozni, mint albb:


>>> squares = []
>>> for x in range(10):
... squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ltrehozhatjuk gy is:
squares = [x**2 for x in range(10)]

Ez gy is ltrehozhat: squares = list(map(lambda x: x**2, range(10))), de az elbbi sokkal


tmrebb s olvashatbb.

A listartelmezs egy zrjelbl ll, amelyben egy kifejezst egy for g kvet, majd nulla vagy tbb for
vagy if g. Az eredmny egy j lista lesz, melyet a kifejezs kirtkelsvel kapunk az azt kvet for s
if gak figyelembevtelvel. Pldul az albbi listartelmezs kombinlja kt lista elemeit, amennyiben
azok nem egyenlek:
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

s ez egyenrtk az albbival:
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Vedd szre, hogy a for s if lltsok sorrendje azonos mindkt pldban.

Ha a kifejezs egy tuple (pl. az (x, y) az elz pldban), akkor zrjelbe kell rakni.
>>> vec = [-4, -2, 0, 2, 4]
>>> # ltrehoz egy listt az rtkek megduplzsval
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # szri a listt a negatv rtkek elhagysval
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # alkalmaz egy fggvnyt az sszes elemre
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # meghv egy metdust az sszes elemre
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # 2 elem tuple-ok listjt hozza ltre, mint (szm, ngyzete)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # a tuple-nak zrjelben kell lennie, klnben hiba lp fel
>>> [x, x**2 for x in range(6)]
File "<stdin>", line 1, in ?
[x, x**2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # egy lista kisimthat kt for-t tartalmaz listartelmezssel
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Egy listartelmezs sszetett kifejezseket s egymsba gyazott fggvnyeket is tartalmazhat:


>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

5.1.4. Egymsba gyazott listartelmezsek


Egy listartelmezs eredeti kifejezse tetszleges kifejezs lehet, akr egy msik listartelmezs is.

Tekintsk a kvetkez pldt, amelyben egy 3x4-es mtrixot egy 4-elem listkbl ll 3-elem lista
trol:
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]

A kvetkez listartelmezs felcserli a sorokat s az oszlopokat (transzponlja a mtrixot):


>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Ahogy ez elz fejezetben lttuk, az egymsba gyazott listartelmezs az utna ll for


figyelembevtelvel rtkeldik ki, teht ez a plda egyenrtk az albbival:
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

amely pedig azonos az albbival:


>>> transposed = []
>>> for i in range(4):
... # az albbi 3 sor felel meg a bels listartelmezsnek
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Az val letben persze ehelyett beptett fggvnyeket rdemes hasznlni sszetett folyamatok helyett. A
zip() fggvny remek eredmnyt ad ebben az esetben:

>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

Lsd Argumentumlista kicsomagolsa fejezetet a fenti sorban szerepl csillaggal kapcsolatban.

5.2. A del utasts


Egy listaelem eltvoltsnak egyik mdja, hogy az elem rtke helyett az indext adjuk meg: ez a del
utasts. Ez abban klnbzik a pop() metdustl, hogy az egy rtkkel tr vissza. A del utasts arra is
hasznlhat, hogy szeleteket trljnk a listbl vagy kirtsk az egsz listt (amit mr megtettnk
korbban gy, hogy a szeletnek az res lista rtkt adtuk). Pldul:
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]

A del utastst arra is hasznlhatjuk, hogy az egsz vltozt trljk:


>>> del a

A tovbbiakban hibt generl, ha az a nvre hivatkozunk (kivve, ha j rtket adunk neki). Ksbb a del
utastsnak ms alkalmazsval is tallkozunk.

5.3. Tuple-ok s sorozatok


Lttuk, hogy a listknak s a karakterlncoknak rengeteg kzs tulajdonsga van, pldul az indexels s a
szeletek hasznlata. Ez kt Mindkett plda a sorozat-adattpusra. Mivel a Python egy folytonos
fejldsben lv nyelv, msfajta sorozat adattpusok is hozzadhatak. Egy msik beptett sorozat-
adattpusa a tuple (ejtsd tjupl) [#]_.
A tuple-t angol formjban fogjuk hasznlni, mivel nincs igazn j magyar megfelelje. Az irodalomban
hasznljk mg a rendezett sorozat elnevezst, de az abban szerepl rendezett jelz flrevezet.

A tuple objektumokat tartalmaz vesszkkel elvlasztva, pldul:


>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # A tuple-okat egymsba gyazhatjuk:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

Az objektumok klnbz tpusak is lehetnek. A tuple nem megvltoztathat adattpus, viszont lehetnek
megvltoztathat elemei. Plda:
>>> megtanulni = ['matek', 'angol'] # Ez egy megvltoztathat lista, [] jells!
>>> orarendem = ('tesi', 'nyelvtan', megtanulni) # ket string elem, es egy lista a tu
ban -- () jells!

>>> orarendem[0] = 'rajz' # az els rt t akarom rni, nem lehet


Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment

>>> orarendem[2][0]='versek' # viszont a tuple lista elemn bell -


- ami megvltoztathat tpus, szabadon rhatok!

Ahogy lthat, a kimeneten a tuple-ok mindig zrjelezve vannak, gy azok egymsba gyazva is helyesen
rtelmezhetk; megadhatjuk zrjelekkel s anlkl is, nha azonban felttlenl szksgesek a zrjelek
(amikor az egy nagyobb kifejezs rsze).

A tuple tpust sokfle dologra felhasznlhatod. Pldul: (x, y) koordintapr trolsa, dolgozk rekordjai
egy adatbzisban... A tuple-ok a karakterlncokhoz hasonlan megvltoztathatatlanok: nem adhatunk
rtket egyetlen elemnek (tovbbi hasonlsgot mutatnak a szeletelssel s az sszefzssel
kapcsolatban is).

Egy klns problma nulla vagy egy elemet tartalmaz tuple ltrehozsa: a nyelv szintaxisa lehetv
teszi ezt. Az res zrojellel hozhat ltre a nulla elem; az egy elem pedig az rtk utn tett vesszvel
(nem elg, ha az rtket zrjelbe tesszk). Csnya, de hatkony. Pldul:
>>> ures = ()
>>> egyszeres = 'hello', # <-- figyeljnk a vesszre a vgn
>>> len(ures)
0
>>> len(egyszeres)
1
>>> egyszeres
('hello',)

A t = 12345, 54321, 'hello!' rtkads egy plda a tuple vltoz feltltsre [#]_ s jbli a
12345, 54321 s 'hello!' klnbz objektumok rtkei egy tuple-ba kerlnek. A fordtott mvelet is
lehetsges, pldul:
>>> x, y, z = t

This is called, appropriately enough, sequence unpacking. Sequence unpacking requires that the list of
variables on the left have the same number of elements as the length of the sequence. Note that multiple
assignment is really just a combination of tuple packing and sequence unpacking!

Ezt hvjk, elg helyesen, sorozat-sztpakolsnak. A sorozat sztpakolshoz az szksges, hogy a bal
oldalon annyi elem szerepeljen, ahny elem van a tuple-ban. Jegyezzk meg, hogy a tbbszrs rtkads
csak egy vltozata a tuple lehetsges feltltsnek!

Van egy kis asszimetria itt: a klnbz objektumokkal val feltlts mindig tuple-t eredmnyez,
ugyanakkor a sztbonts minden sorozatra mkdik.

5.4. A halmazok (set)


A Python a set adattpust is tartalmazza. A halmaz elemek rendezetlen halmaza, amelyben minden elem
csak egyszer fordulhat el. Alapvet hasznlata: megadott elem megltnek ellenrzse, elemek
kettzsnek kiszrse. A set objektumok tmogatjk az olyan matematikai mveleteket, mint az egyests,
metszet, klnbsg, s a szimmetrikus eltrs.

A halmazok ltrehozshoz a kapcsos zrjel, vagy a set() fggvny hasznlhat. Jegyezzk meg, hogy az
res halmaz ltrehozshoz csak a set() hasznlhat, a {} nem, mert az utbbi res sztrat hoz ltre: egy
olyan adattszerkezetet, amelyet e kvetkez fejezetben trgyalunk.

me egy rvid bemutat:


>>> kosar = {'alma', 'narancs', 'alma', 'krte', 'narancs', 'bann'}
>>> print(kosar) # a tbbszr szerepl elemek csak egyszer szereplenek
{'narancs', 'krte', 'alma', 'bann'}
>>> 'narancs' in kosar # gyors ellenrzs: benne van-e
True
>>> 'kakukkfu' in kosar
False

>>> # Plda: set mveletek kt sz egyedi betin


...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # 'a' egyedi elemei
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 'a'-ban megvan, b-bl hinyzik
{'r', 'd', 'b'}
>>> a | b # 'a'-ban, vagy 'b'-ben megvan
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 'a'-ban s 'b'-ben is megvan
set(['a', 'c'])
>>> a ^ b # vagy 'a'-ban, vagy 'b'-ben megvan, de
# egyszerre mindkettben nem
{'r', 'd', 'b', 'm', 'z', 'l'}

A listartelmezshez hasonlan ltezik halmazrtelmezs is:


>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

5.5. Sztrak
Egy msik hasznos adattpus a Pythonban a sztr. A sztrakat ms nyelvekben ,,asszociatv tmbknek
nevezik. Szemben a sorozatokkal amelyek szmokkal vannak indexelve a tmbket kulcsokkal
indexeljk, amely mindenfle megvltoztathatatlan tpus lehet; karakterlncok s szmok mindig lehetnek
kulcsok. Tuple-ok is hasznlhatk kulcsnak, ha csak szmokat, karakterlncokat vagy tuple-okat
tartalmaznak; ha egy tuple megvltoztathat objektumot tartalmaz kzvetlenl vagy kzvetve, akkor nem
lehet kulcs.

Listt nem lehet kulcsknt hasznlni, mert annak rtkei az append(), extend() metdusokkal, valamint a
szeletel vagy indexelt rtkadsokkal (helyben) mdosthatk.

Gondoljunk gy a sztrra, mint kulcs: rtk prok rendezetlen halmazra, azzal a megktssel, hogy a
sztrban a kulcsoknak egyedieknek kell lennik. Egy kapcsos zrjelprral egy res sztrat hozhatunk
ltre: {}. Ha a zrjelbe vesszkkel elvlasztott kulcs:rtk prokbl ll listt helyeznk, akkor ez
belekerl a sztrba; egy sztr tartalma is ilyen mdon jelenik meg a kimeneten.

A legfontosabb mveletek egy sztron: eltrolni egy rtket egy kulccsal egytt, visszakapni egy rtket
megadva a kulcst. Lehet trlni is egy kulcs:rtk prt a del-lel. Ha olyan kulccsal trolsz egy j rtket,
amilyen kulcsot mr hasznltl, a kulcshoz az j rtk fog tartozni, a rgi rtk elveszik. Hiba, ha egy
nemltez kulcsra hivatkozol.

Egy sztron a list(d.keys()) vgrehajtsa a kulcsok listjt adja vissza vletlenszer sorrendben (ha
rendezni akarod, hasznld a sort() metdust a kulcsok listjra). Ha ellenrizni szeretnd, vajon egy
kulcs benne van-e a sztrban, hasznld az in kulcsszt.

me egy kis plda a sztr hasznlatra:


>>> tel = {'Jnos': 4098, 'Simon': 4139}
>>> tel['Gza'] = 4127
>>> tel
{'Simon': 4139, 'Gza': 4127, 'Jnos': 4098}
>>> tel['Jnos']
4098
>>> del tel['Simon']
>>> tel['Pisti'] = 4127
>>> tel
{'Gza': 4127, 'Istvn': 4127, 'Jnos': 4098}
>>> tel.keys()
['Gza', 'Istvn', 'Jnos']
>>> 'Gza' in tel
True
>>> 'Istvn' not in tel
False

A dict() konstruktor kzvetlenl tuple-okban trolt kulcs-rtk prok listjbl is ltre tudja hozni a
sztrat. Ha a prok valamilyen mintt kvetnek, akkor lista-mveletekkel rvidebb mdon is
megadhatjuk a kulcs-rtk listt.
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension
{2: 4, 4: 16, 6: 36}

Ezen fell a sztrrtelmezs hasznlhat arra, hogy sztrat hozzunk ltre tetszleges kulcs- s
rtkkifejezsekbl:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

Ha a kulcsok egyszer karakterlncok, nha egyszerbb a prokat kulcsszavas argumentumokkal


ltrehozni:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

5.6. Ciklustechnikk
Ha egy sztr kulcsain szeretnnk vgigmenni, a for utn egyszeren a sztrat rjuk be:
>>> gyumolcsok = {1:'alma', 2:'krte', 3:'bann'}
>>> for kulcs in gyumolcsok:
... print(kulcs, gyumolcsok[kulcs])
...
1 alma
2 krte
3 bann

Ha vgig szeretnnk menni egy sztr elemein, akkor az items() metdussal lpsenknt egyidben
megkapjuk a kulcsot, s a hozz tartoz rtket.
>>> lovagok = {'Gallahad': 'a tiszta', 'Robin': 'a btor'}
>>> for k, v in lovagok.iteritems():
... print(k, v)
...
Gallahad a tiszta
Robin a btor

Ha sorozaton megynk vgig, akkor az pozcit jelz index rtkt s a hozz tartoz rtket egyszerre
kaphatjuk meg az enumerate() fgvnnyel.

Plda: [#]_
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe

Kt vagy tbb sorozat egyszerre trtn feldolgozshoz a sorozatokat a zip() fggvnnyel kell prba
lltani.
>>> kerdesek = ['neved', 'csoda, amit keresel', 'kedvenc szined']
>>> answers = ['Lancelot', 'A szent Gral', 'Kek']
>>> for q, a in zip(kerdesek, valaszok):
... print('Mi a %s? %s.' % (q, a))
...
Mi a neved? It is lancelot. Lancelot.
Mi a csoda, amit keresel? A szent Gral.
Mi a kedvenc szined? Kek.

Egy sorozaton visszafel haladshoz elszr add meg a sorozatot, majd utna hvd meg a reversed()
fggvnyt.
>>> for i in reversed(range(1,10,2)):
... print(i)
...
9
7
5
3
1

Rendezett sorrendben val listzshoz hasznld a sorted() fggvnyt, amely j, rendezett listt ad
vissza, vltozatlanul hagyva a rgi listt.
>>> kosar = ['alma', 'narancs', 'alma', 'korte', 'narancs', 'banan']
>>> for f in sorted(set(basket)):
... print(f)
...
alma
banan
korte
narancs

5.7. Mg tbb dolog a felttelekrl


A while s az if utastsokban eddig hasznlt felttelek egyb mveleteket is tartalmazhatnak az
sszehasonlts mellett.

Az in s not in relcik ellenrzik, hogy az rtk elfordul-e egy sorozatban. Az is s is not relcik
sszehasonltjk, hogy kt dolog valban azonos-e; ez csak olyan vltozkony dolgoknl fontos,
amilyenek pldul a listk. Minden sszehasonlt relcinak azonos precedencija van, mely magasabb
mint a szmokkal vgzett mveletek.

Relcikat lncolhatunk is, pldul: az a < b == c megvizsglja, hogy az a kisebb-e mint b, s ezen
fell b egyenl-e c-vel.

A relcikat sszefzhetjk and s or logikai mveletekkel is, s a relci erdmnyt (vagy brmely
logikai mvelett) ellentettjre vltoztathatjuk a not mvelettel. Ezeknek mindnek kisebb precedencijuk
van, mint a relciknak, s kzlk a not rendelkezik a legmagasabbal s az or a legkisebbel. Teht az A
and not B or C ugyanazt jelenti, mint az (A and (not B)) or C. Termszetesen a zrjeleket
hasznlhatjuk a kvnt felttel elrshez.

Az and s or logikai mveletek gynevezett shortcat (lusta/rvid kirtkels) mveletek: Az


argumentumaik balrl jobbra fejtdnek ki, s a kifejts rgtn megll, mihelyt a vgeredmny egyrtelm.
Pldul: ha A s C mindkett igaz de B hamis, akkor a A s B s C kifejezs sorn a C rtkt a Python
mr nem vizsglja. ltalban a shortcut mveletek visszatrsi rtke ha ltalnos rtkeket s nem
logikai rtket hasznlunk az utolsnak kifejtett argumantummal egyezik.

Lehetsges, hogy egy relci vagy ms logikai kifejezs rtkt egy vltozba rakjuk. Pldul:
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

Jegyezzk meg, hogy a Pythonban szemben a C-vel nem lehet rtkads egy kifejezs belsejben.
Lehet, hogy a C programozk morognak emiatt, de gy kikerlhet egy gyakori problma, amelyet a C
programokban gyakran elkvetnek: = jelet rnak ott, ahol == kellene.

5.8. Sorozatok s ms tpusok sszehasonltsa


Sorozat objektumokat sszehasonlthatunk msik azonos tpus objektummal. Az sszehasonlts a
lexikografikai rendezst hasznlja: elszr az els elemeket hasonltja ssze, ha ezek klnbznek, ez
meghatrozza az sszehasonlts eredmnyt; ha egyenlek, akkor a msodik elemeket hasonltja ssze, s
gy tovbb, amg az egyik sorozatnak vge nem lesz. Ha a kt sszehasonltand elem azonos tpus
sorozat, akkor az sszehasonts rekurzvan trtnik. Ha a kt sorozat minden eleme azonos, akkor
tekinthetek a sorozatok egyenleknek. Ha sz egyik sorozat a msiknak kezd rsz-sorozata, akkor a
rvidebb sorozat a kisebb. A karakterlncok lexikografikai elemzsre az egyes karakterek ASCII
rendezst alkalmazzuk. Nhny plda azonos tpus sorozatok sszehasonltsra:
(1, 2, 3) < (1, 2, 4)
[1, 2, 3] < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4) < (1, 2, 4)
(1, 2) < (1, 2, -1)
(1, 2, 3) == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)

Jegyezzk meg, hogy szablyos a klnbz tpus objektumok sszehasonltsa is < s > relcikkal. Ha
a megfelel objektumoknak vannak megfelel sszehasonlt metdusai. Pldul a vegyes szmtpusok
sszehasonlthatak a szmrtkk alapjn, gy 0 egyenl 0.0-val, stb. Msklnben, egy nknyes
rendezs helyett, az rtelmez TypeError kivtelt dob.

Lbjegyzet

Other languages may return the mutated object, which allows method chaining, such as d-
[1]
>insert("a")->remove("b")->sort();.

Calling d.keys() will return a dictionary view object. It supports operations like membership test
[2]
and iteration, but its contents are not independent of the original dictionary it is only a view .
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

6. Modulok
Ha a Pythont interaktv mdban hasznlod, s kilpsz az rtelmezbl, majd jra visszalpsz, minden
fggvnydefinci s definilt vltoz elvsz. Emiatt ha nagyobb programot akarsz rni, jobban jrsz ha
valamilyen szerkeszt programot hasznlsz az rtelmez szmra elkszteni a bemeneti adatokat, s az
rtelmezt gy futtatod, hogy a bemenet a szvegfjlod legyen.

Ezt a folyamatot szkriptrsnak nevezik. Ahogy a programod egyre hosszabb lesz, elbb-utbb rszekre
(fjlokra) akarod majd bontani, a knnyebb kezelhetsg vgett. Valsznleg lesznek praktikus
fggvnyeid, amit mr megrt programjaidbl szeretnl hasznlni a fggvnydefincik msolsa nlkl.

Ennek a tmogatsra a Python el tudja helyezni a fggvnydefincikat egy adott fjlba, amik aztn
elrhetk lesznek egy szkriptbl, vagy az interaktv rtelmezbl. Ezeket a fjlokat moduloknak hvjuk. A
modulban hasznlt defincik importlhatk ms modulokba (pldul a modulok hierarchijban legfell
lv main modulba is). (A kvetkez pldkhoz: a felhasznlt vltozk mind a legfels nvtrben
helyezkednek el, a modulok fggvnyeit itt futtatjuk, interaktv mdban.)

A modul egy olyan szveges file, ami Python defincikat s utastsokat tartalmaz. A file neve egyben a
modul neve is (a .py kiterjesztst nem belertve). A programbl az aktulis modul neve a __name__
globlis vltozbl elrhet (karakterlncknt).

Krlek egy neked megfelel szvegszerkesztvel (pl. az IDLE-vel) hozd ltre a fibo.py fjlt, a
kvetkez tartalommal:
# Fibonacci szamok modul

def fib(n): # kiirja a Fibonacci sorozatot n-ig


a, b = 0, 1
while b < n:
print(b, end="")
a, b = b, a+b

def fib2(n): # visszater a Fibonacci sorozattal, n-ertekig


result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result

Most lpj be a Python rtelmezbe, s importld a fenti modult a kvetkez paranccsal:


>>> import fibo

Ez a parancs a fibo-ban definilt fggvnyneveket kzvetlenl nem emeli be az aktulis


szimblumtblba; csak magt a modul nevt, fibo-t emeli be.
>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Ha egy fggvnyt gyakran szeretnl hasznlni az importlt modulbl, hozzrendelheted azt egy loklis
fggvnynvhez:
>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

6.1. Bvebben a modulokrl


A modulok vgrehajthat utastsokat ugyangy tartalmazhatnak, mint fggvnydefincikat. Ezeket az
utastsokat rendszerint a modul inicializlshoz hasznljuk. Kizrlag a modul els importlsakor
futnak le. [1]

Minden modulnak megvan a sajt szimblumtblja, ami a modulban definilt fggvnyek szmra
globlis. Emiatt a modul ltrehozja nyugodtan hasznlhatja a modulban lv globlis vltozkat, s nem
kell aggdnia egy esetleges nvtkzs miatt. Msrszrl, ha pontosan tudod hogy mit csinlsz, el tudod
rni a modul globlis vltozit a vltoznv teljes elrsi tjnak a hasznlatval: modulnv.elemnv.

A modulok importlhatnak ms modulokat. Szoks de nem ktelez az import utastsokat a modul


elejn elhelyezni (vagy a szkript elejn, lsd ksbb). Az importlt modulneveket az rtelmez az
importl modul globlis szimblumtbljba helyezi el.

Az import utasts egyik vltozata, hogy az importlt fggvnyeket kzvetlenl az importl modul
szimblumtbljba helyezzk el. Pldul:
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Az elbbi plda a helyi szimblumtblba nem helyezi el annak a modulnak nevt, amibl az importls
trtnt. (fibo objektum nem jn ltre a nvtrben)

Ha a modulban lv sszes nevet kzvetlenl a helyi szimblumtblba szeretnd importlni, gy tudod


megtenni:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ha gy hasznlod az import utastst, a forrsmodul minden nevt a helyi szimblumtblba emeled,


kivve az alhzssal (_) kezddeket.

A legtbb esetben a Python-programozk nem hasznljk ezt a lehetsget, mivel egy halom ismeretlen
nevet helyez az rtelmezbe, amelyek esetleg fellrnak mr definilt dolgokat.

rdemes megjegyezni, hogy ltalban a * importlsa egy modulbl vagy csomagbl kerlend, mivel ez
gyakran nehezen olvashat kdot eredmnyez. Azonban egy interaktv parancsrtelmezben teljesen
rthet a hasznlata a gpels lervidtsre.

Note

Hatkonysgi okok miatt minden modul csak egyszer kerl importlsra egy rtelmezsi szakaszban.
Ezrt, ha vltoztatsz a modulon, jra kell indtanod az rtelmezt vagy, ha ez csak egyetlen modul,
amit interaktvan szeretnl tesztelni, hasznld az imp.reload() fggvnyt, pldul: import imp;
imp.reload(modulnv).

6.1.1. Modulok vgrehajtja szkriptknt


Amikor vgrehajtasz egy Python modult gy
python fibo.py <arguments>

a modulbeli kd vgrehajtsra kerl, ugyangy, mintha importltad volna, csak a __name__ vltozt
"__main__" rtkre lltva. Ez azt jelenti, hogyha a kvetkez kdot a modul vghez adod:

if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))

akkor a fjlt szkriptknt is hasznlhatv teszed s modulknt is, mivel a kd, amely a parancssort
feldolgozza csak akkor kerl vgrehajtsra, amikor az main fjlknt kerl vgrehajtsra:
$ python fibo.py 50
1 1 2 3 5 8 13 21 34

Amikor a modult importljuk, a kd nem fog lefutni:


>>> import fibo
>>>

Ezt a lehetsget gyakran hasznljk egy knyelmes felhasznli interfsz ltrehozsra a modulhoz, vagy
tesztelsi okokbl (a modul futtatsa szkriptknt vgrehajtja a teszteket).

6.1.2. A modulok keressi tvonala


Amikor a spam modult importljuk, az rtelmez elszr egy beptett modult keres ilyen nven. az
aktulis knyvtrban keresi a spam.py fjlt. Ha itt nem tallja, tovbb keres a sys.path vltozban
felsorolt knyvtrakban a a spam.py fjl utn. A sys.path vltoz a kezdeti rtkt a kvetkez
helyekrl kapja:

a knyvtrbl, amely a bemeneti szkriptet tartalmazza (vagy az akulis knyvtrbl)
PYTHONPATH krnyezeti vltozbl (ez knyvtrnevek listja, hasonl szintaktikval, mint a PATH
krnyezeti vltozb).
egy teleptstl fgg alaprtelmezsbl.

A sys.path kezdeti rtkeit a Python-program mdostani tudja. A knyvtr, amely a futtatott szkriptet
tartalmazza, a keressi tvonal elejre kerl, a standard knyvtr tvonala el. Ez azt jelenti, hogy az
ebben a knyvtrban tallhat szkriptek fognak betltdni azok helyett a knyvtrbeli modulok helyett,
amelyeknek azonos a nevk. Ez hiba, hacsak nem volt szndkos a helyettests. A Standard modulok
szakasz tbb informcit nyjt errl. Standard modulok for more information.

6.1.3. ,,Lefordtott Python-fjlok


Hogy a modulok betltdst lervidtsk, a Python eltrolja az sszes modul lefordtott vltozatt a
__pycache__ knyvtrban modul.verzi.pyc` nv alatt, ahol a verzi mutatja a lefordtott fjl
formtumt; ltalban a Python verziszmt tartalmazza. Pltul a spam.py fjlnak a CPython 3.4-es
kiadsval fordtott vltozata a __pycache__/spam.cpython-34.pyc nven kerl eltrolsra. Ez az
elnevezsi szoks lehetv teszi, hogy klnbz Python-verzikkal fordtott modulvltozatok ltezzenek
egyszerre.

A Python sszeveti a forrskd mdostsnak dtumt a fordtott vltozatval, hogy eldntse, jra kell-e
fordtani. Ez teljesen automaikus folyamat. A lefordtott modulok teljesen platformfggetlenek, gy a
knyvtrakat meg lehet osztani klnbz architektrj rendszerek kztt.

A Python kt esetben nem ellenrzi a fordtott vltozatot. Els eset: teljesen jra fordtja, s nem trolja
az eredmnyt, ha a modul direkt a parancssorbl lett meghvva. A msik eset, amikor nem ellenrzi a
fordtott vltozatot, ha nincs forrsmodul. A forrs nlkli (csak fordtott) terjesztsek esetn a lefordtott
modulnak a forrsknyvtrban kell elhelyezkednik, s nem lehet jelen forrsmodul.

Nhny tipp haladknak:



Amikor a Python rtelmezt a -O vagy -OO paramterrel hvjuk meg, az kisebb mretre fordtja le a
modult. Az -O paramter eltvoltja az assert utastsokat, a -OO paramter az az assert utastsokon
fell a dokumentcis karakterlncokat is. Mivel tbb modul pt ezekre az sszetevkre, csak
akkkor hasznld ezt, ha tudod, mit teszel. Az optimalizlt modulok .pyo kiterjesztst hasznlnak
.pyc helyett, s ltalban kissebbek. A ksbbi kiadsokban az optimalizls hatsa vltozhat.

A program semmivel sem fut gyorsabban, ha .pyc vagy .pyo kiterjeszts bjtkdot futtatunk a
sebessgnvekeds a betltsi idben jelentkezik. Ha a .py flj bjtkdra fordtott verzija
rendelkezsre ll, nincs szksg a fordtsra, rgtn lehet futtatni a bjtkdot tartalmaz verzit.

A compileall modul .pyc (vagy -O kapcsol esetn .pyo) fjlokat tud kszteni az aktulis
knyvtr sszes moduljbl.

Tbb rszlet tallhat errl a folyamatr a PEP 3147-ben. Itt megtallhat a dnts folyamatbrja
is.

6.2. Standard modulok


A Python funkcijuk szerint csoportokba sorolt szabvnyos modulokkal rendelkezik egy knyvtrral
rszletesen: Python Library Reference Python referenciaknyvtr a ksbbiekben
[http://docs.python.org/lib/lib.html] A modulok tteles felsorolsa Module index [http://docs.python.org/modindex.html]
Nhny modult az rtelmezbe ptettnk be, ezeken keresztl olyan funkcik megvalstsa lehetsges,
amelyek ugyan nem tartoznak szorosan a nyelvhez, de pldul az opercis rendszerrel val kapcsolathoz
szksgesek ilyenek pldul a rendszerhvsok.

Ezen modulok fggenek a hasznlt opercis rendszertl, hiszen annak mkdtetshez kellenek. Pldul
az amoeba modul csak azokon a rendszereken elrhet, amik tmogatjk az Amoeba primitvek
hasznlatt. A msik figyelemre mlt s klnleges modul a sys [http://docs.python.org/lib/module-sys.html] , ami
minden Python rtelmezbe be van ptve. Pldul a sys.ps1 s sys.ps2 vltozk tartalmazzk az
rtelmezben megjelen elsdleges s msodlagos prompt karakterlnct:
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

Ez a kt vltoz csak akkor ltezik, ha az rtelmez interaktv mdban fut.

A sys.path vltoz karakterlncok listjt tartalmazza, melyek meghatrozzk az rtelmez keressi


tvonalt, amit az a modulok importlsakor bejr. Kezdeti rtkt a PYTHONPATH krnyezeti vltozbl
veszi, vagy ha ez nem ltezik, akkor az rtelmezbe beptett alaprtelmezett tvonalakbl. A vltoz
rtkt ugyangy mdosthatod, mint egy listt:
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')

6.3. A dir() fggvny


A beptett dir() fggvnnyel listzhatjuk ki a modulban definilt neveket. A dir() meghvsa utn a
nevek rendezett listjval tr vissza.
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
'__package__', '__stderr__', '__stdin__', '__stdout__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
'thread_info', 'version', 'version_info', 'warnoptions']

Ha paramterek nlkl hvjuk meg a dir() fggvnyt, az aktulis nvtrben definilt nevekkel tr vissza:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo, sys
>>> fib = fibo.fib
>>> dir()
['__name__', 'a', 'fib', 'fibo', 'sys']

Fontos, hogy az gy kapott lista az sszes nvfajtt tartalmazza. Vltozkat, modulokat, fggvnyeket, stb.

A dir() nem listzza ki a nyelv beptett fggvnyeit s vltozit. Ezek a builtins modulban vannak
definilva:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']

6.4. A csomagok
A csomagok adnak lehetsget a Python modulok nvtereinek struktrlsra, a pontozott modulnevek
hasznlatval. Pldul a A.B modulnv hivatkozik a B modulra, ami az A modulban tallhat (ott
importltuk). Ha a programozk a fenti plda szerint hasznljk a modulokat, nem kell amiatt aggdniuk,
hogy egyms globlis neveivel tkzs lp fel. Pldul a tbb modulbl ll csomagok (NumPy, Python
Imaging Library...) ri is a pontozott modulnevek hasznlatval kerlik el a vltoznevek tkzst.
Tegyk fel, hogy egy modulokbl ll csomagot akarsz tervezni, hogy egysgesen tudd kezelni a
hangfjlokat s a bennk lv adattartalmat. Tbb klnbz hangfjlformtum ltezik (rendszerint a
kiterjesztsk alapjn lehet ket beazonostani, pl.: .wav, .aiff, .au) valsznleg egy bvl
modulcsoportot kell ksztened s karbantartanod a fjlformtumok kztti konvertlsra.

Radsul mg tbbfajta mveletet is el kell tudnod vgezni a hanganyagon, pldul keverst, visszhang
ksztst, hangsznszablyzst, mvszeti sztereo effekteket szval a fentiek tetejbe mg rni fogsz egy
vgelthatatlan modulfolyamot, ami ezeket a mveleteket elvgzi. A csomagok egy lehetsges struktrja
a hierarchikus fjlrendszereknl hasznlatos jellssel:
sound/ Legfels szint csomag
__init__.py a sound csomag inicializlsa
formats/ A fjlformtum konverzik alcsomagja
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ A hangeffektusok alcsomagja
__init__.py
echo.py
surround.py
reverse.py
...
filters/ A szrk alcsomagja
__init__.py
equalizer.py
vocoder.py
karaoke.py
...

A csomag: olyan hierarchikus knyvtrszerkezet, amely egymssal sszefgg modulokat tartalmaz.

Egy csomag importlsa sorn a Python bejrja a sys.path vltozban szerepl knyvtrakat, a csomag
alknyvtrak utn kutatva. A sys.path az elre meghatrozott keressi tvonalakat tartalmazza.

A Python az __init__.py fjlok jelenltbl tudja, hogy egy knyvtrat csomagknt kell kezelnie s ez
a fjl segt abban is, hogy az alknyvtrakban lv csomagokat is rzkelje a Python.

A legegyszerbb esetben az __init__.py egy res fjl, de tartalmazhat s vgrehajthat a csomaghoz


tartoz inicializl kdot, vagy bellthatja az __all__ vltozt (lsd lejjebb).

A csomag felhasznli egyenknt is importlhatnak modulokat a csomagbl:


import sound.effects.echo

Ez betlti a sound.effects.echo almodult. A hivatkozst teljes tvonallal kell megadni.


sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

Egy msik alternatva almodulok importlsra:


from sound.effects import echo

Ez szintn betlti az echo almodult, s elrhetv teszi a csomagnevek nlkl is (nem kell a sound.effects
eltag).
echo.echofilter(input, output, delay=0.7, atten=4)

Van mg egy lehetsg a kivlasztott fggvny importlsra:


from sound.effects.echo import echofilter

Ez szintn betlti az echo almodult, de a echofilter() fggvny kzvetlenl elrhetv vlik:


echofilter(input, output, delay=0.7, atten=4)

Fontos, hogy a from csomag import elem hasznlatakor az elem az importlt csomag almodulja
(submodule) vagy alcsomagja (subpackage) is lehet, vagy valamilyen ms, a csomagban definilt elem
nev objektum, pldul fggvny, osztly vagy vltoz.

Az import utasts elszr ellenrzi, hogy az importland elem definilva van-e a csomagban. Ha nem,
akkor az elemrl felttelezi, hogy az egy modul, s megksrli azt betlteni. Ha a modul keresse
sikertelen, ImportError kivtel vltdik ki.

Ezzel ellenttben az import elem.alelem.alelem_aleleme utastsforma hasznlatakor az utols


alelem_aleleme kivtelvel mindegyik elemnek csomagnak kell lennie. Az utols elem lehet modul vagy
csomag is, de a fentiekkel ellenttben nem lehet osztly, fggvny vagy definilt vltoz.

6.4.1. Egy csomagbl * importlsa


Mi trtnik, amikor a programoz kiadja a from sound.effects import * utastst? Idelis esetben az
rtelmez a fjlrendszerben megtallja a csomagban lv almodulokat, s mindet importlja. Az sszes
almodul importlsa hossz ideig eltarthat, s olyan mellkhatsai lehetnek, amiknek akkor kellene
megtrtnnik, amikor az almodult kzvetlenl importljuk.

A csomagksztk szmra az egyedli megolds az, ha a csomagot egyrtelm index-el ltjk el. Az
import utasts a kvetkez szablyokat hasznlja: ha a csomag __init__.py llomnynak kdjban
szerepel az __all__ nev lista, az abban felsorolt nevek lesznek az importland modulnevek a from
package import * utasts vgrehajtsakor. A csomag ksztjnek feladata, hogy ezt a listt
naprakszen tartsa, mikor a csomag jabb verzijt kszti. A csomagksztk dnthetnek gy, hogy ezt a
funkcit nem tmogatjk, ha nem tartjk hasznosnak, hogy valaki az *-ot importlja. Pldul a
sounds/effects/__init__.py fjl a kvetkez kdot tartalmazhatja:

__all__ = ["echo", "surround", "reverse"]

A fentiek rtelmben a from sound.effects import * importlni fogja a hrom felsorolt almodult a
sound csomagbl.

Ha az __all__ lista nem meghatrozott, a from sound.effects import * utasts nem importlja a
sound.effects csomag sszes almoduljt az aktulis nvtrbe csupn azt biztostja, hogy a
sound.effects csomag importlva legyen (lehetleg vgrehajtva az sszes utastst a __init__.py
inicializl kdbl) s aztn a csomagban tallhat sszes nevet importlja. Ebbe belertend minden
nv, amit definiltak (s az almodulok, amiket importltak) az __init__.py-ben. Szintn importlsra
kerl a csomag minden almodulja, amit korbbi import utastsokkal kzvetlenl importltunk. Tekinsk
a kvetkez kdot:
import sound.effects.echo
import sound.effects.surround
from sound.effects import *

Ebben a pldban az echo s a surround modulokat az rtelmez az aktulis nvtrbe importlja, mert a
sound.effects csomag rszei voltak a from...import utasts vgrehajtsakor. (Ez akkor is gy lesz,
ha az __all__ vltoz definilva van.)

J tudni, hogy az import * importlsi md hasznlata kerlend, mert a kdot nehezen olvashatv
teszi. mbr ennek az importlsi mdnak a hasznlatval egyszerbben dolgozhatunk az rtelmez
interaktv mdjban, egyes modulokat gy terveznek, hogy csak az __all__ vltozban megadott neveket
exportljk.

Emlkezznk r, hogy semmi problma nincs a from Package import specific_submodule szerkezet
hasznlatval! Valjban ez az ajnlott importlsi md, hacsak az importl modulnak nincs szksge
klnbz csomagokbl szrmaz azonos nev almodulok hasznlatra.

6.4.2. Csomagon belli hivatkozsok


Ha a csomagokban alcsomagok szerpelnek (mint a sound csomag a pldban), abszolt importlst
hasznlhatsz aarra, hogy egy testvrcsomag almoduljra hivatkzhassl.

Pldul a sound.filters.vocoder modulnak szksge van a sound.effects csomag echo moduljra a


nyugtzs miatt, akkor hasznlhatja a from sound.effects import echo sort.

Relatv importlst is hasznlhatsz az import utasts from modul import nv alakjval. Ezek az
importlsok kezdeti pontokat hasznlnak arra, hogy az aktulis s szlknyvtrban szerepl csomagokra
hivatkozhassunk a relatv importls sorn. A surround modulbl pldul hasznlhatod a kvetkezket:
from . import echo
from .. import formats
from ..filters import equalizer

Note that relative imports are based on the name of the current module. Since the name of the main module
is always "__main__", modules intended for use as the main module of a Python application must always
use absolute imports.

6.4.3. Modulok, amelyek tbb, klnll knyvtr moduljaibl plnek fel


A csomagok rendelkeznek egy egyedi jellemzvel, melyet __path__ -nak hvunk. Ez egy lista, amelyben
az __init__.py fjlt tartalmaz knyvtr nevt talljuk mieltt az aktulis fjlban lv kd
vgrehajtdna. Ez egy mdosthat vltoz, amely befolysolja a csomagban tallhat modulok s
alcsomagok keresst.
Br erre a lehetsgre ritkn van szksg, a csomagot jabb modulokkal egszthetjk ki vele.

Lbjegyzet

Valjban a fggvnydefinick is utastsok amelyek vgrehajtdnak; a modulszint


[1]
fggvnyek vgrehajtsa behelyezi a fggvny nevt a modul globlis szimblumtbljba.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

7. Bemenet s kimenet
Egy program kimenete tbbflekppen jelenhet meg: pldul ember ltal olvashat nyomtatott formban,
vagy ksbbi feldolgozs cljbl fjlba rva. Ez a fejezet a lehetsgek kzl tbbet is bemutat.

7.1. Eszttikus kimenet kialaktsa


Az rtkek kirsra kt lehetsgnk van: kifejezs llts s a print() fggvny. (Egy harmadik
lehetsg a fjlobjektumok write() metdusnak hasznlata; a szabvnyos kimeneti fjlt a sys.stdout-
knt rhetjk el. A referencia knyvtrt rdemes megnzni (Library Reference), ott tbb informcit
tallunk a szabvnyos kimenet hasznlatrl.

Gyakori igny, hogy a programoz az egyszer - szkzkkel tagolt kimeneti formzsnl tbb lehetsget
szeretne. A ktflekppen formzhatod a kimenetet:

A kimeneti karakterlncok teljes formzst te kezeled a karakterlncok sztvgsval s
sszeillesztsvel brmilyen elkpzelt kimenetet elllthatsz. A szabvnyos modulok kztt
tallhat string szmos hasznos karakterlnc-kezel rutint tartalmaz (pl. karakterlnc kitltse adott
szlessg elrshez) ezek rvid bemutatsa lejjebb tallhat.
A msodik lehetsg a % opertor hasznlata, ahol a formzand karakterlnc baloldali argumentum
(Plda pr sorral lentebb!). A % operator feldolgozza a baloldali karakterlncot, mintha az
sprintf() fggvnyt hasznltuk volna s a formzott karakterlncot adja visszatrsi rtkknt.

Egy krds maradt htra: hogy hogyan konvertlhatsz egy szmjegyekbl ll karakterlncot rtkkel br
szmm? Szerencsre a Python erre tbb lehetsget is biztost: add t a karakterlncot a repr() vagy az
str() fggvnyeknek. A fordtott egyszeres idzjelek (``) hasznlata egyenrtk a repr() fggvny
hvsval, de hasznlatuk helyett a fggvnyhvst javasoljuk.

Az str() fggvny az rtkek ember ltal olvashat formjval tr vissza, mg a repr() fggvny
visszatrsi rtke az interpreter szmra rtelmezhet adat. (vagy SyntaxError kivtelt vlt ki nem
megfelel szintaxis esetn.)

Azon objektumok esetben, amelyeknek nincs emberi olvassra sznt brzolsa, az str() fggvny
ugyanazzal az rtkkel tr vissza, mintha a repr() fggvnyt hvtuk volna meg. Nhny rtk, pldul a
szmok vagy a struktrk esetben mint pldul a listk vagy a sztrak, brmely kt fent emltett
funkcit hasznlva ugyanazt az eredmnyt kapjuk. Karakterlncok s lebegpontos szmoknak kt eltr
brzolsi mdjuk van:

Nhny plda:
>>> s = 'Hell, vilg.'
>>> str(s)
'Hell, vilg.'
>>> repr(s)
"'Hell, vilg.'"
>>> str(0.1)
'0.1'
>>> repr(0.1)
'0.10000000000000001'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'x rtke: ' + repr(x) + ', s y rtke: ' + repr(y) + '...'
>>> print(s)
x rtke: 32.5, s y rtke: 40000...

% >>> # The repr() of a string adds string quotes and backslashes:


>>> # A repr() fggvny idzjelek kz rakja a stringet,
>>> # s kijelzi a klnleges (escape) karaktereket is:
... hello = 'hell vilg\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hell vilg\n'

>>> # A repr() fggvnynek akr objektumokat is tadhatunk:


... repr((x, y, ('hs', 'tojs')))
"(32.5, 40000, ('hs', 'tojs'))"

% >>> # reverse quotes are convenient in interactive sessions:


>>> # A visszahajl idzjeleket (`) interaktv mdban hasznlhatjuk,
>>> # ugyanazt rjk el, mint ha a repr() fggvnyt hvtuk volna meg:
... `x, y, ('spam', 'eggs')`
"(32.5, 40000, ('spam', 'eggs'))"

Ha akarunk kszteni egy tblzatot, amiben a szmok msodik s harmadik hatvnyai szerepelnek, kt
lehetsgnk is van:
>>> for x in range(1, 11):
... print(repr(x).rjust(2), repr(x*x).rjust(3),)
%... # Note trailing comma on previous line
... # Figyelem! az elz sor vgn szerepl vessz miatt a
... # kvetkez print az elz sor vgn folytatja a kirst!
... print(repr(x*x*x).rjust(4))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1,11):
... print('%2d %3d %4d' % (x, x*x, x*x*x))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

(Megjegyzs: az oszlopok kztt 1 szkznyi helyet a print utasts hagyott az utasts a paramterei
kztt mindig 1 szkzt hagy.)

Ez a plda bemutatja a szveges (karakterlnc) objektumok rjust() metdust, ami a megadott


karakterlncot jobbra igaztja, majd a megadott szlessgig feltlti res karakterekkel a baloldalt. Ehhez
hasonlak a ljust() s a center() fggvnyek. Ezek rsi mveletet nem vgeznek, egyszeren
visszatrnek az j karakterlnccal. Ha a bemenetknt megadott szveg tl hossz, azt nem csonkoljk
vltozatlanul adjk vissza az eredeti karakterlncot. Ez elrontja ugyan a kimenet rendezettsgt, de
rendszerint jobb, mintha a fggvny valtlan (csonktott) rtkkel trne vissza. (Ha valban szeletelni
akarod a karakterlncot, ezt gy tudod megtenni: x.ljust( n)[:n].)

Ltezik egy msik metdus, a zfill(), amely az adott numerikus karakterlncot balrl nulla
karakterekkel tlti fel. Ez knnyen megrthet a plusz s minusz jelek esetben:
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

A % opertort hasznlata gy nz ki:


>>> import math
>>> print('PI rtke megkzeltleg %5.3f.' % math.pi)
PI rtke megkzeltleg 3.142.

Ha a karakterlncban egynl tbb formzst szeretnl hasznlni, akkor az albbi pldt kvetve egy tuple
vltozt kell paramterknt hasznlnod:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print('%-10s ==> %10d' % (name, phone))
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127

A legtbb formzs pontosan ugyangy mkdik, mint C-ben, s a megfelel tpus vltoz tadst
ignyli. Ha kivtel vltdik ki, s azt a kdodban nem kapod el, ???not a core dump???.

A %s formzs ennl rugalmasabb: ha a csatolt paramter nem egy karakterlnc, akkor a str() beptett
fggvny hasznlatval automatikusan azz konvertlja. A * hasznlata a szlessg, vagy a pontossg
meghatrozsra egy kln paramterknt (integer) lehetsges. A kvetkez C formzsok nem
tmogatottak: %n, %p.

Ha egy nagyon hossz formzott karakterlncot szeretnl hasznlni, amit nem akarsz darabokra felosztani,
szp lenne, ha hivatkozni tudnl a formzand vltozkra azok neveivel, pozcijuk helyett. Ezt a %
(name)format forma hasznlatval teheted meg, pldul gy:
>>> table = {'Bea': 1975, 'Balazs': 1978, 'Fanni': 2003}
>>> print('Fanni: %(Fanni)d; Bea: %(Bea)d; Balazs: %(Balazs)d' % table)
Fanni: 2003; Bea: 1975; Balazs: 1978

Ez klnsen hasznos az j vars() fggvnnyel egytt, amely egy sztr tpus vltozval tr vissza,
amely az sszes helyi vltozt tartalmazza.

7.2. Fjlok rsa s olvassa


Az open() fggvny egy object objektummal tr vissza, s rendszerint kt paramterrel hasznljuk:
open(filename, mode).

>>> f=open('/tmp/munkafile', 'w')


>>> print(f)
<open file '/tmp/munkafile', mode 'w' at 80a0960>

Az els paramter egy fjlnevet tartalmaz karakterlnc. A msodik paramter nhny karakterbl ll
csupn, s a fjl hasznlatnak a mdjt (rs, olvass) llthatjuk be vele. A megnyits mdja (mode)
lehet 'r' mikor csak olvassuk a fjlt 'w', ha kizrlag rni szerentnk (a mr esetleg ugyanezen nven
ltez fjl tartalma trldik!) s 'a', amikor hozzfzs cljbl nyitjuk meg a fjlt; ilyenkor brmilyen
adat, amit a fjlba runk, automatikusan hozzfzdik annak a vghez. A 'r+' megnyitsi md egyszerre
nyitja meg a fjlt rsra s olvassra. A mode paramter belltsa nem ktelez; elhagysa esetn 'r'
alaprtelmezett rtket vesz fel.

Windows s Macintosh rendszereken a megnyitsi mdhoz hozzfztt 'b' karakterrel binris mdban
nyithatjuk meg a fjlt, pldul gy: 'rb', 'wb' vagy 'r+b'. A Windows megklnbzteti a szveges s
binris fjlokat; a szveges fjlban a sorvget jelz karakterek (end-of-line) kis mrtkban automatikusan
megvltoznak adat rsa vagy olvassa esetn.

Ez a httrben zajl mdosts ugyan megfelel az ASCII szveges fjlok szmra, de a binris fjlokat
hasznlhatatlann teszi (pl. JPG vagy .EXE fjlokat). Ezrt nagyon figyelj oda, hogy a binris mdot
hasznld olvasskor s rskor. (Megjegyezzk, hogy Macintosh-on a hasznlt C knyvtrtl fgg a
megnyitsi mdok pontos mkdse.

7.2.1. A fjl objektumok metdusai


A fejezet tovbbi pldi felttelezik, hogy mr ltezik az f fjl objektum.

A fjl tartalmnak olvasshoz hvd meg az f.read(size) metdust, ami a megadott adatmennyisgnek
megfelel hossszsg karakterlnccal tr vissza. A size egy opcionlis paramter elhagysa, vagy
negatv rtke esetn a teljes tartalmat visszaadja a metdus ha esetleg a fjl ktszer akkora, mint a
gpedben lv memria, az esetleg problmt jelenthet neked.

Ha hasznlod a size paramtert, akkor a visszatrsi rtkknt kapott karakterlnc hosszt maximalizlni
tudod. Ha elred a fjl vgt, az f.read() egy res karakterlnccal tr vissza ("").
>>> f.read()
'Ez a fjl teljes tartalma.\n'
>>> f.read()
''
A f.readline() egy sort olvas ki a fjlbl. A sor vgt az jsor karakter (\n) jelenti, amely a beolvasott
karakterlnc vgn tallhat. Ez a karakter egyetlen esetben maradhat ki a visszaadott karakterlcbl: ha a
fjl utols sort olvassuk be, s az nem jsor karakterre vgzdik.

Ez a visszatrsi rtket egyrtelmv teszi: ha a f.readline() metdus res karakterlnccal tr vissza,


az olvass elrte a fjl vgt. Ekkor az res sort a '\n' karakter jelkpezi a karakterlnc egyetlen egy
jsor karaktert tartalmaz.
>>> f.readline()
'Ez a fjl els sora.\n'
>>> f.readline()
'A fjl msodik sora.\n'
>>> f.readline()
''

A f.readlines() metdus egy listval tr vissza, amely a fjl minden sort tartalmazza. Ha megadjuk a
sizehint paramtert, a metdus a megadott szm byte-ot kiolvassa a fjlbl, s mg annyit, amennyi a
kvetkez jsor karakterig tart. (A fordt megjegyzse: sizehint paramtert hiba adtam meg, 2.1-es
pythont hasznlva a teljes fjltartalmat kiolvasta.)
>>> f.readlines()
['Ez a fjl els sora.\n', 'Ez pedig a msodik\n']

A f.write(string) metdus a string tartalmt a fjlba rja, s None rtkkel tr vissza.


>>> f.write('Tesztszveg, az rs bemutatsra\n')

Ha egy karakterlnctl eltr tpus vltozt szeretnnk kirni, akkor azt elbb karakterlncc kell
konvertlni:
>>> value = ('a valasz', 42)
>>> s = str(value)
>>> f.write(s)

Ford.: Ha megnzzk a keletkezett fjl tartalmt, az ('a valasz', 42) lesz.

Az f.tell() metdussal a fjl objektum aktulis pozcijt krdezhetjk le bjt-ban, a fjl kezdettl
szmolva. (pl.: hnyadik bjt-ot olvassuk most ppen)

A fjl objektum pozcijnak (a kurzornak) a megvltoztatsnak mdja: f.seek(lptets,


innen_kezdve). Az innen_kezdve ponttl lptets mennyisggel mozgatjuk a kurzort. (Plda: ha van egy
100 bjtos fjl, amiben ppen a 39. karakternl llunk, akkor az aktulis pozcihoz kpest ugorhatunk
tovbb, megadott lpsekben)

A from_what value of 0 measures from the beginning of the file, 1 uses the current file position, and 2
uses the end of the file as the reference point. from_what can be omitted and defaults to 0, using the
beginning of the file as the reference point.

Az innen_kezdve paramter a kvetkez rtkeket veheti fel:



0: a fjl eleje lesz a hivatkozsi pont
1: az aktulis pozci lesz a hivatkozsi pont
2: a fjl vge az aktulis hivatkozsi pont
>>> f = open('/tmp/munkafajl', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5) # Ugorj a 6. bajthoz a fajlban
>>> f.read(1)
'5'
>>> f.seek(-3, 2) # Ugorj a fajl vegehez kepest harom karakterrel vissza
>>> f.read(1)
'd'

Ha mr minden mdostst elvgeztl a fjl-al, hvd meg a f.close() metdust a fjl bezrshoz (a
rendszererforrsok felszabadtshoz). A f.close() hvsa utn a fjl objektum hasznlatra tett
ksrletek automatikusan meghisulnak.
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file

A fjl objektumoknak van nhny kiegszt metdusuk, pldul az isatty() s a truncate() ezek
ritkbban hasznltak. A Referencia knyvtrban teljes tmutatt tallsz a fjl objektumok hasznlathoz.

7.2.2. A pickle modul


A karakterlncokat knny fjlba rni s onnan kiolvasni. A szmokkal kicsit nehezebb a helyzet, mert a
read() metdus mindent karakterknt ad vissza, amit aztn t a szmm trtn talakts miatt pldul az
int() fggvnynek kell tadnunk, ami a '123' karakterlncbl a 123-as rtket adja vissza.

Hogyha sszetettebb adattpusokat akarsz menteni, pldul listkat, sztrakat vagy osztly-pldnyokat,
egyre bonyolultabb vlik a dolgod.

Ahelyett, hogy a felhasznlknak llandan adatment algoritmusokat kelljen rnia s javtania, a Python
rendelkezik a pickle modullal. Ez egy elkpeszt modul, ami kpes a legtbb Python objektumot
karakterlncknt brzolni (mg a Python kdok nhny formjt is!). Ezt a folyamatot pickling-nek
hvjk.

Az objektum karakterlncbl trtn ltrehozst pedig unpickling-nek nevezik.

A karakterlncc trtn konvertls s a visszakonvertls kztt a karakterlnc jelkpezi az objektumot.


Ezt akr fjlban, akr ms formban trolhatjuk. (hlzaton elkldve msik gpen, vagy adatbzisban)

Ha van egy x objektumod, s ltezik az rsra megnyitott f fjl objektum, a legegyszerbb t az


objektumod trolsra a kvetkez egysoros kd:
pickle.dump(x, f)

Ha jbl el kvnod lltani az objektumot, s az f egy olvassra megnyitott fjl objektum:


x = pickle.load(f)

(Vannak ms varicii is ennek, amik tbb objektum trolsnl / jbli ellltsnl hasznlatosak,
illetve akkor, ha nem akarod a trolsi formba alaktott objektumodat tnylegesen fjlba rni; a tma
teljes dokumentcija: pickle a Python Library Referenceben.)

A pickle a szablyos mdja a Python objektumok ksztsnek, amiket trolhatsz, vagy jra
felhasznlhatsz ms programokkal, vagy akr a jvbeni felhasznls cljbl a jelenlegi programoddal.
Ennek a technikai megnevezse: persistent objektumok (lland, tarts). Azrt, mert a pickle szles
krben elterjedt, a legtbb Python kiegsztst kszt programoz figyelmeztet, hogy bizonyosodj meg
arrl, hogy az j adattpusok trolhatk s jra elllthatk (mintha egy matrict leragasztanl, majd jra
felvennd).
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

8. Hibk s kivtelek
Eddig csak emltettk a hibajelzseket, de ha kiprbltad a pldkat felteheten lttl nhnyat. Ktfajta
megklnbztetend hibafajta van (legalbb): szintaktikai hiba (syntax error) s kivtel (exception).

8.1. Szintaktikai hibk


A szintaktikai hibk, vagy mskpp elemzsi hibk, taln a leggyakoribb hibazenetek, amg tanulod a
Pythont:
>>> while 1 print('Hello vilg')
File "<stdin>", line 1
while 1 print('Hello vilg')
^
SyntaxError: invalid syntax

Az elemz megismtli a hibs sort, s kitesz egy kis ,,nyilat amely a sorban elfordul legelsnek szlelt
hibra mutat. A hibt a nyilat megelz szcska (token) okozza (vagy legalbbis itt szlelte az
rtelemez): a pldban, a hibt a print utastsnl szlelte, mivel a kettspont (':') hinyzik elle. A
fjl neve s a sorszm kirdik, gy tudhatod, hol keressed, ha egy szkriptet futtattl.

8.2. Kivtelek
Ha egy llts vagy kifejezs szintaktikailag helyes, akkor is okozhat hibt, ha megprbljuk vgrehajtani.
A vgrehajts sorn szlelt hibkat kivteleknek (execptions) nevezzk s nem felttlenl vgzetesek:
nemsokra megtanulod, hogyan kezeld ezeket a Python programban. A legtbb kivtelt ltalban nem
kezelik a programok, ekkor az albbiakhoz hasonl hibazeneteket adnak:
>>> 10 * (1/0)
File "<stdin>", line 1
ZeroDivisionError: integer division or modulo
>>> 4 + spam*3
File "<stdin>", line 1
NameError: spam
>>> '2' + 2
File "<stdin>", line 1
TypeError: illegal argument type for built-in operation

A hibazenetek utols sora mutatja, mi trtnt. Klnbz tpus kivteleket kaphatunk, s a tpus az
zenet rszeknt kerl kiratsra: a tpusok a pldkban: ZeroDivisionError (nullval val oszts),
NameError (nv hiba) s TypeError (tpussal kapcsolatos hiba). A kivtel tpusaknt kirt szveg a
fellp kivtel beptett (built-in) neve. Ez minden bels kivtelre igaz, de nem felttlenl igaz a
felhasznl ltal definilt kivtelekre (habr ez egy hasznos megllapods). A szoksos kivtelnevek
bels azonostk (nem fenntartott kulcsszavak).

A sor fennmarad rsze egy rszletezs, amelynek alakja a kivtel fajtjtl fgg.

Az ezt megelz rsze a hibazenetnek megmutatja a szvegkrnyezetet ahol a kivtel trtnt egy
veremvisszakvets (stack backtrace) formjban. ltalban ez veremvisszakvetst tartalamazza egy
listban a forrs sorait. jllehet, ez nem fog megjelenteni a sztenderd bementerl kapott sorokat.

A Python Library Reference felsorolja a bels kivteleket s a jelentseiket.

8.3. Kivtelek kezelse


Van r lehetsg, hogy olyan programokat rjunk, amik kezelik a klnbz kivteleket (exception).
Nzzk csak a kvetkez pldt, amely addig krdezi a felhasznltl az rtket amg egy egsz szmot
nem r be, de megengedi a felhasznlnak, hogy megszaktsa a program futst (a Control-C
hasznlatval, vagy amit az opercis rendszer tmogat). Jegyezzk meg, hogy a felhasznl ltal
ltrehozott megszakts KeyboardInterrupt kivtelknt lp fel.
>>> while 1:
... try:
... x = int(raw_input("rj be egy szmot: "))
... break
... except ValueError:
... print("Ez nem egsz szm. Prbld jra... ")
...

A try utasts a kvetkezkppen mkdik.



Elszr a try mellkg hajtdik vgre, azaz a try s except kztti utastsok.
Ha nem lp fel kivtel, az except gat a program tugorja, s a try utasts befejezdik.
Ha kivtel lp fel a try g vgrehajtsa sorn, az g maradk rsze nem hajtdik vgre. Ekkor ha a
tpusa megegyezik az except kulcssz utn megnevezett kivtellel, ez az expect g hajtdik vgre, s
ezutn a vgrehajts a tryexcept blokk utn folytatdik.
Ha olyan kivtel lp fel, amely nem egyezik a az expect gban megnevezett utastssal, akkor a
kivtelt tadja egy klsbb try utastsnak. Ha nincs kezelve a kivtel, akkor ez egy kezeletlen
kivtel a futs megll egy utastssal, ahogy korbban lttuk.

A try utastsnak lehet egynl tbb except ga is, hogy a klnbz kivteleket kezelhessk. Egynl tbb
kezel hajtdhat vgre. A kezelk csak a hozzjuk tartoz try gban fellp kivtelt kezelik a try utasts
msik kezeljben fellp kivtelt nem. Egy expect gat tbb nvvel is illethetnk egy kerek zrjelbe tett
lista segtsgvel, pldul:
... except (RuntimeError, TypeError, NameError):
... pass

(Magyarul: Futsidej hiba, TpusHiba, NvHiba)

Az utols expect g esetn elhagyhat a kivtel neve. Rendkvl vatosan hasznljuk, mert elfedhet valdi
programozsi hibkat! Arra is hasznlhat, hogy kirjunk egy hibazenetet, majd jra kivteldobst
hajtsunk vgre, (megengedve a hvnak, hogy lekezelje a kivtelt):
import string, sys

try:
f = open('file.txt')
s = f.readline()
i = int(string.strip(s))
except IOError, (errno, strerror):
print("I/O error(%s): %s" % (errno, strerror))
except ValueError:
print("Nem kpes az adatot egsz szmm alaktani.")
except:
print("Vratlan hiba:", sys.exc_info()[0])
raise

A try ... except utastsnak lehet egy else ga is, amelyet ha ltezik az sszes except gnak meg kell
elznie. Ez nagyon hasznos olyan kdokban, amelyeknek mindenkppen vgre kell hajtdniuk, ha a try
gban nem lp fel kivtel. Pldul:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('nem nyithat meg', arg)
else:
print(arg, len(f.readlines()), 'sorbl ll.')
f.close()

Az else g hasznlata jobb, mintha a kdot a try ghoz adnnk, mivel ez elkerli egy olyan kivtel
elkapst, amely nem a try ... except utastsok ltal vdett gban vannak.

Ha kivtel lp fel, lehetnek hozztartoz rtkei, amelyeket a kivtel argumentumnak is neveznk. A


meglte s a tpusa a kivtel fajtjtl is fgg. Azokra a kivteltpusokra, amelyek argumentummal
rendelkeznek, az except g elrhat egy vltozt a kivtel neve (vagy a lista) utn, amely felveszi az
argumentum rtkt, ahogy itt lthat:
>>> try:
... spam()
... except NameError, x:
... print('A(z)', x, 'nv nincs definilva.')
...
A(z) spam nv nincs definilva.

Ha a kivtelnek argumentuma van, az mindg utols rszeknt kerl a kpernyre.

A kivtelkezelk nem csak akkor kezelik a kivteleket, ha azok tnylegesen a try gban szerepelnek,
hanem akkor is, ha azok valamelyik try gban meghvott fggvnyben szerepelnek (akr kzvetve is).
Pldul:
>>> def ez_rossz():
... x = 1/0
...
>>> try:
... ez_rossz()
... except ZeroDivisionError, detail:
... print('Handling run-time error:', detail)
...
Handling run-time error: integer division or modulo

8.4. Kivtelek ltrehozsa


A raise utasts lehetv teszi a programoz szmra, hogy egy j, ltala megadott kivtelt hozzon ltre.
Pldul:
>>> raise NameError('IttVagyok')
File "<stdin>", line 1
NameError: IttVagyok

A raise els argumentuma a kivtel neve amit ltrehozunk. Az esetleges msodik argumentum adja meg a
kivtel argumentumt.

8.5. Felhasznl ltal ltrehozott kivtelek


A programok elnevezhetik a sajt kivteleiket, ha karakterlncot rendelnek egy vltozhoz, vagy egy j
kivtel-osztlyt hoznak ltre. Pldul:
>>> class MyError:
... def __init__(self, value):
... self.value = value
... def __str__(self):
... return `self.value`
...
>>> try:
... raise MyError(2*2)
... except MyError, e:
... print('A kivtelem fellpett, rtke:', e.value)
...
A kivtelem fellpett, rtke: 4
>>> raise MyError, 1
File "<stdin>", line 1
__main__.MyError: 1

Sok a Pythonban megtallhat modul ezt hasznlja a fggvnyekben elfordul esetleges hibk
megjelentsre.

Bvebb informci az osztlyokrl a Osztlyok fejezetben tallhat.

8.6. Takart-lezr mveletek definilsa


A try utastsnak van egy msik opcionlis ga, mely takart-rendberak mveletek trolsra szolgl
ezeket a megelz gak lefutsa utn kell vgrehajtani. Pldul:
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Viszlt vilg!')
...
Viszlt vilg!
KeyboardInterrupt

A vgs zradk akr kivteldobs trtnt a try zradkban, akr nem mindenkppen vgrehajtdik. Ha
kivteldobs trtnt, a kivtel a finally zradk vgrehajtsa utn jra kivltdik. A finally a
kivteldobs utszeleknt, lefutsa vgeknt hajtdik vgre, amikor a try utasts elhagyja a break
vagy a return utastst. (Fontos: fggvnyeknl ha nem helyeznk el return utastst, akkor rejtetten egy
return None utasts fut le teht ha nem ltunk egy utastst, az esetleg rejtetten akkor is lefuthat!)

A try utasts egy vagy tbb except zradkot tartalmazhat, vagy egy finally zradkot, de a kettt egytt
nem.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

9. Osztlyok
A Python osztlymechanizmusa osztlyokat ad a nyelvhez a lehet legkevesebb szintaxissal s
szemantikval. A Python osztlyok a C++ s a Modula-3 ban tallhat osztlymechanizmusok keverke.
Ahogy a modulokra is igaz, az osztlyokban a Python nem hatrolja el lesen a defincit s a
felhasznlt: megbzik a felhasznl tlkpessgben, hogy nem akar a mindent definilni fogok
hibjba esni.

Az osztlyok legfontosabb tulajdonsgai teljes egszben megmaradnak: az rkldsi mechanizmus


lehetv teszi a tbb stl val szrmaztatst; a szrmaztatott osztlyok a szlk brmely metdust fell
tudjk rni; a metdusok ugyanazon a nven rhetik el a szlosztly metdusait. Az objektumok
tetszleges szm egyni adatot tartalmazhatnak.

C++ szhasznlattal lve az osztly minden eleme (belertve az adatokat is) publikus, s minden
tagfggvny virtulis. Nincsenek konstruktor s destruktor fggvnyek. A Modula-3 hoz hasonlan
nincsen rvidtett hivatkozs az objektum alkotelemeire annak metdusaibl: az objektum fggvnyeinek
deklarlsakor els paramterknt az objektumot jelkpez vltozt adjuk t, melynek rtke
rtelemszeren objektumonknt vltozik.

A Smalltalk-hoz hasonlan az osztlyok nmaguk is objektumok, a sz tgabb rtelmben, mert a


Pythonban minden adattpus objektum.

Ez biztostja a sz felismerst importlshoz s tnevezshez

A C++-tl s a Modula-3 -tl eltren a beptett tpusok szlosztlyokknt felhasznlhatk. S vgl a


C++-hoz hasonlan, de a Modula-3 tl eltren a legtbb, egyni szintaktikval br beptett opertor
(aritmetikai mveletek, alprogramok, stb.) jradefinilhatk az osztly pldnyaiban.

9.1. Nhny gondolat a szhasznlatrl


Nem lvn ltalnosan elfogadott szhasznlat az osztlyok tmakrre, alkalmanknt Smalltalk s C++
kifejezseket fogok hasznlni. (Szerettem volna Modula-3 kifejezseket alkalmazni, mert annak hasonlt
leginkbb az objektum- orientci rtelmezse a Pythonhoz, de sajnos nagyon kevesen ismerik ezt a
nyelvet.)

Szeretnlek figyelmeztetni a szhasznlatban rejl csapdra: A Pythonban az objektum sz nem felttlenl


egy osztly pldnyt jelenti. A C++-hoz s a Modula-3 -hoz hasonlan, de a Smalltalk-tl eltren nem
minden tpus osztly: az alapvet beptett tpusok, pldul az egsz szmok s a listk (integer, list) nem
azok, s nhny elgg egzotikus tpus sem az. (Pldul a file-ok.) Akrhogy is, minden Python tpus
osztozik az ltalnos jellsen, amit a legrthetbben az objektum kifejezs kzelt meg.

Az objektumoknak egyni jellege van, s tbbszrsen is el lehet nevezni ugyanazt az objektumot


(klnbz nvterekben). Ez a lehetsg fednvknt (aliasing) ismert ms nyelvekben. Ezt a lehetsget
a nyelvvel val els tallkozskor rendszerint nem becslik meg egybknt a fednv hasznlata
nyugodtan mellzhet megvltoztathatatlan tpusok hasznlatakor (pldul szmok, karakterlncok, tuple-
ek esetben).

Ugyanakkor a fednv hasznlata szndkosan rsze a Python nyelvtannak a megvltoztathat tpusok


esetben, mint pldul a listk, sztrak s a legtbb, programon kvli entitst jelkpez tpus esetben
(file-ok, ablakok, stb.). A fednevek ltalban a program hasznra vlnak, klnsen amita a mutatkhoz
hasonltanak nhny vonatkozsban. Pldul egy objektum tadsa kevs erforrsfelhasznlssal jr,
mita csak egy mutat (az objektumra) kerl tadsra a vgrehajts sorn. Ha a meghvott funkci
mdostja a neki tadott objektumot, a hv ltja a vltozst ez szksgtelenn teszi kt klnbz
paramter tadst ( mint pldul a Pascal-ban). (nincs szksg visszatrsi rtkre a meghvott
fggvnybl, mert a megvltoztatott objektum kzvetlenl elrhet a hv nvterbl. A fordt
megjegyzse)

9.2. Hatkrk s nvterek a Pythonban


Mieltt megismerkednnk az osztlyokkal, beszlnnk kell a hatkrkrl. Az osztlydefincik nhny
gyes trkkt adnak el a nvterekkel, s neked ismerned kell a nvterek s hatkrk mkdst ahhoz,
hogy teljesen tlsd, mi is trtnik. Egybknt ennek a tmakrnek az ismerete minden halad Python
programoznak a hasznra vlik.

Kezdetnek nzznk meg nhny defincit.

A nvtr a neveket objektumokra kpezi le. A legtbb nvtr jelenleg Python sztrakknt van
megvalstva, de ez a teljestmny kivtelvel normlis esetben nem szlelhet a jvben ez egybknt
vltozni fog. Pldk a nvterekre: a foglalt nevek listja (fggvnyek, pldul az abs(), vagy a beptett
kivtelek nevei); a modulokban jelenlv globlis nevek; vagy a helyi nevek fggvnyhvsok sorn.
Bizonyos rtelemben egy objektum tulajdonsgai is kln nvteret alkotnak. Fontos tudni, hogy klnbz
nvterekben lv kt nv kztt semmilyen kapcsolat nem ltezik. Pldul ha kt klnbz modul
egyarnt definilhat egy maximum_beallitas nev fggvnyt brmilyen kvetkezmny nlkl, mert a
modulok hasznlinak a fggvnynv eltagjban a modul nevvel egyrtelmen jeleznik kell, hogy
pontosan melyik fggvnyt fogjk hasznlni.

Aprop a tulajdonsg jelzt hasznlom brmilyen nvre, ami a pontot kveti pldul a codez.real
kifejezsben a real a z objektum egyik tulajdonsga.

Az igazat megvallva egy modulbeli nvre val hivatkozs egy tulajdonsg- hivatkozs: a
codemodname.funcname kifejezsben a modname egy modul objektum s a funcname annak egy
tulajdonsga. Ebben az esetben egyenes hozzrendels trtnik a modul tulajdonsgai s a modulban
definilt globlis nevek kztt: ezek egy nvtren osztoznak. [1]

A tulajdonsgok lehetnek csak olvashatak, vagy rhatak is. Az utbbi esetben rtket rendelhetnk a
tulajdonsghoz pldul gy: modname.the_answer = 42. Az rhat tulajdonsgok a del utastssal
trlhetk is, pldul a del modname.the_answer trli a a modname objektum the_answer
tulajdonsgt.

A nvterek klnbz idpontokban szletnek, s lettartamuk is vltoz. Tartalmazzk a Python


rtelmez beptett neveit, melyek nem trlhetk. A modulok rszre a globlis nvtr a modul definci
olvassakor jn ltre ltalnos esetben a modul nvterek az rtelmezbl val kilpsig megmaradnak.
Az utastsok az rtelmez fels szint hvsai alapjn futnak le, vagy file-bl kiolvasva, vagy az
rtelmezbe begpelt utastsok alapjn a __main__ modul megklnbztetett ???considered???
rszeknt, ezrt sajt nvtrrel rendelkeznek. (A beptett nevek szintn a modulban lteznek,
__builtin__ nv alatt.).

A fggvnyek helyi nvtere a fggvny hvsakor keletkezik, s a fggvny lefutsakor, vagy le nem kezelt
kivtelek ltrejttekor sznnek meg. (Taln a felejts sz pontosabb jelz lenne a trls helyett.)
Termszetesen a rekurzv hvsok mindegyike sajt, helyi nvtrrel rendelkezik.

A hatkr (scope) a Python kd azon szveges rsze ahol a nvtr kzvetlenl elrhet. A kzvetlen
elrhetsg itt azt jelenti, hogy a nv a teljes elrsi tjnak kifejtse nlkl elrhet a nvtrben. (pldul
a codez.real-ban a . jelzi, hogy a codez objektumhoz tartoz tulajdonsgrl van sz, ez itt most teljesen
kifejtett.)

mbr a nvterek meghatrozsa statikus, dinamikusan hasznljuk ket. Brmikor a program futsa sorn
legalbb hrom kzvetlenl elrhet nvtr ltezik: a bels nvtr, amiben az rtelmez elszr keres, s
helyi neveket valamint fggvnyek neveit tartalmazza (a fggvnyeket mindig a legkzelebbi zrt
nvtrben keresi az rtelmez) a msodszor vizsglt kzps nvtr, ami az aktulis modul globlis
vltozinak neveit tartalmazza valamint az utoljra vizsglt kls nvtr, ami a beptett neveket
trolja.

Ha egy vltoznv globlisan deklarlt, minden hivatkozs s mvelet kzvetlenl a kzps nvtrben
keres, mert ott tallhatk a modul globlis nevei. Fontos tudni, hogy a bels nvtren kvl tallhat nevek
csak olvashatak.

Rendszerint a helyi nvtr a szvegkrnyezetben tallhat helyi vltozkra hivatkozik az aktulis


fggvnyben. A fggvnyeken kvl a helyi nvtr a globlis nvtrhez hasonlan egyben az aktulis
modul nvtere is. Az osztlydefincik pedig jabb nvtereket helyeznek el a helyi nvtrben.

Tudatostani kell, hogy a nvterek a szvegkrnyezet ltal meghatrozottak: a modulban definilt fggvny
globlis nvtere a modul nvterben jn ltre a fggvny nevei kizrlag itt elrhetk.

Msrszrl az aktulis nevek keresse mg dinamikusan, futsidben trtnik, a nyelvi definci


akrmennyire is trekszik a fordtskori, statikus nvfeloldsra, szval hossztvon ne szmts a
dinamikus nvfeloldsra! (Igazsg szerint a helyi vltozk mr statikusan meghatrozottak)

A Python egy klnleges tulajdonsga, hogy a hozzrendels mindig a bels nvtrben trtnik. A
hozzrendels nem msol adatokat csak ktst hoz ltre a nevek s az objektumok kztt. A trlsre
ugyanez igaz: a del x utasts eltvoltja az x ktst a helyi nvtr nyilvntartsbl,

Valjban minden mvelet, ami j nv hasznlatt vezeti be, a helyi nvteret hasznlja pldul
utastsok importlsa, s fggvnydefincik modulbeli ltrehozsa vagy ktse.

A global kulcsszval jelezheted hogy bizonyos vltozk a globlis nvtrben lteznek.

9.3. Els tallkozs az osztlyokkal


Az osztlyok hasznlathoz szksgnk van valamennyi j nyelvtanra, hrom j objektumtpusra, s
nhny j kifejezs hasznlatra.
9.3.1. Az osztlydefinci szinaxisa
A legegyszerbb osztlydefinci gy nz ki:
class Osztalynev:
<utasitas-1>
.
.
.
<utasitas-N>

Az osztlydefincik hasonltanak a fggvnyek defincijra (def statements) abbl a szempontbl, hogy


az osztly deklarcijnak meg kell elznie az els hasznlatot. Osztlydefincit elhelyzehetsz egy if
utasts valamely gban is, vagy egy fggvnybe begyazva.

A gyakorlatban az osztlyokon belli utastsok tbbsge ltalban fggvnydefinci, de brmilyen ms


utasts is megengedett, s nha hasznos is erre mg ksbb visszatrnk. Az osztlyon belli
fggvnyeknek egyedi argumentumlistjuk (s hvsi mdjuk) van az osztly metdusainak hvsi mdja
miatt ezt szintn ksbb fogjuk megvizsglni.

Egy osztlydefinciba val belpskor j nvtr jn ltre s helyi nvtrr vlik ebbl kifolylag
minden helyi vltozra trtn hivatkozs tkerl ebbe az j nvtre. ???A gyakorlatban ltalban az j
fggvnydefincik kerlnek ide.???

Az osztlydefincikbl val normlis kilpskor egy class object objektum jn lre. Ez lnyegben
egybefoglalja, beburkolja az osztlydefincikor ltrejtt j nvtr tartalmt az osztlyobjektumokrl a
kvetkez alfejezetben fogunk tbbet tanulni. Az eredeti helyi nvtr (az osztlydefinciba val belps
eltti llapotban) helyrelltdik, s az osztlyobjektum neve is a helyi nvtr rsze lesz (az Osztalynev
a pldban).

9.3.2. Osztlyobjektumok
Az osztlyobjektumok a mveletek ktfle tpust tmogatjk: attribtum mveletek s a pldnyosts. Az
Attribtum tulajdonsgok az ltalnosan hasznlt Python jellsmdot hasznljk:
objektum.attribtumnv. Az sszes nv rvnyes attribtumnv ami az osztly nvterben volt az
osztlyobjektum ltrehozsakor. Ha egy osztly definci valahogy gy nz ki:
class Osztalyom:
"Egy egyszeru pelda osztaly"
i = 12345
def f(self):
return 'hello vilag'

akkor codeOsztalyom.i s Osztlyom.f egyarnt rvnyes attribtum hivatkozs egy egsz szmmal
s egy objektum-metdussal trnek vissza. Az osztlyattribtumoknak ugyangy adhatunk rtket mint egy
normlis vltoznak (Osztalyom.i = 2). A __doc__ metdus is rvnyes attribtum, ami az osztly
defincijban lv els szabad, nem hozzrendelt string-objektummal tr vissza: "Egy egyszeru pelda
osztaly"

Class instantiation uses function notation. Just pretend that the class object is a parameterless function
that returns a new instance of the class. For example (assuming the above class):
Egy osztly pldnyostsa a fggvnyek jellsmdjhoz hasonl. Egyszeren gy kell tenni, mintha az
osztlyobjektum egy paramter nlkli fggvny lenne, amit meghvva az osztly egy j pldnyt kapjuk
visszatrsi rtkknt. Pldul (a fenti osztlyt alapul vve):
x = Osztalyom()

creates a new instance of the class and assigns this object to the local variable x.

kszt egy j pldnyt az osztlybl, s hozzrendeli a visszatrsi rtkknt kapott objektumot az x helyi
vltozhoz.

A pldnyosts mvelete (az objektum hvsa) egy res objektumot hoz ltre. Elkpzelhet, hogy az j
pldnyt egy ismert kezdeti llapotba lltva szeretnnk ltrehozni. Ezt egy klnleges metdussal, az
__init__()-el tudjuk elrni:

def __init__(self):
self.data = []

Ha az osztly definilja az __init__() metdust, egy j egyed ltrehozsakor annak __init__()


metdusa automatikusan lefut. Lssunk egy pldt egy j, inicializlt egyedre:
x = Osztalyom()

Termszetesen az __init__() metdusnak paramtereket is tadhatunk. A paramterek az osztly


pldnyostsa sorn az inicializl metdushoz jutnak. Lssunk egy pldt:
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

9.3.3. A ltrehozott egyedek


s most mihez tudunk kezdeni az j egyedekkel? Fontos hogy tisztban legynk az j objektumok
lehetsges alkotelemeivel. Kt lehetsges alkotelem van: a bels vltozk (adat tulajdonsgok) s az
ezekkel dolgoz fggvnyek.

A Pythonban hasznlt adattulajdonsgok fogalma megegyezik a Smalltalk pldnyvltoz fogalmval,


s a C++ adattagok fogalmval. Az adattulajdonsgokat nem kell a hasznlatuk eltt deklarlni, a helyi
vltozkhoz hasonlatosan mkdnek az els hasznlatukkor automatikusan ltrejnnek. Pldul ha x az
Osztalyom egy pldnya, a kvetkez kdrszlet 16-ot fog kirni:

x.szamlalo = 1
while x.szamlalo < 10:
x.szamlalo = x.szamlalo * 2
print(x.szamlalo)
del x.szamlalo
Fentebb mr emltettk, hogy az objektumnak lehetnek sajt fggvnyei (ms nven metdusai) is. Fontos
hogy ezek mkdst is megrtsk. A metdus pontosan egy objektumhoz tartoz fggvnyt jell. (A
Pythonban a metdus kifejezs nem kizrlag egy osztly pldnynak metdust jelenti ms objektum
tpusok is rendelkezhetnek metdusokkal. Pldul a lista objektumoknak vannak sajt metdusai: append,
insert, remove, sort, s gy tovbb. A ford. megjegyzse: valjban ezek is egy a nyelvbe beptett
osztly pldnyai, csak tudatostani kell, hogy itt a Python helyettnk elvgzi a pldnyostst, s mi ennek
a pldnynak a metdusait hasznljuk. Az albbi sorokban a metdus kifejezst kizrlag egy osztly
metdusaira rtjk, hacsak nincs kln kihangslyozva, hogy most egy msik objektum metdusrl van
sz.

A ltrehozott objektum metdusainak neve a szlosztlytl fgg. (Egy osztly bels elemei lehetnek:
fggvnyek vagy vltozk) Meghatrozs szerint minden felhasznl ltal definilt osztlyfggvnyt az
adott (ltez) pldny nevvel kell hvni. Pldul x.f egy rvnyes fggvnyhivatkozs, ha az
Osztalyom.f fggvny ltezik (x objektum az Osztalyom pldnya), de x.i nem rvnyes ha
Osztalyom.i vltozt nem hoztuk ltre az osztly definilsakor. Fontos, hogy x.f nem ugyanaz, mint
Osztalyom.f ez egy Objektummetdus, nem egy fggvnyobjektum. Fordt megjegyzse: az
osztlydefinci egy minta, ami alapjn a konkrt objektumokat ltrehozza a Python. Van egy prototpus,
ami alapjn legyrthat tbb pldny - a prototpus nyilvn nem ugyanaz, mint a rla mintzott jabb
egyedek. Ms nyelvekben jrtas programozknak zavar lehet hogy a tutorial a fggvnyeket ugyangy
jelli, mint a vltozkat: x.f egy fggvny, mg pldul a php-ban ezt a tnyt az res zrjelekkel kln
jellik: x.f()

9.3.4. Az objektummetdusok
Tbbnyire a metdusokat kzvetlenl hasznljuk:
x.f()

Pldnkban x.f a 'hello vilag' string-el tr vissza. Ezt a fggfnyt nem csak kzvetlenl hvhatjuk
meg: x.f egy objektum metdus, trolhat s ksbb is hvhat, pldul gy:
xf = x.f
while True:
print(xf())

Ez a kd az rkkvalsgig a hello vilag zenetet rja ki.

Pontosan mi trtnik egy objektummetdus hvsakor? Lehet, hogy mr szrevetted hogy a x.f()-t a fenti
pldban paramterek nlkl hvtuk meg - annak ellenre, hogy f() fggvnydefincija egy paramter
hasznlatt elrja. Mi van ezzel a paramterrel? Szerencsre a Pythonban ha egy paramtert ignyl
fggvnyt paramter nlkl prblunk hasznlni, kivteldobs trtnik.

Lehet hogy mr kitalltad a vlaszt: az a klnleges a metdusokban, hogy hvsukkor az ket tartalmaz
osztlypldnyt megkapjk az els vltozban. A pldnkban x.f() hvsa pontosan ugyanaz, mintha
Osztalyom.f(x) metdust hvnnk. Ford. megjegyzse: valjban a fggvnynek itt is jelezzk, hogy az x
egyedrl van sz, a paramter miatt. ltalban metdusok hvsa n paramterrel ugyanaz, mintha az
osztlydefinci fggvnyt hvnnk meg gy, hogy a legels paramter el az aktulis pldny nevt
beillesztjk.
Ha nem rtenl valamit a metdusok mkdsrl, nzz meg krlek nhny gyakorlati pldt. Amikor egy
pldny tulajdonsgra hivatkozol, s az nem ltezik a vltozk kztt, az rtelmez az
osztlydefinciban fogja keresni. Ha a nv egy rvnyes osztlytulajdonsgra mutat, ami egy fgvny, a
fenti pldban szerepl folyamat trtnik: az rtelmez az x.f() hvst talaktja a paramtereket
kigyjti, majd els paramterknt x-et tartalmazva ltrehoz egy j paramterlistt s meghvja a
Osztalyom.f(x, paramter1, p2...) fggvnyt. Az adott pldnyban teht a fggvny valjban nem
is ltezik (absztrakt objektum).

Az adatjellemzk fellrjk az ugyanolyan nev metdusokat; a nvtkzsek elkerlse vgett (amelyek


nagyon nehezen megtallhat programhibkhoz vezethetnek) rdemes betartani nhny elnevezsi
szablyt, melyekkel minimalizlhat az tkzsek eslye. Ezek a szablyok pldul a metdusok
nagybetvel rst, az adatjellemzk kisbets rst vagy alsvons karakterrel trtn rst jelentik;
vagy igk hasznlatt a metdusokhoz, s fnevekt az adatjellemzkhz.

Az adatjellemzkre a metdusok is hivatkozhatnak, ppgy mint az objektum hagyomnyos felhasznli.


Ms szavakkal az osztlyok nem hasznlhatk csupasz absztrakt adattpusok megvalstsra. Valjban a
Pythonban jelenleg semmi sincs, ami az adatrejts elvt biztostani tudn minden az elnevezsi
konvencikra pl. Msrszrl az eredeti C alap Python kpes teljesen elrejteni a megvalstsi
rszleteket s ellenrizni az objetkum elrst, ha szksges; ehhez egy C nyelven rt kiegsztst kell
hasznlni.

A kliensek az adatjellemzket csak vatosan hasznlhatjk, mert elronthatjk azokat a varinsokat,


amelyeket olyan eljrsok tartanak karban, amelyek idpont-pecstelssel dolgoznak. Az objektum
felhasznli sajt adatjellemziket brmifle ellenrzs nlkl hozzadhatjk az objektumokhoz amg
ezzel nem okoznak nvtkzst az elnevezsi konvencik hasznlatval elg sok fejfjstl
megszabadulhatunk!

A metdusokon bell nem ltezik rvidts, gyors hivatkozs az adatjellemzk. n gy ltom, hogy ez
nveli a metdusok olvashatsgt, s nem hagy eslyt a helyi s a pldnyostott vltozk
sszekeversre, mikor a metdus forrskdjt olvassuk.

A hagyomnyokhoz hen a metdusok els paramternek neve rendszerint self. Ez valban csak egy
szoks: a self nvnek semmilyen specilis jelentse nincs a Pythonban. (Azrt vegyk figyelembe, hogy
ha eltrnk a hagyomnyoktl, akkor a program nehezebben olvashatv vlik, s a class browser -
osztly bngsz is a tradicionlis vltoznevet hasznlja.

Az osztly defincijban megadott fggvnyek az osztly pldnyai szmra hoznak ltre metdusokat (a
pldnyhoz tartoz fggvnyeket). Nem szksgszer azonban hogy egy fggvnydefinci kdja az
osztlydefinci rsze legyen: egy defincin kvli fggvny helyi vltozhoz val rendelse is megfelel
a clnak. Pldul:
# Egy osztlyon kvl definilt fggvny
def f1(self, x, y):
return min(x, x+y)

class C:
f = f1
def g(self):
return 'hello vilag'
h = g
Most f, g s h egyarnt C osztly jellemzi (gyakorlatilag objektumhivatkozsok) kvetkezskppen C
osztly minden pldnynak metdusai is h s g pedig valjban ugyanazt a fggvnyt jelentik. Azrt ne
feledjk, hogy a fenti plda hasznlata a program olvasjt sszekavarhatja!

Az osztlyon belli metdusok egymst is hvhatjk a self argumentum hasznlatval:


class Taska:
def __init__(self):
self.tartalom = []
def belerak(self, x):
self.tartalom.append(x)
def belerak_ketszer(self, x):
self.belerak(x)
self.belerak(x)

A metdusok a globlis nvtrben lv fggvnyekre is hasonlkpp hivatkozhatnak. (Maguk az


osztlydefincik soha nem rszei a globlis nvtrnek!) Mg egy kivteles esetben a globlis nvtr
vltozinak hasznlata jl jhet, tbb esetben is jl jhet a globlis nvtr elrse: a globlis nvtrbe
importlt fggvnyeket s modulokat az adott osztlymetdusbl is hasznlhatjuk, mintha az adott
fggvnyben vagy osztlyban definiltk volna ket. Rendszerint az osztly az nmaga ltal definilt
metdust a globlis nvtrben tartja, s a kvetkez rszben megltjuk majd, mirt j ha a metdusok a
sajt osztlyukra hivatkozhatnak!

9.4. rkls
Termszetesen az rkls tmogatsa nlkl nem sok rtelme lenne az osztlyok hasznlatnak. A
szrmaztatott osztlyok defincija a kvetkezkppen nz ki:
class SzarmaztatottOsztalyNeve(SzuloOsztalyNeve):
<utasitas-1>
.
.
.
<utasitas-N>

a SzuloOsztalyNeve nvnek a szrmaztatott osztly nvterben lteznie kell. Abban az esetben, ha a


szlosztly msik modulban lett definilva, a modulnev.szuloosztalynev formt is hasznlhatjuk:
% class DerivedClassName(modname.BaseClassName):
class SzarmaztatottOsztalyNeve(modulnev.SzuloOsztalyNeve):

A szrmaztatott osztly defincijnak feldolgozsa hasonl a szlosztlyokhoz az osztlyobjektum


ltrehozsakor a szlosztly is a pldny rsze lesz. Ha egy osztlyjellemzre hivatkozunk, s az nincs
jelen az osztlyban, az rtelmez a szlosztlyban keresi azt s ha az szintn szrmaztatott osztly,
akkor annak a szljben folytatdik a keress, rekurzvan.

A szrmaztatott osztlyok pldnyostsban nincs semmi klnleges: SzarmaztatottOsztalyNeve()


ltrehozza az osztly j pldnyt. A metdusok nyilvntartst a kvetkezkpp oldja meg az rtelmez:
elszr az aktulis osztly megfelel nev osztly-objektumait vizsglja meg, majd ha nem tallja a
keresett metdust, elindul a szlosztlyok lncn. Ha a keressi folyamat eredmnyes, teht valamelyik
szlosztlyban megtallta a keresett nev objektumot, az adott objektumnv hivatkozsa rvnyes lesz: a
talt objektumra mutat.

A szrmaztatott osztlyok fellrhatjk a szlosztlyok metdusait. A metdusoknak nincsenek klnleges


jogaik ms, ugyanabban az objektumban lv metdusok hvsakor. A szlosztly egy metdusa
/a_eredeti()/, amely ugyanazon szlosztly egy msik metdust hvja /b(), lehet hogy nem fog
mkdni, ha a szrmaztatott osztlybl fellrjk /a_uj()/, ami nem hvja mr b()-t. (C++
programozknak: a Pythonban minden metdus valjban virtual tpus.

A szrmaztatott osztly metdusa, amely fellrja a szlosztly egy metdust, valjban inkbb
kiterjeszti az eredeti metdust, s nem egyszeren csak kicserli. A szlosztly metdusra gy
hivatkozhatunk: SzuloOsztalyNev.metodusnev(self, paramterek). Ez nha jl jhet. (Fontos, hogy
ez csak akkor mkdik, ha a szloszty a globlis nvtrben lett ltrehozva, vagy kzvetlenl
beimportlva.)

9.4.1. Tbbszrs rkls


A python korltozottan tmogatja a tbbszrs rklst is. Egy ilyen osztly defincija a kvetkezkpp
nz ki:
% class DerivedClassName(Base1, Base2, Base3):
% <statement-1>
class SzarmaztatottOsztalyNeve(Szulo1, Szulo2, Szulo3):
<utasitas-1>

.
.
.
% <statement-N>
<utasitas-N>

Az egyedli nyelvtani szably amit ismerni kell, az osztlyjellemzk feloldsnak a szablya. Az


rtelmez elszr a mlyebb rtegekben keres, balrl jobbra. A fenti pldban ha a jellemz nem
tallhat meg a SzarmaztatottOsztaly-ban, akkor elszr a Szulo1-ben keresi azt, majd rekurzvan a
Szulo2-ben, s ha ott nem tallja, akkor lp tovbb rekurzvan a tbbi szlosztly fel.

Nhnyan els pillanatban arra gondolnak, hogy a Szulo2 -ben s a Szulo3-ban kellene elbb keresni, a
Szulo1 eltt mondvn hogy ez termszetesebb lenne. Ez az elgondols viszont ignyli annak ismerett,
hogy mely jellemzt definiltak a Szulo1-ben vagy annak egyik szlosztlyban, s csak ezutn tudod
elkerlni a Szulo2-ben lv nvtkzseket. A mlyebb elszr szably nem tesz klnbsget a helyben
definilt s rkltt vltozk kztt.

Ezekbl gondolom mr ltszik, hogy az tgondolatlanul hasznlt tbbszrs rklds a program


karbantartst rmlomm teheti a nvtkzsek elkerlse vgett pedig a Python csak a konvencikra
tmaszkodhat. A tbbszrs rkls egyik jl ismert problmja ha a gyermekosztly kt szlosztlynak
egy kzs nagyszl osztlya van. Ugyan egyszer kitallni hogy mi trtnik ebben az esetben (a nagyszl
adat jellemzinek egypldnyos vltozatt hasznlja a gyermek) az mg nem tisztzott, hogy ez a nyelvi
kifejezsmd minden esetben hasznlhat-e.

9.5. Privt vltozk


Egyedi azonostk ltrehozst az osztlyokhoz a Python korltozottan tmogatja. Brmely azonost,
amely gy nz ki: __spam (legalbb kt bevezet alsvons, amit legfeljebb egy alsvons kvethet)
szvegesen kicserldik a _classname__spam formra, ahol a classname az aktulis osztly neve egy
alsvonssal bevezetve. Ez a csere vgrehajtdik az azonost pozcijra val tekintet nlkl, gyhogy
hasznlhat osztly-egyedi pldnyok, osztlyvltozk, metdusok definilsra mg akkor is, ha ms
osztlyok pldnyait sajt privt vltozi kz veszi fel (???Ford: ellenrizni!)

Ha a cserlt nv hosszabb mint 255 karakter, az rtelmez csonkthatja az j nevet. Kls osztlyoknl,
vagy ahol az osztlynv kvetkezetesen alsvonsokbl ll??? nem trtnik csonkts. A nvcsonkts
clja az, hogy az osztlyoknak egyszer megoldst biztostson a private vltozk s metdusok
definilsra anlkl, hogy aggdnunk kellene a szrmaztatott osztlyokban megjelen privt vltozk
miatt, vagy esetleg a szrmaztatott osztlyban mr meglv vltoz privt vltozval val fellrsa miatt.
Fontos tudni, hogy a nvcsonktsi szablyok elssorban a problmk elkerlst clozzk meg gy
mg mindig lehesges annak, aki nagyon akarja, hogy elrje vagy mdostsa a privtnak tartott vltozkat.

Ez specilis krlmnyek kztt nagyon hasznos lehet, pldul hibakeressnl, s ez az egyik oka annak,
hogy ezt a kibvt mg nem szntettk meg.

(Buglet (duda): szrmaztats egy osztlybl a szlosztly nevvel megegyez nven a szlosztly
privt vltozinak hasznlata ekkor lehetsges lesz.)

Fontos, hogy a exec, eval() vagy evalfile() ltal vgrehajtott kd nem veszi figyelembe a hv
osztly nevt az aktulis osztly esetben ez hasonl a global vltozk mkdshez, elre lefordtott
byte-kd esetben. Hasonl korltozsok lteznek a getattr(), setattr() s delattr() esetben, ha
kzvetlenl hvjk meg a __dict__ utastst.

9.6. Egyebek...
Alkalomadtn hasznos lehet a Pascal record, vagy a C struct adattpusaihoz hasonl szerkezetek
hasznlata egybefogni nhny sszetartoz adatot. A kvetkez res osztlydefinci ezt szpen
megvalstja:
class Alkalmazott:
pass

john = Alkalmazott() # Egy res alkalmazott rekordot hoz ltre

# A rekord mezinek feltltse


john.nev = 'John Doe'
john.osztaly = 'szmtgpes labor'
john.fizetes = 1000

Ez a kis kdrszlet ami egyni adat tpusokat kezel, gyakran kvet adatszerkezetek trolsra val
osztlydefincikat.

Az egyes objektumpldnyok sajt tulajdonsgokkal is rendelkeznek: m.im_self az aktulis


objektumpldnyra mutat ??? ezt ki kell prblni???, m.im_func az objektumban elrhet metdusokat
tartalmazza. ??? ezt is prbld ki
9.7. Kivtelek alkalmazsa az osztlyokban
A felhasznli kivtelek az osztlyokban is mkdnek hasznlatukkal egy bvthet, hierarchikus
kivtel-struktrt pthetnk fel.

A raise utastsnak ktfle hasznlati mdja lehetsges:


raise Osztaly, peldany

raise peldany

Az els esetben peldany-nak az Osztaly-bl kell szrmaznia. A msodik eset egy rvidts:
raise peldany.__class__, peldany

Az except zradkban lv class megegyezik egy kifejezssel ha az ugyanaz az osztly vagy a szlosztly
(de nem msik kerl ton az except zradkban lv szrmaztatott osztly figyelse nem egyezik meg
a szlosztly figyelsvel.) Pldul a kvetkez kd B, C, D kimenetet fog produklni:
class B:
pass
class C(B):
pass
class D(C):
pass

for c in [B, C, D]:


try:
raise c()
except D:
print("D")
except C:
print("C")
except B:
print("B")

Note that if the except clauses were reversed (with except B first), it would have printed B, B, B the
first matching except clause is triggered.

Fontos, hogy ha az except zradkot megfordtjuk (except B van elszr), B, B, B lesz a kimenet az
els except-re val illeszkeds utn a tbbit mr nem vizsglja az rtelmez.

Mikor egy kezeletlen kivtel miatt hibazenetet kld az rtelmez, s a hiba egy osztlybl szrmazik, a
kimenetben szerepel az osztly neve, egy kettspont, egy space, s befejezsl a pldnyt stringg
konvertlja az rtelmez a beptett str() fggvnnyel.

9.8. Bejrk
Valsznleg mr szrevetted, hogy a legtbb trol objektum bejrhat a for ciklusutasts
hasznlatval:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line)

Az elrs ilyen mdja tiszta, tmr s knyelmes. Az itertorok hasznlata thatja s egysgesti a
Pythont. A sznfalak mgtt a for utasts meghvja a iter() fggvnyt a bejrand trolra. Ez a
fggvny egy itertor-objektummal tr vissza, amely definilja a __next__() metdust, amellyel a trol
elemeit lehet elrni, egyszerre egy elemet. Ha nincs tbb elem, a __next__() metdus StopIteration
kivtelt dob, amely a for ciklust megszaktja. A next() beptett fggvnnyel is meghvhatom a
__next__() metdust, ahogy a kvetkez pldban lthat:

>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)

Traceback (most recent call last):


File "<pyshell#6>", line 1, in <module>
next(it)
StopIteration

A ciklusok mkdsbe bepillantva mr knny sajt bejr esemnyt kszteni egy osztlyhoz. Definilni
kell az __iter__() metdust, ami a __next__() fggvny eredmnyekpp ltrejv objektummal tr
vissza. Ha az osztly definilja a __next__() metdust, akkor az __iter__() egyszeren a self
objektummal tr vissza:
>>> class Reverse:
"Iterator for looping over a sequence backwards"
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]

>>> for char in Reverse('spam'):


print(char)

m
a
p
s

9.9. Genertorok
A genertorok egyszer s hatkony eszkzk adatbejrk ksztsre. A normlis fggvnyekhez hasonl
a felptsk, de hasznljk a yield utastst ha adatot szeretnnek visszaadni. A __next__() metdus
minden hvsakor a genertor ott folytatja az adatok feldolgozst, ahol az elz hvsakor befejezte
(emlkszik minden vltoz rtkre, s hogy melyik utastst hajtotta vgre utoljra). Lssunk egy pldt
arra, hogy milyen egyszer egy genertort kszteni:
>>> def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]

>>> for char in reverse('golf'):


print(char)

f
l
o
g

Brmi, amit egy genertorral megtehetsz, osztly alap bejrkkal is kivitelezhet az elz rszben
lertak szerint. Ami a genertorokat tmrr teszi, hogy a __iter__() s a next() metdusok
automatikusan ltrejnnek.

Egy msik fontos lehetsg hogy a helyi vltozk, s a vgrehajts llapota automatikusan troldik a
genertor kt futsa kztt.

Az automatikus metdus generls s program llapot ments gondolatmenett folytatva, amikor a


genertor futsa megszakad, ez az esemny automatikusan StopIteration kivtelt vlt ki. Egymssal
kombinlva ezek a nyelvi szolgltatsok egyszerv teszik a bejrk ksztst nhny fggvny
megrsnak megfelel viszonylag kis erfesztssel.

Lbjegyzet

Except for one thing. Module objects have a secret read-only attribute called __dict__ which
returns the dictionary used to implement the modules namespace; the name __dict__ is an
[1]
attribute but not a global name. Obviously, using this violates the abstraction of namespace
implementation, and should be restricted to things like post-mortem debuggers.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

10. A Python alap-knyvtr rvid bemutatsa -


Standard Library 1.
10.1. Fellet az opercis rendszerhez
Az os modul nagyon sok fggvnyt tartalmaz, melyek az opercis rendszerrel kommuniklnak:
>>> import os
>>> os.system('time 0:02') # FIGYELEM: tlltottuk a rendszer rjt!
0
>>> os.system('time')
A pontos id: 0:02:08,14
rja be az j idt:

>>> os.getcwd() # Az aktulis knyvtr nevt adja vissza


'C:\\Python24'
>>> os.chdir('/server/accesslogs') # s itt knyvtrar vltottunk.

Fontos, hogy az importls sorn az import os alakot hasznld, s ne a from os import * alakot. Ez
megv attl, hogy az os.open() fggvny elfedje (s hasznlhatatlann tegye) a beptett open()
fggvnyt, ami teljesen mskpp mkdik.

A beptett dir() s help() fggvnyek sokat segthetnek ha olyan nagy modulokkal van dolgod, mint
pldul az os:
>>> import os
>>> dir(os)
<kilistzza az sszes fggvnyt, ami az 'os' modulban tallhat>
>>> help(os)
<egy nagyon rszletes manual oldalt generl a modulok dokumentcis karakterlncbl>

A mindennapi fjl- s knyvtr-mveletekhez az shutil modul magasszint, knnyen hasznlhat felletet


nyjt:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')

10.2. Karakterhelyettest jelek dzsker karakterek


A glob modulban lv fggvny segt a fjl listk elksztsben, ha dzsker karaktert hasznlsz:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

10.3. Parancssori paramterek


A programoknak gyakran fel kell dolgozniuk a parancssori paramtereiket. Ezek a paramterek a sys
modul argv attribtumban troldnak, listaknnt. Pldul ha kiadjuk azt a parancsot, hogy python
demo.py egy ketto harom, az a kvetkez kimenetet eredmnyezi:

>>> import sys


>>> print(sys.argv)
['demo.py', 'egy', 'ketto', 'harom'] # a nulladik argumentum mindig a program neve!

A getopt modul kpes feldolgozni a sys.argv elemeit a Unix getopt() fggvnynek szablyai szerint.
Ennl mg hatkonyabb s rugalmasabb program-paramter feldolgozst tesz lehetv az optparse
modul.

10.4. Hiba-kimenet tirnytsa, programfuts megszaktsa


The sys module also has attributes for stdin, stdout, and stderr. The latter is useful for emitting warnings
and error messages to make them visible even when stdout has been redirected:

A sys modul szintn rendelkezik stdin, stdout, s stderr attribtummal. Ez utbbi hasznlatos
figyelmeztetsek s hibazenetek lthatv ttelre pldul akkor, amikor a stdout t van irnytva,
mondjuk egy fjlba:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one

A legrvidebb t egy program megszaktsra a sys.exit() utasts.

10.5. Regulris kifejezsek - karakterlncok


A re modul segtsgvel regulris kifejezseket hasznlhatsz szvegfeldolgozsra. sszetett illeszkedsi
s mdost szablyokat hatrozhatsz meg a regulris kifejezsek rvid, tmr megoldst knlnak:
>>> import re # kovetkezik: minden f-el kezdodo szot kigyujtunk:
>>> re.findall(r'\bf[a-z]*', 'aki felveszi, az felmelegszik, aki nem, az fazik')
['felveszi', 'felmelegszik', 'fazik']

>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'macska a a kalapban a a hazban')


'macska a kalapban a hazban' # a pelda nem tokeletes, 'a a a'-bol
# 'a a'-t csinal, de szemleltetesnek jo

Ha egyszerbb szvegmdostsi ignyed van, a string metdusokat javasoljuk, mert olvashatak s a


hibakeress is knyebb velk:
>>> 'Teat Peternek'.replace('Peter', 'Elemer')
'Teat Elemernek'

10.6. Matematika
A math modulon keresztl rhetek el a httrben mkd C fggvnyek, melyekkel lebegpontos
mveleteket vgezhetsz:
>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0

A random modullal vletlenszmokat generlhatsz:


>>> import random
>>> random.choice(['alma', 'korte', 'banan'])
'alma'
>>> random.sample(range(100), 10) # ismetles nelkuli mintavetel
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # vletlen egsz szm kivlasztsa 0-
6ig terjed tartomnyban
4

10.7. Internet elrs


Tbb modul is van, amely lehetv teszi az Internet elrst, s klnbz protokollok hasznlatt. A kt
legegyszerbb az urllib2 adatfogads url cmekrl, s az smtplib modul, amellyel levelet kldhetsz:
>>> import urllib2
>>> for line in urllib2.urlopen('http://www.python.org/'):
# for: az oldal soronknti feldolgozsa:
... if 'Python' in line: # keressk azokat a sorokat,
... print(line) # ahol a Python sz megtallhat

>>> import smtplib


>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('[email protected]', '[email protected]',
"""To: [email protected]
From: [email protected]

Szevasz! Eljutottal a tutorial vegeig!.


""")
>>> server.quit()

10.8. A dtumok s az id kezelse


A datetime modul biztost osztlyokat a dtumok s az idpontok manipullsra egyszerbbeket s
sszetettebbeket is. A dtum- s az id- aritmetikai mveletek tmogatottak a kzppontban a kimenet
formzsa s mdostsa ll. A modul tmogatja azokat az objektumokat is, amelyek kezelni tudjk az
idznkat.
# a dtumok knnyen ltrehozhatak s formzhatak:
>>> from datetime import date
>>> most = date.today()
>>> most
datetime.date(2003, 12, 2)
>>> most.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
# a dtumok tmogatjk a naptri mveleteket:
>>> szuletesnap = date(1964, 7, 31)
>>> kor = most - szuletesnap # a most-ot az elozo peldaban hataroztuk meg!
>>> kor.days # days = napok, itt a napok szamat jelenti
14368

10.9. Tmrts - zip, gzip, tar...


Az elterjedtebb archivl s tmrt formtumok kzvetlenl tmogatottak, a kvetkez modulokban:
zlib, gzip, bz2, zipfile, and tarfile.

>>> import zlib


>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

10.10. Teljestmnymrs
Nhny Python programoz komoly rdekldst mutatott a klnbz problma- megoldsok
teljestmnynek sszehasonltsa irnt. A Pythonban tallhat egy mreszkz, amely azonnali vlaszt ad
ezekre a krdsekre.

Pldul hasznlhatunk tuple becsomagolst s kicsomagolst a megszokott paramter-tads helyett. A


timeit modul gyorsan demonstrl egy egyszer teljestmny mrst:

>>> from timeit import Timer


>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

A timeit modul apr kdrszletek vgrehajtsi idejnek mrsre szolgl. Ezzel ellenttben a profile
s a pstats modulok nagyobb kdrszletek futsi-id kritikus rszeinek meghatrozsra szolgl.

10.11. Minsgellenrzs
A jminsg programok fejlesztsnek egyik elmlete az, hogy minden fggvnyhez prbaadatokat,
teszteket runk majd a fejlesztsi folyamat sorn ezeket gyakran lefuttatjuk - gy azonnal kiderl, ha a
vrttl eltren viselkedik a program.

A The doctest modul tartalmaz olyan eszkzket, amelyekkel modulokat vizsglhatunk, s a program
dokumentcis karakterlncba gyazott teszteket futtathatunk le. A teszt ltrehozsa olyan egyszer, mint
kivgni s beilleszteni egy tipikus fggvnyhvs sorn bejv-keletkez adatokat.

Ez a lehetsg elsegti a jobb dokumentltsgot, hiszen a felhasznlnak rgtn fggvnyhvsi pldt


mutathatunk tovbb ellenrizhetv teszi a doctest modulnak, hogy a kd a dokumentcival
sszhangban van-e.
def atlag(ertekek):
"""Listban tadott szmok szmtani kzept hatrozza meg a fggvny.

>>> print(atlag([20, 30, 70]))


40.0
"""
return sum(ertekek) / len(ertekek)

import doctest
doctest.testmod() # a begyazott tesztet automatikusan kiprblja.

A unittest modul kicsit bonyolultabb, mint a doctest modul viszont tbb tfog tesztkszlet
kezelsrl gondoskodik, egy klnll fjlban:
import unittest

class StatisztikaiFuggvenyekTesztelese(unittest.TestCase):

def atlag_tesztelese(self):
self.assertEqual(atlag([20, 30, 70]), 40.0)
self.assertEqual(round(atlag([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
atlag([])
with self.assertRaises(TypeError):
atlag(20, 30, 70)

unittest.main() # A parancssorbl trtn hvs lefuttatja a teszteket.

10.12. Elemekkel egytt...


A Python filozfija: elemekkel egytt. A legjobban ez gy ltszik, ha szrevesszk nagyszm
moduljainak - csomagjainak kifinomultsgt, sszetettsgt.

Pldul:

Az xmlrpclib s a SimpleXMLRPCServer modulok a tvoli eljrshvsokat egyszer mvelett


teszik szmunkra. A neveik ellenre nincs kzvetlen XML tudsra szksg.
Az email csomag egy knyvtr az elektronikus levelek kezelsre belertve a MIME s ms RFC
2822-alap zeneteket is. Eltren az smtplib s poplib moduloktl, melyek azonnali levlkldst
s fogadst valstanak meg, az email csomag teljes eszkzkszlettel rendelkezik sszetett zenet-
struktrk felptshez s dekdolshoz a csatolt llomnyokat is belertve. Tovbb tartalmazza
az Interneten hasznlt kdol s fejlc protokollokat.
Az xml.dom s az xml.sax csomagok nagyon jl hasznlhatk az elterjedt adat-cserl formtumok
kezelsre, rtelmezsre s feldolgozsra Ugyangy a csv modul tmogatja a csv formtum
kzvetlen rst s olvasst. Mindent egybevve ezek a modulok s csomagok remekl
leegyszersti a Python programok s ms alkalmazsok kztti adatcsert.
A kultrlis tulajdonsgok bellthatk s tmogatottak szmos modulban, pldul: gettext,
locale, s a codecs csomagban is.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

11. Az alap-knyvtr bemutatsa 2. rsz


Ebben a rszben nhny olyan modult vizsglunk meg, amire a professzionlis programozs sorn szksg
lesz. Ezen modulok kisebb szkriptekben ritkn fordulnak el.

11.1. A kimenet formzsa


A repr modulban tallhat repr() fggvny lehetv teszi a nagymret, mlyen egymsba gyazott
adatszerkezetek rvid, ttekinthet kijelzst:
>>> import repr
>>> repr.repr(set('elkelkaposztastalanitottatok'))
"set(['a', 'e', 'i', 'k', 'l', 'n', ...])"

A pprint modullal finoman szablyozhatod beptett s a felhasznl ltal definilt objektumok


megjelentst gy, hogy az az rtelmez szmra tovbbra is feldolgozhat marad. Amikor az eredmny
nem fr el egy sorban, egy csinos nyomtat sortrseket s behzsokat ad a kimenethez, hogy az jl
olvashat legyen:
>>> import pprint
>>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
... 'yellow'], 'blue']]]
...
>>> pprint.pprint(t, width=30)
[[[['black', 'cyan'],
'white',
['green', 'red']],
[['magenta', 'yellow'],
'blue']]]

A textwrap modullal szvegblokkokak jelenthetnk meg adott szlessg blokkban:


>>> import textwrap
>>> doc = """The wrap() method is just like fill() except that it returns
... a list of strings instead of one big string with newlines to separate
... the wrapped lines."""
...
>>> print(textwrap.fill(doc, width=40))
The wrap() method is just like fill()
except that it returns a list of strings
instead of one big string with newlines
to separate the wrapped lines.

A locale modul a klnbz kultrkhoz ktd egyedi adatformzsokhoz fr hozz a locale format
funkcijnak grouping (csoportosts, a kvetkez pldban helyirtk) tulajdonsga kzvetlenl
biztostja az adott kultrnak megfelel szm-kijelzst:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'English_United States.1252')
'English_United States.1252'
>>> conv = locale.localeconv() # get a mapping of conventions
>>> x = 1234567.8
>>> locale.format("%d", x, grouping=True)
'1,234,567'
>>> locale.format("%s%.*f", (conv['currency_symbol'],
... conv['int_frac_digits'], x), grouping=True)
'$1,234,567.80'

11.2. Szveg-sablonok
A string modulban tallhat egy nagyon hasznos osztly, a Template. Ez lehetsget ad a
vgfelhasznlknak sablon-szvegek szerkesztsre.

A szvegbe adatmezket a $ jellel helyezhetnk el, melyek mell kapcsos zrjelbe Python
vltozneveket kell rni (ez szmot, bett s alsvons karaktert tartalmazhat). A kapcsos zrjelprra
akkor van szksg, ha nem nll sz a beillesztett adat, pldul lent a Peternek sz lesz ilyen -
egybknt a zrjelpr elhagyhat. Egyszer $ jelet gy rhatsz: $$
>>> from string import Template
>>> t = Template('${nev}nek kuldunk 10$$-t, hogy $cselekedet.')
>>> t.substitute(nev='Peter', cselekedet='csizmat vegyen')
'Peternek kuldunk 10$-t, hogy csizmat vegyen'

A substitute() meddus KeyError kivtelt dob, ha az adatmezkben megadott vltoznevet a


paramterknt tadott sztrban, vagy kulcsszavas paramterekben nem tallja. Elkpzelhet olyan
helyzet, hogy valamelyik vltoznv (vagy kulcs, ha sztrrl van sz) hinyzik - ilyenkor a
safe_substitute() metdust rdemes hasznlni, ami a hinyz adatoknl az adatmezt vltozatlanul
hagyja:
# ez a pelda nem fut le, hianyzik $owner
>>> t = Template('Return the $item to $owner.')
>>> d = dict(item='unladen swallow')
>>> t.substitute(d)
Traceback (most recent call last):
. . .
KeyError: 'owner'
>>> t.safe_substitute(d) # ez a pelda lefut, pedig hianyzik $owner:browse confirm

'Return the unladen swallow to $owner.'

A Template alosztly egyedi hatroljelet is tud hasznlni. Pldul egy tmeges fjl-tnevez funkci
esetben (pl. fnykp-karbantart programnl) az adatmezk jelzsre hasznlhatod a szzalk jelet is, az
aktulis dtum, a kp sorszma, vagy a fjl formtumnak jelzse esetn:
>>> import time, os.path
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class BatchRename(Template):
... delimiter = '%'
>>> fmt = raw_input('Add meg az atnevezes modjat: (%d-datum %n-fajl_sorszama %f-
fileformatum): ')
Add meg az atnevezes modjat: (%d-datum %n-fajl_sorszama %f-
fileformatum): Ashley_%n%f

>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
... base, ext = os.path.splitext(filename)
... newname = t.substitute(d=date, n=i, f=ext)
... print('%s --> %s' % (filename, newname))

img_1074.jpg --> Ashley_0.jpg


img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg

Another application for templating is separating program logic from the details of multiple output formats.
The makes it possible to substitute custom templates for XML files, plain text reports, and HMTL web
reports.

A szvegsablonok msik felhasznlsi lehetsge a tbbfle kimeneti formtumot tmogat programokban


van. Itt a vezrlsi logika a kimenettl el van vlasztva A kimeneti fjl felptse ms XML fjloknl,
szvegfjloknl, vagy html kimenet esetben, viszont az adattartalom rtelemszeren megegyezik.

11.3. Binris adatblokkok hasznlata


A struct modulban tallhat a pack() s az unpack() fggvnyek, melyekkel vltoz hosszsg
binris adatblokkokat kezelhetsz. A kvetkez plda bemutatja a ZIP fjlok fejlc informciinak
feldolgozst (a "H" s az "L" kdcsomag jelkpezi a kt s ngybjtos eljel nlkli szmokat):
import struct

data = open('fajlom.zip', 'rb').read()


start = 0
for i in range(3): # megnezzuk az elso harom fajl fejlecet
start += 14
fields = struct.unpack('LLLHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields

start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)

start += extra_size + comp_size # tovabblepes a kovetkezo fejlechez

11.4. Tbbszlsg
A szlkezelssel lehet az egymstl sorrendileg nem fgg folyamatokat prhuzamoss tenni. A szlakkal
egyidben fogadhatjuk a program felhasznljnak utastsait, mikzben a httrben a program egy
feladaton dolgozik - a kt folyamat (kommunikci, s httrben munka) egymssal prhuzamosan fut.

A kvetkez kd bemutatja a threading modul magasszint hasznlatt, ami egy kln httrfolyamatot
indt, mikzben a program fut tovbb:
import threading, zipfile

class AsyncZip(threading.Thread):
def __init__(self, infile, outfile):
threading.Thread.__init__(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
print('Kesz a zip tomoritese ennek a fajlnak: ', self.infile)

background = AsyncZip('valami.txt', 'myarchive.zip')


background.start()
print('A foprogram tovabb fut az eloterben.')

background.join() # Varakozas a hattermuvelet befejezesere


print('A foprogram megvarja, hogy a hattermuvelet befejezodjon.')

A tbbszl programok egyik legfontosabb feladata azon szlak mkdsnek koordinlsa, melyek
megosztott adatokon, vagy kzs erforrsokon dolgoznak. (pl. mi trtnik ha kt szl egyidben akar egy
fjlt rni?) A Threading modul tbb szinkronizcis elemet tartalmaz ilyen a zrols, az esemnykezels,
a feltteles vltozk s a szemaforok.

Igaz ugyan, hogy ezek hatkony eszkzk m elfordulhatnak kisebb tervezsi hibk is, melyek nehezen
megismtelhetk, s nehezen kinyomozhatk. Mivel a szlak egymstl fggetlenl futnak, mg
vgrehajtsuk sorrendje sem biztos - emiatt elfordulhat, hogy a program nem ugyangy viselkedik, ha
egyms utn tbbszr lefuttatjuk gy a hibakeress is nehezebb vlik.

A szlak koordinlsra azt javasoljuk, hogy az erforrsok elrst egy szl biztostsa, s hasznld a
Queue modult a tbbi szlbl rkez krsek kezelsre. Ha egy programban a szlak kztti
kommunikcit a Queue objektumokkal biztostod, a program koordinlsnak megtervezse egyszerbb,
olvashatbb s megbzhatbb lesz.

11.5. Naplzs
A logging modul egy sszetett, finoman bellthat naplz rendszert tartalmaz. A legegyszerbb esetben
a naplzand zenetek fjlba, vagy a sys.stderr (szabvnyos hibakimenetre) - kldhetk:
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

A fenti plda kimenete:


WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down

Alaprtelmezs szerint az informcis s debug zenetek elfojtottak, s a kimenet a szabvnyos hiba


csatornra kerl. A kimenet clja ms is lehet, pldul email, datagram, socket vagy akr egy HTTP
szerver. Az j szrk az zenet prioritstl fggen ms-ms kimenetre terelhetik a naplzand zenetet.
A prioritsok: DEBUG, INFO, WARNING, ERROR, s CRITICAL.
A naplz rendszer kzvetlenl a Pythonbl is bellthat, vagy hasznlhatsz konfigurcis fjlt, s gy a
programbl val kilps nlkl megvltoztathatod a naplzs belltsait.

11.6. Gyenge hivatkozsok


A memriakezelst a Python automatikusan vgzi (hivatkozsszmlls a legtbb objektum esetben, s
szemtgyjts). Az utols objektum-hivatkozs megsemmislse utn az elfoglalt memria felszabadul.

Ez az automatizmus a legtbb esetben j s hasznos, de nha szksg van az objektumok kvetsre


mindaddig, amg hasznlatban vannak. rdekes, hogy ppen ez a kvets az, ami a hivatkozsokat
llandv teszi (nem sznnek meg).

A weakref modulban olyan eszkzk vannak, amelyekkel gy lehet nyomon kvetni az objektumokat, hogy
a nyomkvetssel nem hozol ltre jabb hivatkozst az objektumra. Amikor az objektumot mr senki nem
hasznlja, automatikusan trldik a weakref (gyenge referencia) tblbl, s a weakref objektum errl
rtestst kap. A tipikus programok trol objektumokat tartalmaznak, melyek ltrehozsa
erforrsignyes:
>>> import weakref, gc
>>> class A:
... def __init__(self, ertek):
... self.ertek = ertek
... def __repr__(self):
... return str(self.ertek)
...
>>> a = A(10) # hivatkozas letrehozasa
>>> d = weakref.WeakValueDictionary()
>>> d['primary'] = a # itt nem keletkezik hivatkozas
>>> d['primary'] # ha az objektum meg letezik, visszaadja az erteket
10
>>> del a # toroljuk az egyetlen hivatkozast
>>> gc.collect() # a szemetgyujtest azonnal lefuttatjuk
0
>>> d['primary'] # ez a bejegyzes automatikusan megszunt, nem kell kul
Traceback (most recent call last):
File "<pyshell#108>", line 1, in -toplevel-
d['primary'] # ez a bejegyzes automatikusan megszunt, nem kell kul
File "C:/PY24/lib/weakref.py", line 46, in __getitem__
o = self.data[key]()
KeyError: 'primary'

11.7. Listakezel eszkzk


A legtbb adatstruktrnak szksge van a beptett lista tpusra. Nha elfordul, hogy a listk egy
msfajta megvalstsra van szksg, az eredeti listktl eltr viselkedssel.

Az array modulban tallhat array() objektum hasonlt azokhoz a listkhoz, melyek csak hasonl adat-
tpusokat trolnak, de ezt a trolst sokkal tmrebben vgzi. A kvetkez pldban egy szmokbl ll
tmbt lthatunk, ahol a szmok mint kt bjtos eljel-nlkli binris szmknt troldnak (tpuskd: "H")
ellenttben a hagyomnyos Python int (egsz szm) objektumokbl ll listkkal, ahol minden bejegyzs
16 bjtot hasznl.
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])

A collections modulban lv deque() objektum egy a listhoz hasonl tpus viszont gyorsabban
tud j elemet felvenni a lista vgre s elemet kiemelni a lista elejrl. Htrnya viszont, hogy a
keressben lassabb - nehzkesebb, mint a hagyomnyos lista. Ez az objektumtpus hasznos vrakozsi
sorok, listk megvalstsra s mlysgi keress esetn:
>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())
Handling task1

unsearched = deque([starting_node])
def breadth_first_search(unsearched):
node = unsearched.popleft()
for m in gen_moves(node):
if is_goal(m):
return m
unsearched.append(m)

Radsul az Alapknyvtr ms eszkzket is tartalmaz, pldul a bisect modult, ami rendezett listk
mdostsra szolgl:
>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]

A heapq modulban tallhat fggvnyekkel megvalsthatk a hagyomnyos listkon alapul


adathalmazok kezelse. A legalacsonyabb rtk bejegyzs mindig a nulla pozciba kerl. Ez hasznos, ha
a programodnak gyakran kell elrnie a lista legkisebb elemt, de nem akarod a listt teljes mrtkben
rendezni:
>>> from heapq import heapify, heappop, heappush
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(data) # trendezi a listt
>>> heappush(data, -5) # j elemet ad a listba
>>> [heappop(data) for i in range(3)] # kilistzza a hrom legkisebb elemet.
[-5, 0, 1]

11.8. Lebegpontos Aritmetika


A decimal modulban tallhat a Decimal adattpus, lebegpontos szmtsokhoz. A beptett float
tpushoz kpest, amely a binris lebegpontos szmtsokhoz kszlt, az j osztly nagyon sokat segt
pnzgyi programoknl (s ott, ahol vges decimlis brzolst hasznlnak, a pontossg ellenrzsvel, a
trvnyeknek vagy a szablyoknak megfelel kerekts hasznlatval, a fontos szmjegyek
nyomkvetsvel vagy olyan programoknl, ahol a felhasznl kzzel vgzett szmtsokhoz akarja
hasonltani a vgeredmnyt.

Pldul szmtsuk ki az 5%-os adjt egy 70 centes telefonkltsgnek, ami klnbz eredmnyt ad
decimlis s binris lebegpontos szmts hasznlata esetn. A klnbsg fontos lesz, ha a kerekts a
legkzelebbi centhez trtnik:
>>> from decimal import *
>>> Decimal('0.70') * Decimal('1.05')
Decimal("0.7350")
>>> .70 * 1.05
0.73499999999999999

A Decimal osztly eredmnye egy lezr nullt tartalmaz, automatikusan ngy szmjegyen kerl
brzolsra, a 2*2 szmjegy (tizedesjegyek) szorzs eredmnyekpp. A Decimal ugyanolyan
matematikt hasznl, mint amit a papron vgzett szmols, s elkerli azokat a krdseket, amikor a
binris lebegpontos szmts nem tud abszolt pontosan brzolni decimlis mennyisgeket.

A Decimal osztly teljesen pontosan brzolja a maradkos osztst, s az egyenlsgtesztelst, ami a


binris lebegpontos brzols esetn helytelen eredmnyre vezet:
>>> Decimal('1.00') % Decimal('.10')
Decimal("0.00")
>>> 1.00 % 0.10
0.09999999999999995

>>> sum([Decimal('0.1')]*10) == Decimal('1.0')


True
>>> sum([0.1]*10) == 1.0
False

A decimal modulban a szmtsok pontossgt szksg szerint bellthatod:


>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857142857")

Copyright 2014, Guido. Created using Sphinx 1.1.3.


index next | previous | Python oktat 3.4 documentation

12. What Now?


Reading this tutorial has probably reinforced your interest in using Python you should be eager to
apply Python to solving your real-world problems. Where should you go to learn more?

This tutorial is part of Pythons documentation set. Some other documents in the set are:

library-index:

You should browse through this manual, which gives complete (though terse) reference material
about types, functions, and the modules in the standard library. The standard Python distribution
includes a lot of additional code. There are modules to read Unix mailboxes, retrieve documents via
HTTP, generate random numbers, parse command-line options, write CGI programs, compress data,
and many other tasks. Skimming through the Library Reference will give you an idea of whats
available.

install-index explains how to install external modules written by other Python users.

reference-index: A detailed explanation of Pythons syntax and semantics. Its heavy reading, but is
useful as a complete guide to the language itself.

More Python resources:


http://www.python.org: The major Python Web site. It contains code, documentation, and pointers to
Python-related pages around the Web. This Web site is mirrored in various places around the world,
such as Europe, Japan, and Australia; a mirror may be faster than the main site, depending on your
geographical location.
http://docs.python.org: Fast access to Pythons documentation.
http://pypi.python.org: The Python Package Index, previously also nicknamed the Cheese Shop, is an
index of user-created Python modules that are available for download. Once you begin releasing
code, you can register it here so that others can find it.
http://aspn.activestate.com/ASPN/Python/Cookbook/: The Python Cookbook is a sizable collection
of code examples, larger modules, and useful scripts. Particularly notable contributions are collected
in a book also titled Python Cookbook (OReilly & Associates, ISBN 0-596-00797-3.)
http://scipy.org: The Scientific Python project includes modules for fast array computations and
manipulations plus a host of packages for such things as linear algebra, Fourier transforms, non-
linear solvers, random number distributions, statistical analysis and the like.

For Python-related questions and problem reports, you can post to the newsgroup comp.lang.python, or
send them to the mailing list at [email protected]. The newsgroup and mailing list are gatewayed, so
messages posted to one will automatically be forwarded to the other. There are around 120 postings a day
(with peaks up to several hundred), asking (and answering) questions, suggesting new features, and
announcing new modules. Before posting, be sure to check the list of Frequently Asked Questions (also
called the FAQ). Mailing list archives are available at http://mail.python.org/pipermail/. The FAQ
answers many of the questions that come up again and again, and may already contain the solution for your
problem.
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index next | previous | Python oktat 3.4 documentation

13. Interactive Input Editing and History


Substitution
Some versions of the Python interpreter support editing of the current input line and history substitution,
similar to facilities found in the Korn shell and the GNU Bash shell. This is implemented using the GNU
Readline [http://tiswww.case.edu/php/chet/readline/rltop.html] library, which supports various styles of editing. This
library has its own documentation which we wont duplicate here.

13.1. Tab Completion and History Editing


Completion of variable and module names is automatically enabled at interpreter startup so that the Tab
key invokes the completion function; it looks at Python statement names, the current local variables, and
the available module names. For dotted expressions such as string.a, it will evaluate the expression up
to the final '.' and then suggest completions from the attributes of the resulting object. Note that this may
execute application-defined code if an object with a __getattr__() method is part of the expression.
The default configuration also saves your history into a file named .python_history in your user
directory. The history will be available again during the next interactive interpreter session.

13.2. Alternatives to the Interactive Interpreter


This facility is an enormous step forward compared to earlier versions of the interpreter; however, some
wishes are left: It would be nice if the proper indentation were suggested on continuation lines (the parser
knows if an indent token is required next). The completion mechanism might use the interpreters symbol
table. A command to check (or even suggest) matching parentheses, quotes, etc., would also be useful.

One alternative enhanced interactive interpreter that has been around for quite some time is IPython
[http://ipython.scipy.org/], which features tab completion, object exploration and advanced history management.
It can also be thoroughly customized and embedded into other applications. Another similar enhanced
interactive environment is bpython [http://www.bpython-interpreter.org/].
Copyright 2014, Guido. Created using Sphinx 1.1.3.
index previous | Python oktat 3.4 documentation

14. Floating Point Arithmetic: Issues and Limitations


Floating-point numbers are represented in computer hardware as base 2 (binary) fractions. For example,
the decimal fraction
0.125

has value 1/10 + 2/100 + 5/1000, and in the same way the binary fraction
0.001

has value 0/2 + 0/4 + 1/8. These two fractions have identical values, the only real difference being that
the first is written in base 10 fractional notation, and the second in base 2.

Unfortunately, most decimal fractions cannot be represented exactly as binary fractions. A consequence is
that, in general, the decimal floating-point numbers you enter are only approximated by the binary
floating-point numbers actually stored in the machine.

The problem is easier to understand at first in base 10. Consider the fraction 1/3. You can approximate
that as a base 10 fraction:
0.3

or, better,
0.33

or, better,
0.333

and so on. No matter how many digits youre willing to write down, the result will never be exactly 1/3,
but will be an increasingly better approximation of 1/3.

In the same way, no matter how many base 2 digits youre willing to use, the decimal value 0.1 cannot be
represented exactly as a base 2 fraction. In base 2, 1/10 is the infinitely repeating fraction
0.0001100110011001100110011001100110011001100110011...

Stop at any finite number of bits, and you get an approximation. On most machines today, floats are
approximated using a binary fraction with the numerator using the first 53 bits starting with the most
significant bit and with the denominator as a power of two. In the case of 1/10, the binary fraction is
3602879701896397 / 2 ** 55 which is close to but not exactly equal to the true value of 1/10.

Many users are not aware of the approximation because of the way values are displayed. Python only
prints a decimal approximation to the true decimal value of the binary approximation stored by the
machine. On most machines, if Python were to print the true decimal value of the binary approximation
stored for 0.1, it would have to display
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

That is more digits than most people find useful, so Python keeps the number of digits manageable by
displaying a rounded value instead
>>> 1 / 10
0.1

Just remember, even though the printed result looks like the exact value of 1/10, the actual stored value is
the nearest representable binary fraction.

Interestingly, there are many different decimal numbers that share the same nearest approximate binary
fraction. For example, the numbers 0.1 and 0.10000000000000001 and
0.1000000000000000055511151231257827021181583404541015625 are all approximated by
3602879701896397 / 2 ** 55. Since all of these decimal values share the same approximation, any
one of them could be displayed while still preserving the invariant eval(repr(x)) == x.

Historically, the Python prompt and built-in repr() function would choose the one with 17 significant
digits, 0.10000000000000001. Starting with Python 3.1, Python (on most systems) is now able to choose
the shortest of these and simply display 0.1.

Note that this is in the very nature of binary floating-point: this is not a bug in Python, and it is not a bug in
your code either. Youll see the same kind of thing in all languages that support your hardwares floating-
point arithmetic (although some languages may not display the difference by default, or in all output
modes).

For more pleasant output, you may wish to use string formatting to produce a limited number of significant
digits:
>>> format(math.pi, '.12g') # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f') # give 2 digits after the point


'3.14'

>>> repr(math.pi)
'3.141592653589793'

Its important to realize that this is, in a real sense, an illusion: youre simply rounding the display of the
true machine value.

One illusion may beget another. For example, since 0.1 is not exactly 1/10, summing three values of 0.1
may not yield exactly 0.3, either:
>>> .1 + .1 + .1 == .3
False

Also, since the 0.1 cannot get any closer to the exact value of 1/10 and 0.3 cannot get any closer to the
exact value of 3/10, then pre-rounding with round() function cannot help:
>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False

Though the numbers cannot be made closer to their intended exact values, the round() function can be
useful for post-rounding so that results with inexact values become comparable to one another:
>>> round(.1 + .1 + .1, 10) == round(.3, 10)
True

Binary floating-point arithmetic holds many surprises like this. The problem with 0.1 is explained in
precise detail below, in the Representation Error section. See The Perils of Floating Point
[http://www.lahey.com/float.htm] for a more complete account of other common surprises.

As that says near the end, there are no easy answers. Still, dont be unduly wary of floating-point! The
errors in Python float operations are inherited from the floating-point hardware, and on most machines are
on the order of no more than 1 part in 2**53 per operation. Thats more than adequate for most tasks, but
you do need to keep in mind that its not decimal arithmetic and that every float operation can suffer a new
rounding error.

While pathological cases do exist, for most casual use of floating-point arithmetic youll see the result
you expect in the end if you simply round the display of your final results to the number of decimal digits
you expect. str() usually suffices, and for finer control see the str.format() methods format
specifiers in formatstrings.

For use cases which require exact decimal representation, try using the decimal module which
implements decimal arithmetic suitable for accounting applications and high-precision applications.

Another form of exact arithmetic is supported by the fractions module which implements arithmetic
based on rational numbers (so the numbers like 1/3 can be represented exactly).

If you are a heavy user of floating point operations you should take a look at the Numerical Python
package and many other packages for mathematical and statistical operations supplied by the SciPy
project. See <http://scipy.org>.

Python provides tools that may help on those rare occasions when you really do want to know the exact
value of a float. The float.as_integer_ratio() method expresses the value of a float as a fraction:
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)

Since the ratio is exact, it can be used to losslessly recreate the original value:
>>> x == 3537115888337719 / 1125899906842624
True

The float.hex() method expresses a float in hexadecimal (base 16), again giving the exact value stored
by your computer:
>>> x.hex()
'0x1.921f9f01b866ep+1'
This precise hexadecimal representation can be used to reconstruct the float value exactly:
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
True

Since the representation is exact, it is useful for reliably porting values across different versions of
Python (platform independence) and exchanging data with other languages that support the same format
(such as Java and C99).

Another helpful tool is the math.fsum() function which helps mitigate loss-of-precision during
summation. It tracks lost digits as values are added onto a running total. That can make a difference in
overall accuracy so that the errors do not accumulate to the point where they affect the final total:
>>> sum([0.1] * 10) == 1.0
False
>>> math.fsum([0.1] * 10) == 1.0
True

14.1. Representation Error


This section explains the 0.1 example in detail, and shows how you can perform an exact analysis of
cases like this yourself. Basic familiarity with binary floating-point representation is assumed.

Representation error refers to the fact that some (most, actually) decimal fractions cannot be represented
exactly as binary (base 2) fractions. This is the chief reason why Python (or Perl, C, C++, Java, Fortran,
and many others) often wont display the exact decimal number you expect.

Why is that? 1/10 is not exactly representable as a binary fraction. Almost all machines today (November
2000) use IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754
double precision. 754 doubles contain 53 bits of precision, so on input the computer strives to convert
0.1 to the closest fraction it can of the form J/2**N where J is an integer containing exactly 53 bits.
Rewriting
1 / 10 ~= J / (2**N)

as
J ~= 2**N / 10

and recalling that J has exactly 53 bits (is >= 2**52 but < 2**53), the best value for N is 56:
>>> 2**52 <= 2**56 // 10 < 2**53
True

That is, 56 is the only value for N that leaves J with exactly 53 bits. The best possible value for J is then
that quotient rounded:
>>> q, r = divmod(2**56, 10)
>>> r
6
Since the remainder is more than half of 10, the best approximation is obtained by rounding up:
>>> q+1
7205759403792794

Therefore the best possible approximation to 1/10 in 754 double precision is:
7205759403792794 / 2 ** 56

Dividing both the numerator and denominator by two reduces the fraction to:
3602879701896397 / 2 ** 55

Note that since we rounded up, this is actually a little bit larger than 1/10; if we had not rounded up, the
quotient would have been a little bit smaller than 1/10. But in no case can it be exactly 1/10!

So the computer never sees 1/10: what it sees is the exact fraction given above, the best 754 double
approximation it can get:
>>> 0.1 * 2 ** 55
3602879701896397.0

If we multiply that fraction by 10**55, we can see the value out to 55 decimal digits:
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625

meaning that the exact number stored in the computer is equal to the decimal value
0.1000000000000000055511151231257827021181583404541015625. Instead of displaying the full
decimal value, many languages (including older versions of Python), round the result to 17 significant
digits:
>>> format(0.1, '.17f')
'0.10000000000000001'

The fractions and decimal modules make these calculations easy:


>>> from decimal import Decimal
>>> from fractions import Fraction

>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)

>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)

>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

>>> format(Decimal.from_float(0.1), '.17')


'0.10000000000000001'

Copyright 2014, Guido. Created using Sphinx 1.1.3.


index Python oktat 3.4 documentation

Index
_ | A | B | C | D | E | F | H | I | K | M | O | P | R | S

_
__all__

A
append() (list method)

B
built-in function
builtins
help
module
open

C
coding
style
count() (list method)
compileall
module

D
docstrings
dokumentcis karakterlnc
documentation strings

E
environment variable
PATH, [1]
extend() (list method)
PYTHONPATH, [1]
PYTHONSTARTUP

F
file
object
H
help
built-in function

I
index() (list method) insert() (list method)

K
karakterlncok, dokumentci

M
module
builtins
compileall
method
pickle
object
search path
string
sys

O
object
open
file
built-in function
method

P
PATH, [1]
path Python Enhancement Proposals
module search PEP 8
pickle PYTHONPATH, [1]
module PYTHONSTARTUP
pop() (list method)

R
remove() (list method) reverse() (list method)
S
search strings, documentation
path, module style
sort() (list method) coding
string sys
module module
Copyright 2014, Guido. Created using Sphinx 1.1.3.
Table of Contents
Python oktat
tvgygerjeszt
A Python rtelmez hasznlata
A Python rtelmez hasznlata
Az rtelmez elindtsa
Az rtelmez s krnyezete
Ktetlen bevezet a Pythonba
Ktetlen bevezet a Pythonba
A Python hasznlata szmolgpknt
Els lpsek a programozs fel
Tovbbi vezrl utastsok
Tovbbi vezrl utastsok
Az if utasts
A for utasts
A range() fggvny
A break s a continue utastsok, az else g a ciklusokban
A pass utasts
Fggvnyek definilsa
Mg tbb tudnival a fggvnyek definilsrl
Intermezzo: kdolsi stlus
Adatstruktrk
Adatstruktrk
Mg tbb dolog a listkrl
A del utasts
Tuple-ok s sorozatok
A halmazok (set)
Sztrak
Ciklustechnikk
Mg tbb dolog a felttelekrl
Sorozatok s ms tpusok sszehasonltsa
Modulok
Modulok
Bvebben a modulokrl
Standard modulok
A dir() fggvny
A csomagok
Bemenet s kimenet
Bemenet s kimenet
Eszttikus kimenet kialaktsa
Fjlok rsa s olvassa
Hibk s kivtelek
Hibk s kivtelek
Szintaktikai hibk
Kivtelek
Kivtelek kezelse
Kivtelek ltrehozsa
Felhasznl ltal ltrehozott kivtelek
Takart-lezr mveletek definilsa
Osztlyok
Osztlyok
Nhny gondolat a szhasznlatrl
Hatkrk s nvterek a Pythonban
Els tallkozs az osztlyokkal
rkls
Privt vltozk
Egyebek...
Kivtelek alkalmazsa az osztlyokban
Bejrk
Genertorok
A Python alap-knyvtr rvid bemutatsa - Standard Library 1.
A Python alap-knyvtr rvid bemutatsa - Standard Library 1.
Fellet az opercis rendszerhez
Karakterhelyettest jelek dzsker karakterek
Parancssori paramterek
Hiba-kimenet tirnytsa, programfuts megszaktsa
Regulris kifejezsek - karakterlncok
Matematika
Internet elrs
A dtumok s az id kezelse
Tmrts - zip, gzip, tar...
Teljestmnymrs
Minsgellenrzs
Elemekkel egytt...
Az alap-knyvtr bemutatsa 2. rsz
Az alap-knyvtr bemutatsa 2. rsz
A kimenet formzsa
Szveg-sablonok
Binris adatblokkok hasznlata
Tbbszlsg
Naplzs
Gyenge hivatkozsok
Listakezel eszkzk
Lebegpontos Aritmetika
What Now?
Interactive Input Editing and History Substitution
Interactive Input Editing and History Substitution
Tab Completion and History Editing
Alternatives to the Interactive Interpreter
Floating Point Arithmetic: Issues and Limitations
Floating Point Arithmetic: Issues and Limitations
Representation Error

You might also like