Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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 >>>
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
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
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
Rezumat
Acumartrebuisputeiscrie,salvairulacuuurinprogramePython.Pentrucaaidevenit utilizatordePython,smainvmctevaconceptedinPython.
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".
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
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)
Seobinerezultatul:
Acesta este un ir care continu pe a doua linie.
Similar,
print\ (i)
estelafelca
print(i)
20
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 >>>
Plus
adundouobiecte
Minus
-5.2facenegativnumrul5.2 50 - 24fac26.
Inmulire
23
**
Putere
dxlaputereay
3 ** 4d81 (adic3 * 3 * 3 * 3)
mprire
mpartexlay
4 / 3d1.3333333333333333.
//
mprire ntreag
dparteantreaga ctului
4 // 3fac1.
Modulo
drestulmpririi
<<
Translaiela stnga
>>
Translaiela dreapta
&
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.
>
Maimare (dect)
<=
Maimicsau egal(cu)
x = 3; y = 6; x <= ydTrue.
>=
Maimaresau egal(cu)
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
and
Ilogic
x = False; y = True; x and ydFalsentructxesteFalse.n acestcaz,Pythonnuvaevaluapey fiindctiecparteastngaexpresiei 'and'esteFalseceeacedntregii expresiivaloareaFalseindiferentde celelaltevalori.Acestfaptsenumete evaluarencircuitscurt.
or
SAUlogic
Prescurtarepentruoperaiimatematiceiatribuiri
Esteuzualsfacioprelucrarematematicauneivariabileispstreziapoirezultatultotnea;de aceeaexistoprescurtarepentruacestfeldeexpresii: nlocde:
a = 2; a = a * 3
puteiscrie:
a = 2; a *= 3
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
Testedeidentitate
Ibinar Translaii
27
Referinlaatribut
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
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
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
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!
Parametriifunciilor
Ofunciepoateacceptaparametri,caresuntvalorifurnizatefuncieipentrucaaceastaspoatface cevacuacestevalori.Acetiparametrisuntcavariabilelenumaicvalorileacestorvariabilesunt definitenmomentulapeluluifuncieiidejalesuntatribuitevalorilamomentulexecutriiblocului funciei. 36
Rezultat:
$ python func_param.py 4 este maximum 7 este maximum
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
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
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
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
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
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
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']
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 >>>
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
Rezultat:
$ python meu_demo.py Salut, aici este modulul meu. Versiunea 0.1
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
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
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'
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']
Seturi
Seturilesuntcoleciineordonatedeobiectesimple.Acesteasuntfolositeatuncicandexistenaunui 58
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']
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
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
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
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)
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?
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
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
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
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
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.
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)
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
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
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
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'
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
Formulelambda
Odeclaraielambdasefolosetepentruacreaobiectefuncienruntime.
#!/usr/bin/python # Fiier: lambda.py def repetor(n):
92
Rezultat:
$ python lambda.py cuvntcuvnt 10
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]
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
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
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
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
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
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