Sunteți pe pagina 1din 104

Pythonro:Prefa

Pythonesteprobabilsingurullimbajdeprogramarecareesteisimpluiputernic.Astaebinei
pentrunceptoriipentruexperii,celmaiimportant,estedistractivsprogramezicuel.Aceast
carteipropunesajutelanvareaacestuilimbajminunatisaratecumsefaclucrurilerepede
ifrproblemecaurmare'antivenin'ulperfectpentruproblemeletaledeprogramare.

Pentrucineesteaceastcarte
AceastacarteservetecaghidsaututorialpentrulimbajuldeprogramarePython.Esteorientatn
principalsprenceptori,darestefolositoripentruprogramatoriavansai.
Obiectivulestecadactotceeacetiidesprecalculatoareestecumssalvezifiieretext,atuncis
poinvaPythondinaceastacarte.idacaiexperienprealabildeprogramare,deasemenea
poinvadinaceastacarte.
Dacaiexperienanterioar,veifipreocupatdediferenelentrePythonilimbajultude
programarefavoritamevideniatmulteasemeneadiferene.Unmicavertisment,totui:Pythonva
ajungencurndlimbajultudeprogramarefavorit!

Leciedeistorie
AmnceputlucrulcuPythoncndaveamnevoiesscriuuninstallerpentruunprogrampecarel
amscris,numit'Diamond'casfacinstalareauoar.AtrebuitsalegntrelegturilePythoniPerl
pentrubibliotecaQt.AmcutatunpicpenetiamgsitunarticolundeEricS.Raymond,faimosul
irespectatulhacker,vorbeadesprecumaajunsPythonsdevinlimbajulsufavorit.Ammai
descoperitclegturilePyQteraumaimaturecomparativculegturilePerlQt.Astfelamdecisc
Pythoneralimbajulcaremitrebuie.
Asteafiindfcute,amtrecutlacutareauneicribunedePython.Namgsitniciuna!Amgsit
nitecriO'Reilly,dareraufiepreascumpefieeraumaimultmanualdereferinedectghid.
Aadarmamhotrtsfolosescdocumentaiainclusnlimbaj.Totui,erapreascurticoncis.
DdeaoideedestuldebundesprePython,darincomplet.Mamdescurcat,fiindcaveam
experienanterioar,dareraneadecvatpentrunceptori.
LacircaaselunidupprimulmeucontactcuPython,aminstalat(peatunci)ultimaversiunede
LinuxRedHat9.0imjucamcuKWord.Maentuziasmatidintrodatmiavenitideeadea
scriecevadesprePython.Amnceputsscriuiamajunsrepedela30depagini.Peurmamcutat
cretereautilitiidocumentaieimelenformauneicri.Dupomulimederescrieri,aceastaa
atinsunstadiulacareputeafifolositcaghidutilpentrunvarealimbajuluiPython.Consider
aceastcartemicameacontribuielacomunitateaopensource.
CarteameaanceputcanitenotepersonaledesprePythonieuoconsideraancontinuare,dei
amfcutmarieforturipentruaofacemaiplcutcelorlali:)
nadevratulspiritopensource,amprimitomulimedesugestii,criticiconstructiveireaciidela
cititorientuziaticaremauajutatmultsmbuntescaceastcarte.

1
Stareacrii
Modificrilededupultimareviziemajordinmartie2005suntactualizarialelansriiPython3.0
(datadelansareestimatnAugust/Septembrie2008).ncepndcuPython3.0,limbajulnsuinu
estencfinalizat/lansat,deciaceastcartevasufericonstantmodificri.Totui,nspiritulfilosofiei
opensource"Lanseazndevans,lanseazfrecvent",carteaactualizatafostlansativafi
actualizatconstant.
Carteanecesitajutorulcititoriloreicaresaindiceoriceprialecriicarenusuntbune,nusunt
inteligibilesausuntgreite.Vrogscrieiautoruluiprincipalsautraductorilorcomentariilei
sugestiilevoastre.
Esteoluptpermanentscntretintrenevoilenceptoruluiitendinaspre'completitudinea'
informrii.Arfifolositordaccititoriiarlsaireacialornmesajeprivindadncimeapnlacare
artrebuisptrundemnsubiect.

Websiteoficial
Websiteuloficialalacesteicriesteacesta,undesepoatecitintreagacarteonline,descrca
ultimaversiuneacrii,cumpraocopietipritimisepottrimitereaciilefadecarte.

Licen
1. AceastcarteesteliceniatsublicenaCreativeCommonsAttributionShareAlike3.0
Unported.
Censeamnacestlucru:
Poicopia,distribuiitransmiteaceastcartemaideparte
Poiremixaconinutulsladaptezicumvrei
Suburmtoarelecondiii:
Atribuire.Trebuiesspecificicuiiseatribuiematerialuloriginaldarnun
aafelnctsseneleagcautoruloriginaliofersuport.
ShareAlike.Dacmodificisaufolosetiaceastlucrarepentruacreacevape
bazaacesteia,trebuiesdistribuinoulconinutsubolicensimilari
compatibilsausublicenaoriginal.
Pentruoricefolosiresaudistributie,trebuiesfaciclarlicenasubcareseaflacest
material
Oricaredintrecondiiiledemaisuspotfianulatedoarcupermisiuneadeintorului
decopyright.
Nimicprevzutnaceastalicennuatacdrepturilemoralealeautorului
2. Atribuireatrebuieartatprinadaugreaunuilinknapoilaautoriindicareaclarctextul
originalsepoatedownloadadelaacealocaie
3. ntregcodulsursdinaceastcarteesteliceniatsublicenaBSDcu3meniunidacnuse
specificaltlicen
4. Contribuiiledevoluntariatlamaterialuloriginaltrebuiesfiesubaceailiceniar
copyrightultrebuiesrmnalautoruluioriginalalacestuimaterial.

2
Reacii
Amdepusmultefortpentruafacecarteactmaiinteresantiexact.Totui,dacapreciaiunele
pricsuntinconsistentesauincorectesaupurisimpluconsideraicnecesitmbuntiri,v
rogsminformai,caspotfacemodificrileadecvate.Potficontactatprinintermediulpaginii
meledeutilizator.

Cumpraicartea
Dacvreissusineidezvoltareacontinuaacesteicri,vrogsluaincalculposibilitateadea
cumpraocopietipritsaudeafaceodonaie.

Subiectdegndire
Existdoucideafaceundesigndesoftware:unaestedealfaceattdesimplunct
nmodevidentnuaredeficiene;cellaltestedealfaceattdecomplicatnctsnui
fieevidentedeficienele.
C.A.R.Hoare

Succesulnvianuesteattochestiunedetalentioportunitatectdeconcentrarei
perseveren.
C.W.Wendte

3
Pythonro:Introducere

Introducere
Pythonesteunuldintrepuinelelimbajedeprogramarecarepotsusinecsuntnacelaitimpi
simpleiputernice.Veirealizacveifinmodplcutsurprinsdectdeuorestesteconcentrezi
pesoluiaproblemeiinupesintaxaistructuralimbajuluincareprogramezi.
TextuldeintroducereoficialpentruPythoneste:
Pythonesteunlimbajuordenvatiputernic.Deinestructuridedatedenivelnalt
eficienteioabordaresimpldarefectivasupraprogramriiorientatepeobiecte.
SintaxaelegantaluiPythonimoduldinamicdeselecieatipuluidedate,mpreuncu
naturasadelimbajinterpretat,lfaceunlimbajidealpentruscriptareipentru
dezvoltarerapiddeaplicaiinmultedomeniiipemajoritateaplatformelorexistente.

Majoritateafacilitilorsalevorfidiscutatemaindetaliuncapitolulurmtor.
Not
GuidovanRossum,creatorullimbajuluiPython,iabotezatlimbajuldupaspectacolulBBC
"MontyPython'sFlyingCircus"(CirculzburtoralluiMontyPython).Defaptelnuprea
agreeazerpiiconstrictori,careucidanimalepentruhranstrivindule.

FacilitileluiPython
Simplu
Pythonesteunlimbajsimpluiminimalistic.CitireaunuiprogrambinescrisnPythond
aceeaisenzaiecaicitireauneinuvelenenglez,deicuogramaticfoartestrict!Aceast
naturdepseudocodaluiPythonesteunadinmarilesaleputeri.Eaipermiteste
concentreziasuprasoluieiproblemeimaidegrabadectasupralimbajuluinsui.

Uordenvat
Aacumveivedea,cuPythonesteextremdeuordenceput.Pythonareosintax
extraordinardesimpl.

Gratisiopensource
PythonesteunexempludeFLOSS(Free/LibreandOpenSourceSoftware).ntermenisimpli,
poidistribuilibercopiialeacestuisoftware,citicodulsurs,modifica,folosipridineln
alteprogramefree.FLOSSsebazeazpeconceptuldecomunitatecarepunecunotinen
comun.AcestaesteunuldinmotivelepentrucarePythonesteaadebunelafostcreati
mbuntitconstantdeocomunitatecarepurisimpluidoretesvadunPythontotmai
bun.

Limbajdenivelnalt
CndscriiprogramenPython,nuainevoiestepreocupidedetaliidenivelsczutprecum

4
managementulmemorieifolositedeprogrametc...

Portabil
Prinnaturasaopensource,Pythonafostportat(modificatcasfuncioneze)pemulte
platforme.ToateprogrameletalePythonpotfuncionapeoricaredinacesteplatforme,fra
necesitavreomodificare,dacprogramezicugrijadeaevitafacilitiledependentedesistem
alelimbajului.
PoifolosiPythonpeLinux,Windows,FreeBSD,Macintosh,Solaris,OS/2,Amiga,AROS,
AS/400,BeOS,OS/390,z/OS,PalmOS,QNX,VMS,Psion,AcornRISCOS,VxWorks,
PlayStation,SharpZaurus,WindowsCEichiarpePocketPC!

Limbajinterpretat
Aicisuntnecesarectevaexplicaii.
Unprogramscrisntrunlimbajcompilat,precumCsauC++esteconvertitdinlimbajulsurs
ntrunformatacceptatdecalculator(codulbinar,cu1i0)folosinduncompilatorcudiverse
comutatoareiopiuni.Cndruleziprogramullinkeditat,softwareulcopiazprogramulde
peharddiscincepeslexecute.
Python,pedealtparte,nunecesitcompilarenbinar.Purisimpluselanseazprogramul
directdincodulsurs.Intern,Pythonconvertetecodulsursntrunformatintermediarnumit
bytecodes(rom.irdeoctei),apoipeacestaltransformnlimbajulnativalcomputerului
(codmain)iapoilruleaz.nfapttoateacesteafacutilizarealimbajuluiPythonmultmai
uoarfiindcnumaitrebuiesporigrijacompilriiprogramului,averificriialegeriilink
editariiincrcriicorecteabiblioteciloretc,etc.Dinacelaimotivprogramelescrisen
Pythonsuntmultmaiportabile,doarlecopiezipealtcalculatoriimediatmerg!

Limbajorientatpeobiecte
Pythonsuportiprogramareaprocedural,pelngprogramareaorientatpeobiecte.n
limbajeleorientatepeproceduriprogramelesuntconstruitenjurulprocedurilorifunciilor
acesteanefiindaltcevadectporiunideprogramreutilizabile.nlimbajeleorientatepe
obiecteprogramulesteconstruitnjurulobiectelor,carecombindateleifuncionalitatea.
Pythonareometodfoarteputernic,darsimpldeafaceprogramareorientatpeobiecte
(OOP),nspecialncomparaiecumarilelimbajeprecumJavasauC++.

Extensibil
Dacainevoiecaoporiunedincodulprogramuluisrulezefoarterapidsauvreicaunele
soluiidealgoritmsnufieopen,poicodaparteaaceeanCsauC++ipoiapelaaceaparte
directdinprogramulPython.

Implantabil
SepoateimplantacodPythonnprogrameC/C++pentrualeoferifacilitide'scripting'
utilizatorilorprogramelor.

Biblioteciextinse
BibliotecastandardPythonestecuadevraturia.Tepoateajutasrezolvidiverseprobleme
referitoarelaexpresiiregulare,generarededocumentaie,testaredepri,gestiunedefirede
execuie,bazededate,browsereweb,CGI,ftp,email,XML,XMLRPC,HTML,fiiere
.WAV,criptografie,GUI(graphicaluserinterfaces),Tkialtelucruridependentedesistem.
Reinei,toateacesteasuntprezenteundeesteinstalatPython.Acestlucruesteaanumita

5
filozofie'cubateriiincluse'alimbajuluiPython.
Pelngbibliotecastandardexistdiferitealtebibliotecidefoartebuncalitate,precum
wxPython,Twisted,PythonImagingLibraryimultealtele.

Pythonestentradevrunlimbajputerniciantrenant.Arecombinaiacorectdeperformani
faciliticarefacscriereadeprogramenPythonidistractiviuoar.

DecenuPerl?
Dacnutiaideja,Perlesteunaltlimbajdeprogramareopensourceinterpretat.
DacaifincercatvreodatsscrieiunprogrammarenPerl,vaifirspunssingurilantrebare!
CualtecuvinteprogramelenPerlsuntuoarecndsuntmiciiexceleazlamicigselniei
scripturide'fcuttreaba'.Oricum,eledevinrapidpreacomplexendatcencepscreasciv
spunastadinpropriaexperiendeautordeprogramenPerllaYahoo!
ComparativcuPerl,programelePythonsuntclarmaisimple,maicurate,maiuordescrisiastfel
maiuordenelesintreinut.EuadmirPerlulilfolosesczilnicpentrudiverselucruri,darcnd
ncepsscriuunprogramncepprinalgndintermeniidePythonpentrucmiemivinemai
naturalaa.Perlasuferitaademulteperfecionriischimbrinctelpareafiomare(darfoarte
util)gselni.Regretabil,darateptatulPerl6nupareafaceprogresedinacestpunctdevedere.
SingurulavantajfoartesemnificativpentruPerlestereeauasadearhivedemoduleCPAN(the
ComprehensivePerlArchiveNetwork).Aacumsugereazinumeleei,CPANesteocolecie
uriademodulePerlcareimpresioneazprinextindereiprofunzimefolosindacestemodulepoi
facevirtualorice.UnuldinmotivelepentrucarePerlaremaimultemodulecaPythonesteacelac
elaaprutmaidemultdectPython.noricecaz,situaiaastapareaseschimbadatoritindexului
PythonPackageIndexdepachetePython.

DecenuRuby?
Dacnustiaideja,Rubyesteunaltlimbajdeprogramareopensourceinterpretat.
DacdejaapreciaiifolositiRuby,atuncinmodcertvrecomandscontinuaislfolosii.
Pentruceilalti,carenulaufolositincearcsjudecedacsnveeRubysauPython,as
recomandaPython,pebazacriteriuluiuurineidenvtare.Personal,lamgsitgreudeasimilat,
darceicentelegRubypropovduiescfrumuseeasa.Dinnefericirenusuntattdenorocos.

Cespunprogramatorii
Poatevintereseazscitiiprereaunormarihackeri,precumESRdesprePython:
EricS.Raymondesteautorullucrrii'Catedralaibazarul'fiinddeasemeneaprintele
termenului'OpenSource'.ElspunecPythonadevenitlimbajulsudeprogramarefavorit.
Acelarticolafostoadevratinspiraiepentruabordareaprimelormeleprogramen
Python.
BruceEckelesteautorulfaimoaselorcri'GndirenJava'i'GndirenC++'.Elspunec
niciunlimbajdeprogramarenuiaadusoproductivitatemaimarecaPython.nplus
Pythonesteprobabilsingurullimbajfocalizatpeauuramuncaprogramatorului.Citete

6
interviulcompletpentrualtedetalii.
PeterNorvigesteunbinecunoscutautordeprogrameLISP,directordecalitateacutriila
Google(mulumiriluiGuidovanRossumpentruacestpont).ElspunecaPythonafost
ntotdeaunaparteintegrantdinGoogle.ipoiverificadeclaraiapepaginaGoogleJobs
carearatcerinaobligatoriedecunotinedePythonpentruingineriidesoftware.

DesprePython3.0
Python3.0estenouaversiunendevenirealimbajului.Isemaispune'Python3000'sau'Py3K'.
MotivulprincipalpentruonouversiunemajoralimbajuluiPythonesteeliminareatuturormicilor
problemeicriticiacumulatepesteaniiafacelimbajulchiarmaicurat.
DacaaidejamultcodPythonversiunea2.x,existunutilitarpentruateajutasconverteticodul
sursdinversiunea2.xnversiunea3.x.
Maimultedetaliin:
IntroducerealuiGuidovanRossum
CeenounPython2.6(facilitisensibildiferitedeversiunile2.xprecedentecareprobabil
vorfiinclusenPython3.0)
CeenounPython3.0
Python2.6igraficuldelansarealversiunii3.0
Python3000(listaoficialdefinitivaschimbrilorpropuse)
DiverseplanuriPython3.0
NoutiPython(listadetaliatamodificrilor)

7
Pythonro:Instalare
DacaveidejainstalatPython2.x,nuaveinevoiesleliminainaintedeinstalareaversiunii
Python3.0.Leputeiaveapeambelenacelaitimp.

PentruutilizatoriiLinuxiBSD
DacfolosiiodistribuiedeLinuxprecumUbuntu,Fedora,OpenSUSEsau{puneiaiciopiunea
voastr}sauunsistemBSDprecumFreeBSD,atuncifoarteprobabilaveidejainstalatPythonn
sistem.
PentruaverificadacaveiPythondejainstalatnsistemulLinux,deschideiunprogramshell
(precumkonsolesaugnome-terminal)idaicomandapython -Vcumesteartatmai
jos.
$ python -V
Python 3.0b1

Not
$estepromptulshellului.Acestapoatefidiferitpentruvoi,nfunciedesetrilesistemuluide
operare,deaceeaeulvoiartarestrnsladoarsimbolul$.

Dacseafieazinformaiidespreversiune,nseamncaveidejainstalatPython.
Totui,dacvadaunrspunscamaijos:
$ python -V
bash: Python: command not found

nseamncnuaveiPythoninstalat.Astaestefoarteatipic,darposibil.
nacestcazaveidoucideainstalaPythonnsistem.
PuteicompilaiinstalaPythondincodulsurs.Instruciuniledecompilaresuntdaten
acelaiwebsite.
[AceastaopiunevafidisponibilduplansareafinalaversiuniiPython3.0].Instalai
pachetelebinarefolosindprogrameledemanagementdepachetespecificesistemuluide
operare(apt-getpentruUbuntu/DebianialtelebazatepeDebian,yumnFedora,
pkg_addnFreeBSD,etc.)Reineicvatrebuisaveiaccesinternetpentruafolosi
aceastopiune.Alternativ,puteidescrcaexecutabilelebinareprecompilatepentru
platformavoastrdinaltparteileputeicopiaiinstalanPC.

PentruutilizatoriiWindows
Vizitaihttp://www.python.org/download/releases/3.0/idescarcaiultimaversiune,careera3.0
beta1lamomentulacesteiscrieri.Suntdoar12.8MBceeaceestefoartecompactincomparaiecu
majoritateaaltorlimbajeisofturi.InstalareaestelafelcalaoricesoftwarepentruWindows.
Atenionare

8
Dacavidedaopiuneadeadebifacomponenteoptionale,NUDEBIFAINIMIC!Unelev
potfifoartefolositoare,nspecialIDLE.

UnfaptinteresantestecmajoritateadescrcrilordePythonsuntfcutedeutilizatoriWindows.
Desigur,astanudoimaginecompletntructmajoritateautilizatorilordeLinuxauPython
preinstalat.

DOSPrompt
DacavreisputeifolosiPythondelaliniadecomandWindows(sauDOSprompt),trebuies
setaicorespunzatorvariabila%PATH%.
nWindows2000,XP,2003,clickpeControl Panel>System>Advanced>
Environment Variables.ClickpevariabilanumitPATHnseciunea'SystemVariables',
apoiselectaiEditiadugai;C:\Python30lasfritulaceeaceexistdejaacolo.Desigur,
folosiinumelecorectaldirectorului.
PentruversiunimaivechideWindows,adugainfiierulC:\AUTOEXEC.BATurmatoarealinie:
'PATH=%PATH%;C:\Python30'(frghilimele)irestartaisistemul.nWindowsNT,folosii
fiierulAUTOEXEC.NT.

PentruutilizatoriideMacOSX
UtilizatoriideMacOSXvorgsiPythonpreinstalatnsistem.DeschideiTerminal.app,rulai
python -ViurmairecomandareapentruutilizatoriideLinux.

Rezumat
PeunsistemLinux,foarteprobabilcdejaaveiPythoninstalatnsistem.ncazcontrar,lputei
instalafolosindprogramuldemanagementdepachetespecificdistribuieideLinuxrespective.n
cazulunuisistemWindows,instalarealuiPythonestelafeldeuoarcaidescrcareainstallerului
ilansarealui.DeacumncolovompresupunecaveiPythoninstalatpesistem.
ncontinuarevomscrieprimulnostruprogramnPython.

9
Pythonro:Primiipai

Introducere
Vomaflaacumcetrebuiefcutpentruarulatradiionalulprogram'HelloWorld'nPython.Astfel
vomnvacumsscriem,salvmirulmprogramePython.
SuntdouacideafolosiPythonpentruarulaunprogramfolosindpromptulinteractival
interpretoruluisaufolosindfiierulsurs.Vomaflacumsefolosescambelemetode.

Folosindpromptulinterpretorului
Porniiinterpretoruldelaliniadecomandintroducndpythonlaprompt.
PentruutilizatoriideWindows,puteirulainterpretoruldinliniadecomanddacaveisetatcorect
variabilaPATH.
DacfolosiiIDLE(delaIntegratedDeveloppementLinuxEnvironment),daticlicpeStart
ProgramsPython 3.0IDLE (Python GUI).
Acumintroduceiprint('Hello World')urmatdetastaEnter.Artrebuisvedeica
rezultatcuvinteleHello World.
$ python
Python 3.0b2 (r30b2:65106, Jul 18 2008, 18:44:17) [MSC v.1500 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello World')
Hello World
>>>

ObservaicPythonvadarezultatulcomenziiimediat!Ceeacetocmaiaiintrodusesteodeclaraie
Pythonsingular.Folosimprintpentru(nesurprinzator)atiprioricevaloarepecareio
furnizm.AiciifurnizmtextulHello Worldiacestaestetipritrapidpeecran.
Cumsprsiiinterpretorul
Casprsiipromptul,tastaiCtrl-DdacfolosiiIDLEsauunshellLinux/BSD.ncazul
consoleiWindows(Commandprompt),tastaiCtrl-ZurmatdetastaENTER.

Alegereaunuieditor
naintedeatrecelascriereadeprogramePythonnfiieresursavemnevoiedeuneditorpentrua
creaacestefiiere.Alegereaeditoruluiestecrucial.Trebuiealeslafelcaimainile.Uneditorbun
vvaajutasscrieiprogramePythonuor,fcndtimpulpetrecutocltorieconfortabilivva
ajutasajungeiladestinaie(svatingeiobiectivul)ntromanierarapidisigur.
Ocerindebazesteevideniereasintaxei[1]ncarediferitelecomponentealesintaxeisunt
coloratedeaanaturnctspoivizualizaprogramulirularealui.

10
DacutilizaiWindows,vrecomandsfolosiiIDLE.IDLEfacesyntaxhighlightingimulte
alteleprintrecarefaptulcvpermitesrulaiprogrameletotnIDLE.Onotspecial:Nufolosii
Notepadesteoopiunereafiindcnufacesyntaxhighlightinginusuportindentareatextului,
ceeaceestefoarteimportantncazulnostru,aacumveivedeancontinuare.Editoarelebune
precumIDLE(iVIM)vvorajutaautomatsindentaitextul.
DacutilizaiLinux/FreeBSD,atunciaveiomulimedeopiunipentrueditor.Dacsunteichiarla
nceputulcariereideprogramator,poateospreferai'geany'.Areinterfagraficcuutilizatoruli
butoanespecialepentrucompilatirulatprogramelePythonfrcomplicaii.
Dacsunteiprogramatorexperimentat,atunciprobabilcfolosiidejaVimsauEmacs.Numaie
nevoiesprecizmcacesteadousuntcelemaiputerniceeditoareiveiaveanenumrateavantaje
dinfolosirealorlascriereadeprogramePython.EupersonalfolosescVimpentrumajoritatea
programelor.Dacsunteiprogramatornceptor,puteifolosiKatecareesteunuldinfavoritele
mele.ncazulncaredoriisalocaitimpulnecesarnvriilucruluicuVimsauEmacs,v
recomandslenvaipeamndou,ntructpetermenlungveiculegefoloasemultmaimari.
naceastcartevomfolosiIDLE,editorulnostruIDEcelmairecomandat.IDLEesteinstalatn
modimplicitdectreinstallerelePythonpentruWindowsiMacOSX.Estedisponibilipentru
LinuxiBSDncoleciile('engl.repositories')respective.
VomexplorafolosireamediuluiIDLEncapitolulurmtor.Pentrumaimultedetalii,vrogs
vizitaidocumentaiaIDLE.
Dactotmaidoriisvedeiialteopiunipentrueditor,recomandcuprinztoarealistdeeditoare
pentruPythonisoptai.PuteialegeiunIDE(IntegratedDevelopmentEnvironment)pentru
Python.Asevedealistademediiintegrate(IDE)caresuportPythonpentrudetaliisuplimentare.
ImediatceveincepesscrieiprogramePythonmari,IDEurilepotficuadevratfoarte
folositoare.
Repet,vrogsalegeiuneditoradecvatelpoatefacescriereadeprogramePythonmaidistractiv
iuoar.
PentruutilizatoriideVim
Existointroducerebundespre'CumsfaciVimunIDEputernicpentruPython'deJohnM
Anderson.
PentruutilizatoriideEmacs
Existointroducerebundespre'CumsfaciEmacsunIDEputernicpentruPython'deRyan
McGuire.

Folosindunfiiersurs
Snentoarcemlaprogramare.Existotradiiecadecteorinveiunnoulimbajdeprogramare,
primulprogrampecarelscriisfieprogramul'HelloWorld'totcefaceelestesafieze'Hello
World'cndlrulezi.DupexpimarealuiSimonCozens[2],este'incantaiatradiionalctrezeii
programriicasateajutesnveilimbajulmaibine':).
Porniieditorulales,introduceiprogramulurmtorisalvailsubnumelehelloworld.py
DacfolosiiIDLE,daiclicpeFileNew Windowiintroduceiprogramuldemaijos.Apoi
clicpeFileSave.
#!/usr/bin/python

11
#Fisier: helloworld.py

print('Hello World')

Rulaiprogramuldeschizndunshell[3]iintroducndcomandapython helloworld.py.
DacafolosiiIDLE,deschideimeniulRunRun ModulesaudirectF5depetastatur.
Rezultatulesteafiatastfel:
$ python helloworld.py
Hello World

Dacaaiobinutrezultatulafiatmaisus,felicitri!airulatcusuccesprimulprogramnPython.
ncazcaaiobinutunmesajdeeroare,vrog,tastaiprogramulanteriorexactcanimaginei
rulaiprogramuldinnou.DereinutcPythonestecasesensitive[4]aadarprintnuesteacelai
lucrucuPrintobservaipminusculnprimulexempluiPmajusculnaldoileaexemplu.De
asemenea,asiguraivcnuexistspaiisauTABnainteaprimuluicaracterdinfiecarelinievom
vedeamaitrziudeceesteattdeimportant.

Cumfuncioneaz
Sconsidermprimeledouliniidinprogram.Acesteasuntnumitecomentariioricesaraflala
dreaptacaracterului#devinecomentariuiesteutilnspecialpentrudocumentareacititorului
programului.
Pythonfolosetecomentariinumaipentruacestcaz.Primalinieestenumitalinieshebangde
fiecaredatcndncepecu#!urmatdelocaiaunuiprogram;astaspunesistemuluinostru
Linux/Unixcfiierultrebuientelesprinacestinterpretoratuncicndesteexecutat.Oexplicaie
maidetaliatvafiprezentatncapitoleleurmtoare.Dereinutcputeirulaoricndprogramulpe
oriceplatformspecificndinterpretorulnliniadecomand,canexemplulpython
helloworld.py.
Important
Folosiicugrijcomentariinprogramepentruaexplicadetaliiimportantealeunor
instruciuniAstavaajutacititorulsneleagmaiuorce'face'programul.Acelcititor
puteifidumneavoastr,pesteaseluni!

ComentariilesunturmatedeodeclaraiePython.ncazulnostruapelmfunciaprintcarepuri
simplutipretepeecrantextul'Hello World'.Vomnvadesprefunciintrunaltcapitol;ce
trebuiereinutacumestecoriceamfipusnparantezearfiaparutpeecran.nacestcazpunem
'Hello World',ceeacesepoatenumistringfiifrgrij,vomexploramaitrziu
terminologiaaceastandetaliu.

ProgramePythonexecutabile
ParteaaceastaseaplicnumaiutilizatorilordeLinux/Unix,darutilizatoriideWindowsarputeafi
curioinlegturcuprimaliniedinprogram.Pentrunceput,vatrebuisdmfiierului
permisiuneadeafiexecutabilfolosindcomandachmodiapoisrulmprogramulsurs.
$ chmod a+x helloworld.py
$ ./helloworld.py
Hello World

12
Comandachmodestefolositaicipentruaschimba[5]modulfiieruluidnduidreptdeexecuie
pentrutoi[6]utilizatoriisistemului.Peurmexecutmprogramuldirect,specificndlocaia
programuluisurs.Folosim./pentruaindicalocalizareaprogramuluiexecutabilndirectorul
curent.
Pentruafacelucrurileimaidistractive,puteiredenumifiierulcunumelehelloworldil
puteirulacu./helloworlditotvamerge,folosindinterpretoruldelalocaiaspecificatpe
primulrnddinfiier..
CeedefcutdacnutimundeestelocalizatPython?Atunciputeifolosiprogramulenvspecific
sistemelorLinux.Modificaiprimulrndastfel:
#!/usr/bin/env python

ProgramulenvlarndulluivacutainterpretorulPythoncarevarulaprogramul.
Pnacumampututsexecutmprogramelenoastredoardactiamcaleaexact.Dardacdorim
srulmprogramuldinoricedirector?Putemsfacemastadacmemormprogramulntrunuldin
directoarelelistatenvariabilademediuPATH.Oridecteorirulaivreunprogram,sistemulcaut
acelprogramndirectoarelelistatenvariabilaPATHiapoiruleazprogramul.Putemface
programulnostrudisponibilnoricedirectorprincopiereaprogramuluintrunuldindirectoareledin
PATH.
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/swaroop/bin
$ cp helloworld.py /home/swaroop/bin/helloworld
$ helloworld
Hello World

PutemafiaconinutulvariabileiPATHfolosindcomandaechoiprefixndnumelevariabileicu
caracterul$pentruaitransmiteshelluluicavemnevoiedevaloareaacesteivariabile.Observm
c/home/swaroop/binesteprintredirectoareledinPATH,undeswaroopestenumelede
utilizator[7]pecareeulfolosescnsistemulmeu.Existunulsimilarpentrunumeledeutilizator
alfiecaruiapesistemulsu.Caalternativ,puteiadugaundirectoranumelavariabilaPATHse
faceexecutndPATH=$PATH:/home/swaroop/mydirunde'/home/swaroop/mydir'
estedirectorulpecareeuvreausaladauglavariabilaPATH.Aceastmetodestefoarteutildac
vreisscrieiscripturiutilepecarevreislerulaioricnddinoricelocaieasistemului.Seamn
cuaicreapropriilecomenzi,precumcdsauoricealtcomandpecareoexecuinterminalul
LinuxsauDOSprompt.
Atenie
DinpunctuldevederealPythonului,programsauscriptsausoftwarenseamnacelailucru!

Cumobinemajutor
DacaveinevoierepededeinformaiidesprevreofunciesaudeclaraiedinPython,atunciputei
apelalafunctionalitateainclus[8]help.Estefoartefolositor,maialeslapromptulinterpretorului.
Deexemplurulaihelp(print)sevaafiadocumentaiadeasistenpentrufunciaprint
folositpentruafiareapeecran.
Not
Tastaiqpentruaieidinhelp.

13
Similar,puteiobineinformaiidespreaproapeoricedinPython.Folosiihelp()pentruaafla
maimultedesprensuihelp!
ncazulncareaveinevoiedeajutornlegturcuoperatoriprecumreturn,atuncivatrebuisi
puneinghilimele(canhelp('return'))pentrucaPythonsineleagfrconfuziece
ncercaisfacei.

Rezumat
Acumartrebuisputeiscrie,salvairulacuuurinprogramePython.Pentrucaaidevenit
utilizatordePython,smainvmctevaconceptedinPython.

Referine:
1. engl.syntaxhighlighting
2. autorulminunateicri'BeginningPerl'
3. terminalLinuxsauDOSprompt
4. sensibilfadecazulcaracterelorn.tr.minuscule/majuscule
5. engl.change
6. engl.all
7. engl.username
8. engl.builtin

14
Pythonro:Elemente
Simplatiprireatextului'HelloWorld'nuajunge,aai?Vreisfaceimaimultdeattvreis
preluaicevaintrri,sleprelucraiisobineiunrezultat.PutemfaceastanPythonfolosind
constanteivariabile.

Constanteliterale
Oconstantaliteralesteunnumrprecum5,1.23,9.25e-3sauunir[1]precum'Acesta
este un ir'sau"E string!".Senumeteliteralfiindcestefolositliteralifolosim
valoarealiteralmente.Numrul2sereprezintntotdeaunapesineinimicaltcevaesteo
constantdeoarecevaloareasanupoatefischimbat.Deaicidenumireadeconstanteliterale.

Numere
NumerelenPythonsuntdetreitipuriinteger,floaticomplex.
Unexempludeinteger(rom.ntreg)este2careesteunnumrntreg.
Exempledefloatsaufloatingpoint[2]sunt3.23i52.3E-4.NotaiaEindicputerilelui
10.nacestcaz,52.3E-4nseamn52.3 * 10-4.
Exempledenumerecomplexesunt(-5+4j)i(2.3 - 4.6j)
Notpentruprogramatoriiexperimentai
Nuexistuntipseparat'longint'.Tipulimplicitintegerpoatefioricevaloaremare.

iruri
Unir(engl.string)esteosecvendecaractere.irurilesuntnesendoarosuccesiunede
cuvinte.CuvintelepotfinlimbaenglezsaunoricealtlimbsuportatdestandardulUnicode,
ceeacenseamnaproapeoricelimbdinlume.
Notpentruprogramatoriiexperimentai
Nuexistiruri"ASCII"purepentrucUnicodeesteunsupersetalASCII.Dacseimpunen
programunfluxdeocteicodatASCII,atuncifolosiistr.encode("ascii").Pentru
detalii,urmriidiscuiapeacestsubiectdelaStackOverflow.
Implicit,toateirurilesuntnUnicode.

AproapepotgarantacveifolosiirurinaproapetoateprogramelePythonpecarelescriei,aac
acordaiateniepriiurmtoaredesprecumsefolosescirurilenPython.

Ghilimelesimple
Puteispecificairurifolosindghilimelesimple[3]precum'Citeaza-ma referitor la
acest subiect'.TotspaiulalbprecumSPACEiTABsuntpstratecaatare[4].

15
Ghilimeleduble
irurilenghilimeleduble[5]funcioneazalafelcaicelenghilimelesimple.Deexemplu"Cum
te cheam?"

Ghilimeletriple
Puteispecificairuricaresentindpemaimulteliniifolosindghilimeletriple(engl.triplequotes)
("""sau''').Puteifolosiliberghilimelesimpledaudubleninteriorulghilimelelortriple.Iatun
exemplu:
'''Acesta este un ir multi-linie. Aceasta este prima linie.
Aceasta este a doua linie.
'Cum te numeti?', l-a intrebat.
El a zis "Bond, James Bond".
'''

Secvenedeevadare
Spresupunemcvremsutilizmunircareconineunapostrof(unadinghilimelesimple)'.
CumosspecificmirulWhat's your name?.Nulputemspecifica'What's your
name?'pentrucPythonvaconfundaapostrofulcusfritulirului.ntrunfelsaualtulvatrebui
sspecificmcacelapostroffacepartedinir,nuesteundelimitator.Pentruaceastasefoloseteo
secvendeevadare[6].Specificmapostroful\'observaibackslashul.Astfelputemspecifica
irul'What\'s your name?'.
Altcaledeaspecificaacestiresteutilizareaghilimelelordublepentrudelimitareasirului.
Problemaapareilaincludereauneighilimeledublentrunirdelimitatcughilimeleduble.i
pentruevadareabackslashuluitrebuietotbackslash\\.
Dardacamvreasspecificmunirpedournduri?Osoluieestesfolosimghilimeletriple
cumamvzutmaidevreme,darputemsfolosimosecvendeevadarepentrusfritulliniei\n
pentruaindicatrecereapeolinienou.UnexempluarfiAceasta este prima
linie\nAceasta este a doua linie.Altexempluutildesecvendeevadareeste
pentruTAB\t.Existmultmaimulte,darleamprezentataicipecelemaifolositedenoi.
Unlucrunotabilestecntrunirunbackslashlasfritullinieiaratcontinuareairuluipelinia
urmtoare,frsseadaugecaracterulnewline.Deexemplu:
"Aceasta este prima propoziie. \
Aceasta este a doua propoziie".

esteechivalentcu"Aceasta este prima propoziie. Aceasta este a doua


propoziie".

iruribrute
Dacaveinevoiesspecificaiirurincaresnufieprocesatesecvenedeevadaretrebuies
folosiiiruribrute[7]prefixndirulcursauR.Deexemplur"Caracterul newline
este indicat de \n".

16
irurilesuntimuabile
Astanseamncodatcreate,numaipotfimodificate.Deipareunlucruru,nueste.Vomvedea
ndiferiteleprogrameprezentatedeceastanuesteolimitare.

Concatenarealiteralilorir
Dacsealturadoiliterali,eusuntconcatenaidePythonautomat.Deexemplu'What\'s '
'your name?'esteconvertitautomatn"What's your name?".
NotpentruprogramatoriiC/C++
NuexistnPythonuntipdedateseparatchar.Nuexistnicionevoierealdeaaceva,
decisuntsigurcnosiduceidorul.

NotpentruprogramatoriiPerl/PHP
Reineicairuriledelimitatedegihilimelesimplesaudublesuntlafel,nudiferprinnimic.

Notpentruutilizatoriideexpresiiregulare
Folosiintotdeaunairuribrutecandaveideafacecuexpresiiregulare,altfelosfienevoie
demultecutrinurmpentruagsicenumerge.Deexemplureferineleretroactive[8]pot
fiutilizateca'\\1'saur'\1'.

Metodaformat
Uneorivremsconstruimiruridinalteinformaii.Aiciestefolositoaremetodaformat().
#!/usr/bin/python
# Fiier: str_format.py

vrst = 25
nume = 'Swaroop'

print('{0} are {1} de ani.'.format(nume, vrst))


print('De ce se joac {0} cu python-ul la?'.format(nume))

Rezultat:
$ python str_format.py
Swaroop are 25 de ani.
De ce se joac Swaroop cu python-ul la?

Cumfuncioneaz:
Unirpoatefolosianumitespecificaiiiapoipoateapelametodaformatpentruasubstituiacele
specificaiicarecorespundargumentelormetodeiformat.
Observaiprimafolosire,undefolosim{0}iastacorespundecuvaribilanumecareesteprimul
argumentalmetodeiformat.Similar,adouaspecificaieeste{1}corespunzatoarevariabilei
vrstcareestealdoileaargumentpentrumetodaformat.
Observaicputeamobineacelailucruprinconcatenare:nume + ' are ' +
str(vrst) + ' de ani',daruiteceurtipredispuslaeroriesteaceastcale.nal
doilearnd,conversianirestefcutautomatdemetodaformatnloculuneiconversii
explicite.naltreilearnd,folosindmetodaformatputemschimbamesajulfrsavemdeaface

17
cuvariabileleireciproc.
CefacePythonnmetodaformatestecnlocuietevaloareafiecruiargumentnlocurile
specificate.Potexistaispecificrimaidetaliate,cumarfi:
>>> '{0:.3}'.format(1./3) # zecimal (.) precizie de 3 zecimale pentru float
'0.333'
>>> '{0:_^11}'.format('hello') # umple pn la 11 caractere cu textul centrat i
bordat cu underscore (_)
'___hello___'
>>> '{nume} a scris {carte}.'.format(nume='Swaroop', carte='Un pic de Python') #
pe baz de cuvinte-cheie
'Swaroop a scris Un pic de Python.'

DetaliidespreacestespecificaiideformataresuntdatenPEP3101(PEP=PythonEnhancement
Proposal).

Variabile
Folosireaexclusivaliteralilorpoatedevenirapidplictisitoareavemnevoiesstocmorice
informaieisoprelucrm.Aiciesteloculvariabilelor.Variabilelesuntexactceeacespune
numelelorvaloarealorpoatefimodificat,vaszicsepoatestocaoricentrovariabil.
Variabilelesuntnitemicizonedinmemoriacalculatoruluiundesestocheazniteinformaie.Spre
deosebiredeconstante,enevoiedeaaccesaaceastinformaie,dinacestmotivvariabileleaunume.

Numedeidentificatori
Variabilelesuntexempledeidentificatori.Identificatoriisuntnumedatepentruaidentificaceva.
Existctevaregulicaretrebuiesfieurmatelastabilireaidentificatorilor:
Primulcaracteralnumeluitrebuisfieoliteraaalfabetului(majusculASCII,minuscul
ASCII,caracterUnicode)sauunderscore('_').
Restulnumeluiidentificatoruluipoateincludeicifre(dela0la9).
Pentrunumeledeidentificatorimajusculelesiminusculelesuntconsideratediferite(engl.
casesensitive).Deexemplu,mynameimyNamenudesemneazaceeaivariabil.
ObservaiminusculannprimulcazimajusculaNnaldoilea.
Exempledenumevalidedeidentificatorsunti,__chiar_aa,nume_23,a1b2_c3i
resum _count.
Exempledenumeinvalidedeidentificatorsunt2chestii,asta contine spaiii
cal-breaz.

Tipuridedate
Variabilelepotluavaloridediferitetipurinumitetipuridedate.Tipuriledebazsuntnumerei
iruri,desprecareamdiscutatdeja.nultimelecapitolevomnvacumscrempropriilenoastre
tipuridedate,folosindclase.

Obiecte
Reinei,Pythonconsiderctotcesefolosetenprogramesteobiect,nsensgeneric.nlocdea

18
spunecevaul,spunemobiectul.
NotpentruutilizatoriidePOO

Pythonesteputernicorientatpeobiectensensulctoatesuntobiecte,inclusivnumerele,irurilei
funciile.
Acumvomvedeacumsefolosescvariabilelempreunculiteralii.Salvaiurmtorulprogrami
rulail.
CumsescriuprogramelePython
Deacumncolo,procedurastandarddeasalvairulaprogramelePythonesteastfel:
1. Deschideieditorulpreferat.
2. Introduceicodulprogramuluidatnexemplu.
3. Salvailntrunfiiercunumelemenionatncomentariu.Euurmezconveniadea
salvatoateprogramelePythonnfiierecuextensia.py.
4. Rulailfolosindinterpretorulcucomandapython program.pysaufolosiiIDLE
pentruarulaprograme.Deasemeneaputeifolosimetodaexecutabilcumamexplicat
maidevreme.

Exemplu:Folosireavariabilelorialiteralilor
# Fiier : var.py

i = 5
print(i)
i = i + 1
print(i)

s = '''Acesta este un ir multi-linie.


Aceasta este linia a doua.'''
print(s)

Rezultat:
$ python var.py
5
6
Acesta este un ir multi-linie.
Aceasta este linia a doua.

Cumfuncioneaz:
Iatcumlucreazprogramul:nti,atribuimvaloareaconstanteiliterale5variabileiifolosind
operatoruldeatribuire(=).Aceastalinieesteodeclaraiedeoarecesusinectrebuiefcutceva,n
acestcaz,conectmvariabilailavaloarea5.ncontinuare,tiprimvaloarealuiifolosind
declaraiaprintcare,previzibil,tiprestevaloareavariabileipeecran.
Apoiadugm1lavaloareastocatniipstrmnoulrezultat.Tiprimvaloareavariabileii
obinemceamprevzut,valoarea6.
Similar,atribuimliteralulirvariabileisiotiprim.
Notpentruprogramatoriinlimbajecutipuristatice
Variabilelesuntfolositeprinsimplaatribuireauneivalori.Nuestenecesarniciodeclaraie

19
saudefiniiedetipdedate.

Liniilogiceiliniifizice
Oliniefizicesteceeacevedeicndscrieiprogramul.OlinielogicesteceeacevedePythoncao
singurdeclaraie.Pythonpresupuneimplicitcfiecareliniefiziccorespundeuneiliniilogice.
Unexempludelinielogicesteodeclaraieprecumprint('Hello World')dacaceasta
estesingurpelinie(cumsevedeneditor),atuncieacorespundeiuneiliniifizice.
Implicit,Pythonncurajeazfolosireauneisingureliniilogicepeliniafizic(rnd),ceeaceface
codulmultmailizibil.
Dacvreisspecificaimaimultdeolinielogicpeliniefizic,vatrebuisspecificaiexplicit
ncheierealinieilogicecu(;).Deexemplu,
i = 5
print(i)

esteefectivlafelca
i = 5;
print(i);

iacelailucrupoatefiscris
i = 5; print(i);

sauchiar
i = 5; print(i)

Totui,recomandcutriesrmneilascriereacelmultauneisingureliniilogicepefiecare
liniefizic.Prinfolosireamaimultorliniilogicepeoliniefizicseobinerealmentecodmailung.
Ideeaestesseevitesemnulpunctivirgullamaximposibilpentruaobineuncodctmailizibil.
Defapt,eunamfolositniciodatinicinamvzutpunctivirgulntrunprogramPython.
Sdmunexempludelinielogicntinspemaimulteliniifizice,caresenumetereunire
explicitaliniilor.
s = 'Acesta este un ir \
care continu pe a doua linie.'
print(s)

Seobinerezultatul:
Acesta este un ir care continu pe a doua linie.

Similar,
print\
(i)

estelafelca
print(i)

20
Existireunireimplicitaliniilor,conformuneiprezumiicareeliminnevoiadebackslash.Este
cazulncarelinialogicfoloseteparantezerotunde,parantezedreptesauacolade.Leveivedean
aciunecndvomscrieprogramefolosindlistencapitolelefinale.

Indentarea
SpaiulalbesteimportantnPython.Defapt,spaiulalblanceputullinieiesteimportant.Acesta
senumeteindentare.Spaiulalb(spaiiitaburi)delanceputullinieilogiceestefolositpentrua
determinaniveluldeindentareallinieilogice,carelarndulluiestefolositpentruadetermina
grupareadeclaraiilor.
Astanseamncdeclaraiilecaremergmpreuntrebuiesaibaceeaiindentare.Fiecareastfel
desetdedeclaraiisenumetebloc.Vomvedeaexempledespreimportanablocurilorncapitolele
urmtoare.
Unlucrudemndereinutestecindentareagreitpoateproduceerori.Deexemplu:
i = 5
print('Valoarea este ', i) # Eroare! Observai un spaiu la nceputul liniei.
print('Repet, valoarea este ', i)

Cndrulaiasta,obineiurmtoareaeroare:
File "whitespace.py", line 4
print('Valoarea este ', i) # Eroare! Observai un singur spaiu la
nceputul liniei.
^
IndentationError: unexpected indent

Observaicexistunspaiulanceputullinieiadoua.EroareaindicatdePythonnespunec
sintaxaestegreit,adicprogramulnuafostscriscorespunztor.Astanseamncnupoincepe
nmodarbitrarnoiblocuridedeclaraiicuexcepiabloculuiprincipal[9]implicitpecarelai
folosittottimpul.Cazurilencareputeifolosiunnoublocdedeclaraiivorfidetaliatencapitolele
finale,cumarficapitoluldesprecontrolulexecuiei.
Cumseindenteaz
NufolosiiunamestecdeSPACEiTABfiindcprogramelenuvorlucracorectpetoate
platformele.VrecomandcldurossfolosiiunsingurTABsaupatruspaiipentrufiecare
niveldeindentare.
Alegeioricaredinacestestilurideindentare.imaiimportant,alegeiunstilifolosiiln
modconsistentiexclusiv.

Notpentruprogramatoriinlimbajecutipuristatice
Pythonvafolosimereuindentareapentrublocuriiniciodatacolade.Rulaifrom
__future__ import bracespentruaaflamaimultedetalii.

Rezumat
Acumcamtrecutprinmultedetaliieseniale,putemcontinuaculucrurimaiinteresantecumarfi
declaraiipentrucontrolulexecuiei.Asiguraivcainelesceainvatatnacestcapitol.

21
22
Pythonro:Operatoriiexpresii

Introducere
Majoritateadeclaraiilor(liniilogice)pecarelescrieiconinexpresii.Unexempludeexpresie
simpleste2 + 3.Oexpresiepoatefidescompusnoperatoriioperanzi.
Operatoriisuntfunctionaliticareexecutcevaipotfireprezentaiprinsimboluriprecum+sau
princuvintecheiespeciale.Operatoriiaunevoiedenitedateasupracrorasopereze,numite
operanzi.nacestcaz,2i3suntoperanzii.

Operatori
Vomaruncaoprivirerapidasupraoperatoriloriafolosiriilor:
Reineicputeievaluaexpresiiledatenexemplefolosindinteractivinterpretorul.Deexemplu,
pentruatestaexpresia2 + 3,folosindinteractivinterpretorulPython:
>>> 2 + 3
5
>>> 3 * 5
15
>>>

Operatoriifolosirealor

Operator Nume Explicaie Exemple

3 + 5fac8
+ Plus adundouobiecte
'a' + 'b'fac'ab'.

fiefaceunnumrs
fienegativfied -5.2facenegativnumrul5.2
Minus
diferenantredou 50 - 24fac26.
numere

dprodusuladou
numeresaurepetarea 2 * 3fac6
* Inmulire
unuiirdenumrul 'la' * 3d'lalala'.
specificatdeori

23
3 ** 4d81
** Putere dxlaputereay
(adic3 * 3 * 3 * 3)

/ mprire mpartexlay 4 / 3d1.3333333333333333.

mprire dparteantreaga
// 4 // 3fac1.
ntreag ctului

8 % 3fac2
% Modulo drestulmpririi
-25.5 % 2.25fac1.5.

Translateazabiiiunui
numrlastngacu
numrulspecificatde 2 << 2da8
Translaiela bii.(Oricenumr 2estereprezentatprin10nbii.Prin
<<
stnga estereprezentatn translaielastngacudoibiiseobine
memoriesubforma 1000ceeacereprezintnumrul8.
debiicifrebinare0
i1)

Translateazabiii 11 >> 1d5


Translaiela numruluiladreapta 11estereprezentatnbiiprin1011
>>
dreapta cunumrulspecificat caretranslatatladreaptacuunbitd
debii. 101ceeacereprezintnumrul5.

& AND Ibinarntrenumere 5 & 3da1.

SAUbinarntre
| OR 5 | 3d7
numere

SAUexclusivbinar
^ XOR 5 ^ 3fac6
ntrenumere

Complement complementulluix
~ ~5d-6.
binar este(x+1)

24
Valoareadeadevra
propoziieixestemai
micdecty.Toi
5 < 3dFalse
operatoriide
3 < 5dTrue.
Maimic comparaieiau
<
(dect) valorilelogiceTrue
Comparaiilepotfinlnuitearbitrar:3
sauFalse.
< 5 < 7dTrue.
Observaicaceste
numencepcu
majuscul.

5 > 3dTrue.Dacambiioperanzi
Maimare Valoareadeadevra suntnumere,acetiasuntconvertiinti
>
(dect) propoziieixestemai launtipcomun.ncazcontraroperaia
maredecty. araveamereuvaloareaFalse.

Valoareadeadevra
Maimicsau propoziieixestemai
<= x = 3; y = 6; x <= ydTrue.
egal(cu) micsaucelmultegal
cuy.

Valoareadeadevra
Maimaresau propoziieixestemai
>= x = 4; y = 3; x >= 3daTrue.
egal(cu) maresaucelpuin
egalcuy.

x = 2; y = 2; x == ydTrue.

x = 'str'; y = 'stR'; x ==
Verificdacdou
== Egal(cu) ydFalse.
numeresuntegale
x = 'str'; y = 'str'; x ==
ydTrue.

Verificdacdou
numeresuntdiferite
!= Diferit(de) x = 2; y = 3; x != ydTrue.

25
dacxesteTrue,d
not NUlogic False.Dacxeste x = True; not xdFalse.
False,dTrue.

x = False; y = True; x and


ydFalsentructxesteFalse.n
acestcaz,Pythonnuvaevaluapey
x and ydFalse
fiindctiecparteastngaexpresiei
and Ilogic dacxesteFalse,
'and'esteFalseceeacedntregii
altfeldvaloarealuiy
expresiivaloareaFalseindiferentde
celelaltevalori.Acestfaptsenumete
evaluarencircuitscurt.

dacxesteTrue,d x = True; y = False; x or y


or SAUlogic True,altfeld dTrue.iaiciseaplicevaluarean
valoarealuiy circuitscurt.

Prescurtarepentruoperaiimatematiceiatribuiri
Esteuzualsfacioprelucrarematematicauneivariabileispstreziapoirezultatultotnea;de
aceeaexistoprescurtarepentruacestfeldeexpresii:
nlocde:
a = 2; a = a * 3

puteiscrie:
a = 2; a *= 3

Observaicvar = var operaie expresiedevinevar operaie= expresie.

Ordineadeevaluare
Dacaaveioexpresieprecum2 + 3 * 4,sevaevaluantioperaiadeadunaresauceade
nmulire?Matematicadeliceunenvacmultiplicareaartrebuifcutnti.Astanseamnc
operatoruldenmulireareprecedenmaimaredectoperatoruldeadunare.
TabelulurmtordprecedenaoperatorilornPython,delaceamaimicpreceden(ceamaislab
legtur)pnlaceamaimarepreceden(ceamaistrnslegtur).Astanseamncntro
expresiedat,Pythonvaevaluantioperatoriiiexpresiilecelemaidejosntabelnainteacelor
maidesus.
Urmtorultabel,extrasdinmanualuldereferinePython,estedatdedragulcompletitudinii.Estede
departemaibinesfolosimparantezepentruagrupaoperatoriiioperanziinmodadecvatpentrua
specificaprecedena.Astfelprogramuldevinemailizibil.Pentrudetaliivrogsurmriimaijos
Schimbareaordiniideevaluare.

26
Precedenaoperatorilor
Operator Descriere

lambda Expresielambda

or SAUlogic

and
Ilogic

notx NUlogic

in,notin Testedeapartenen

is,isnot
Testedeidentitate

<,<=,>,>=,!=,== Comparaii

| SAUbinar

^ SAUexclusivbinar

&
Ibinar

<<,>> Translaii

+,
Adunareiscdere

*,/,//,% nmulire,mprire,mprirentreag,modulo

+x,x Pozitiv,negativ

~x NUbinar

** Exponeniere

27
x.atribut Referinlaatribut

x[index]
Referinlaelement

x[index1:index2] Feliere

f(argumente...) Apellafuncie

(expresii,...) Legturasauafiareaunuicuplu

[expresii,...] Afiareauneiliste

{cheie:date,...} Afiareaunuidicionar

Operatoriipecarenuiamntlnitpnacumvorfidescriincapitoleleviitoare.
Operatoriicuaceeaiprecedensuntlistainacelairndntabelulanterior.Deexemplu,+i-
auaceeaipreceden.

Schimbareaordiniideevaluare
Pentruafaceexpresiilemailizibile,putemfolosiparanteze.Deexemplu,2 + (3 * 4)esten
modclarmaiuordenelesdect2 + 3 * 4carenecesitcunoatereaprecedeneioperatorilor.
Caioricealtceva,parantezeletrebuiefolositecudiscernmnt(nuexagerai)ifrredundan(ca
n2 + (3 + 4)).
Existunavantajsuplimentarnfolosireaparantezelorneajutsschimbmordineadeevaluare.
Deexemplu,dacvreisfieevaluatadunareanainteanmuliriintroexpresie,trebuiesoscriei
(2 + 3) * 4.

Asociativitatea
Operatoriisuntdeobiceiasociatividelastngaladreapta,adicoperatoriicuaceeaipreceden
suntevaluaidelastngaladreapta.Deexemplu,expresia2 + 3 + 4esteevaluataca(2 + 3)
+ 4.Civaoperatori,precumatribuireasuntasociativideladreaptalastngaastfelespresiaa =
b = cesteevaluatcaa = (b = c).

Expresii
Exemplu:
#!/usr/bin/python
# Fiier: expression.py

lungime = 5

28
lime = 2

aria = lungime * lime


print('Aria este', aria)
print('Perimetrul este', 2 * (lungime + lime))

Rezultat:
$ python expression.py
Aria este 10
Perimetrul este 14

Cumfuncioneaz:
Lungimeailimeadreptunghiuluisuntstocatenvariabilecunumelerespective.Lefolosim
pentruacalculaariaiperimetruldreptunghiuluicuajutorulexpresiilor.Stocmrezultatulexpresiei
lungime * limenvariabilaariaioafimfolosindfunciaprint.naldoileacaz,
folosimdirectvaloareaexpresiei2 * (lungime + lime)nfunciaprint.
Deasemenea,observaicumPython'cosmetizeaz'tiprirearezultatului.Deinoinamspecificat
unspaiuntre'Aria este'ivariabilaaria,Pythonofacepentrunoicasobinemo
prezentaremaiclariastfelprogramulestemultmailizibil(fiindcnumaitrebuiesnengrijim
despaiereairurilorfolositepentruafiare).AcestaesteunexempludesprecumfacePythonviaa
programatoruluimaiuoar.

Rezumat
Amnvatcesuntoperatorii,operanziiiexpresiileacesteasuntcomponenteledebazale
oricaruiprogram.ncontinuarevomvedeacumsefolosescndeclaraii.

29
Pythonro:Controlulexecuiei

Introducere
nprogramelepecareleamvzutpnacumerauoseriededeclaraiiiPythonleexecuta
credinciosnaceeaiordine.Dardacamfivrutsschimbamfluxulsaumodulluidelucru?De
exemplu,vreicaprogramulsianitedeciziiisfacprocesridiferitendiferitesituaii,precum
atipri'Bunziua'sau'Bunseara'nfunciedeoralacareseexecutprogramul?
Cumpoateaighicit,astasepoatefacecudeclaraiidecontrolalexecuiei.Existtreideclaraiide
controlalexecuieinPythonif,foriwhile.

Declaraiaif
Declaraiaifestefolositpentruatestaocondiiei,dacaceastaesteadevrat,srulezeunbloc
dedeclaraii(numit'bloculif'),iarncazcontrarsrulezealtblocdedeclaraii(blocul'else').
Clauza'else'esteoptional.
Exemplu:
#!/usr/bin/python
# Fiier: if.py

numr = 23
ghici = int(input('Introducei un ntreg : '))

if ghici == numr:
print('Felicitri, ai ghicit,') # Noul bloc ncepe aici
print('(dar nu ctigai niciun premiu!)') # Noul bloc se ncheie aici

elif ghici < numr:


print('Nu, e un pic mai mare.') # Alt bloc
# Poti face ce vrei ntr-un bloc ...
else:
print('Nu, e un pic mai mic.')
# Ca s ajungei aici e sigur ca ghici > numr

print('Gata')
# Aceasta ultim declaraie este executat ntotdeauna, dup declaraia if

Rezultat:
$ python if.py
Introducei un ntreg : 50
Nu, e un pic mai mic.
Gata

$ python if.py
Introducei un ntreg : 22
Nu, e un pic mai mare.
Gata

30
$ python if.py
Introducei un ntreg : 23
Felicitri, ai ghicit,
dar nu ctigai niciun premiu!
Gata

Cumfuncioneaz:
nacestprogramprelumdelautilizatorncercrideaghicinumruliverificmdaceste
numrulmemorat.Setmvariabilanumrlacevaloarevrem,szicem23.Apoiprelumnumrul
ncercatdeutilizatorfolosindfunciainput().Funciilesuntniteporiunideprogram
reutilizabile.Vomaflamaimultedespreelencapitolulurmtor.
Furnizmunirfuncieiimpliciteinput()careltipretepeecraniateaptintroducereade
informaiedelautilizator.ndatceintroducemceva(ENTERrom.aintra/introduce)iapsm
tastaENTER,funciainput()dcarezultatceeaceamintrodus,subformdeir.Convertim
acestirntrunntregfolosinddeclaraiaintistocmvaloareanvariabilaghici.Defaptint
esteoclas,darcetrebuiestiinacestmomentesteclfolosiipentruaconvertiunirntrun
ntreg(presupunndcirulconineunntregvalidntext).
ncontinuarecomparmalegereautilizatoruluicunumrulstabilitdenoi.Dacacesteasuntegale,
tiprimunmesajdesucces.ObservaicfolosimniveledeindentarepentruaispunePythonului
cruiblocaparinefiecaredeclaraie.IatdeceesteindentareaatatdeimportantnPython.Sper
cvaiataatderegulaindentriiconsistente.Esteaa?
ObservaicumdeclaraiaifconinesemnuldoupunctelasfritaaispunemPythonuluic
urmeazunblocdedeclaraii.
Maideparte,testmdacnumrulfurnizatdeutilizatorestemaimicdectnumruli,dacesteaa,
informmutilizatorulctrebuiesinteascmaisusdeatt.Ceamfolositaiciesteclauzaelif
caredefaptcombindoudeclaraiiif else-if elsentrosingurdeclaraieif-elif-
else.Astafaceprogramulmaiuorireducenumruldeindentrinecesar.
iclauzeleelifielsetrebuiesaiblasfritullinieilogicesemnuldoupunctedupcare
poateurmablocullordedeclaraii(cuindentareaadecvat,desigur).
Puteipuneoaltdeclaraieifninteriorulblocului'if'aldeclaraieiifs.a.m.d.nacestcaz
declaraiileifsenumescimbricate(engl.nested).
Clauzeleelifielsesuntopionale.Odeclaraieifminimaleste:
if True:
print('Da, e adevarat.')

DupcePythonaterminatexecuiantregiideclaraiiifinclusivclauzeleelifielse,eltrece
laurmtoareadeclaraiedinbloculcareconinedeclaraiaif.nacestcazestevorbadeblocul
main(rom.principal),undencepentotdeaunaexecuiaprogramului,iarinstruciuneaurmtoare
estedeclaraiaprint('Gata').Dupaceasta,Pythonvedesfritulprogramuluiincheie.
Deiacestaesteunprogramfoartesimplu,amindicatomulimedelucruricaretrebuieobservate.
Toateacesteasuntdestuldedirecte(isimplepentruceicareaucunotinedeC/C++)iiniial
necesitsdeveniiconstienideele,darapoivordeveniuzualeivvorprea'naturale'.
NotpentruprogramatoriinC/C++
NuexistdeclaraiaswitchnPython.Puteiutilizadeclaraiaif..elif..elsepentrua
faceacelailucru(inunelecazuri,puteifolosiostructurdedatepentruarezolvarepede).

31
Declaraiawhile
Declaraiawhilenepermitesexecutmrepetatunblocdedeclaraiiatttimpctocondiie
rmneadevrat.Odeclaraiewhileesteunexempludeinstruciunedeciclare.Poateaveai
clauzaelse.
Exemplu:
#!/usr/bin/python
# Fiier: while.py

numr = 23
ciclu = True

while ciclu:
ghici = int(input('Introducei un ntreg : '))

if ghici == numr:
print('Felicitri, ai ghicit!')
ciclu = False # asta face ciclul s se ntrerup
elif ghici < numr:
print('Nu, este puin mai mare.')
else:
print('Nu, este puin mai mic..')
else:
print('Bucla s-a ncheiat.')
# Aici putei face ce prelucrri vrei

print('Gata')

Rezultat:
$ python while.py
Introducei un ntreg : 50
Nu, este puin mai mic.
Introducei un ntreg : 22
Nu, este puin mai mare
Introducei un ntreg : 23
Felicitri, ai ghicit.
Bucla s-a ncheiat.
Gata

Cumfuncioneaz:
nacestprogramjucmtotjoculcughicireanumrului,daravantajulestecautilizatorulpoate
continuancercrilepncndghicetenutrebuiesrulezeprogramuldefiecaredat,cumam
facutnprogramulprecedent.Ceeaceestechiarodemostraiededeclaraiewhile.
Deplasmdeclaraiileinputiifninteriorulbucleiwhileiiniializmvariabilaciclucu
Truenainteabuclei.LanceputtestmdacvariabilacicluesteTrueiapoicontinumcu
executareabloculuiwhile.Dupcebloculafostexecutat,condiiaesteevaluatdinnoui,nacest
caz,condiiaestevariabilaciclu.DacesteTrue,executmbloculwhiledinnou,altfel
verificmdacexistoclauzelsecasoexecutm.
BloculelseesteexecutatatuncicandcondiiadeciclaredevineFalseastapoatefichiari
primadatcndsetesteazcondiia.Dacexistaunblocelselabuclawhile,eavafi
ntotdeaunaexecutat,dacnuseieseforatdinbuclcuodeclaraiebreak.

32
ValorileTrueiFalsesuntnumitebooleeneipotficonsiderateafiechivalentecuvalorile1i
respectiv0.
NotpentruprogramatoriinC/C++
Reineicpoateexistaoclauzelselabuclawhile.

Buclafor
Declaraiafor..inesteodeclaraiedeciclarecareitereazelementeleuneisecvenedeobiecte.
Vomaflamaimultedespresecvenencapitoleleurmtoare.Cetrebuietiutacumesteco
secvenestepurisimpluocolecieordonatdeelemente.Exemplu:
#!/usr/bin/python
# Fiier: for.py

for i in range(1, 5):


print(i)
else:
print('Bucla s-a terminat')

Rezultat:
$ python for.py
1
2
3
4
Bucla s-a terminat

Cumfuncioneaz:
nacestprogram,tiprimosecvendenumere.Genermsecvenacuajutorulfuncieipredefinite
range.
Noidmfuncieirangedounumereieanedsecvenadenumerencepndcuprimulnumri
pnlaceldealdoilea.Deexemplu,range(1,5)nseamnsecvena[1, 2, 3, 4].Implicit,
rangearepasul1.Dacidmiunaltreileanumr,rangeaceladevinepasulsecvenei.De
exemplurange(1,5,2)d[1,3].Reineicgamadenumere(engl.range)seextindepnla
aldoileanumr,darnu'liinclude.
Aadarbuclaforitereazpesteacestagamfor i in range(1,5)esteechivalentcufor
i in [1, 2, 3, 4]ceeaceestecaicumsaratribuifiecareobiectdinsecvenluii,pe
rnd,iexecutareabloculuidedeclaraiipentrufiecarevaloarealuii.nacestcaz,nufacem
altcevadectstiprimvaloareaobiectului.
Amintiivcclauzaelseesteopional.Cndesteinclus,esteexecutatntotdeaunaodat,
dupncheiereabucleifor,cuexcepiacazuluincaresentlneteodeclaraiebreak.
Dereinutcbuclafor..infuncioneazpentruoricesecven.nacestcazavemdoarolistde
numere,generatcufunciapredefinitrange,darngeneral,putemfolosioricefeldesecvende
oricefeldeobiecte.
NotpentruprogramatoriinC/C++/Java/C#
nPythonbuclaforesteradicaldiferitdebuclafordinC/C++.ProgramatoriiC#vor
reinecbuclafordinPythonestesimilarcubuclaforeachdinC#.ProgramatoriiJava

33
sobservecacelailucruestesimilarcufor (int i : IntArray)nJava1.5.
nC/C++,dacvreisscriifor (int i = 0; i < 5; i++),atuncinPythonscrii
doarfor i in range(0,5).Aacumvedei,nPythonbuclaforestemaisimpl,mai
expresivimaipuinpredispuslaerori.

Declaraiabreak
Declaraiabreakestefolositpentruantrerupe(engl.break)executareauneideclaraiideciclare,
chiaridaccondiiatestatnuadevenitncFalsesausecvenanuafostparcurscomplet.
Onotimportantestecdacsentrerupeobuclaforsauwhile,niciclauzaelsenuvafi
executat.
Exemplu:
#!/usr/bin/python
# Fiier: break.py

while True:
s = (input('Introducei ceva:'))
if s == 'quit':
break
print('Lungimea irului introdus este', len(s))
print('Gata')

Rezultat:
$ python break.py
Introducei ceva: Programarea e mito
Lungimea irului introdus este 15
Introducei ceva: Cnd treaba e facut
Lungimea irului introdus este 20
Introducei ceva: Dac vrei s te i distrezi:
Lungimea irului introdus este 27
Introducei ceva: folosete Python!
Lungimea irului introdus este 17
Introducei ceva: quit
Gata

Cumfuncioneaz:
nacestprogram,prelumdateledeintrarenmodrepetatdelautilizatoritiprimlungimea
fiecruiirintrodus.Prevedemiocondiiespecialpentruoprireaprogramului,princutarea
cuvntului'quit'.Oprimprogramulprinntrerupereabucleiiajungerealasfritulbloculuide
declaraii.
Lungimeairuluideintrarepoatefigsitfolosindfunciapredefinitlen.
Reineicdeclaraiabreakpoatefifolositicudeclaraiafor.

PoezialuiSwaroopdesprePython
Ceamfolositaicidreptintrare(delautilizator)esteunminipoemscrisdemine,numitSwaroop's
PoeticPython(nlimbaenglez):
Programming is fun

34
When the work is done
if you wanna make your work also fun:
use Python!

Declaraiacontinue
DeclaraiacontinuesefolosetepentruaspuneluiPythonstreaclaurmtoareaiteraiefrs
executeinstruciunilermasedinbloculdeclaraieideciclare.
Exemplu:
#!/usr/bin/python
# Fiier: continue.py

while True:
s = input('Introducei ceva: ')
if s == 'quit':
break
if len(s) < 3:
print('Prea puin')
continue
print('irul introdus are lungime suficient')
# Facei alte procesri aici...

Rezultat:
$ python test.py
Introducei ceva: a
Prea puin
Introducei ceva: 12
Prea puin
Introducei ceva: abc
irul introdus are lungime suficient
Introducei ceva: quit

Cumfuncioneaz:
nacestprogramacceptmdatedelautilizator,darleprocesmdoardacaucelpuin3caractere
lungime.Aadar,folosimfuncialenpentruaobinelungimeai,dacaceastaestemaimicdect
3,srimpesteceamairmasdiniteraiacurentfolosinddeclaraiacontinue.ncazcontrar,
restuldeclaraiilordinbuclsuntexecutateiputemsfacemoricefeldeprocesarenzonaunde
esteacelcomentariu.
Retineicdeclaraiacontinuefuncioneazicubuclafor.

Rezumat
Amvzutcumsefolosescceletreiinstruciunidecontrolalexecuieiif,whileifor
mpreuncuasociatelelor,declaraiilebreakicontinue.Acesteasuntuneledintrecelemai
utilizatepridinPythonideaceeaesteesenialsteobinuieticuele.
ncontinuarevomnvasconstruimisfolosimfuncii.

35
Pythonro:Funcii

Introducere
Funciilesuntporiunideprogramreutilizabile.Elevpermitsdainumeunuiblocdedeclaraiii
puteirulaacelblocdedeclaraiinprogramdecteorivrei.Astasenumeteapelalfunciei.Noi
amfolositdejamultefunciipredefiniteprecumlenirange.
Conceptuldefuncieesteprobabilcelmaiimportantblocconstructivaloricruiprogramnonbanal
(noricelimbajdeprogramare),decivomexploradiverseaspectealefunciilornacestcapitol.
Funciilesuntdefinitefolosindcuvntulcheiedef.Acestaesteurmatdeunnumeidentificator
pentrufuncieurmatdeoperechedeparantezecarepotincludenitenumedevariabile.n
continuareesteplasatbloculdedeclaraiicarecompunfuncia.Unexempluvaartactestede
simplu:
Exemplu:
#!/usr/bin/python
# Fiier: function1.py

def sayHello():
print('Hello World!') # blocul funciei
# Sfritul funciei

sayHello() # apel la funcia sayHello()


sayHello() # din nou apel la funcia sayHello()

Rezultat:
$ python function1.py
Hello World!
Hello World!

Cumfuncioneaz:
DefinimofuncienumitsayHellofolosindsintaxaexplicatmaisus.Aceastafuncienu
primeteparametriidecinusuntdeclaratevariabilenparanteze.Parametriipentrufunciesunt
doarnitemodalitideaitransmitefuncieidiferitevalorisau/ideaextragevalorile
corespunztoare.
Observaicputemapelaaceeaifunciededouori,ceeacenseamncnumaitrebuiesscriem
aceeaiporiunedecoddinnou.

Parametriifunciilor
Ofunciepoateacceptaparametri,caresuntvalorifurnizatefuncieipentrucaaceastaspoatface
cevacuacestevalori.Acetiparametrisuntcavariabilelenumaicvalorileacestorvariabilesunt
definitenmomentulapeluluifuncieiidejalesuntatribuitevalorilamomentulexecutriiblocului
funciei.

36
Parametriisuntspecificaintroperechedeparantezendefiniiafunciei,separateprinvirgule.
Cndapelmfuncia,furnizmacestevalorintrunfelsaualtul.Observaiterminologiafolosit
numeledatenfunciesenumescparametrintimpcevalorilepecarelefurnizmnapelulfunciei
senumescargumente.
Exemplu:
#!/usr/bin/python
# Fiier: func_param.py

def printMax(a, b):


if a > b:
print(a, 'este maximum')
elif a == b:
print(a, 'este egal cu', b)
else:
print(b, 'este maximum')

printMax(3, 4) # argumente date prin literali

x = 5
y = 7

printMax(x, y) # argumente date prin variabile

Rezultat:
$ python func_param.py
4 este maximum
7 este maximum

Cumfuncioneaz:
AicidefinimofuncienumitprintMaxcareprimetedoiparametrinumiiaib.Gsimcelmai
marenumrdintreelefolosindosimpladeclaraieif..elseitiprimpeecrancelmaimare
numr.
nprimulapelalfuncieiprintMax,furnizmargumentelenformaliteral.naldoileaapeldm
funcieivalorileparametrilorprinintermediulvariabilelor.printMax(x, y)facecavaloarea
variabileixsfieatribuitparametruluiaivaloareavariabileiysfieatribuitparametruluib.
FunciaprintMaxlucreazlafelnambelecazuri.

Variabilelocale
Cndsedeclarvariabileninterioruldefiniieifunciei,acesteanuauniciunfeldelegturcualte
variabiledinafaradefiniieifunciei,nicichiardacaraveaacelainume,deaceeasenumesc
variabilelocalefunciei.Acestaestedomeniulvariabilei.Toatevariabileleaucadomeniubloculn
caresuntdeclarate,ncepndcupunctulncareafostdefinitnumeleei.
Exemplu:
#!/usr/bin/python
# Fiier: func_local.py

x = 50

def func(x):

37
print('x este', x)
x = 2
print('Am schimbat x local n ', x)

func(x)
print('x este tot ', x)

Rezultat:
$ python func_local.py
x este 50
Am schimbat x local n 2
x este tot 50

Cumfuncioneaz:
nfuncie,primadatcndfolosimvaloareanumeluix,Pythonfolosetevaloareaparametrului
declaratnfuncie.
ncontinuareatribuimvaloarea2luix.Numelexestelocalfuncieinoastre.Prinurmare,cnd
schimbmvaloarealuixnfuncie,xdefinitnbloculprincipalrmneneafectat.
nultimulapelalfuncieiprint,afimvaloarealuixdinbloculprincipalcasconfirmmca
rmasneafectat.

Folosireadeclaraieiglobal
Dacvreisatribuiiovaloareunuinumedefinitlanivelulcelmainaltalprogramului(adicnu
ninterioruldomeniuluifuncieisauclasei),vatrebuisispuneiluiPythoncacelnumenueste
localciglobal.Obinemastafolosinddeclaraiaglobal.Esteimposibilcaninteriorulunei
funciisatribuiovaloareuneivariabiledefinitenafarafuncieifrdeclaraiaglobal.
Puteifolosivaloriledefinitenafarafunciilor(presupunndcnuexistovariabilcuacelai
numedefinitnbloculfunciei).Totui,acestfaptnuestencurajatitrebuieevitatntructdevine
neclarcititoruluiundeestedefiniiaaceleivariabile.Folosinddeclaraiaglobalmarcmfoarte
clarcvariabilaestedefinitncelmaiexteriorbloc.
Exemplu:
#!/usr/bin/python
# Fiier: func_global.py

x = 50

def func():
global x

print('x is', x)
x = 2
print('Am schimbat x global n ', x)

func()
print('Valoarea lui x este', x)

Rezultat:
$ python func_global.py

38
x este 50
Am schimbat x global n 2
Valoarea lui x este 2

Cumfuncioneaz:
Declaraiaglobalestefolositpentruadeclaracxesteovariabilglobaldeaceea,cnd
atribuimovaloareluixninteriorulfunciei,aceaschimbaresereflectcndfolosimvaloarealuix
nbloculprincipal.
Puteispecificamaimultevariabileglobalefolosinddeclaraiaglobal.Deexemplu,global x,
y, z.

Folosireadeclaraieinonlocal
Amnvatsaccesmvariabilendomeniullocaliglobal.Maiexistundomeniuspecific
funciilor,numit"nonlocal"icareseaflntreceledou.Domeniilenonlocalseobservcnd
definiifunciininteriorulfunciilor.
ntructtotulnPythonestecodexecutabil,sepotdefinifunciioriunde.
Slumunexemplu:
#!/usr/bin/python
# Fiier: func_nonlocal.py

def func_outer():
x = 2
print('x este', x)

def func_inner():
nonlocal x
x = 5

func_inner()
print('x local a devenit ', x)

func_outer()

Rezultat:
$ python func_nonlocal.py
x este 2
x local a devenit 5

Cumfuncioneaz:
Cndneaflmninterioruluneifunciifunc_inner,'x'definitnprimalinieafunciei
func_outeresteundevantreglobalilocal.Declarmcfolosimacestxcudeclaraia
nonlocal xiastfelobinemacceslaaceavariabil.
ncercaisschimbainonlocal xcuglobal xiseliminaicompletdeclaraia,casvedei
cediferenedecomportamentsuntnacestecazuri.

39
Valoriimplicitealeargumentelor
Pentruunelefuncii,poatevreisfaceiuniiparametriopionaliisfolosiivaloriimpliciten
cazulncareutilizatorulnufurnizeazovaloarepentruparametrulrespectiv.Astasefacecu
ajutorulvalorilorimplicitealeparametrilor.Puteispecificavalorileimplicitealeargumentelorn
definiiafunciei,punndoperatoruldeatribuire(=)urmatdevaloareaimplicit.
Observaicvaloareaimplicitaargumentuluitrebuiesfieoconstant.Maiprecis,trebuiesfie
imuabilacestfaptvafiexplicatndetaliuncapitoleleurmtoare.Pentrumomentreineidoar
att.
Exemplu:
#!/usr/bin/python
# Fiier: func_default.py

def say(mesaj, ori = 1):


print(mesaj * ori)

say('Hello')
say('World', 5)

Rezultat:
$ python func_default.py
Hello
WorldWorldWorldWorldWorld

Cumfuncioneaz:
Funcianumitsayestefolositpentruatipripeecranunirdeatteaorictsespecific.Dac
nufurnizmaceavaloare,atuncivafifolositvaloareaimplicit,1.Obinemaceastapunnd
valoareaimplicit1aparametruluiori.
Laprimafolosireafuncieisay,dmnumaiiruliealtipreteodat.nadouafolosiredm
funcieisayiiruliunargument5ceeacespunecvremsfietipritirulde5ori.
Important
Numaiparametriidelasfritullisteideparametripotaveavaloriimplicitedecinuputeiavea
unparametrucuvaloareimplicitnainteaaltuiafrvaloareimplicitnlistadeparametria
funciei.
Motivulestecvalorilesuntatribuiteparametrilorprinpoziie.Deexemplu,def func(a,
b=5)estevalid,dardef func(a=5, b)esteinvalid.

Argumentecuvntcheie
Dacaveifunciicumuliparametriivreisspecificainumaipeunii,atunciputeisdaivalori
parametrilorprinnumeleloracestmoddespecificaresenumeteprinargumentecuvntcheie
folosimcuvntulcheie(engl.keyword)nloculpoziiei(pecareamfolositopnacum)pentrua
specificaargumentefunciei.
Existdouavantajeunu,folosireafuncieiestemaiuoar,ntructnutrebuiesnepreocupm
deordineaparametrilor.Doi,putemdavalorinumaiunorparametriselectai,cucondiiacatoi
ceilalisaaibndefiniiafuncieivaloriimplicite.

40
Exemplu:
#!/usr/bin/python
# Fiier: func_key.py

def func(a, b=5, c=10):


print('a este', a, 'i b este', b, 'i c este', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)

Rezultat:
$ python func_key.py
a este 3 i b este 7 i c este 10
a este 25 i b este 5 i c este 24
a este 100 i b este 5 i c este 50

Cumfuncioneaz:
Funcianumitfuncareunparametrufrvaloareimplicit,urmatdedoiparametricuvalori
implicite.
nprimulapel,func(3, 7),parametrulaprimetevaloarea3,parametrulbprimetevaloarea
7,iarcvaloareaimplicit,10.
naldoileaapel,func(25, c=24),variabilaaiavaloarea25datoritpoziieiargumentului.Pe
urm,parametrulciavaloarea24prinnumeargumentcuvntcheie.Variabilabiavaloarea
implicit,5.
naltreileaapel,func(c=50, a=100),folosimnumaitehnicanou,acuvintelorcheie.
Observai,specificmvaloareaparametruluicnainteaparametruluiadeiaestedefinitnaintea
variabileicndefiniiafunciei.

ParametriVarArgs
TODO
Sscriudespreastantruncapitolurmtor,fiindcnuamvorbitncdesprelistei
dicionare?

Uneoriaiputeadorisdefiniiofunciecaresiaoricenumrdeparametri,astasepoateface
folosindasteriscul:
#!/usr/bin/python
# Fiier: total.py

def total(iniial=5, *numere, **keywords):


numrtor = iniial
for numr in numere:
numrtor += numr
for cheie in keywords:
numrtor += keywords[cheie]
return numrtor

print(total(10, 1, 2, 3, legume=50, fructe=100))

41
Rezultat:
$ python total.py
166

Cumfuncioneaz:
Cnddeclarmunparametrucuasteriscprecum*parametri,toiparametriipoziionalidela
acelpunctncolosuntcolectaintrolistnumit'parametri'.
Similar,cnddeclarmunparametrucudouasteriscuri,precum**parametri,toate
argumentelecuvntcheiedelaacelpunctncolosuntcolectatentrundicionarnumit'parametri'.
Vomexploralisteleidicionarelentruncapitolurmtor.

Parametriexclusivcuvntcheie
Dacvremsspecificmanumiiparametricuvntcheiepentruafidisponibilinumainforma
cuvntcheieiniciodatcaparametripoziionali,acetiapotfideclaraidupunparametrucu
asterisc:
#!/usr/bin/python
# Fiier: keyword_only.py

def total(iniial=5, *numere, legume):


numrtor = iniial
for numr in numere:
numrtor += numr
numrtor += legume
return numrtor

print(total(10, 1, 2, 3, legume=50))
print(total(10, 1, 2, 3))
# Ridic o eroare pentru c nu am furnizat o valoare implicit pentru 'legume'

Rezultat:
$ python keyword_only.py
66
Traceback (most recent call last):
File "test.py", line 12, in <module>
print(total(10, 1, 2, 3))
TypeError: total() needs keyword-only argument legume

Cumfuncioneaz:
Declarareadeparametridupunparametrucuasterisc(engl.starredparameter)produceargumente
exclusivcuvntcheie.Dacacesteanusuntdefinitecuvaloriimplicite,apelurilefuncieivorridica
oeroaredacnusefurnizeazargumentulcuvntcheie,aacumsavzutmaisus.
Dacvreisaveiparametriexclusivcuvntcheie,darnuaveinevoiedeniciunparametrucu
asterisc,folosiiunasteriscizolat,canexemplul:
def total(iniial=5, *, legume).

42
Declaraiareturn
Declaraiareturnestefolositpentruanentoarcedintrofuncie(deciaevadadineaengl.
breakout).Opionalputemntoarceovaloarelafeldebine.
Exemplu:
#!/usr/bin/python
# Fiier: func_return.py

def maximum(x, y):


if x > y:
return x
else:
return y

print(maximum(2, 3))

Rezultat:
$ python func_return.py
3

Cumfuncioneaz:
Funciamaximumntoarceparametrulcelmaimarefurnizatfunciei.Eafoloseteodeclaraie
simplif..elsepentruagsinumrulcelmaimareiapointoarce(engl.return)aceavaloare.
Observaicdeclaraiareturnfrovaloareesteechivalentcureturn None.Noneesteun
tipspecialnPythoncarereprezintnimicul.Deexemplu,estefolositpentruaindicafaptulco
variabilnuareniciovaloare,deciarevaloareaNone.
Oricefuncie,nmodimplicit,conineodeclaraiereturn Nonelasfritulbloculuide
declaraii,cuexcepiacazuluincareiscrieioaltdeclaraiereturn.Puteivedeaastarulnd
print o_funcie_oarecare()ncarenuestedatodeclaraiereturnprecum:
def o_functie_oarecare():
pass

DeclaraiapassestefolositnPythonpentruaindicaunblocdedeclaraiigol.
Not
Existofunciepredefinitnumitmaxcareimplementeazaceastfuncionalitatedea'gsi
maximul',decifolosireaacestefunciiesteposibiloricand.

DocStrings
Pythonareofacilitatedrgunumitdocumentationstrings,numitdeobiceipenumelescurt
docstrings.DocStrings(rom.iruridedocumentaie,sg.docstring)suntounealtimportantpentru
cvajutsdocumentaiprogramelemaibineilefacemaiuordeneles.Uimitor,putemchiar
sextragemirurilededocumentareale,szicem,uneifunciichiarntimpceprogramulruleaz!
Exemplu:
#!/usr/bin/python
# Fiier: func_doc.py

43
def printMax(x, y):
'''Tiprete pe ecran cel mai mare din dou numere.

Cele dou numere trebuie s fie ntregi.'''


x = int(x) # convertete n integer, dac este posibil
y = int(y)

if x > y:
print(x, 'este maximum')
else:
print(y, 'este maximum')

print(printMax.__doc__)
printMax(3, 5)

Rezultat:
$ python func_doc.py
Tiprete pe ecran cel mai mare din dou numere.

Cele dou numere trebuie s fie ntregi.


5 este maximum

Cumfuncioneaz:
Unirpeprimalinielogicafuncieidevinedocstringpentruaceafuncie.DeretinutcDocStrings
seaplicilamoduleiclase,desprecarevomnvancapitolelerespective.
Conveniaurmatpentruundocstringeste:unirmultiliniencareprimaliniencepecumajuscul
isencheiecupunct.Apoiliniaadouaestegoaliurmatdeoexplicaiemaidetaliatncepand
culiniaatreia.Vsftuimcucldursurmaiaceastaconveniepentrutoatedocstringuriletuturor
funciilornebanalepecarelescriei.
PutemaccesadocstringulfuncieiprintMaxfolosindatributul__doc__(observaidublu
underscore)alfunciei.AmintiivcPythontrateaztotulcaobiect,inclusivfunciile.Vomnva
maimultdespreobiectencapitoluldespreclase.
Dacaaifolosithelp()nPython,aivzutdejacumsefolosetedocstring!Ceeacefaceeaeste
cextrageatributul__doc__alfuncieiilafieazntromanieraconvenabil.Puteincerca
astaasuprafuncieidemaisusincludeipurisimpludeclaraiahelp(printMax)nprogram.
Nuuitaistastaiqpentruaieidinhelp.
Utilitarelepotcolectaautomatdocumentaiadinprogramenaceastmaniera.Deaceeav
recomandinsistentsfolosiidocstringpentruoricefuncienebanalpecareoscriei.Comanda
pydocinclusndistribuiaPythonfuncioneazsimilarcuhelp()folosinddocstringurile.

Adnotri
Funciilemaiauofacilitateavansatnumitadnotare(engl.annotations)careesteocaledeteapt
deaataainformaiepentrufiecaredinparametriprecumipentruvaloareantoars.ntruct
limbajulPythonnsinenuinterpreteazacesteadnotrinniciunfel(aceastfuncionalitateeste
lsatbibliotecilorthirdpartysinterpretezeelencefelvor),vomtrecepesteaceastfacilitaten
discuianoastr.Dacsunteiinteresaidespreadnotri,puteicitiPEPNo.3107.

44
Rezumat
Amdiscutatmulteaspectealefunciilor,darreineicnuamacoperittoateaspecteleposibile.
Totui,amacoperitdejamajoritateaaspectelorpecarelevomfolosinmoduzual.
Vomaflancontinuarecumsfolosim,dariscreammodulePython.

45
Pythonro:Module

Introducere
Aivzutcumsepoaterefolosioporiunedecodnprogramprindefinireafunciilor.Dardacvrei
srefolosiiunnumrmaimaredefunciinalteprogramedectcelpecarelscriei?Aacumai
ghicit,rspunsulestefolosireamodulelor.
Existvariatemetodedeascriemodule,darceamaisimplcaleestedeacreaunfiiercuextensia
.pycareconinefunciiivariabile.
AltmetodestescriereamodulelornlimbajulncarechiarinterpretorulPythonafostscris.De
exemplu,puteiscriemodulenlimbajuldeprogramareCidupacompilare,elepotfifolositedin
codulPythoncndsefoloseteinterpretorulPythonstandard.
Unmodulpoatefiimportatdeunaltprogrampentruafolosifuncionalitateaacestuia.Aaputemi
noisfolosimbibliotecastandardPython.ntivomvedeacumsefolosescmodulelebibliotecii
standard.
Exemplu:
#!/usr/bin/python
# Fiier: using_sys.py

import sys

print('Argumentele la linia de comand sunt:')


for i in sys.argv:
print(i)

print('\n\nPYTHONPATH este', sys.path, '\n')

Rezultat:
$ python using_sys.py noi suntem argumente
Argumentele la linia de comand sunt:
using_sys.py
noi
suntem
argumente

PYTHONPATH este ['', 'C:\\tmp', 'C:\\Python30\\python30.zip',


'C:\\Python30\\DLLs', 'C:\\Python30\\lib', 'C:\\Python30\\lib\\plat-win',
'C:\\Python30', 'C:\\Python30\\lib\\site-packages']

Cumfuncioneaz:
Lanceputimportmmodululsysfolosinddeclaraiaimport.nesen,astaispuneluiPython
cvremsfolosimacestmodul.ModululsysconinefuncionalitatelegatdeinterpretorulPython
imediulsu,system.
CndPythonexecutdeclaraiaimport sys,elcautmodululsys.nacestcaz,estevorbade
unmodulpreinstalatideaceeaPythontieundeslgseasc.

46
Dacnuarfifostunmodulcompilat,ciunmodulscrisnPython,interpretorularficutatn
directoarelelistatenvariabilasys.path.Dacmodululestegsit,declaraiiledininteriorul
moduluisuntexecutate.Observaicaceastiniializareestefcutnumaiprimadatcnd
importmunmodul.
Variabilaargvdinmodululsysesteaccesatfolosindnotaiacupuncte,adicsys.argv.Ea
aratclarcacestnumeesteparteamodululuisys.Altavantajalacesteiabordriestecnumele
nudconflictcuniciovariabilargvfolositnprogram.
Variabilasys.argvesteolistdeiruri(listelesuntexplicatendetaliuncapitoluldespreliste.
nspecial,variabilasys.argvconinelistaargumentelordinliniadecomandadicacele
argumentetransmiseprogramuluiprinadugarealorlaliniadecomandcarelanseazprogramul.
DacafolosiiunIDEpentruascrieirulaacesteprograme,cutainmeniuriocaledeaspecifica
argumentelaliniadecomand.
Aici,cndseexecutpython using_sys.py noi suntem argumente,rulmmodulul
using_sys.pycucomandapythonicelelaltelucruricarelurmeazsunttransmise
programului.Pythonpstreazliniadecomandnvariabilasys.argvcasleputemfolosi.
Reinei,numelescriptuluicareruleazestentotdeaunaprimulargumentdinlistasys.argv.
Decinacestcazvomavea'using_sys.py'npoziiasys.argv[0],'noi'npoziia
sys.argv[1],'suntem'npoziiasys.argv[2]i'argumente'npoziia
sys.argv[3].ObservaicPythonncepenumerotareacu0nucu1.
Variabilasys.pathconinelistanumelordedirectordeundepotfiimportatemodule.Observai
cprimulsirdinsys.pathestevidastaaratcdirectorulcurentesteparteavariabilei
sys.pathceeaceestetotunacuvariabilademediuPYTHONPATH.Acestcomportamenteste
prevzutpentruapermiteimportuldirectalmoduleloraflatendirectorulcurent.ncazcontrar
modulelecaretrebuieimportatetrebuiepoziionatentrunuldindirectoarelelistatensys.path.

Fisiere.pyccompilateinocteti
Importulunuimodulesterelativcostisitor,astfelcPythonfacenitesmecheriicaslaccelereze.
Ocaleestescreezefiierecompilatenoctei(engl.bytecompiled)cuextensia.pyccaresunt
niteformeintermediarencarePythontransformprogramul(vamintiidincapitolulintroductiv
cumlucreazPython?).Acestfiier.pycesteutilcndimportaiunmoduladouaoardinalte
programeelevorfimultmairapidentructparteadeprocesarelegatdeimportulmodululuieste
dejarealizat.Deasemenea,acestefiierecompilatenocteisuntindependentedeplatform.
Not
Fiierele.pycsuntcreatedeobiceinacelaidirectorcaifiierul.pycorespondent.Dac
Pythonnuarepermisiuneadeascriefiierenaceldirector,fiierele.pycnuvorficreate.

Declaraiafrom...import...
Dacvreisimportaidirectvariabilaargvnprogramulvostru(pentruaevitascriereanumelui
sys.defiecaredat),puteifolosideclaraiafrom sys import argv.Dacvreis
importaitoatenumelefolositenmodululsysatunciputeifolosideclaraiafrom sys import
*.Funcioneazpentruoricemodul.

47
ngeneral,trebuiesevitaifolosireaacestordeclaraiiinschimbsfolosiideclaraiaimport.
Casfieevitateoriceconflictedenumeiprogramelesfiemailizibile.

Atributul__name__almodulului
Oricemodulareunnume,iardeclaraiiledinmodulpotgsinumelemodulului.Estecomodaa,
maialesnsituaiaparticularncaresedoreteaflarearegimuluimodulului(autonomsau
importat).Cumammenionatanterior,cndunmodulesteimportatpentruprimadat,coduldin
modulesteexecutat.Putemfolosiacestconceptpentruaalteracomportamentulmodululuidac
programulesteexecutatautonomilputemlsaneschimbatdacmodululesteimportatdinalt
modul.Acesteasuntposibilefolosindatributul__name__almodulului.
Exemplu:
#!/usr/bin/python
# Fiier: using_name.py

if __name__ == '__main__':
print('Acest program ruleaz autonom')
else:
print('Acest program a fost importat din alt modul')

Rezultat:
$ python using_name.py
Acest program ruleaz autonom

$ python
>>> import using_name
Acest program a fost importat din alt modul
>>>

Cumfuncioneaz:
OricemodulPythonarepropriulatribut__name__definitidacacestaeste'__main__',
rezultcacelmodulesterulatdesinestttordectreutilizatoriputemluamsurileadecvate.

Creareapropriilormodule
Creareapropriilornoastremoduleesteuoar,aifcutastatottimpul!Astadincauzcorice
programPythonesteunmodul.Trebuiedoarsneasigurmcfiierulareextensia.py.Urmtorul
exempluartrebuisclarificesituaia.
Exemplu:
#!/usr/bin/python
# Fiier: meu.py

def zisalut():
print('Salut, aici este modulul meu.')

__versiune__ = '0.1'

# Sfritul modulului meu.py

48
Maisusafostunmodeldemodul.Aacumvedei,nuestenimicdeosebitnlegturcumodulele
ncomparaiecuprogramelePythonobinuite.Vomvedeancontinuarecumputemsfolosim
acestmodulnprogramelenoastrePython.
Amintiivcmodululartrebuiplasatnacelaidirectorcuprogramulcarelimportsauntrun
directorlistatnvariabilasys.path.
#!/usr/bin/python
# Fiier: meu_demo.py

import meu

meu.zisalut()
print ('Versiunea', meu.__versiune__)

Rezultat:
$ python meu_demo.py
Salut, aici este modulul meu.
Versiunea 0.1

Cumfuncioneaz:
Observaicfolosimaceeainotaiecupunctpentruaaccesamembriimodulului.Python
refolosetecusporaceeainotaiepentruadaunsentimentdistinctiv'Pythonic'programelor,astfel
nctsnufimnevoiisnvmnoimodurideafacelucrurile.
Iatonouvariantfolosindsintaxadeclaraieifrom..import:
#!/usr/bin/python
# Fiier: meu_demo2.py

from meu import zisalut, __versiune__

zisalut()
print('Versiunea', __versiune__)

Rezultatulprogramuluimeu_demo2.pyesteacelaicairezultatulprogramuluimeu_demo.py.
Observaicdacarfiexistatunnume__versiune__declaratnmodululcareimportmodulul
meu,arfiaprutunconflict.iastaesteprobabil,ntructesteopracticuzualpentrufiecare
modulssedeclareversiuneasafolosindacestnume.Deaceeaestentotdeaunarecomandabilsse
foloseascdeclaraiaimportdeiarputeafaceprogramulunpicmailung.
Sarmaiputeafolosi:
from meu import *

Astfelarfiimportatetoatenumelepublice,precumzisalutdarnusarimporta
__versiune__pentrucancepecudubluunderscore.
Calea(Zen)nPython
UnprincipiudirectornPythoneste"Explicitestemaibinedectimplicit".Rulaiimport
thispentruaaflamaimulteiurmriiaceastdiscuiecareenumerexemplepentru
fiecaredinprincipii.

49
Funciadir
Puteifolosifunciapredefinitdirpentrualistaidentificatoriipecareidefineteunobiect.De
exemplu,pentruunmodul,claseleivariabileledefinitenacelmodul.
Cndfurnizaiunnumefuncieidir(),eantoarcelistanumelordefinitenacelmodul.Dacse
lanseazfunciafrargumente,eantoarcelistanumelordefinitenmodululcurent.
Exemplu:
$ python

>>> import sys # obine lista atributelor, n acest caz, pentru modulul sys

>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__s
tderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_compact_freelists',
'_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', '
byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle'
, 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable',
'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getfil
esystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof',
'gettrace', 'getwindowsversion', 'hexversion', 'intern', 'maxsize', 'maxunicode
', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platfor
m', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_in
fo', 'warnoptions', 'winver']

>>> dir() # obine lista atributelor pentru modulul curent['__builtins__',


'__doc__', '__name__', '__package__', 'sys']

>>> a = 5 # creaz o nou variabil, 'a'

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']

>>> del a # terge (engl. delete) un nume

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']

>>>

Cumfuncioneaz:
Pentrunceput,vedemfolosireafuncieidirasupramodululuiimportatsys.Putemvedealista
uriadeatributepecareoconine.
Apoifolosimdirfrparametri.Implicit,eantoarcelistaatributelormodululuicurent.Observai
clistamodulelorimportateesteinclusnlistamodululuilistat.
Pentruavedeafunciadirnaciune,definimonouvariabil,a,iiatribuimovaloare,apoi
testmcudirdacaaprutncovaloarenlistadeatributeaaceluiainume.Eliminm
variabila/atributulmodululuicurentfolosinddeclaraiadelidinnouschimbareaestereflectatn
rezultatulfuncieidir.
Onotasupradeclaraieidelaceastdeclaraieestefolositpentruatergeunnumedevariabila
idupceafostexecutat(del a),numaiputeiaccesavariabilaaestecaicumnuaexistat

50
niciodat.
Reineicfunciadir()lucreazpeoriceobiect.Deexemplu,rulaidir(print)pentrua
descoperiatributelefuncieiprintsaudir(str)pentruatributeleclaseistr.

Pachete
Laacestnivel,ainceputprobabilsobservaioierarhienorganizareaprogramelor.Variabilele
suntdeobiceininteriorulfunciilor.Funciileivariabileleglobaleintrnmodule.Darmodulele
cumseorganizeaz?Aiciintervinpachetele.
Pachetelesuntnitefolderedemodulecuunfiierspecial__init__.pycareindicluiPythonc
acelfolderestespecial,deoarececoninemodulePython.
Szicemcvreiscreaiunpachetnumit'mapamond'cusubpachetele'asia','africa',etc.iaceste
pacheteconinlarndullormoduleprecum'india','madagascar','romnia'etc.
Iatcumaistructurafolderele:
- <un folder prezent n sys.path>/
- mapamond/
- __init__.py
- asia/
- __init__.py
- india/
- __init__.py
- foo.py
- africa/
- __init__.py
- madagascar/
- __init__.py
- bar.py
- europa/
- __init__.py
- romnia/
- __init__.py
- foo_bar.py

Pachetelesuntdoarunmodconvenabildeaorganizaierarhicmodulele.Veivedeademulteoriasta
nbibliotecaPythonstandard.

Rezumat
Aacumfunciilesuntprireutilizabiledeprogram,modulelesuntprograme(ntregi)reutilizabile.
Oaltierarhiedeorganizareamodulelororeprezintpachetele.Bibliotecastandardcarevinecu
Pythonesteunexempludesetdepacheteimodule.
Amvzutcumsefolosescmoduleleicumsecreeazamoduleproprii.
ncontinuarevomnvadesprectevaconcepteinteresantenumite'structuridedate'.

51
Pythonro:Structuridedate

Introducere
Structurilededatesuntnesenexactastastructuricarepotmemoradategrupate.Cualte
cuvinte,suntfolositepentruastocacoleciidedatenrudite.
ExistpatrustructuripredefinitenPythonliste,tupluri,dicionareiseturi.Vomnvasle
folosimpefiecareicumnepotuuraeleviaa.

Liste
Olist(engl.list)esteostructurdedatecarepstreazocolecieordonatdeelementedecise
poatememoraosecvendeelemententrolist.Astaesteuordeimaginatdacnegndimlao
listdecumprturi,numaicpelistfiecareitemocupunrndseparat,iarnPythonpunem
virguleintreele.
ElementelelisteitrebuieinclusenparantezedrepteastfelnctPythonsneleagcesteo
specificaredelist.Odatceamcreatlista,putemaduga,tergesaucutaelementenea.Deaceea
sepoatespuneclistelesuntmuabile,acesttipdedatepoatefimodificat.

Introducererapidnobiecteiclase
Deingeneralamamnatdiscutareaobiecteloriclaselorpnaacum,estenecesaroscurt
introducere,pentruaseputeanelegelistelemaibine.Detaliilelevomaflancapitoluldedicat
acestora.
Olistesteunexempludeutilizareaobiecteloriclaselor.Cndfolosimovariabiliiiatribuim
ovaloare,szicemntregul5,putemgndicamcreatunobiect(defaptinstan)idinclasa(de
fapttipul)int.Defaptsepoatecitihelp(int)pentruonelegeremaiaprofundatat.
Oclaspoateaveaimetodeadicfunciidefinitepentruafifolositeexclusivnraportcuacea
clas.Puteifolosiacestefuncionalitinumaiasupraunuiobiectdinaceaclas.Deexemplu,
Pythonoferometodappendpentruclasalistcarenepermitesadugmunelementla
sfritullistei.Prinurmarelista_mea.append('un item')vaadugaacelirla
lista_mea.Dereinutfolosireanotaieicupunctpentruaccesareametodelorobiectelor.
Oclaspoateaveaicmpuri(engl.fields)carenusuntaltcevadectvariabiledefinitenraport
exclusivcuaceaclas.Sepotfolosiacelevariabile/numenumainraportunobiectdinaceaclas.
Cmpurilesuntaccesatetotprinnotaiacupunct,deexemplulista.cmp.
Exemplu:
#!/usr/bin/python
# Fiier: using_list.py

# Lista mea de cumprturi


shoplist = ['mere', 'mango', 'morcovi', 'banane']

52
print('Am de cumprat', len(shoplist), 'itemuri.')

print('Acestea sunt:', end=' ')


for item in shoplist:
print(item, end=' ')

print('\nTrebuie s cumpr i orez.')


shoplist.append('orez')
print('Lista mea de cumprturi este acum', shoplist)

print('Acum vom sorta lista')


shoplist.sort()
print('Lista sortat este', shoplist)

print('Primul lucru de cumprat este', shoplist[0])


item_cumprat = shoplist[0]
del shoplist[0]
print('Am cumprat', item_cumprat)
print('Lista mea este acum', shoplist)

Rezultat:
$ python using_list.py
Am de cumprat 4 itemuri.
Acestea sunt: mere mango morcovi banane
Trebuie s cumpr i orez.
Lista mea de cumprturi este acum
['mere', 'mango', 'morcovi', 'banane', 'orez']
Acum vom sorta lista
Lista sortat este
['banane', 'mango', 'mere', 'morcovi', 'orez']
Primul lucru de cumprat este banane
Am cumprat banane
Lista mea este acum
['mango', 'mere', 'morcovi', 'orez']

Cumfuncioneaz:
Variabilashoplistesteolistdecumprturipentrucinevacaremergelapia.nshoplist,
memormiruricarereprezintnumelelucrurilorpecareleavemdecumprat,darputemaduga
oricefeldeobiectinclusivnumeresaualteliste.
Amfolositbuclafor..inpentruaiteraprinitemurilelistei.Pnacumcredcairealizatcao
listesteisecvennacelaitimp.Specificulsecvenelorvafidiscutatntrunsubcapitolurmtor.
Observaiutilizareaargumentuluicuvntcheieendalfuncieiprintpentruaitransmitecvrem
sncheiemliniacuunspaiu('')nlocdencheiereauzual.
ncontinuareadugmunitemlalistfolosindmetodaappendaobiectuluilist,aacumam
discutatanterior.Verificmcadugareasarealizattiprindconinutullisteiprintransmitereaei
funcieiprintcareotipretefrumospeecran.
Maidepartesortmlistafolosindmetodasortalistei.Esteimportantsntelegemcaceast
metodafecteazansilistainuntoarceolistmodificatspredeosebiredecomportamentul
sirurilor.Astavremszicemprinmuabilepecndirurilesuntimuabile.
Dupcecumprmunitemdelapia,vremsleliminmdinlist.Pentruaceastautilizm
declaraiadel.Trebuiemenionataiciitemulpecarevremsleliminmideclaraiadell

53
eliminpentrunoi.Specificmcvremseliminmprimulitem,deaicideclaraiadel
shoplist[0](amintiivcPythonncepenumrtoareadela0).
Dacvreistiitoatemetodeledefinitedeobiectullist,citiihelp(list).

Tupluri
Tuplurilesuntfolositepentrupstracoleciideobiecte.Suntsimilareculistele,darfr
funcionalitateaextinspecareodauclasele.Ofacilitatemajoratuplurilorestecelesunt
imuabilecaiirurileadicnupotfimodificate.
Tuplurilesuntdefiniteprinspecificareaitemurilorseparateprinvirgulentroperecheopionalde
paranteze.
Tuplurilesuntfolositedeobiceincazurilencareodeclaraiesauofunciedefinitdeutilizator
poatepresupunefrriscdegreealcocoleciedevalorinusevaschimba..
Exemplu:
#!/usr/bin/python
# Fiier: using_tuple.py

zoo = ('piton', 'elefant', 'pinguin') # reinei c parantezele sunt opionale


print('Numrul animalelor n zoo este', len(zoo))

zoo_nou = ('maimu', 'cmil', zoo)


print('Numrul de cuti n noul zoo este', len(zoo_nou))
print('Animalele din noul zoo sunt ', zoo_nou)
print('Animalele aduse din vechiul zoo sunt ', zoo_nou[2])
print('Ultimul animal adus din vechiul zoo este', zoo_nou[2][2])
print('Numrul de animale n noul zoo este', len(zoo_nou)-1+len(zoo_nou[2]))

Rezultat:
$ python using_tuple.py
Numrul animalelor n zoo este 3
Numrul de cuti n noul zoo este 3
Animalele din noul zoo sunt ('maimu', 'cmil', ('piton', 'elefant',
'pinguin'))
Animalele aduse din vechiul zoo sunt ('piton', 'elefant', 'pinguin')
Ultimul animal adus din vechiul zoo este pinguin
Numrul de animale n noul zoo este 5

Cumfuncioneaz:
Variabilazooesteuntupludeitemuri.Vedemcfuncialenlucreazipentrutupluri.De
asemeneaastaaratctuplurilesuntisecvene.
Acummutmacesteanimalentrunnouzoo,deoarecevechiulzoosanchis,szicem.Caurmare
tuplulzoo_nouconineniteanimalecareerauacolompreuncuanimaleleadusedinvechiul
zoo.nrealitate,acum,reineicuntupluninteriorulaltuituplunuipierdeidentitatea.
Putemaccesaitemuriledintupluspecificndpoziiantroperechedeparantezeptrate,capentru
liste.Acestasenumeteoperatordeindexare.Accesmaltreileaitemdinzoo_nouspecificnd
zoo_nou[2]iaccesmaltreileaitemaltupluluizoodintuplulzoo_nouspecificnd
zoo_nou[2][2].Edestuldesimpludupceaintelesregula.

54
Paranteze
Deiparantezelesuntopionale,eupreferslepunmereu,pentruafaceevidentcevorbade
untuplu,nspecialpentruaevitaambiguitatea.Deexempluprint(1,2,3)i
print( (1,2,3) )nseamndoulucrurifoartediferiteprimatipretetreinumere,iar
adouatipreteuntuplu(careconinetreinumere).

Tupluricu1sau0elemente
Untupluvidesteconstruitfolosindoperechedeparantezegoalemyempty = ().Totui,un
tuplucuunsingurelementnueaadesimplu.Trebuieslspecificaifolosindvirguladup
primul(iultimul)element,caPythonspoatdifereniantretupluiunaltobiectcuprinsn
parantezentroexpresiedecivatrebuisspecificaisingleton = (2 , )dacvreis
seneleag'tuplulcareconinedoarelementul2'.

NotpentruprogramatoriinPerl
OlistntrolistnuipierdeidentitateaadicnuesteasimilatcanPerl.Astaseaplici
pentruuntupluntruntuplu,olistntruntuplu,untupluntrolistetc.nceprivetelimbajul
Python,elesuntniteobiectestocatenalteobiecte.

Dicionare
Undicionarestecaocartedeadresencarepoigsiadresasaudateledecontactalepersoanei
doartiinduinumele,adicasociemchei(nume)cuvalori(detalii).Deobservatcocheietrebuie
sfieunic,pentruanuexistaconfuzii,exactcaatuncicndnupoideosebidoupersoanedacau
acelainume.
Pepostdecheiputeifolosinumaiobiecteimuabile(precumirurile),darpepostdevaloriputem
folosioricefeldevalori.nesennseamncartrebuisfolosimpepostdecheinumaiobiecte
simple.
Perechilecheievaloaresuntspecificatentrundicionarfolosindnotaiad = {cheie1 :
valoare1, cheie2 : valoare2 }.Observaicperechilecheievaloaresuntseparate
prinvirgul,iarcheiaesteseparatdevaloareprinsemnuldoupuncte.Dicionarulestedelimitat
deoperechedeacolade.
Reineicntrundicionarperechilecheievaloarenusuntordonatenniciunfel.Dacvreio
anumitordine,vatrebuislsortaisingurinaintedefolosire.
Dicionarelepecareleveifolosisuntinstane/obiectealeclaseidict.
Exemplu:
#!/usr/bin/python
# Fiier: using_dict.py

# 'ab' este o prescurtare de la 'a'ddress'b'ook

ab = { 'Swaroop' : 'swaroop@swaroopch.com',
'Larry' : 'larry@wall.org',
'Matsumoto' : 'matz@ruby-lang.org',
'Spammer' : 'spammer@hotmail.com'
}

print("Adresa lui Swaroop este", ab['Swaroop'])

55
# tergerea unei perechi cheie - valoare
del ab['Spammer']

print('\nExist {0} contacte n address-book\n'.format(len(ab)))

for nume, adresa in ab.items():


print('Contactai pe {0} la adresa {1}'.format(nume, adresa))

# Adugarea unei perechi cheie - valoare


ab['Guido'] = 'guido@python.org'

if 'Guido' in ab: # OR ab.has_key('Guido')


print("\nAdresa lui Guido este", ab['Guido'])

Rezultat:
$ python using_dict.py
Adresa lui Swaroop este swaroop@swaroopch.com

Exist 3 contacte n address-book

Contactai pe Swaroop la adresa swaroop@swaroopch.com


Contactai pe Matsumoto la adresa matz@ruby-lang.org
Contactai pe Larry la adresa larry@wall.org

Adresa lui Guido este guido@python.org

Cumfuncioneaz:
Cremdicionarulabfolosindnotaiadejadiscutat.Accesmperechilecheievaloarespecificnd
cheiaifolosindoperatoruldeindexare,aacumamdiscutatlalisteitupluri.Observaisimplitatea
sintaxei.
Putemtergeperechicheievaloarefolosindvechiulnostruprietendeclaraiadel.Purisimplu
specificmdicionarulioperatoruldeindexarepentrucheiacaretrebuietearsiledm
declaraieidel.Nuestenecesarssecunoascivaloareaasociatacheiipentruarealizaaceast
operaie.
ncontinuareaccesmfiecareperechecheievaloaredindicionarfolosindmetodaitemsa
dicionaruluicarentoarceolistdetuplurincarefiecaretupluconineoperechedeitemuricheia
urmatdevaloare.Extragemaceastperecheioatribuimvariabilelornumeiadres
corespunztorpentrufiecareperechefolosindobuclfor..inncaretiprimacesteinformaii.
Putemadugaperechinoicheievaloareprinsimplautilizareaoperatoruluideindexarepentrua
accesacheiaiaatribuiaceavaloare,aacumamfcutpentruGuidoncazuldemaisus.
Putemtestadacexistndicionaroanumitperechecheievaloarefolosindoperatorulinsau
chiarmetodahas_keyaclaseidict.Puteiconsultadocumentaiapentruolistcompleta
metodelorclaseidictfolosindcomandahelp(dict).
Argumentecuvntcheieidicionare
ntroaltordinedeidei,dacaifolositargumentecuvntcheienfuncii,nseamncai
folositdejadicionare!Iagndiiv:perecheacheievaloareestespecificatnlistade
parametriadefiniieifuncieiicndaccesaivariabilele,numelelorsuntcheideaccesale
unuidicionarnumittabeldesimbolurinterminologiaproiectriidecompilatoare).

56
Secvene
Listele,tuplurileiirurilesuntexempledesecvene,darcesuntsecveneleicelefaceattde
speciale?
Facilitateaceamaiimportantestecautestedeapartenen(adicexpresiileininot in)i
operaiideindexare.Operaiadeindexarenepermitesextragemdirectunitemdinsecven.
Aufostmenionatetreitipuridesecveneliste,tupluriiiruriioperaiadefeliere,carene
permitesextragemoparte(engl.slice)dinsecven.
Exemplu:
#!/usr/bin/python
# Fiier: seq.py

shoplist = ['mere', 'mango', 'morcovi', 'banane']


nume = 'swaroop'

# Operaia de indexare sau 'subscriere'


print('Itemul 0 este', shoplist[0])
print('Itemul 1 este', shoplist[1])
print('Itemul 2 este', shoplist[2])
print('Itemul 3 este', shoplist[3])
print('Itemul -1 este', shoplist[-1])
print('Itemul -2 este', shoplist[-2])
print('Caracterul 0 este', nume[0])

# Felierea unei liste


print('Itemurile de la 1 la 3 sunt', shoplist[1:3])
print('Itemurile de la 2 la sfrsit sunt', shoplist[2:])
print('Itemurile de la 1 la -1 sunt', shoplist[1:-1])
print('Itemurile de la nceput la sfrit sunt', shoplist[:])

# Felierea unui ir
print('Caracterele de la 1 la 3 sunt', nume[1:3])
print('Caracterele de la 2 la end sunt', nume[2:])
print('Caracterele de la 1 la -1 sunt', nume[1:-1])
print('Caracterele de la nceput la sfrit sunt ', nume[:])

Rezultat:
$ python seq.py
Itemul 0 este mere
Itemul 1 este mango
Itemul 2 este morcovi
Itemul 3 este banane
Itemul -1 este banane
Itemul -2 este morcovi
Caracterul 0 este s
Itemurile de la 1 la 3 sunt ['mango', 'morcovi']
Itemurile de la 2 la sfrit sunt ['morcovi', 'banane']
Itemurile de la 1 la -1 sunt ['mango', 'morcovi']
Itemurile de la nceput la sfrit sunt ['mere', 'mango', 'morcovi',
'banane']
Caracterele de la 1 la 3 sunt wa
Caracterele de la 2 la sfrit sunt aroop
Caracterele de la 1 la -1 sunt waroo
Caracterele de la nceput la sfrit sunt swaroop

57
Cumfuncioneaz:
Lanceput,vedemcumsefolosescindeciipentruaobineunelementanumedinsecven.Astase
mainumeteoperaiadesubscriere.Decteorispecificaiunnumrntroperechedeparanteze
dreptealturateuneisecvene,Pythonvvaextrageitemulcorespunzatorpoziieinsecven.
ReineicPythonncepenumrtoareadela0.Astfelshoplist[0]extrageprimulitemi
shoplist[3]lextragepealpatruleadinsecvenashoplist.
Indexulpoatefiiunnumrnegativ,cazncarepoziiaestecalculatdelasfritulsecvenei.Din
acestmotivshoplist[-1]indicultimulitemdinsecven,iarshoplist[-2]penultimul
item.
Operaiadefeliereestefolositspecificndnumelesecveneiurmatdeoperecheopionalde
numereseparateprinsemnuldouapuncte(engl.colon)inclusenparantezedrepte.Observaic
estefoarteasemntorcuoperaiadeindexarefolositpnacum.Dereinutcnumerelesunt
opionale,semnuldoupuncteNUesteopional.
Primulnumr(naintededoupuncte)noperaiadefeliereindicpunctulundencepefelia,iaral
doileanumrindicundesetemin.Dacnuestespecificatprimulnumr,Pythonvancepecu
nceputulsecvenei.Dacesteomisaldoileanumr,Pythonsevaoprilasfritulsecvenei.
Observaicfeliantoars(uneorisespune'returnat')ncepecupoziiadatdeprimulnumr,dar
sencheieimediatnaintedepoziiadatdealdoileanumradicnceputulesteinclus,sfritulnu
esteinclusnfelie.
Astfel,shoplist[1:3]ntoarceofeliedinsecvenacarencepecupoziia1,includepoziia2,
darnuincludepoziia3deciestentoarsofeliededouitemuri.Similar,shoplist[:]ntoarce
ocopieasecvenei.
Maiputetifacefeliereicuindecinegativi.Numerelenegativesuntfolositepentruaindicapoziii
delasfritulsecvenei.Deexemplu,shoplist[:-1]vantoarceofeliedinsecvencare
excludeultimulitemdinsecven,darincludetotrestulsecvenei.
Deasemenea,putemdaaltreileaargumentpentrufeliere,caredevinepasuldefeliere(implicit
pasuleste1):
>>> shoplist = ['mere', 'mango', 'morcovi', 'banane']
>>> shoplist[::1]
['mere', 'mango', 'morcovi', 'banane']
>>> shoplist[::2]
['mere', 'morcovi']
>>> shoplist[::3]
['mere', 'banane']
>>> shoplist[::-1]
['banane', 'morcovi', 'mango', 'mere']

Iatcesentmplcndpasuleste2,obinemitemurilecupoziiile0,2,...Dacpasuleste3,
obtinemitemuriledinpoziiile0,3,etc.
ncercaivariatecombinaiidespecificaiidefelierenmodulinteractiv,pentruavedeaimediat
rezultatele.Mareleavantajalsecvenelorestecputeiaccesatuplurile,listeleiirurilenacelai
fel!

Seturi
Seturilesuntcoleciineordonatedeobiectesimple.Acesteasuntfolositeatuncicandexistenaunui

58
obiectncolecieestemaiimportantdectpoziialuisaunumruldeapariii.
Folosindseturi,puteitestaapartenena,dacunsetestesubsetalaltuiset,puteiaflainterseciaa
douseturiiaamaideparte.
>>> bri = set(['brazilia', 'rusia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('rusia')
>>> bri & bric # OR bri.intersection(bric)
{'brazilia', 'india'}

Cumfuncioneaz:
Exemplulesteautoexplicativdeoareceimplicteoriadebaznvatlacoaladespremulimi
(seturi).

Referine
Cndcreaiunobiectiiatribuiiovaloare,variabiladoarindicobiectulcreat,nureprezint
obiectulnsui!Astanseamncnumelevariabileiesteunindicatorctreaceaparteamemoriei
calculatoruluincareestestocatobiectul.Acestfaptsenumetelegare(engl.binding)anumeluila
obiect.
ngeneral,nutrebuiesvngrijoraideasta,darexistunefectsubtildaroratreferineidecare
trebuiesfiicontieni:
Exemplu:
#!/usr/bin/python
# Fiier: reference.py

print('Atribuire simpl')
lista_iniial = ['mere', 'mango', 'morcovi', 'banane']
lista_mea = lista_iniial # lista_mea este doar un alt nume al aceluiai
obiect!

del lista_iniial[0] # Am cumprat primul item, deci s-l tergem din list

print('lista initial este', lista_iniial)


print('lista mea este', lista_mea)
# Observai c ambele liste apar fr 'mere', confirmnd
# astfel c ele indic acelai obiect

print('Copiere fcnd o felie intergal')


lista_mea = lista_iniial[:] # Face o copie prin feliere integral
del lista_mea[0] # eliminm primul item

print('lista_iniial este', lista_iniial)


print('lista_mea este', lista_mea)
# Observai c acum cele dou liste sunt diferite?

59
Rezultat:
$ python reference.py
Atribuire simpl
lista_iniial este ['mango', 'morcovi', 'banane']
lista_mea este ['mango', 'morcovi', 'banane']
Copiere fcnd o felie intergal
lista_iniial este ['mango', 'morcovi', 'banane']
lista_mea este ['morcovi', 'banane']

Cumfuncioneaz:
Parteaprincipalaexplicaieiseregsetencomentarii.
Reineicdacvreisfaceiocopieauneilistesauaunorobiectecomplexe(nusimpleobiecte,
cumarfintregii),atuncitrebuiesfolosiifelierea.Dacfolosiiatribuireaobineincunnume
pentruacelaiobiectiastapoateaduceproblemedacnusunteiateni.
NotpentruprogramatoriinPerl
Reineicodeclaraiedeatribuirepentrulistenucreeazaocopie.Vatrebuisfolosii
feliereapentruafaceocopieasecvenei.

Altedetaliidespreiruri
Amdiscutatdejandetaliudespreiruri.Cearmaiputeafidetiut?Eibine,tiaicirurilesunt
obiecteiaumetodecarefacoricedelaverificareaunorprialeiruluipnlaeliminarea
spaiilor?
Sirurilepecarelefolosiinprogramesuntobiectedinclasastr.Ctevametodeutilesuntartate
nexemplulurmtor.Pentruolistcompletametodelor,citiihelp(str).
Exemplu:
#!/usr/bin/python
# Fiier: str_methods.py

nume = 'Swaroop' # Acesta este obiectul ir

if name.startswith('Swa'):
print('Da, irul ncepe cu "Swa"')

if 'a' in nume:
print('Da, irul conine subirul "a"')

if name.find('war') != -1:
print('Da, irul conine subirul "war"')

delimitator = '_*_'
Lista_mea= ['Brazilia', 'Rusia', 'India', 'China']
print(delimitator.join(lista_mea))

Rezultat:
$ python str_methods.py
Da, irul ncepe cu "Swa"
Da, irul conine subirul "a"
Da, irul conine subirul "war"

60
Brazilia_*_Rusia_*_India_*_China

Cumfuncioneaz:
Aicivedemomulimedemetodenaciune.Metodastartswithestefolositpentruatestadac
irulncepesaunucuunirdat.Operatorulinsefolosetepentruaverificaincludereaunuiirn
iruldat.
Metodafindestefolositpentruagsipoziiaunuiirdatniruliniial,carentoarce1dacnu
agsitnimic.Clasastrareiometodsimpaticjoinpentruaalturaitemuriledintrosecven,
cuunirpepostdedelimitatorntreitemuriiintoarceunirlunggeneratdintoateacestea.

Rezumat
AmexploratdiverselestructuridedatepredefinitenPythonndetaliu.Acestestructuridedatevor
deveniesenialepentruscriereadeprogramededimensiunirezonabile.
AcumcavemomulimedeelementePythonasimilate,vomvedeacumseproiecteazisescriu
programePythonnlumeadezicuzi.

61
Pythonro:Rezolvareaproblemelor
AmexploratdiversepridinlimbajulPythoniacumvomvedeacumconlucreazacesteaprin
proiectareaiscriereaunuiprogramcarefacecevautil.Ideeaestedeanvacumsscriemun
programPythonpropriu.

Problema
Problemaeste"Vreauunprogramcaresfacunbackupaltuturorfiierelormeleimportante".
Deiaceastaesteoproblemasimpl,nuavemdestuleinformaiipentruancepegsireauneisoluii.
Seimpuneoanalizsuplimentar.Deexemplu,cumspecificmcarefiieretrebuiesalvate?Cum
vorfielestocate?Undevorfistocate?
Dupoanalizcorectaproblemei,proiectmprogramul.Facemolistculucruricaredescriucum
trebuiesfuncionezeprogramulnostru.nacestcaz,amcreatlistaurmtoarecaredescriecum
vreauEUsmearg.Dacfaceivoiproiectareasarputeasrezulteoaltfeldeanaliz,ntruct
fiecarefacelucrurilenfelullui,decieperfectOK.
1. Fiiereleidirectoarelecaretrebuiesalvatesuntspecificatentrolist.
2. Backupultrebuiestocatndirectorulprincipaldebackup
3. Fiierelesuntstocatentroarhivzip.
4. Numelearhiveizipestedataiora.
5. FolosindcomandastandardzipdisponibilimplicitntoatedistribuiileLinux/Unix.
UtilizatoriideWindowspotinstaladinpaginaproiectuluiGnuWin32iadauga
C:\Program Files\GnuWin32\binlavariabilademediuPATH,similarmoduluin
careamfcutpentrurecunoatereansiacomenziipython.Reineicputeifolosiorice
comanddearhivareatttimpctaceastareointerfaliniedecomand,casiputem
transmiteargumentedinprogramulnostru.

Soluia
ntructdesignulprogramuluinostruesterelativstabil,putemscriecodulcareimplementeaz
soluianoastr.
#!/usr/bin/python
# Fiier: backup_ver1.py

import os
import time

# 1. Fiierele i directoarele de salvat sunt specificate ntr-o list.


source = ['"C:\\My Documents"', 'C:\\Code']
# Observai c a fost nevoie de ghilimele duble n interiorul irului pentru a
proteja spaiile din interiorul numelor.

# 2. Salvarea (engl. backup) trebuie stocat n directorul principal de backup


target_dir = 'E:\\Backup' # Nu uitai s schimbai asta cu directorul folosit de
voi

62
# 3. Fiierele sunt salvate ntro arhiv zip.

# 4. Numele arhivei zip este data i ora curent


target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'

# 5. Folosim comanda zip pentru a include fiierele i directoarele de salvat n


arhiv
zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rulm comanda de backup


if os.system(zip_command) == 0:
print('Salvare reuit n ', target)
else:
print('Backup EUAT')

Rezultat:
$ python backup_ver1.py
Salvare reuit n E:\Backup\20090208153040.zip

Acumsuntemnfazadetestarencareverificmdacprogramulnostrulucreazcorect.Dacnu
secomportcumtrebuie,vafinevoiededebuggingadiceliminareaerorilordinprogram.
Dacprogramulnuvamerge,puneiodeclaraieprint(zip_command)imediatnaintede
apelulos.systemirulaiprogramul.Acumcopiaicomandazip_commandlapromptulshell
uluiiverificaidacmergepecontpropriu.Dacaceastaeueaz,citiimanualulcomenziizipca
saflaicearputeafigreit.Dacreuete,verificaiprogramulPythoncasvedeidacesteexact
camaisus.
Cumfuncioneaz:
Veiobservacumamtransformatdesignulncodntromanierpascupas.
Utilizmmoduleleositimeimportnduledelanceput.Apoispecificmdirectoarelecare
trebuiesalvatenlistasource.Directoruldestinaieesteloculundestocmtoatesalvrileiacesta
estespecificatnvariabilatarget_dir.Numelearhiveizippecareovomcreaeste"data
curent+oracurent"pecarelegsimfolosindfunciatime.strftime().Arhivavaavea
extensia.zipivafistocatndirectorultarget_dir.
Observaifolosireavariabileios.sepceacarenedseparatoruldedirectoralsistemuluivostru
deoperare;acestavafi'/'nLinuxiUnix,'\\'nWindowsi':'nMacOS.Folosirea
declaraieios.sepnloculacestorcaracterevafaceprogramulmaiportabilntreacestesisteme.
Funciatime.strftime()primeteospecificaiecaaceeafolositnprogram.Specificaia%Y
vafinlocuitcuanul,frsecol.Specificaia%mvafinlocuitculuna,canumarzecimalntre01
i12.a.m.d.ListacompletaspecificaiilorpoatefigsitnManualuldereferinPython.
Cremnumeledirectoruluidestinaiefolosindoperatoruldeadunarecareconcateneazirurile
adicalturirurileiproduceunulmailung.Atuncinoicremunirzip_commandcare
coninecomandapecareovomexecuta.Puteiverificadacarezultatocomandcorectprin
executareaeidesinestttoarentrunshell(terminalLinuxsauDOSprompt).
Comandazippecareofolosimarectevaopiuniiparametritransmii.Opiunea-qestefolosit
pentruaindicamoduldelucrutcut(engl.quiet).Opiunea-rspecificmodulrecursivde
parcurgereadirectoarelor,adictrebuiesincluditoatesubdirectoareleisubdirectoarele
acestoraetc.Celedouopiunisecombinisespecificpescurt-qr.Opiunilesunturmatede

63
numelearhiveicarevaficreaturmatdelistafiiereloridirectoarelordesalvat.Convertimlista
sourcentrunirfolosindmetodajoinairurilor,pecareamnvatdejasofolosim.
nfine,rulmcomandafolosindfunciaos.systemcareexecutcomandacaicumarfifost
lansatdinsistemadicnshelleantoarce0daccomandaafostexecutatcusucces,altfel
ntoarceuncoddeeroare.
nfunciederezultatulcomenzii,tiprimpeecranmesajuladecvat,cumcsalvareaareuitsaunu.
Astae,amcreatunscriptcaresfacaunbackupalfiierelorimportantedinsistem!
NotpentruutilizatoriideWindows
nloculsecvenelordeevadarecudublubackslash,puteifolosiiiruribrute.Deexemplu,
folosii'C:\\Documents'saur'C:\Documents'.noricecaz,nufolosii
'C:\Documents'ntructveiajungesfolosiiosecvendeevadarenecunoscut,\D.

Acumcavemunscriptfuncionaldesalvare,lputemruladecteorivremsobinemosalvarea
fiierelor.UtilizatoriideLinux/Unixsuntsftuiisfoloseascmetodeexecutabileaacumam
discutatncapitoleleprecedente,astfelcaelespoatruladeoriunde,oricnd.Astasenumete
fazadeoperaresaudedistribuireasoftwareului.
Programuldemaisusfuncioneazcorect,dar(deobicei)primulprogramnufuncioneazcumne
amatepta.Deexempluarputeafiproblemedacnuamproiectatcorectprogramulsaudacavem
oeroarededactilografierenscriereacodului(engl.typo),etc.nmoduladecvat,vveintoarcela
fazadedesignsaudebuggiggpentruarezolvaproblema.

Adouaversiune
Primaversiuneascriptuluinostrufuncioneaz.Totui,putemrafinaprogramulpentrualucramai
binenutilizareasadezicuzi.Astasenumetentreineresaumentenanasoftwareului(engl.
maintenance).
Unuldinrafinamentelepecareleamconsiderateuutileafostunmecanismmaibundedenumirea
salvrilor,folosindoracanumealfiierului,iardatacanumedesubdirectoraldirectoruluide
backupcaresconinsalvriledinaceeaidata.Primulavantajestecsalvrilevorfistocatentro
manierierarhicivorfimaiuordegestionat.Aldoileaavantajesteclungimeanumelorde
fiiervafimaimultmaimic.Altreileaavantajestecsevaputeaverificamaiuordacaufost
fcutesalvrizilnic(nziuancarenusafacut,directorulavndcanumeaceadatlipsete,
ntructnuafostcreat).
#!/usr/bin/python
# Fiier: backup_ver2.py

import os
import time

# 1. Fiierele i directoarele de salvat sunt specificate ntro list.


source = ['"C:\\My Documents"', 'C:\\Code']
# Observai c au fost necesare ghilimele duble pentru a proteja spaiile din
interiorul numelor.

# 2. Salvarea trebuie stocat n directorul principal de backup


target_dir = 'E:\\Backup' # Nu uitai s schimbai asta cu directorul pe care l
folosii voi

64
# 3. Fiierele sunt salvate n fiiere zip.
# 4. Data curent este numele subdirectorului din folderul principal
azi = target_dir + os.sep + time.strftime('%Y%m%d')
# Ora curent este numele arhivei zip
acum = time.strftime('%H%M%S')

# Crem subdirectorul, dac nu exista nainte


if not os.path.exists(azi):
os.mkdir(azi) # crem directorul
print('Am creat cu succes directorul ', azi)

# Numele fiierului arhiva zip


target = azi + os.sep + acum + '.zip'

# 5. Folosim comanda zip pentru a colecta fiierele n arhiv.


zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rulm programul de salvare


if os.system(zip_command) == 0:
print('Salvare reuit n ', target)
else:
print('Salvare EUAT')

Rezultat:
$ python backup_ver2.py
Am creat cu succes directorul E:\Backup\20090209
Salvare reuit n E:\Backup\20090209\111423.zip

$ python backup_ver2.py
Salvare reuit n E:\Backup\20090209\111837.zip

Cumfuncioneaz:
Majoritateacoduluiramneneschimbat.Schimbrileconstauuntestareaexisteneidirectorului
avndcanumedatacurentninterioruluidirectoruluiprincipaldebackupfolosindfuncia
os.path.exists.Dacacestanuexist,lcremnoifolosindfunciaos.mkdir.

Versiuneaatreia
Adouaversiunemergebinecndfacemmultesalvri,daregreudevzutceestesalvatnfiecare
arhiva!Deexemplu,poateamfcutoschimbaremareunuiprogramsauuneiprezentriiavreas
asociezacesteschimbricunumeleprogramuluisauprezentriiiarhivazip.Aceastasepoate
realizauorprinataareaunuicomentariufurnizatdeutilizatorlanumelearhiveizip.
Not
Urmtorulprogramnufuncioneaz,decinuvaalarmai,urmailtotui,pentruceolecie
nel.

#!/usr/bin/python
# Fiier: backup_ver3.py

import os
import time

65
# 1. Fiierele i directoarele de salvat sunt specificate ntro list.
source = ['"C:\\My Documents"', 'C:\\Code']
# Observai c a fost nevoie de ghilimele duble pentru a proteja spaiile din
interiorul numelor.

# 2. Salvarea trebuie stocat n directorul principal


target_dir = 'E:\\Backup' # Nu uitai s schimbai asta cu ce folosii voi
# 3. Fiierele sunt salvate ntro arhiv zip.
# 4. Data curent este numele subdirectorului
azi = target_dir + os.sep + time.strftime('%Y%m%d')
# Ora curent este numele arhivei zip
acum = time.strftime('%H%M%S')

# Lum un comentariu de la utilizator pentru a crea numele


comentariu = input('Introducei un comentariu --> ')
if len(comentariu) == 0: # Verificai dac a fost introdus
target = azi + os.sep + acum+ '_' +
comentariu.replace(' ', '_') + '.zip'

# Crem subdirectorul dac nu exist deja


if not os.path.exists(azi):
os.mkdir(azi) # Crem directorul
print('Am creat cu succes directorul ', azi)

# 5. Folosim comanda zip pentru a colecta fiierele n arhiva


zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rulm salvarea
if os.system(zip_command) == 0:
print('Salvare reuit n ', target)
else:
print('Salvare EUAT')

Rezultat:
$ python backup_ver3.py
File "backup_ver3.py", line 25
target = azi + os.sep + now + '_' +
^
SyntaxError: invalid syntax

Cum(nu)funcioneaz:
Acestprogramnufuncioneaz!Pythonspuneceundevaoeroaredesintaxceeacenseamnc
programulnuafostbinescris,cnurespectstructurapecareseateaptPythonsogseasc
acolo.CndvedemeroareadatdePython,aflmiloculundeadetectateleroarea.Decincepem
eliminareaerorilor(engl.debugging)programuluidelaacealinie.
Laoobservaieatent,vedemcaolinielogicafostextinspedouliniifizicefrssespecifice
acestlucru.nesenPythonagsitoperatoruldeadunare(+)frvreunoperandnacealiniei
prinurmarenutiecumscontinue.Vamintiicputemspecificatrecereauneiliniilogicepe
urmtoarealiniefizicfolosindunbackslashlasfritullinieifizice.Astfelfacemcorecturala
progrmulnostru.Aceastacorecieaprogramuluicndgasimerorisenumetedepanare(engl.bug
fixing).

66
Versiuneaapatra
#!/usr/bin/python
# Fiier: backup_ver4.py

import os
import time

# 1. Fiierele de salvat sunt specificate ntro list.


source = ['"C:\\My Documents"', 'C:\\Code']
# Observai c a trebuit s punem ghilimele duble pentru a proteja spaiile din
interiorul numelor.

# 2. Salvarea trebuie stocat n directorul principal de backup


target_dir = 'E:\\Backup' # Nu uiati s schimbai asta cu ceea ce folosii voi

# 3. Salvrile se fac n arhive zip.

# 4. Ziua curent este numele subdirectorului din directorul principal de backup


azi = target_dir + os.sep + time.strftime('%Y%m%d')
# Ora curent este numele arhivei zip
acum = time.strftime('%H%M%S')

# Acceptm un comentariu de la utilizator


comentariu = input('Introducei un comentariu --> ')
if len(comentariu) == 0: # Verificm dac a fost introdus un comentariu
target = azi + os.sep + acum + '.zip'
else:
target = azi + os.sep + acum + '_' + \
comentariu.replace(' ', '_') + '.zip'

# Crem subdirectorul, dac nu exista deja


if not os.path.exists(azi):
os.mkdir(azi) # crem directorul
print('Am creat cu succes directorul ', today)

# 5. Folosim comanda zip pentru a colecta fiierele n arhiv zip


zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rulm comanda de backup


if os.system(zip_command) == 0:
print('Salvare reuit n ', target)
else:
print('Salvare EUAT')

Rezultat:

$ python backup_ver4.py
Introducei un comentariu --> noi exemple adugate
Salvare reuit n E:\Backup\20090209\162836_noi_exemple_adugate.zip

$ python backup_ver4.py
Introducei un comentariu -->
Salvare reuit n E:\Backup\20090209\162916.zip

Cumfunctioneaz:

67
Acestprogramfuncioneaz,acum!Sparcurgemmbuntirilepecareileamadusnversiunea3.
Acceptmuncomentariudelautilizatorfolosindfunciainputiapoitestmdacsaintrodus
cevasaunucalculndlungimeairuluiintroduscuajutorulfuncieilen.Dacutilizatoruladat
ENTERfrsintroducceva(poateeradoarunbackupderutininaufostfcutemodificri
anume),apoicontinumcamainainte.
Totui,dacafostintrodusuncomentariu,acestaesteataatnumeluiarhiveizip,chiarnaintea
extensiei.zip.Observaicnlocuimspaiilencomentariucuunderscorecasfiemaiuoar
gestiuneafiierelorcunumelungi.

Alterafinamente
Apatraversiuneesteunasatisfctoarepentrumajoritateautilizatorilor,darestemereulocpentru
maibine.Deexemplusepoateintroduceunniveldelogoree(engl.verbosity)pentruprogram,cu
ajutorulopiunii-vPentruafaceprogramulmaivorbre.
Altmbuntireposibilarfispermitemcafiiereleidirectoareledesalvatsfietransmise
scriptuluilaliniadecomand.Noileputemculegedinlistasys.argvileputemadugala
variabilalistsourcefolosindmetodaextendaclaseilist.
Ceamaiimportantaextinderearfisnufolosimos.systemcidirectmodulelepredefinite
zipfilesautarfilepentruacreaacestearhive.Elesuntparteabiblioteciistandardisunt
dejadisponibilepentruascrieunprogramfrdependenteexternepentruprogramuldearhivare.
Totui,amfolositos.systempentrucreareasalvrilordinmotivepedagogice,pentrucaexemplul
sfiedestuldesimpludenteles,dariutil.
Puteincercasscrieiacinceavariantfolosindmodululzipfilenloculapeluluios.system?

Procesuldedezvoltaredesoftware
Amtrecutprindiversefazenprocesuldescriereaunuiprogram.Acestefazepotfirezumateastfel:
1. Ce(Analiza)
2. Cum(Design)
3. Executare(Implementare)
4. Test(Testareieliminareerori)
5. Utilizare(Operaresaudistribuire)
6. Mentenan(Rafinare)
Ocalerecomandatdeascrieprogrameesteproceduraurmatdenoilascriereascriptuluide
salvare:facemanalizaidesignul.ncepemimplementareacuoversiunesimpl.Otestmio
depanm.Ofolosimpentruaneasiguracmergecumneampropus.Acumiadugmnoifaciliti
pecareledorimiparcurgemciclulFACITESTEZIUTILIZEZIdecteoriestenevoie.Reinei,
Softwareulestecrescut,nuconstruit.

Rezumat
Amvzutcumsecreeazunprogram/scriptPythonidiferitestadiiimplicatedescriereaunui
program.Aiputeaconsiderautilscriereadeprogrameproprii,attpentruacomodareacuPython
ctipentruarezolvaprobleme.

68
ncontinuarevomdiscutadespreprogramareaorientatpeobiecte.

69
Pythonro:Programareorientatpeobiecte

Introducere
ntoateprogramelefolositepnacumneamconstruitsoluiilenjurulfunciiloradicblocuride
declaraiicaremanipuleazdate.Acestmoddeprogramaresenumeteorientatpeproceduri.Exist
iunaltmoddeorganizareaprogramelor,ncarefuncionalitateaidatelesuntmpachetate
mpreunnunitinumiteobiecte.Acestmoddestructuraredefineteparadigma"orientatpe
obiecte.Aproapetottimpulputeifolosiabordriproceduralenprogramare,darcndscriei
programemarisauaveiderezolvatproblemecaresuntmaiaproapedeacestmoddestructurare,
puteifolositehniciledeprogramareorientatpeobiecte..
Claseleiobiectelesuntdouaspectealeprogramriiorientatepeobiecte.Oclascreeazaunnou
tipncareobiectelesuntinstanealeclasei.Oanalogieestecputeiaveavariabiledetipintcare
setraduceprinaceeacvariabilelecarestocheazntregisuntinstane(obiecte)aleclaseiint.
Notpentruprogramatoriinlimbajecutipuristatice
Observaicpnintregiisunttrataicaobiecte(aleclaseiint).AstaediferitdeC++i
Java(nversiuniledinaintede1.5)ncarentregiisunttipuriprimitivenative.Asevedea
help(int)pentrudetaliidespreclas.
ProgramatoriinC#iJava1.5vorgsiosimilaritatecuconcepteledencapsularei
decapsulare.

Obiectelepotstocadatefolosindvariabileobinuitecareaparinobiectului.Variabilelecareaparin
unuiobiectsuntnumitecmpuri.Obiectelepotaveaifuncionalitatefolosindfunciicareaparin
clasei.Acestefunciisemunescmetodealeclasei.Aceastterminologieesteimportantdeoarece
neajutasdifereniemntrefunciiivariabileindependenteiceleaparinndunuiobiectsauunei
clase.mpreun,variabileleifunciilecareaparinuneiclasesenumescatributealeclasei.
Cmpurilesuntdedoutipurielepotaparinefiecreiinstane/obiectalclaseisaupotaparine
nsiclasei.Acesteasuntnumitevariabiledeinstanrespectivvariabilealeclasei.
Oclasestecreatfolosindcuvntulcheieclass.Cmpurileimetodeleclaseisuntlistatentrun
blocindentat.

self
Claseleimetodeleauodiferenspecificfadefunciileobinuiteeletrebuiesaibun
prenumesuplimentarcaretrebuieadugatlanceputullisteideparametri,darnutrebuiesidaio
valoarecndapelaimetoda,Pythonovafurniza.Aceastvariabilspecialsereferlaobiectul
nsui(engl.self)iprinconvenieestenumitself.
Cutoateacestea,deiputeisidaioricenumeacestuiparametru,esteputernicrecomandats
folosiinumeleselforicealtnumeestedezaprobat.Existmulteavantajenfolosirenumelui
standardoricecititoralprogramuluivanelegeimediatdespreceestevorbaichiarmediileIDE
(IntegratedDevelopmentEnvironments)specializatetepotajutadacfolosetiself.

70
NotpentruprogramatoriinC++/Java/C#
selfdinPythonesteechivalentcupointerulthisdinC++icureferinathisdinJavai
C#.

ProbabilvntrebaicumdPythonvaloareacorectluiselfidecenutrebuiesidmo
valoare.Unexempluvaclarificaaceastproblem.SzicemcaveioclasnumitMyClassio
instanaacesteiclase,numitmyobject.Cndapelaiometodaacestuiobiect
myobject.method(arg1, arg2),apelulesteautomatconvertitdePythonn
MyClass.method(myobject, arg1, arg2)astaetoatmareaspecialitatealuiself.
Astanseamnicdacaveiometodcarenuprimeteargumente,totvatrebuisaveiun
argumentself.

Clase
Ceamaisimplclasposibilesteartatnexemplulurmtor.
#!/usr/bin/python
# Fiier: simplestclass.py

class Persoana:
pass # Un bloc gol

p = Persoana()
print(p)

Rezultat:
$ python simplestclass.py
<__main__.Persoana object at 0x019F85F0>

Cumfuncioneaz:
Cremoclasnoufolosinddeclaraiaclassinumeleclasei.Aceastaesteurmatdeunbloc
indentatdedeclaraiicareformeazcorpulclasei.nacestcazavemunblocgol,artatdedeclaraia
pass.
ncontinuarecremunobiect/instanaacesteiclasefolosindnumeleclaseiurmatdeoperechede
paranteze.(Vomnvamaimultedespreinstanierenparagrafulurmtor).Pentrupropria
verificare,confirmmtipulvariabileiprinsimplaeitiprire.Aflmcavemoinstanavariabilei
dinclasaPersoanadinmodulul__main__.
Observaicafosttipritiadresaundeestestocatobiectulnmemoriacalculatorului.Adresa
aceastavaaveaovaloarediferitnaltcalculatordeoarecePythonlstocheazundeareloc.

Metodeleobiectelor
Amdiscutatdejacobiectele/claselepotaveametode,exactcafunciile,doarcauunargument
selfnplus.Iatunexemplu.
#!/usr/bin/python
# Fiier: metoda.py

class Persoana:

71
def ziSalut(self):
print('Salut, ce mai faci?')

p = Persoana()
p.ziSalut()

# Acest exemplu poate fi scris i ca Persoana().ziSalut()

Rezultat:
$ python metoda.py
Salut, ce mai faci?

Cumfuncioneaz:
Aicivedemparticulaselfnaciune.ObservaicmetodaziSalutnuprimeteparametri,dar
totareargumentulselfndefiniiafunciei.

Metoda__init__
ExistmultenumedemetodecareauunntelesspecialnclaselePython.Acumvomafla
semnificaiametodei__init__.
Metoda__init__esteexecutatimediatceesteinstaniatunobiectalclasei.Metodaesteutil
pentruafaceiniializareadoritpentruobiectulrespectiv.Observaicnumeleestencadratcu
dubluunderscore.
Exemplu:
#!/usr/bin/python
# Fiier: class_init.py

class Persoana:
def __init__(self, nume):
self.nume = nume
def ziSalut(self):
print('Salut, numele meu este ', self.nume)

p = Persoana('Swaroop')
p.ziSalut()

# Acest exemplu putea fi scris Persoana('Swaroop').ziSalut()

Rezultat:
$ python class_init.py
Salut, numele meu este Swaroop

Cumfuncioneaz:
Definimmetoda__init__siaunparametrunume(pelngobinuitulself).nacestcaz
cremdoaruncmpnumitnume.Observaicdeiambelesuntnumite'nume',celedousunt
obiectediferite.Notaiacupunctnepermitesledeosebim.
Celmaiimportant,observaicnuapelmexplicitmetoda__init__ciitransmitemargumentele
nparantezdupnumeleclaseinmomentulcreriiobiectului/instanaaclasei.Aceastaeste
semnificaiaacesteimetode.

72
Acumputemsfolosimcmpulself.namenmetodelenoastre,ceeaceesteartatnmetoda
ziSalut.

Variabiledeclas,variabiledeinstan
Amdiscutatdejaparteadefuncionalitateaclaseloriobiectelor(adicmetodele),acumsnvm
cevadespreparteadedate.Parteadedate,aanumitelecmpuri,nusuntaltcevadectvariabile
obinuitecaresuntlegatedespaiiledenumealeclaseloriobiectelor.Astanseamncaceste
numesuntvalabilenumaincontextulclaseloriobiectelorrespective.Dinacestmotivacesteasunt
numitespaiidenume(engl.namespaces).
Existdoufeluridecmpurivariabiledeclasaivariabiledeobiect/instan,caresuntclasificate
nfunciedeproprietarulvariabilei.
Variabileledeclassuntpartajateelepotfiaccesatedetoateinstaneleaceleiclase.Existdoarun
exemplaralvariabileideclasicndoinstanimodificvaloarea,aceastmodificareestevzut
imediatdecelelalteinstane.
Variabileledeinstansuntproprietateafiecreiinstaneaclasei.nacestcaz,fiecareobiectare
propriulexemplaralaceluicmpadicelenusuntrelaionatenniciunfelcucmpurileavnd
acelainumenalteinsante.Unexempluvaajutalanelegereasituaiei:
#!/usr/bin/python
# Fiier: objvar.py

clasa Robot:
'''Reprezint un robot cu nume.'''

# O variabil de clas, numrtorul populaiei de roboi


populaie = 0

def __init__(self, nume):


'''Iniializeaz datele.'''
self.nume = nume
print('(Iniializez robotul {0})'.format(self.nume))

# Cnd aceast instan este creat, robotul se


# adaug la populaie
Robot.populaie += 1

def __del__(self):
'''Dispar...'''
print('{0} este dezmembrat!'.format(self.nume))

Robot.populaie -= 1

if Robot.populaie == 0:
print('{0} a fost ultimul.'.format(self.nume))
else:
print('Mai exist {0:d} roboi api de
lucru.'.format(Robot.populaie))

def ziSalut(self):
'''Salutare de la robot.

Da, pot s fac i asta.'''


print('Salut. Stpnii mei mi zic {0}.'.format(self.nume))

73
def ci():
'''Tiprete populaia curent.'''
print('Avem {0:d} roboi.'.format(Robot.populaie))
ci = staticmethod(ci)

droid1 = Robot('R2-D2')
droid1.ziSalut()
Robot.ci()

droid2 = Robot('C-3PO')
droid2.ziSalut()
Robot.ci()

print("\nRoboii pot s fac nite treab aici.\n")

print("Roboii au terminat treaba. Deci s-i distrugem.")


del droid1
del droid2

Robot.ci()

Rezultat:
(Iniializez robotul R2-D2)
Salut. Stpnii mei mi zic R2-D2.
Avem 1 roboi.
(Iniializez robotul C-3PO)
Salut. Stpnii mei mi zic C-3PO.
Avem 2 roboi.

Roboii pot s fac nite treab aici.

Roboii au terminat treaba. Deci s-i distrugem.


R2-D2 este dezmembrat!
Mai exist 1 roboi api de lucru.
C-3PO este dezmembrat!
C-3PO a fost ultimul.
Avem 0 roboi.

Cumfuncioneaz:
Esteunexemplulung,darajutlaevideniereanaturiivariabilelordeclasideinstan.Aici
cmpulpopulaieaparineclaseiRobotiestedeciovariabildeclas.Variabilanume
aparineobiectului(iesteatribuitfolosindself.)deciesteovariabildeobiect/instan.
AsadarnereferimlavariabiladeclaspopulaiecunotaiaRobot.populaieinucu
self.populaie.Nereferimlavariabiladeinstannumecunotaiaself.numenmetodele
aceluiobiect.Amintiivaceastdiferensimplntrevariabileledeclasideinstan.Mai
observaiicovariabildeobiectcuacelainumecaovariabildeclas,vaascundevariabilade
clasfademetodeleclasei!
Metodaciestenfaptometodaclaseiinuainstanei.Astanseamnctrebuiesodefinim
cudeclaraiaclassmethodsaustaticmethodDacvremstimcruispaiudenumei
aparine.ntructnuvremaceastainformaie,ovomdefinicustaticmethod.
Amfipututobineacelailucrufolosinddecoratori:
@staticmethod

74
def ci():
'''Tiprete populaia curent.'''
print('Avem {0:d} roboti.'.format(Robot.populaie))

Decoratoriipotficoncepuicascurtturipentruapelareaunordeclaraiiexplicite,aacumamvzut
nacestexemplu.
Observaicmetoda__init__estefolositpentruainiializacuunnumeinstanaclaseiRobot.
naceastmetod,mrimpopulaiecu1intructafostcreatncunrobot.Maiobservaiic
valoareaself.numeestespecificfiecruiobiect,ceeaceindicnaturadevariabildeinstana
variabilei.
Reineictrebuiesvreferiilavariabileleimetodeleaceluiaiobiectnumaicuself.Acest
moddeindicaresenumetereferinlaatribut.
nacestprogrammaivedemidocstringspentruclaseimetode.Putemaccesadocstringulclasei
nruntime(rom.timpulexecuiei)folosindnotaiaRobot.__doc__idocstringulmetodei
ziSalutcunotaiaRobot.ziSalut.__doc__
Exactcaimetoda__init__,maiexistometodspecial,__del__,careesteapelatatunci
cndunobiecttrebuiedistrus,adicnuvamaififolosit,iarresurseleluisuntreturnatesistemului.
naceastmetodreduceminumrulRobot.populaiecu1.
Metoda__del__esteexecutatdacobiectulnumaiestenfolosininuexistogaraniec
metodavamaifirulat.Dacvreisovedeiexplicitnaciune,vatrebuisfolosiideclaraiadel
cumamfcutnoiaici.
NotpentruprogramatoriinC++/Java/C#
Toimembriiuneiclase(inclusivmembriidate)suntpubliciitoatemetodelesuntvirtualn
Python.
Oexcepie:Dacfolosiimembriidatecunumecarencepcudubluunderscoreprecum
__var_privat,Pythonexploateazacestaspectichiarvafacevariabilasfieprivat.
Aadar,conveniaestecoricevariabilcarevremsfiefolositnumaincontextulclaseisau
obiectului,artrebuisfienumitcuprimulcaracterunderscore,iartoatecelelaltenumesunt
publiceipotfifolositedealteclase/instane.Reineicaceastaestedoaroconvenieinu
esteimpusdePython(exceptndprefixuldubluunderscore).

Motenire
Unbeneficiumajoralprogramriiorientatepeobiecteesterefolosireacoduluiiocaledeaobine
astaestemecanismuldemotenire.Motenireapoatefidescriscelmaibinecaicumar
implementaorelaientreuntipiunsubtipntreclase.
Szicemcscrieiunprogramncaretrebuiesineievidenaprofesoriloristudenilorntrun
colegiu.Eiauunelecaracteristicicomune,precumnume,adres,vrst.Eiauicaracteristici
specifice,cumarfisalariul,cursurileiperioadeledeabsen,pentruprofesori,respectivnotelei
taxelepentrustudeni.
Puteicreadouclaseindependentepentrufiecaretipiprocesaacesteclaseprinadugareade
caracteristicinoi.Aaprogramuldevinerepedeunhisnecontrolabil.
OcalemaibunarfiscreaioclascomunnumitMembruAlcoliiisfaceiclasele
studentiprofesorsmoteneascdelaaceastclas,devenindastfelsubclasealeacesteia,iapoi

75
sadugaicaracteristicilaacestesubtipuri.
Aceastabordarearemulteavantaje.Dacfacemvreoschimbarelafuncionalitateaclasei
MembruAlcolii,eaesteautomatreflectatinsubtipuri.Deexemplu,puteiadugaunnou
cmpcard IDipentrustudeniipentruprofesoriprinsimplaadugareaacestuialaclasa
MembruAlcolii.Totui,schimbriledinsubtipurinuafecteazaltesubtipuri.Altavantajestec
puteifacereferirelaunprofesorsaustudentcaobiectMembruAlcoliiobject,ceeacepoatefi
utilnanumitesituaiiprecumcalcululnumruluidemembriaicolii.Acestcomportamenteste
numitpolimorfism,ncareunsubtippoatefifolositnoricesituatiencareseateaptfolosirea
unuitipprinteadicobiectulpoatefitratatdreptinstanatipuluiprinte.
Observaiicrefolosimcodulclaseiprinteinuenevoieslrepetmnsubclasecumamfifost
nevoiidacamficreatclaseindependente.
ClasaMembruAlcoliinaceastsituaieestenumitclasabazsausuperclasa.Clasele
profesoristudentsuntnumiteclasederivatesausubclase.
Vomvedeaacestexemplupeunprogram.
#!/usr/bin/python
# Fiier: inherit.py

class MembruAlcolii:
'''Reprezint orice membru al colii.'''
def __init__(self, nume, vrst):
self.nume = nume
self.varsta = vrst
print('(Iniializez MembruAlcolii: {0})'.format(self.nume))

def descrie(self):
'''Afieaz detaliile mele.'''
print('Nume:"{0}" Vrst:"{1}"'.format(self.nume, self.vrst), end=" ")

class profesor(MembruAlcolii):
'''Reprezint un profesor.'''
def __init__(self, nume, vrst, salariu):
MembruAlcolii.__init__(self, nume, vrst)
self.salariu = salariu
print('(Iniializez Profesor: {0})'.format(self.nume))

def descrie(self):
MembruAlcolii.descrie(self)
print('Salariu: "{0:d}"'.format(self.salariu))

class student(MembruAlcolii):
'''Reprezint un student.'''
def __init__(self, nume, vrst, note):
MembruAlcolii.__init__(self, nume, vrst)
self.note = note
print('(Iniializez student: {0})'.format(self.nume))

def descrie(self):
MembruAlcolii.descrie(self)
print('Note: "{0:d}"'.format(self.note))

p = profesor('D-na. Shrividya', 40, 30000)


s = student('Swaroop', 25, 75)

print() # Afieaz o linie goal

76
membri = [p, s]
for membru in membri:
membru.descrie() # Funcioneaz i pentru profesor i pentru student

Rezultat:
$ python inherit.py
(Iniializez MembruAlcolii: Mrs. Shrividya)
(Iniializez profesor: D-na. Shrividya)
(Iniializez MembruAlcolii: Swaroop)
(Iniializez student: Swaroop)

Nume:"D-na. Shrividya" Vrst:"40" Salariu: "30000"


Nume:"Swaroop" Vrst:"25" Note: "75"

Cumfuncioneaz:
Pentruafolosimotenirea,specificmclaselebazntruntuplucareurmeaznumelendefiniia
clasei.Apoiobservmcmetoda__init__aclaseibazesteapelatexplicitfolosindvariabila
selfcasputeminiializaparteadinobiectcareprovinedinclasabaz.Estefoarteimportantde
reinutPythonnuapeleazaautomatconstructorulclaseibaz,trebuiesfaceiastaexplicit.
Maiobservmcapelurilectreclasabazsefacprefixindnumeleclaseiapeluluimetodelori
punndvariabilaselfmpreuncucelelalteargumente.
Seconfirmcfolosiminstaneleclaselorprofesoristudentcaicumarfiinstaneale
claseiMembruAlcoliicndfolosimmetodadescrieaclaseiMembruAlcolii.
nplus,observaicesteapelatmetodadescrieasubtipuluinumetodadescrieaclasei
MembruAlcolii.OcaledeantelegeastaestecPythonncepentotdeaunacutarea
metodelorntipulcurent,ceeacefacenacestcaz.Dacnuarfigsitmetoda,arficutatnclasele
printe,unacteuna,nordineaspecificatntupluldindefiniiaclasei.
Onotasupraterminologieidacantupluldemotenireestelistatmaimultdeoclas,acestcaz
estedemoteniremultipl.

Rezumat
Amexploratdiverseaspectealeclaseloriobiectelorprecumidiferiteterminologiiasociatecu
acestea.Amvzutdeasemeneabeneficiileipuncteleslabealeprogramriiorientatepeobiecte.
Pythonesteputernicorientatpeobiecteinelegereaacestorconceptevvaajutaenormncariera
deprogramator.
MaidepartevomnvastratmcuintrrileiieirileicumsaccesamfiierenPython.

77
Pythonro:Intrri/ieiri

Introducere
Existsituaiincareprogramullacarelucraitrebuiesinteracionezecuutilizatorul.Deexemplu,
vreispreluaidatedelautilizatoristipriiniterezultate.Putemfolosifunciileinput()i
print().
Pentruieire,putemfolosiidiversemetodealeclaseistr(string).Deexemplu,putemfolosi
metodarjustpentruaaliniajudiciosladreaptapeoanumitlungime.Asevedeahelp(str)
pentrudetaliisuplimentare.
Alttipobinuitdeintrare/ieireestelucrulcufiiere.Capacitateadeacrea,citiiscriefiiereeste
esenialpentruprogramelepecarelevomscrienacestcapitol.

Intrridelautilizator
#!/usr/bin/python
# FIier: user_input.py

def reverse(text):
return text[::-1]

def is_palindrome(text):
return text == reverse(text)

ceva = input('Introducei textul: ')


if (is_palindrome(ceva)):
print("Da, este un palindrom")
else:
print("Nu, nu este un palindrom")

Rezultat:
$ python user_input.py
Introducei textul: ir
Nu, nu este un palindrom

$ python user_input.py
Introducei textul: madam
Da, este un palindrom

$ python user_input.py
Introducei textul: racecar
Da, este un palindrom

Cumfuncioneaz:
Folosimfacilitateadefelierepentruainversatextul.Amnvatdejacumsfacemfeliidinsecvene
ntrepoziiileaibfolosindformulaseq[a:b].Putemdaiunaltreileaargumentcare
determinpasulfelierii.Pasulimpliciteste1motivpentrucarevarezultaoporiunecontinudin

78
text.Cuunpasnegativ,deexemplu-1textulvafiinversat.
Funciainput()iacaargumentunirilafieazutilizatorului.Apoiasteaptutilizatoruls
introduccevaisapesetastaENTER.nacelmomentfunciainput()vantoarcenprogram
textulintrodus.
Lumaceltextilinversm.Dacoriginalulitextulinversatsuntidentice,textulesteun
palindrom(definiiapentrulimbaengleza).
Temapentruacas:
Verificareacalitiidepalindromartrebuisignorepunctuaia,spaiileicazulcaracterelor.De
exemplu"Elefaccafele."estedeasemeneapalindrom,darprogramulnostruspunecnu.Putei
mbuntiacestprogramcasrecunoascacestpalindrom?

Fiiere
Puteideschidefiierepentruscrieresaucitireprincreareaunuiobiectdinclasafile(rom.fiier)
ifolosindmetodelesaleread,readlinesauwritedupcaz.Capacitateadeacitisauscrie
ntrunfiierdepindedemodulncareaispecificatfiierulndeclaraiadedeschidere.nfinal,
cndaiterminatlucrulcufiierul,puteiapelametodaclosepentruaidaluiPythonslnchid.
Exemplu:
#!/usr/bin/python
# Fiier: using_file.py
from __future__ import print_function

poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''

f = open('poem.txt', 'w') # Deschidere pentru scriere


# 'w' vine de la 'writing' (rom. scriere)
f.write(poem) # scriem textul n fiier
f.close() # nchidem fiierul
f = open('poem.txt') # Dac nu este specificat modul, se presupune citire, 'r'
vine de la 'read' (rom. citire)
while True:
linie = f.readline()
if len(linie) == 0: # Lungime 0 indic EOF - sfritul fiierului (engl. End
Of File)
break
print(linie, end='')
f.close() # nchidem fiierul

Rezultat:
$ python using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!

79
Cumfuncioneaz:
ntideschidemunfiierfolosindfunciapredefinitopenispecificndnumelefiieruluii
modulncarevremsfiedeschisfiierul.Modulpoatefi'modcitire'('r'),mod'scriere'('w')
saumod'adugarelasfrit'('a')(engl.append).Putemfolosii('t')pentrufiieretextsau
('b')pentrufiierebinare.nrealitateexistmultemoduriposibile,pecareleputeiaflalansnd
help(open).Implicit,open()considerfiierul't'extildeschidenmod'r'(citire).
nexemplulnostrudeschidemfiierulnmodscriereifolosimmetodawriteaobiectuluifiier
pentruascrienfiieriapoilnchidemcufunciaclose.
ncontinuaredeschidemacelaifiierdinnou,nmodcitire.Nuavemnevoiesspecificmmodul
deoareceestecelimplicit.Citimfiecareliniefolosindfunciareadlinentrobucl.Aceast
metodantoarceunrndcomplet,inclusivcaracterul'linienou'(engl.newline)delasfritulliniei.
Dacestereturnatunirgol(engl.empty),nseamncsaajunslasfritulfiieruluiiieimdin
buclcudeclaraia'break'.
Implicit,funciaprint()tiprestetextuliuncaracternewlinenmodautomatpeecran.
Suprimmcaracterulnewlineautomatspecificndend=''deoareceliniacititaredejauncaracter
newlinelasfrit.Lafinalnchidemfiierulcuclose.
Acumverificaiconinutulfiieruluipoem.txtpentruaconfirmacprogramulascrisntradevr
nfiieriacititdinacesta.

Conservarea
Pythonoferunmodulstandardnumitpickle(rom.aconserva,amura)cuajutorulcruiaputei
depozitaoriceobiectPythonntrunfiierpentrualreactivamaitrziu.Acestfaptsenumete
stocarepersistent.
Exemplu:
#!/usr/bin/python
# Fiier: pickling.py

import pickle

# Numele fiierului n care stocm obiectul


shoplistfile = 'shoplist.data'
# lista de cumprturi
shoplist = ['mere', 'mango', 'morcovi']

# Scriem n fiier
f = open(shoplistfile, 'wb')
pickle.dump(shoplist, f) # depunem (engl. dump) obiectul n fiier
f.close()

del shoplist # distrugem variabila shoplist

# Refacem din depozit


f = open(shoplistfile, 'rb')
storedlist = pickle.load(f) # ncrcm obiectul din fiier
print(storedlist)

Rezultat:

80
$ python pickling.py
['mere', 'mango', 'morcovi']

Cumfuncioneaz:
Pentruastocaunobiectntrunfiier,trebuiesdeschidemfiierulnmodscrierebinar('w'i'b')
cufunciaopenisapelmfunciadumpamodululuipickle.Acestprocessenumetepickling
(rom.conservare,figurativ:punerelamurat).
Apoirefacemobiectulfolosindfuncialoadamodululuipickle,carentoarceobiectul.Acest
processenumeteunpickling(rom.deconservare,figurativ:scoateredelamurat).

Rezumat
Amdiscutatvariatetipurideintrri/ieiriimanipulareafiierelorfolosindmodululpickle.
Acumvomstudiaconceptuldeexcepie.

81
Pythonro:Excepii

Introducere
Excepiilepotapreaatuncicndaparanumitesituaiiexcepionalenprogram.Deexemplu,dac
trebuiescitiiunfiier,daracestanuexist?Saudaclaitersaccidentalntimpulrulrii
programului?Astfeldesituaiisunttratatefolosindexcepii.
Similar,dacanprogramerauctevadeclaraiiinvalide?AcestesituaiisunttratatedePythoncare
ridicminileivspunecaexistoeroare.

Erori
Iatunexemplusimpludeapelalfuncieiprint.dacaaiscrisgreitPrintnlocdeprint?
Observaimajuscula.nacestcaz,Pythonridicoeroaredesintax.
>>> Print('Hello World')
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
Print('Hello World')
NameError: name 'Print' is not defined
>>> print('Hello World')
Hello World

ObservaicafostridicatoeroareNameErroriafostindicatpoziiaundeafostdetectat
eroarea.Astaesteaciuneauneirutinepentrutratareaerorii(engl.errorhandler).

Excepii
Vomncerca(engl.try)sprelumdatedelautilizator.Daictrl-divedeicesentmpl.
>>> s = input('Introducei ceva --> ')
Introducei ceva -->
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
s = input('Introducei ceva --> ')
EOFError: EOF when reading a line

PythonridicoeroarenumitEOFErrorceeacenseamnnesencagsitsimbolulendoffile
(caresereprezintaprinctrl-d)ntrunmomentncarenueraposibil.

Tratareaexcepiilor
Putemtrataexcepiilefolosinddeclaraiatry..except.Pescurt,punemdeclaraiileuzualen
blocultryitoatetratamenteledeerorinbloculexcept.
#!/usr/bin/python
# Fiier: try_except.py

82
try:
text = input('Introducei ceva --> ')
except EOFError:
print('De ce mi dai EOF?')
except KeyboardInterrupt:
print('Ai anulat operaia.')
else:
print('Ai introdus {0}'.format(text))

Rezultat:
$ python try_except.py
Introducei ceva --> # Dai ctrl-d
De ce mi dai EOF?

$ python try_except.py
Introducei ceva --> # Dai ctrl-c
Ai anulat operaia.

$ python try_except.py
Introducei ceva --> # fr excepii, acum
Ai introdus fr excepii, acum

Cumfuncioneaz:
Punemtoatedeclaraiilecarearputearidicaexcepii/erorinblocultryiapoipunemrutinede
tratarepentruerorile/excepiilerespectivenbloculexcept.Clauzaexceptpoatetrataosingur
eroaresauexcepiespecificat,sauolistnparantezeaexcepiilor/erorilor.Dacnusuntdate
numedeerori/excepii,sunttratatetoateerorileiexcepiile.
Reineictrebuiesexistemcaroclauzexceptasociatcufiecareclauztry.ncazcontrar
centelesareunbloctry?
Dacoeroaresauexcepienuestetratat,esteapelatrutinaimplicitdetratarealimbajuluiPython
carepurisimpluopreteexecuiaprogramuluiitiprestepeecranunmesajdeeroare.Amvzut
dejaasta.
Maipoateexistaioclauzelseasociatcuunbloctry..except.Clauzaelseesteexecutat
dacnuaparenicioexcepie/eroare.
nurmtorulexempluvomvedeacumsobinemobiectulexcepie,pentruaiextrageinformaii
suplimentare.

Ridicareaexcepiilor
Putetiridicaexcepiifolosinddeclaraiaraiseifurnizndnumeleerorii/excepieiiobiectulcare
urmeazafiaruncat(engl.thrown).
Eroareasauexcepiapecareoridicaitrebuiesfieoclasderivatdirectsauindirectdinclasa
Exception.
#!/usr/bin/python
# Fiier: raising.py

class ShortInputException(Excepie):
'''O clasa de excepii definit de utilizator.'''
def __init__(self, lungime, minim):

83
Excepie.__init__(self)
self.lungime = lungime
self.minim = minim

try:
text = input('Introducei ceva --> ')
if len(text) < 3:
raise ShortInputException(len(text), 3)
# Alte prelucrri pot continua aici ca nainte
except EOFError:
print('De ce mi dai EOF?')
except ShortInputException as ex:
print('ShortInputException: Ai introdus un text de lungime {0}, era necesar
minim {1}'\
.format(ex.lungime, ex.minim))
else:
print('Nu a fost ridicat nici o excepie.')

Rezultat:
$ python raising.py
Introducei ceva --> a
ShortInputException: Ai introdus un text de lungime 1, era necesar minim 3

$ python raising.py
Introducei ceva --> abc
Nu a fost ridicat nici o excepie.

Cumfuncioneaz:
Aicicremuntippropriudeexcepie.Acesttipnoudeexcepieestenumit
ShortInputException.Aredoucmpurilungimecareestelungimeaintroduceriii
minimcareestelungimeaminimacceptatdeprogram.
nclauzaexceptmenionmclasadeeroricarevafistocatsub numele(engl.as)variabilei
carevapstraobiectulexcepie.Astaesteanalogparametriloriargumentelornapelulfunciei.
Anumenaceastclauzexceptfolosimcmpurilelungimeiminimaleobiectuluiexcepie
pentruatipriunmesajadecvatctreutilizator.

try..finally
Spresupunemcvreiscitiiunfiierntrunprogram.Cumvasiguraicfiierulafostnchis
corectindiferentdacaaprutsaunuoeroare?Astasepoatefacefolosindbloculfinally.
Observaicputeifolosioclauzexceptmpreuncuclauzafinallypentruacelaibloctry.
Vatrebuisleimbricaidaclevreipeamndou.
#!/usr/bin/python
# Fiier: finally.py

import time

try:
f = open('poem.txt')
while True: # citirea obinuit
line = f.readline()
if len(line) == 0:
break

84
print(line, end='')
time.sleep(2) # Ca s ne asigurm c funcioneaz un timp
except KeyboardInterrupt:
print('!! Ai anulat citirea din fiier.')
finally:
f.close()
print('(Curenie: Am nchis fiierul)')

Rezultat:
$ python finally.py
Programming is fun
When the work is done
if you wanna make your work also fun:
!! Ai anulat citirea din fiier.
(Curenie: Am nchis fiierul)

Cumfuncioneaz:
Facemtreburilecurentelacitireafiierelor,daravemoateptarededousecundeintrodusarbitrar
duptiprireafiecareiliniifolosindfunciatime.sleepcasrulezemailent(Pythonestefoarte
rapidprinnaturalui).Cndprogramulncruleazapasaictrl-cpentruantrerupeprogramul.
ObservaicestearuncatexcepiaKeyboardInterruptiprogramulsencheie.Totui,
naintecaprogramulssencheie,clauzafinallyseexecutiobiectulfiierestentotdeaunanchis.

Declaraiawith
Achiziiauneiresursenblocultryieliberareaeinbloculfinallyesteoschemobinuit.
Dinacestmotivexistiodeclaraiewithcarepermitecaaceastutilizarearesurseissefac
ntromaniermaiclar:
#!/usr/bin/python
# Fiier: using_with.py

with open("poem.txt") as f:
for line in f:
print(line, end='')

Cumfuncioneaz:
Rezultatultrebuiesfielafelcanexemplulprecedent,diferenaestecacumfolosimfuncia
opencudeclaraiawithlsmnchidereafiieruluisfiefcutautomatdedeclaraiawith
open ....
Cesentmplnculiseesteunprotocolutilizatdedeclaraiawith.Eaextrageobiectulntorsde
funciaopen,sizicem"fiierul"nacestcaz.
Eaapeleazntotdeaunafunciafiierul.__enter__naintedeancepebloculdedeclaraii
pecarelincludeifunciafiierul.__exit__dupncheiereabloculuidedeclaraii.
Astfelcodulcarearfitrebuitsfiescrisnbloculfinallyestenlocuitautomatdemetoda
__exit__.Astfelsuntemajutaisevitmutilizareaexplicitadeclaraiilortry..finallyn
modrepetat.
Discuiamaiaprofundataacestuisubiectestedincolodeobiectivulacesteicrti,decivrogs
citiiPEP343pentruoexplicaiecomplet.

85
Rezumat
Amdiscutatutilizareadeclaraiilortry..exceptitry..finally.Amvzutcumputem
creapropriultipdeexcepieicumsridicmexcepii.
VomexplorancontinuarebibliotecaPythonstandard.

86
Pythonro:BibliotecaPythonstandard

Introducere
BibliotecaPythonstandardconineunnumruriademoduleutileiesteparteaoricreiinstalri
standardPython.Esteimportantsvfamiliarizaicubibliotecastandardntructmulteprobleme
potfirezolvaterapiddaccunoateiplajadelucruripecareacestemodulelepotface.
Vomexploractevamoduleutilizatemaifrecventdinaceastbibliotec.Detaliilecomplete(n
limbaenglez)desprebibliotecaPythonstandardpotfigsitencapitolul'LibraryReference'din
documentaiacarevinecuinstalareaPython.
Sexplormcatevamoduleutile.
Not
Dacacestesubiecteviseparpreaavansateputeitrecepesteacestcapitol.Totui,v
recomandcldurossreveniiatuncicndveifimaifamiliarizaicufolosirealimbajului
Python.

Modululsys
Modululsysconinefuncionalitatespecificsistemuluideoperare.Amaflatdejaclista
sys.argvconineargumentelelinieidecomand.
SzicemcvreisverificaiversiuneacomenziiPythonutilizate,szicempentruavasigurac
estecelpuinversiunea3.Modululsysdoastfeldefuncionalitate.
>>> import sys
>>> sys.version_info
(3, 0, 0, 'beta', 2)
>>> sys.version_info[0] >= 3
True

Cumfuncioneaz:
Modululsysareuntupluversion_infocaredainformaiadespreversiune.Primulelementd
versiuneamajor.Noioputemtestapentruaneasiguracprogramulruleazsubversiuneaminim
3.0:
#!/usr/bin/python
# Fiier: versioncheck.py
import sys, warnings
if sys.version_info[0] < 3:
warnings.warn("E nevoie de Python 3.0 sau ulterior pentru a rula acest
program",
RuntimeWarning)
else:
print('Continum normal')

Rezultat:

87
$ python2.5 versioncheck.py
versioncheck.py:6: RuntimeWarning: E nevoie de Python 3.0 sau ulterior pentru
a rula acest program

$ python3 versioncheck.py
Continum normal

Cumfuncioneaz:
Folosimaltmoduldinbibliotecastandard,numitwarnings(rom.avertizri)folositpentruaafia
utilizatoruluiavertismentepeecran.DacversiuneaPythonnuestecelpuin3,afimun
avertismentcorespunztor.

Modulullogging
Ceedefcutdacvreisstocaiundevamesajeimportantesaudedepanare,astfelnctsle
verificaimaitrziucasanalizaimersulprogramului?Cumstocaiundevaacestemesaje?Acest
obiectivpatefiatinsfolosindmodulullogging(rom.jurnalizare).
#!/usr/bin/python
# Fiier: use_logging.py
import os, platform, logging

if platform.platform().startswith('Windows'):
logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'),
'test.log')
else:
logging_file = os.path.join(os.getenv('HOME'), 'test.log')

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s : %(levelname)s : %(message)s',
filename = logging_file,
filemode = 'w',
)

logging.debug("nceputul programului")
logging.info("O prelucrare important")
logging.warning("ncheiere")

Rezultat:
$python use_logging.py
Logging to C:\Users\swaroop\test.log

Dacverificmconinutulfiieruluitest.log,vomgsicamaa:
2009-02-09 13:18:16,233 : DEBUG : nceputul programului
2009-02-09 13:18:16,233 : INFO : O prelucrare important
2009-02-09 13:18:16,233 : WARNING : ncheiere

Cumfuncioneaz:
Folosimtreimoduledinbibliotezastandardmodululospentruinteraciuneacusistemulde
operare,modululplatformpentruinformaiidespreplatformadicsistemuldeoperarei
modululloggingpentruajurnalizainformaii.

88
Lanceputverificmceversiunedesistemdeoperarefolosimprinanalizairuluintorsdefuncia
platform.platform()(pentruinformaiisuplimentareasevedeaimport platform;
help(platform)).DacesteWindows,determinmdriveulpecareseafldirectoarele
utilizatorului,directorulncaresegsescacesteainumelefiieruluincarevomstocainformaia.
Combinndacestetreipriputemstabilicaleantreagafiierului.Pentrualteplatformenetrebuie
doardirectorulutilizatoruluiiavemcaleacompletafiierului.
Folosimfunciaos.path.join()pentruareuniacestetreiprialecii.Motivulpentrucare
folosimofunciespecialnlocdesimplaconcatenareestegaraniacrezultatulvaficonform
ateptrilorsistemuluideoperare.
Configurmmodululloggingsscrietoatemesajelentrunformatanume,nfiierulspecificat.
nfinal,putemstocamesajepentrudebugging,urmrire,avertizaresauchiarmesajecritice.Odat
ceprogramulafostlansat,putemvedeacesantmplatnprogram,chiardacnuafostafiat
nimicpeecranutilizatoruluicarealansatprogramul.

Moduleleurllibijson
CtdedistractivarfidacaiputeascrieprogramecaresdearezultatulunorcutripeInternet?
Iasvedem.
Putemfaceastafolosindctevamodule.ntimodululurllibpecarelfolosimcasaduco
pagindepeInternet.VomfolosimotoruldecutareYahoo!pentruaobinerezultatelecutriii
dinfericireelnevadarezultatelecutriinformatJSONceeaceeuordeprocesatpentrunoi
datoritmodululuijsondinbibliotecastandard.
TODO
Acestprogramnufuncioneazncceeacepareafioeroare(engl.bug)nPython3.0beta2.

#!/usr/bin/python
# Fiier: yahoo_search.py

import sys
if sys.version_info[0] != 3:
sys.exit('Acest program necesit Python 3.0 sau ulterior')

import json
import urllib, urllib.parse, urllib.request, urllib.response

# V putei lua APP ID la http://developer.yahoo.com/wsregapp/


YAHOO_APP_ID =
'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr'
SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch'

class YahooSearchError(Excepie):
pass

# Luat de la http://developer.yahoo.com/python/python-json.html
def search(interogare, rezultate=20, start=1, **kwargs):
kwargs.update({
'appid': YAHOO_APP_ID,
'query': interogare,
'results': rezultate,
'start': start,
'output': 'json'

89
})
url = SEARCH_BASE + '?' + urllib.parse.urlencode(kwargs)
result = json.load(urllib.request.urlopen(url))
if 'Error' in result:
raise YahooSearchError(result['Error'])
return result['ResultSet']

query = input('Ce dorii s cutai? ')


for result in search(query)['Rezultat']:
print("{0} : {1}".format(result['Titlu'], result['Url']))

Rezultat:
TODO

Cumfuncioneaz:
Putemobinerezultatulcutriidelaunanumitwebsitedndiruldupcarecutm,ntrunanumit
format.Trebuiesspecificmmaimulteopiunipecarelecombinmfolosindformatul
cheie1=valoare1&cheie2=valoare2careesteprocesatdefuncia
urllib.parse.urlencode().
Deexemplu,deschideiacestlinknbrowserulweb(InternetExplorersausimilar)iveivedea20
derezultate,ncepndcuprimul,dupcuvintele"byteofpython",icurezultatulnformatJSON.
FacemoconexiunelaacestURLfolosindfunciaurllib.request.urlopen()itransmitem
aceareferinfuncieijson.load()carevaciticoninutulpaginiiivaconvertifiecarerezultat
ntrunobiectPython.Apoiciclmprinacesteobiecteileafimutilizatorului.

SeriaModululsptmnii
Suntmultedeexploratnbibliotecastandardcumarfidepanarea,gestiuneaopiunilorlinieide
comand,expresiileregulares.a.m.d.
CeamaibuncaledeacontinuaexplorareabiblioteciistandardestecitireaexcelenteiseriiModulul
PythonalsptmniialuiDougHellmann.

Rezumat
AmexploratopartedinfuncionalitateamultormoduledinbibliotecaPythonstandard.Este
recomandatsparcurgeidocumentaiabiblioteciiPythonstandardpentruavfaceoideeasupra
modulelordisponibile.
ncontinuarevomacoperidiverseaspectecarepotfacePythonmaicomplet.

90
Pythonro:Plus

Introducere
AmacoperitpnacummajoritateaaspectelordinPythonpecareleveiutiliza.nacestcapitol
vommaiacoperictevaaspectecarevor'rotunji'cunotinelevoastredesprePython.

Transmitereatuplurilor
Vaidoritvreodatsreturnaimaimulterspunsuridintrofuncie?Putei.Nutrebuiedects
folosiiuntuplu.
>>> def get_error_details():
... return (2, 'detalii eroarea 2')
...
>>> errnum, errstr = get_error_details()
>>> errnum
2
>>> errstr
'detalii eroarea 2'

Observaifolosireaformuleia, b = <o expresie>careinterpreteazrezultatuluneiexpresii


cafiinduntuplucudouvalori.
Dacvreisinterpretairezultatulca(a, <orice altceva>),trebuiesfolosiiasteriscul,ca
laparametriifunciilor:
>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]

AstanseamncceamairapidacaledeainterschimbadouvariabilenPythoneste:
>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)

Metodespeciale
Existanumitemetode,precum__init__i__del__careausemnificaiespecialnclase.
Metodelespecialesuntfolositepentruaimitaanumitecomportamentealetipurilorpredefinite.De
exemplu,dacvreisfolosiioperaiadeindexarex[cheie]pentruoclas(aacumaifolosio
pentrulistesautupluri),atuncinutrebuiedectsimplementaimetoda__getitem__()i
treabaestefcut.Dacvgndii,astafacePythonpentrunsiclasalist!
Ctevametodespecialefolositoaresuntlistatentabelulurmtor.Dacvreisstudiaitoate

91
metodelespecialeconsultaimanualul.
MetodeSpeciale
Nume Explicaie

__init__(self,...) Metodaesteapelatimediatnaintedereturnareaobiectuluinoucreat.

__del__(self) Apelatchiarnaintededistrugereaobiectului

__str__(self) Apelatpremergtorexecutriifuncieiprintsaustr().

Apelatcndsefoloseteoperatorulmaimicdect(<).Similar,exist
__lt__(self,altceva)
metodespecialepentrutoioperatorii(+,>,etc.)

__getitem__(self,
Apelatcndsefoloseteoperaiadeindexarex[cheie].
cheie)

Apelatcndsefolosetefunciapredefinitlen()pentruunobiect
__len__(self)
secven.

Blocuricuosingurdeclaraie
Amvzutcfiecareblocdedeclaraiiesteseparatdecelelalteblocuriprinniveluldeindentare.Ei
bine,acestaesteunpunctriscant.Dacbloculdedeclaraiiconineosingurdeclaratie,atuncio
puteispecificapeaceeailiniecudeclaraiacondiionalsaudeclaraiadeciclare.Exemplul
urmtorvaajutalaclarificareaproblemei:
>>> indicator = True
>>> if indicator: print 'Da'
...
Da

Observaicdeclaraiaunicestefolositpelocnuntrunblocseparat.Cutoatecputeifolosiasta
pentruaobineprogramemaimici,Euvrecomandcutriesnufolosiiaceastscurttura,cu
excepiacazuluicndverificaierorile,nspecialpentrucvafimultmaiuorsadaugio
declaraienplusdacfolosetiindentarea.

Formulelambda
Odeclaraielambdasefolosetepentruacreaobiectefuncienruntime.
#!/usr/bin/python
# Fiier: lambda.py

def repetor(n):

92
return lambda s: s * n

dublu = repetor(2)

print(dublu('cuvnt'))
print(dublu(5))

Rezultat:
$ python lambda.py
cuvntcuvnt
10

Cumfuncioneaz:
Folosimoformullambdanumitrepetorpentruacreafunciiobiectnruntimeialereturna
nprogram.nesen,formulalambdaprimeteunparametruurmatdeoexpresieuniccedevine
corpulfuncieiobiectivaloareaacesteifunciiestereturnatdenouafuncie.Reineicntro
formullambdanupoatefiutilizatnicimcarodeclaraieprint,cinumaiexpresii.
TODO
Putemexecutaofuncielist.sort()furnizndofunciedecompararegeneratcuo
declaraielambda?

puncte = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]


# puncte.sort(lambda a, b : cmp(a['x'], b['x']))

Includerideliste
Includeriledelistesuntfolositepentruaderivaolistnoudintrolistexistent.Szicemcavem
olistdenumereivremsobinemolistanumerelornmulitecu2darnumaidacnumruleste
maimaredect2.Includeriledelistesuntidealepentruaaceva.
#!/usr/bin/python
# Fiier: list_comprehension.py

lista1 = [2, 3, 4]
lista2 = [2*i for i in lista1 if i > 2]
print(lista2)

Rezultat:
$ python list_comprehension.py
[6, 8]

Cumfuncioneaz:
nacestexempluderivmnoualistspecificndprocesareanecesar(2*i)cndcondiiaeste
satisfcut(if i > 2).Observaicoriginalulrmneneschimbat.
Avantajulfolosiriiincluderilordelisteestecreducevolumuldedeclaraiinecesarelaciclareaprin
elementelelisteiistocareanaltlistarezultatelor.

93
Primireatuplurilorilistelornfuncii
Existocalespecialdeaprimiparametrintrofunciesubformdetuplusaudicionarfolosind
prefixul*,respectiv**.Aceastaesteutilatuncicndseprimeteunnumrvariabildeargumente
nfuncie.
>>> def sumadeputeri(putere, *argumente):
... ''' Intoarce suma argumentelor ridicate la o putere dat.'''
... total = 0
... for i in argumente:
... total += pow(i, putere)
... return total
...
>>> sumadeputeri(2, 3, 4)
25

>>> sumadeputeri(2, 10)


100

Deoareceavemprefixul*lavariabilaargumente,toateargumenteletransmisefuncieisunt
stocatenargumentecatuplu.Dacamfifolositprefixul**,parametriisuplimentariarfifost
consideraiperechicheie/valoarentrundicionar.

Funciileexecieval
FunciaexecsefolosetepentruaexecutadeclaraiiPythonstocatentrunirsaufiier,nun
programulnsui.DeexempluputemgeneranruntimeunirconinndcodPythonisl
executmfolosinddeclaraiaexec:
>>> exec('print("Hello World")')
Hello World

Similar,funciaevalestefolositcasevaluezeexpresiiPythonvalidestocatentrunir.Iatun
exemplusimplu.
>>> eval('2*3')
6

Declaraiaassert
Declaraiaassertestefolositpentruaafirmaceva.Deexempludacsunteifoartesiguricavei
celpuinunelementnlistapecareofolosiiivreisverificaiastaprinridicareauneieroridac
nueaadeclaraiaassertesteidealnaceastasituaie.DacdeclaraiaassertdFalse,este
ridicatoexcepieAssertionError.
>>> list= ['item']
>>> assert len(lista) >= 1
>>> lista.pop()
'item'
>>> lista
[]
>>> assert len(lista) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>

94
AssertionError

Declaraiaasserttrebuiefolositjudicios.Decelemaimulteoriestemaibinesprinziexcepii
fiectrateziproblemafiecafieziunmesajdeeroareinchiziprogramul.

Funciarepr
Funciareprsefolosetepentruaobineoreprezentarecanonicaobiectuluisubformdeir.
Parteainteresantestecveiaveaeval(repr(obiect)) == obiectaproapetottimpul.
>>> i = []
>>> i.append('item')
>>> repr(i)
"['item']"
>>> eval(repr(i))
['item']
>>> eval(repr(i)) == i
True

nesen,funciareprsefolosetepentruaobineoreprezentaretipribilaobiectului.Putei
controlacereturneazoclaspecareoscrieilaexecutareafuncieireprdefinindmetoda
__repr__naceaclas.

Rezumat
AmmaiacoperitctevafacilitialelimbajuluiPythonnacestcapitoldarncnuleamacoperitpe
toate.Totui,laacestnivelamacoperitmarepartedinceeaceveifolosivreodatnpractic.Asta
estesuficientpentrupornirenoriceprogramdoriiscreai.
MaidepartevomdiscutacumscontinumexplorarealimbajuluiPython.

95
Pythonro:Ceurmeaz
Dacaicititaceastcartecuateniepnacumiaiexersatomulimedeprograme,vai
familiarizatdejacuPython.Probabilaiscrisctevaprogramecasncercaidiverseideiisv
exersaiaptitudinile.Dacnuaifcutaa,artrebui.ntrebareaeste'Ceurmeaz?'
Vasugerasabordaiaceastproblem:
Creaivpropriacartedeadresecuinterfalaliniadecomand,pecareoputei
rsfoi,puteiaduga,terge,modificacontacteprecumprieteni,familiecolegietc.i
informaiilelorprecumadresadeemailinumruldetelefon.Detaliiletrebuiestocate
pentruoaccesarenviitor.

Astaestedestuldeuordacvgndiilaeaprinprismadiverselorelementestudiatepnacum.
Dacncmaivreiindicaiicumspornii,iatunpont.
Pont(nucitii)
Creaioclaspentruareprezentaopersoancuinformaiileei.Folosiiundictionarpentrua
stocaobiectelepersoancucheienumelelor.Folosiimodululpicklepentruastocaobiectele
nmodpersistentpeharddisc.Folosiimetodelepredefinitealedicionarelorpentruaaduga,
tergeimodificapersoanele.

Odatceputeifaceasta,puteispunecsunteiprogramatorPython.nacelmomenttrimiteimi
unemaildemulumirepentruminunatacarte;).Acestpasesteopional,darrecomandat.De
asemenea,vrogsluaincalculodonaie,participareacumbuntirisauvoluntariatulla
traduceripentruasusinedezvoltareacontinuacesteicri.
Dacprogramulvisaprutuor,iataltul:
Implementaicomandareplace.Aceastcomandvanlocuiunircualtulntrolistde
fiieredat.

Comandareplacepoatefiattdesimplsaudesofisticatcumvrei,delaosimplformulde
substituiedeiruripnlacutareadescheme(expresiiregulare).
Dupasta,maiexistctevacideavcontinuacltorianPython:

Coduriexemplificative
Ceamaibuncaledeanvaunlimbajdeprogramareestedeacitiiscriemultcod:
ProiectulPLEAC
DepozituldecodRosetta
exemplePythonlajava2s
CarteadebucatePythonesteocoleciefoartevaloroasdereeteiponturipentruarezolva
anumitetipurideproblemefolosindPython.Asteatrebuiecititeneapratdefiecareutilizator
Python.

96
ntrebriirspunsuri
DAuriiNUurioficialePython
FAQoficialPython
ListaluiNorvigdentrebrirare(engl.InfrequentlyAskedQuestions)
InterviucuntrebriirspunsuriPython
ntrebricutag'Python'peStackOverflow

Ponturisismecherii
(engl.tipsandtricks)
PythonTips&Tricks
AdvancedSoftwareCarpentryusingPython(rom.Tamplariesoftwareavansatafolosind
Python)
CharmingPythonesteoserieexcelentadearticoleinlegaturacuPythondeDavidMertz.

Carti,documentatii,tutoriale,filmulete
UrmatorulpaslogicdupacarteaaceastaestesacititiminunatacartealuiMarkPilgrimDiveInto
Python(romAprofundareinPython)pecareoputeticitisionline.CarteaDiveIntoPython
exploreazasubiectecaexpresiiregulare,procesaredeXML,serviciiweb,testarideunitati,etc.in
detaliu.
Alteresursefolositoaresunt:
filmuleteShowMeDopentruPython
filmuleteGoogleTechTalksdesprePython
ListadetutorialePythonaluiAwaretek
ZonaPythonEffbot's
LinkurilasfarsitulfiecarulmesajPythonURL!
DocumentatiiPython

Discuie
DacvncurcoproblemPythoninutiipecinesntrebai,grupuldediscuii
comp.lang.pythonestecelmaibunlocdeapunentrebarea.
Asiguraivcvaifcuttemancercndntisorezolvaisinguri.

Nouti
DacvreisnvaiceleaprutemainounlumeaPythonatuncimergeilaPlanetaoficial
Pythoni/sauPlanetaneoficialPython.

Instalareabibliotecilor
ExistunnumruriadebiblioteciopensourcepecareleputeifolosinprogramelaIndexul

97
pachetelorPython.
PentrualeinstalaiutilizaputeisfolosiiexcelentulutilitarEasyInstall.

Softwaregrafic
Szicemcvreisacreaipropriulprogramcuinterfagrafic(GUI)folosindPython.Astase
poatefacefolosindobibliotecaGUI(engl.GraphicalUserInterface)cuconexiunileeiPython.
LegturilesuntceeacenepermitesscriemprogramenPythonisfolosimbiblioteciscrisenC
sauC++,darinaltelimbaje.
ExistaomulimedeopiunideGUIcarefolosescPython:
PyQt
AceastaesteoconexiunePythonpentrukituldeutilitareQtcareestefundaiapecareeste
construitKDE.Qtesteextremdeuordefolositifoarteputernic,nspecialdatoritmediului
QtDesigneriuimitoareidocumentaiiQt.PyQtestefreedacvreiscreaisoftwareopen
source(licentaGPL)respectivtrebuieslcumparaidacvreiscreaisoftcusursele
protejate(nchise).ncepndcuQt4.5lputeifolosiipentruacreasoftnonGPL.Pentrua
ncepecitiitutorialulPyQtsaucarteaPyQt.

PyGTK
AceastaesteconexiuneaPythonpentrukituldeutilitareGTK+careestebazapecareeste
construitGNOME.GTK+aremultecomplicaiinutilizare,darndatacetefamiliarizezicu
el,poicreaaplicaiiGUIrapid.MediulGladedeproiectareainterfelelorgraficeeste
indispensabil.Documentaiamaitrebuiembuntit.GTK+lucreazbinepeLinux,iar
portareasapeWindowsesteincomplet.PuteicreacuGTK+attsoftopensourceisoft
nonGPL.PentruancepecitiitutorialulPyGTK.

wxPython
AcestaesteconexiuneaPythonpentrukituldeutilitarewxWidgets.wxPythonareasociato
curbadenvare.TotuiestefoarteportabiliruleazapeLinux,Windows,Macichiarpe
platformeimplantate(engl.embedded).ExistmulteIDEuridisponibilepentruwxPython
careincludmediideproiectareGUIprecumSPE(Stani'sPythonEditor)iconstructorulde
GUIwxGlade.PuteicreacuwxPythonattsoftopensourceisoftnonGPL.Pentruancepe
citiitutorialulwxPython.

TkInter
AcestaesteunuldincelemaivechikiturideutilitareGUI.DacaifolositIDLE,aivzut
programulTkInterlalucru.Nuarecelmaibunaspectiatmosferciunuldecoalaveche.
TkInteresteportabilimergeattpeLinux/UnixctipeWindows.Important,TkIntereste
parteadistribuieistandardPython.PentruancepecitiitutorialulTkinter.

PentrumaimulteopiunirsfoiipaginawikiGuiProgrammingdepewebsituloficialPython].

RezumatulutilitarelorGUI
DinnefericirenuexistpunutilitarGUIstandardpentruPython.Euvppropunspvpalegeiunadin
unelteledemaisus,nfunciedesituaie.Primulfactorestedacdoriispltiipentruvreunadin
unelteleGUI.AldoileafactordacvreismeargprogramulnumaipeWindows,numaipeMac

98
sauLinuxsaupetoate.Altreileafactor,dacafostaleasplatformaLinuxestedacsuntei
utilizatorKDEsauGNOMEsubLinux.
Pentruoanalizcomparativmaidetaliatcitiipagina26dinPublicaiaPython,Volumul3,
Numarul1.

Diverseimplementri
Deobiceiexistdouprialeunuilimbajdeprogramarelimbajuliprogramele.Unlimbajeste
cumsscriemceva.Programulesteceeacesefolosetepentruarulaprogramele.
Pentruarulaprogramelenoastreamfolositsoftwareul(pescurtsoftul)CPython.Isespune
CPythonpentrucestescrisnlimbajulCiesteinterpretorulPythonclasic.
MaiexistialtesofturicarepotrulaprogramePython:
Jython
OimplementarePythoncareruleazpeplatformaJava.Astanseamncputeifolosi
bibliotecileJavaiclasedinPythonireciproc.
IronPython
OimplementarePythoncaremergepeplatforma.NET.Astanseamncputeifolosi
bibliotecile.NETiclasedinPythonireciproc.
PyPy
OimplementarePythonscrisnPython!Acestaesteunproiectdecercetareavndca
obiectivscriereaunuiinterpretorcaresfieuordembuntitntructinterpretorulnsui
estescrisntrunlimbajcutipuridinamice(spredeosebiredelimbajelecutipuristatice,
precumC,JavasauC#nacestetreiimplementri)
StacklessPython
OimplementarePythonspecializatpentruperformanorientatpefirdeexecuie.

Maiexistialtele,precumCLPythonOimplementarePythonscrisnCommonLispi
IronMonkeycareesteoportareaIronPythonpentruamergesusinutdeuninterpretorJavaScript
ceeacearputeansemnacpotfiscriseprogramedewebbrowser("Ajax")nPython(nlocde
Javascript).
Fiecaredinacesteimplementriaredomeniuleincareesteutil,datoritspecializrii.

Rezumat
Amajunslasfritulacesteicri,darcumsespuneestenceputulsfritului!.Acumsunteiun
utilizatoraviddePythonifrndoialsuntetigatasrezolvaimulteproblemefolosindPython.
Putetisncepeisautomatizaicalculatorulsfactotfeluldelucruri,deneimaginatpnacum
sauputeiscriepropriilejocuriimultealtele.Decisncepem!

99
Pythonro:ApendixFLOSS

Free/LibreandOpenSourceSoftware(FLOSS)
FLOSSestebazatpeconceptuldecomunitatecareesteelnsuibazatpeconceptuldepartajare,n
particularpepartajareacunotinelor.FLOSSsuntliberepentruutilizare,modificareiredistribuire.
Dacaicititdejacarteaaceasta,sunteidejafamiliarcuFLOSSntructaifolositPythontot
timpul,iarPythonestesoftware'opensource'!
IatctevaexempledeFLOSSpentruadaoideedespregenuldelucruripecarelepoatecreao
comunitatecareconstruietencomun:
Linux.AcestaesteunsistemdeoperareFLOSSPecarencet,ncetlmbrieaztoat
lumea!ElafostiniiatdeLinusTorvaldspecnderastudent.Acumesteunconcurentserios
pentruMicrosoftWindows.[NucleulLinux]
Ubuntu.Aceastaesteodistribuiemeninutdeocomunitate,sponsorizatdefirma
Canonicaliesteceamaipopulardistribuienzilelenoastre.Eavpermitesinstalaio
mulimedeFLOSSdisponibileitoatentromanierauordeinstalatifolosit.Maimult
dectatt,puteirestartacalculatorulirulaLinuxdepeunCD!Acestlucruvpermites
ncercaitoatefacilitilenouluisistemdeoperarenaintedealinstalancalculator.
[UbuntuLinux]
OpenOffice.org.Aceastaesteosuitdeaplicaiidebiroucueditordetext,prezentri,foide
calculicomponentededesenareprintrealtele.PoatedeschideieditachiarifiiereMS
WordiMSPowerPointcuusurin.Ruleazpemaitoateplatformele.[OpenOffice]
MozillaFirefox.Acestaestebrowserulwebalnoiigeneraiicareoferoadevarat
competiieluiInternetExplorer.Esterapidcafulgeruliaprimitfelicitriimportantepentru
facilitilesalesensibileiimpresionante.Conceptuldeextensiepermitefolosireaoricrui
feldeplugin(rom.implant).
ProdusulsupartenerThunderbird(rom.pasreafulger)esteunexcelentclientdeemail
careciteteemailulctaiclipi.[MozillaFirefox,MozillaThunderbird]
Mono.Acestaesteunsoftopensourcecareimplementeazplatforma.NETcreatde
Microsoft.Elpermiteaplicaiilor.NETsfiecreateisrulezepeLinux,Windows,
FreeBSD,MacOSipemultealteplatforme.[Mono,ECMA,Microsoft.NET]
ServerulwebApache.Acestaestebinecunoscutulserverwebopensource.Defapt,estecel
maipopularserverwebdepeplanet!Elruleazmaimultdejumtatedinwebsiturile
existente.Da,aaeApachesusinemaimultewebsituridecttoatcompetiialaunloc
(inclusivMicrosoftIIS).[Apache]
MySQL.Acestaesteunserverdebazededateopensource.Estefaimospentruvitezasa
fulgertoare.EsteMdinfaimoasasuitLAMPcareruleazmajoritateawebsiteurilordepe
Internet.[MySQL]
VLCPlayer.AcestaesteunplayervideocarepoateredaoricedelaDivXlaMP3laOggla
VCDuriiDVDurii...cinezicecopensourcenuemito?;)[VLCmediaplayer]
GeexBoxesteodistributieLinuxproiectatsredeafilmedendatcebutezidepeunCD!
[GeexBox]

100
AceastlistvreadoarsvfaceioideeexistmulteFLOSSexcelente,precumlimbajulPerl,
limbajulPHP,sistemulDrupaldemanagementalconinutuluiwebsiturilor,serveruldebazededate
PostgreSQL,joculdecurseTORCS,KDevelopIDE,playeruldefilmeXine,editorulVIM,Editorul
Quanta+,playerulaudioBanshee,programuldeeditaredeimaginiGIMP,...Listaarputeainela
nesfrit.
PentruaprindecelemairecentesubiectedinlumeaFLOSS,accesaiurmtoarelewebsituri:
linux.com
LinuxToday
NewsForge
DistroWatch
VizitaiurmtoarelewebsituripentruinformaiidespreFLOSS:
SourceForge
FreshMeat
Aadar,naintenexplorareaimenseilumilibere(engl.free)ideschise(engl.open)FLOSS!

101
Pythonro:ApendixDespre...

Aprecierefinal
Aproapetotsoftulfolositlacreareaacesteicriestefreeiopensource.

Natereaacesteicri
nprimuldraftaleiamfolositLinuxRedHat9.0cabazamediuluimeudelucruincepndcual
aseleadraftLinuxFedoraCore3.
IniialfoloseamKWordpentruascriecartea(cumamexplicatnleciadeistoriedinprefa).

Aniiadolescenei
MaitrziuamtrecutpeDocBookXMLfolosindKate,darlamconsideratgreoi.Aacamtrecut
laOpenOfficecareaveauncontrolexcelentalformatriiialgenerriidePDF,darproducea
documenteHTMLcamopite.
nfinalamdescoperitXEmacsiamrescriscarteadela0nDocBookXML(dinnou)dupceam
deciscaceastaestesoluiadetermenlung.
nalaseleadraftmamhotrtsfolosescQuanta+pentrutoataeditarea.Foloseamfoiledestiluri
XSLcareauvenitcuFedoraCore3ifonturileimplicitestandard.Totui,amscrisundocument
CSSpentruadaculoareistilpaginilorHTML.Amscrisiunanalizorlexicalbrut,nPython
desigur,careaduceaevideniereaautomatasintaxeintoatelistingurile.

Acum
Pentruacestalapteleadraft,folosescMediaWikicabazaaranjamentului.Acumediteztotul
onlineicititoriipotciti/edita/comentadirectnsitulwiki.
ncfolosescVimpentrueditaredatoritextensieiViewSourceWithpentruFirefoxcarese
integreazcuVim.

Despreautor
http://www.swaroopch.com/about/

102
Pythonro:ApendixIstoriculreviziilor
1.90
04/09/2008incevolueaz
Reveniredupunsaltpeste3.5ani!
UpdatarealaPython3.0
RescrierefolosindMediaWiki(dinnou)
1.20
13/01/2005
RescrierecompletfolosindQuanta+peplatformaFC3cuomulimedecorecturii
actualizri.Multeexemplenoi.RescrisaranjamentulDocBookdela0.
1.15
28/03/2004
Reviziiminore
1.12
16/03/2004
Adugiriicorecturi.
1.10
09/03/2004
Altecorecturidactilodatoratemultorcititoriutiliientuziati.
1.00
08/03/2004
Dupaenormdemultfeedbackisugestiidelacititoriamfacutmultemodificrila
coninuticorecturidactilo.
0.99
22/02/2004
Adaugtuncapitolnou,despremodule.Adugatdetaliidesprenumrulvariabilde
argumentenfuncii.
0.98
16/02/2004
ScrisscriptPythonifoaiedestiluriCSSpentruambuntirezultatulXHTML,
inclusivunanalizorlexicalbrut,darfuncionalpentruevideniereasintaxeinstil
Vimnlistinguriledeprograme.
0.97
13/02/2004
Altdraftcompletrescris,dinnouinXMLDocBook.Carteaafostmbuntit
masivestemaicoerentilizibil.
0.93
25/01/2004
AdugatdiscuiadespreIDLEialtelespecificeWindows
0.92
05/01/2004

103
Schimbrilauneleexemple.
0.91
30/12/2003
Corectatdactilo.Improvizatmaimultesubiecte.
0.90
18/12/2003
Adaugtnc2capitole.FormatOpenOfficecurevizii.
0.60
21/11/2003
Rescrisiexpandatcartea.
0.20
20/11/2003
Corectatcatevaeroriminoreidactilo.
0.15
20/11/2003
ConversienXMLDocBook.
0.10
14/11/2003
DraftiniialeditatcuKWord.

104

S-ar putea să vă placă și