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.

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.

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

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)

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.

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. 2. 3. 4. 5. 6. 7. 8. engl.syntaxhighlighting autorulminunateicri'BeginningPerl' terminalLinuxsauDOSprompt sensibilfadecazulcaracterelorn.tr.minuscule/majuscule engl.change engl.all engl.username 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

Plus

adundouobiecte

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

Minus

fiefaceunnumrs fienegativfied diferenantredou numere

-5.2facenegativnumrul5.2 50 - 24fac26.

Inmulire

dprodusuladou numeresaurepetarea unuiirdenumrul specificatdeori

2 * 3fac6 'la' * 3d'lalala'.

23

**

Putere

dxlaputereay

3 ** 4d81 (adic3 * 3 * 3 * 3)

mprire

mpartexlay

4 / 3d1.3333333333333333.

//

mprire ntreag

dparteantreaga ctului

4 // 3fac1.

Modulo

drestulmpririi

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

<<

Translaiela stnga

Translateazabiiiunui numrlastngacu numrulspecificatde bii.(Oricenumr estereprezentatn memoriesubforma debiicifrebinare0 i1)

2 << 2da8 2estereprezentatprin10nbii.Prin translaielastngacudoibiiseobine 1000ceeacereprezintnumrul8.

>>

Translaiela dreapta

Translateazabiii numruluiladreapta cunumrulspecificat debii.

11 >> 1d5 11estereprezentatnbiiprin1011 caretranslatatladreaptacuunbitd 101ceeacereprezintnumrul5.

&

AND

Ibinarntrenumere

5 & 3da1.

OR

SAUbinarntre numere

5 | 3d7

XOR

SAUexclusivbinar ntrenumere

5 ^ 3fac6

Complement binar

complementulluix este(x+1)

~5d-6.

24

<

Maimic (dect)

Valoareadeadevra propoziieixestemai micdecty.Toi operatoriide comparaieiau valorilelogiceTrue sauFalse. Observaicaceste numencepcu majuscul.

5 < 3dFalse 3 < 5dTrue. Comparaiilepotfinlnuitearbitrar:3 < 5 < 7dTrue.

>

Maimare (dect)

Valoareadeadevra propoziieixestemai maredecty.

5 > 3dTrue.Dacambiioperanzi suntnumere,acetiasuntconvertiinti launtipcomun.ncazcontraroperaia araveamereuvaloareaFalse.

<=

Maimicsau egal(cu)

Valoareadeadevra propoziieixestemai micsaucelmultegal cuy.

x = 3; y = 6; x <= ydTrue.

>=

Maimaresau egal(cu)

Valoareadeadevra propoziieixestemai maresaucelpuin egalcuy.

x = 4; y = 3; x >= 3daTrue.

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

!=

Diferit(de)

Verificdacdou numeresuntdiferite

x = 2; y = 3; x != ydTrue.

25

not

NUlogic

dacxesteTrue,d False.Dacxeste False,dTrue.

x = True; not xdFalse.

and

Ilogic

x and ydFalse dacxesteFalse, altfeldvaloarealuiy

x = False; y = True; x and ydFalsentructxesteFalse.n acestcaz,Pythonnuvaevaluapey fiindctiecparteastngaexpresiei 'and'esteFalseceeacedntregii expresiivaloareaFalseindiferentde celelaltevalori.Acestfaptsenumete evaluarencircuitscurt.

or

SAUlogic

dacxesteTrue,d True,altfeld valoarealuiy

x = True; y = False; x or y dTrue.iaiciseaplicevaluarean 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 lambda or and notx in,notin is,isnot Expresielambda SAUlogic Descriere

Ilogic NUlogic Testedeapartenen

Testedeidentitate

<,<=,>,>=,!=,== Comparaii | ^ & <<,>> +, *,/,//,% +x,x ~x ** SAUbinar SAUexclusivbinar

Ibinar Translaii

Adunareiscdere nmulire,mprire,mprirentreag,modulo Pozitiv,negativ NUbinar Exponeniere

27

x.atribut x[index] x[index1:index2] f(argumente...) (expresii,...) [expresii,...] {cheie:date,...}

Referinlaatribut

Referinlaelement Feliere Apellafuncie Legturasauafiareaunuicuplu Afiareauneiliste Afiareaunuidicionar

Operatoriipecarenuiamntlnitpnacumvorfidescriincapitoleleviitoare. Operatoriicuaceeaiprecedensuntlistainacelairndntabelulanterior.Deexemplu,+iauaceeaipreceden.

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-elifelse.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:
$ a a a python func_key.py este 3 i b este 7 i c este 10 este 25 i b este 5 i c este 24 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' 'Larry' 'Matsumoto' 'Spammer' : : : : 'swaroop@swaroopch.com', 'larry@wall.org', 'matz@ruby-lang.org', '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 print('Itemurile de la print('Itemurile de la print('Itemurile de la # Felierea unui ir print('Caracterele de print('Caracterele de print('Caracterele de print('Caracterele de 1 la 3 sunt', shoplist[1:3]) 2 la sfrsit sunt', shoplist[2:]) 1 la -1 sunt', shoplist[1:-1]) nceput la sfrit sunt', shoplist[:]) 1 la 3 sunt', nume[1:3]) 2 la end sunt', nume[2:]) 1 la -1 sunt', nume[1:-1]) nceput la sfrit sunt ', nume[:])

la la la la

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. 2. 3. 4. 5. Fiiereleidirectoarelecaretrebuiesalvatesuntspecificatentrolist. Backupultrebuiestocatndirectorulprincipaldebackup Fiierelesuntstocatentroarhivzip. Numelearhiveizipestedataiora. 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. 2. 3. 4. 5. 6. Ce(Analiza) Cum(Design) Executare(Implementare) Test(Testareieliminareerori) Utilizare(Operaresaudistribuire) 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 --> De ce mi dai EOF? $ python try_except.py Introducei ceva --> Ai anulat operaia. # Dai ctrl-d

# Dai ctrl-c

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


>>> >>> 1 >>> [2, a, *b = [1, 2, 3, 4] a b 3, 4]

AstanseamncceamairapidacaledeainterschimbadouvariabilenPythoneste:
>>> >>> >>> (8, a = 5; b = 8 a, b = b, a a, b 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 __init__(self,...) __del__(self) __str__(self) Explicaie Metodaesteapelatimediatnaintedereturnareaobiectuluinoucreat. Apelatchiarnaintededistrugereaobiectului Apelatpremergtorexecutriifuncieiprintsaustr(). Apelatcndsefoloseteoperatorulmaimicdect(<).Similar,exist metodespecialepentrutoioperatorii(+,>,etc.)

__lt__(self,altceva)

__getitem__(self, cheie)

Apelatcndsefoloseteoperaiadeindexarex[cheie].

__len__(self)

Apelatcndsefolosetefunciapredefinitlen()pentruunobiect 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 CarteadebucatePython esteocoleciefoartevaloroasdereeteiponturipentruarezolva anumitetipurideproblemefolosindPython.Asteatrebuiecititeneapratdefiecareutilizator Python.

96

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

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

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 1.20 1.15 1.12 1.10 1.00 04/09/2008incevolueaz Reveniredupunsaltpeste3.5ani! UpdatarealaPython3.0 RescrierefolosindMediaWiki(dinnou) 13/01/2005 RescrierecompletfolosindQuanta+peplatformaFC3cuomulimedecorecturii actualizri.Multeexemplenoi.RescrisaranjamentulDocBookdela0. 28/03/2004 Reviziiminore 16/03/2004 Adugiriicorecturi. 09/03/2004 Altecorecturidactilodatoratemultorcititoriutiliientuziati. 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

0.91 0.90 0.60 0.20 0.15 0.10

Schimbrilauneleexemple. 30/12/2003 Corectatdactilo.Improvizatmaimultesubiecte. 18/12/2003 Adaugtnc2capitole.FormatOpenOfficecurevizii. 21/11/2003 Rescrisiexpandatcartea. 20/11/2003 Corectatcatevaeroriminoreidactilo. 20/11/2003 ConversienXMLDocBook. 14/11/2003 DraftiniialeditatcuKWord.

104