A Byte of Python
A Byte of Python
Pentrucineesteaceastcarte
[Link] principalsprenceptori,darestefolositoripentruprogramatoriavansai. Obiectivulestecadactotceeacetiidesprecalculatoareestecumssalvezifiieretext,atuncis [Link],deasemenea poinvadinaceastacarte. Dacaiexperienanterioar,veifipreocupatdediferenelentrePythonilimbajultude [Link],totui:Pythonva ajungencurndlimbajultudeprogramarefavorit!
Leciedeistorie
AmnceputlucrulcuPythoncndaveamnevoiesscriuuninstallerpentruunprogrampecarel amscris,numit'Diamond'[Link] [Link],faimosul irespectatulhacker,[Link] [Link] Pythoneralimbajulcaremitrebuie. Asteafiindfcute,[Link]!Amgsit nitecriO'Reilly,dareraufiepreascumpefieeraumaimultmanualdereferinedectghid. [Link],erapreascurticoncis. DdeaoideedestuldebundesprePython,[Link],fiindcaveam experienanterioar,dareraneadecvatpentrunceptori. LacircaaselunidupprimulmeucontactcuPython,aminstalat(peatunci)ultimaversiunede [Link] [Link] [Link],aceastaa [Link] aceastcartemicameacontribuielacomunitateaopensource. CarteameaanceputcanitenotepersonaledesprePythonieuoconsideraancontinuare,dei amfcutmarieforturipentruaofacemaiplcutcelorlali:) nadevratulspiritopensource,amprimitomulimedesugestii,criticiconstructiveireaciidela cititorientuziaticaremauajutatmultsmbuntescaceastcarte.
Stareacrii
Modificrilededupultimareviziemajordinmartie2005suntactualizarialelansriiPython3.0 (datadelansareestimatnAugust/Septembrie2008).ncepndcuPython3.0,limbajulnsuinu estencfinalizat/lansat,[Link],nspiritulfilosofiei opensource"Lanseazndevans,lanseazfrecvent",carteaactualizatafostlansativafi actualizatconstant. Carteanecesitajutorulcititoriloreicaresaindiceoriceprialecriicarenusuntbune,nusunt [Link] sugestiilevoastre. Esteoluptpermanentscntretintrenevoilenceptoruluiitendinaspre'completitudinea' [Link] artrebuisptrundemnsubiect.
Websiteoficial
Websiteuloficialalacesteicriesteacesta,undesepoatecitintreagacarteonline,descrca ultimaversiuneacrii,cumpraocopietipritimisepottrimitereaciilefadecarte.
Licen
1. AceastcarteesteliceniatsublicenaCreativeCommonsAttributionShareAlike3.0 Unported. Censeamnacestlucru: Poicopia,distribuiitransmiteaceastcartemaideparte Poiremixaconinutulsladaptezicumvrei Suburmtoarelecondiii: [Link] aafelnctsseneleagcautoruloriginaliofersuport. [Link] bazaacesteia,trebuiesdistribuinoulconinutsubolicensimilari compatibilsausublicenaoriginal. Pentruoricefolosiresaudistributie,trebuiesfaciclarlicenasubcareseaflacest material Oricaredintrecondiiiledemaisuspotfianulatedoarcupermisiuneadeintorului decopyright. Nimicprevzutnaceastalicennuatacdrepturilemoralealeautorului 2. Atribuireatrebuieartatprinadaugreaunuilinknapoilaautoriindicareaclarctextul originalsepoatedownloadadelaacealocaie 3. ntregcodulsursdinaceastcarteesteliceniatsublicenaBSDcu3meniunidacnuse specificaltlicen 4. Contribuiiledevoluntariatlamaterialuloriginaltrebuiesfiesubaceailiceniar copyrightultrebuiesrmnalautoruluioriginalalacestuimaterial.
Reacii
[Link],dacapreciaiunele pricsuntinconsistentesauincorectesaupurisimpluconsideraicnecesitmbuntiri,v rogsminformai,[Link] meledeutilizator.
Cumpraicartea
Dacvreissusineidezvoltareacontinuaacesteicri,vrogsluaincalculposibilitateadea cumpraocopietipritsaudeafaceodonaie.
Subiectdegndire
Existdoucideafaceundesigndesoftware:unaestedealfaceattdesimplunct nmodevidentnuaredeficiene;cellaltestedealfaceattdecomplicatnctsnui fieevidentedeficienele. [Link] Succesulnvianuesteattochestiunedetalentioportunitatectdeconcentrarei perseveren. [Link]
Pythonro:Introducere
Introducere
Pythonesteunuldintrepuinelelimbajedeprogramarecarepotsusinecsuntnacelaitimpi [Link] pesoluiaproblemeiinupesintaxaistructuralimbajuluincareprogramezi. TextuldeintroducereoficialpentruPythoneste: [Link] eficienteioabordaresimpldarefectivasupraprogramriiorientatepeobiecte. SintaxaelegantaluiPythonimoduldinamicdeselecieatipuluidedate,mpreuncu naturasadelimbajinterpretat,lfaceunlimbajidealpentruscriptareipentru dezvoltarerapiddeaplicaiinmultedomeniiipemajoritateaplatformelorexistente. Majoritateafacilitilorsalevorfidiscutatemaindetaliuncapitolulurmtor. Not GuidovanRossum,creatorullimbajuluiPython,iabotezatlimbajuldupaspectacolulBBC "MontyPython'sFlyingCircus"(CirculzburtoralluiMontyPython).Defaptelnuprea agreeazerpiiconstrictori,careucidanimalepentruhranstrivindule.
FacilitileluiPython
Simplu [Link] aceeaisenzaiecaicitireauneinuvelenenglez,deicuogramaticfoartestrict!Aceast [Link] concentreziasuprasoluieiproblemeimaidegrabadectasupralimbajuluinsui. Uordenvat Aacumveivedea,[Link] extraordinardesimpl. Gratisiopensource PythonesteunexempludeFLOSS(Free/LibreandOpenSourceSoftware).ntermenisimpli, poidistribuilibercopiialeacestuisoftware,citicodulsurs,modifica,folosipridineln [Link] [Link] mbuntitconstantdeocomunitatecarepurisimpluidoretesvadunPythontotmai bun. Limbajdenivelnalt CndscriiprogramenPython,nuainevoiestepreocupidedetaliidenivelsczutprecum 4
managementulmemorieifolositedeprogrametc... Portabil Prinnaturasaopensource,Pythonafostportat(modificatcasfuncioneze)pemulte [Link],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 [Link],softwareulcopiazprogramulde peharddiscincepeslexecute. Python,pedealtparte,[Link] [Link],Pythonconvertetecodulsursntrunformatintermediarnumit bytecodes([Link]),apoipeacestaltransformnlimbajulnativalcomputerului (codmain)[Link] uoarfiindcnumaitrebuiesporigrijacompilriiprogramului,averificriialegeriilink editariiincrcriicorecteabiblioteciloretc,[Link] Pythonsuntmultmaiportabile,doarlecopiezipealtcalculatoriimediatmerg! Limbajorientatpeobiecte Pythonsuportiprogramareaprocedural,pelngprogramareaorientatpeobiecte.n limbajeleorientatepeproceduriprogramelesuntconstruitenjurulprocedurilorifunciilor [Link] obiecteprogramulesteconstruitnjurulobiectelor,carecombindateleifuncionalitatea. Pythonareometodfoarteputernic,darsimpldeafaceprogramareorientatpeobiecte (OOP),nspecialncomparaiecumarilelimbajeprecumJavasauC++. Extensibil Dacainevoiecaoporiunedincodulprogramuluisrulezefoarterapidsauvreicaunele soluiidealgoritmsnufieopen,poicodaparteaaceeanCsauC++ipoiapelaaceaparte directdinprogramulPython. Implantabil SepoateimplantacodPythonnprogrameC/C++pentrualeoferifacilitide'scripting' utilizatorilorprogramelor. Biblioteciextinse [Link] referitoarelaexpresiiregulare,generarededocumentaie,testaredepri,gestiunedefirede execuie,bazededate,browsereweb,CGI,ftp,email,XML,XMLRPC,HTML,fiiere .WAV,criptografie,GUI(graphicaluserinterfaces),Tkialtelucruridependentedesistem. Reinei,[Link] 5
DecenuPerl?
Dacnutiaideja,Perlesteunaltlimbajdeprogramareopensourceinterpretat. DacaifincercatvreodatsscrieiunprogrammarenPerl,vaifirspunssingurilantrebare! CualtecuvinteprogramelenPerlsuntuoarecndsuntmiciiexceleazlamicigselniei scripturide'fcuttreaba'.Oricum,eledevinrapidpreacomplexendatcencepscreasciv spunastadinpropriaexperiendeautordeprogramenPerllaYahoo! ComparativcuPerl,programelePythonsuntclarmaisimple,maicurate,maiuordescrisiastfel [Link],darcnd ncepsscriuunprogramncepprinalgndintermeniidePythonpentrucmiemivinemai [Link](darfoarte util)[Link],darateptatulPerl6nupareafaceprogresedinacestpunctdevedere. SingurulavantajfoartesemnificativpentruPerlestereeauasadearhivedemoduleCPAN(the ComprehensivePerlArchiveNetwork).Aacumsugereazinumeleei,CPANesteocolecie uriademodulePerlcareimpresioneazprinextindereiprofunzimefolosindacestemodulepoi [Link] [Link],situaiaastapareaseschimbadatoritindexului PythonPackageIndexdepachetePython.
DecenuRuby?
Dacnustiaideja,Rubyesteunaltlimbajdeprogramareopensourceinterpretat. DacdejaapreciaiifolositiRuby,atuncinmodcertvrecomandscontinuaislfolosii. Pentruceilalti,carenulaufolositincearcsjudecedacsnveeRubysauPython,as recomandaPython,[Link],lamgsitgreudeasimilat, [Link].
Cespunprogramatorii
Poatevintereseazscitiiprereaunormarihackeri,precumESRdesprePython: [Link]'Catedralaibazarul'fiinddeasemeneaprintele termenului'OpenSource'.ElspunecPythonadevenitlimbajulsudeprogramarefavorit. Acelarticolafostoadevratinspiraiepentruabordareaprimelormeleprogramen Python. BruceEckelesteautorulfaimoaselorcri'GndirenJava'i'GndirenC++'.Elspunec [Link] [Link] 6
DesprePython3.0
[Link]'Python3000'sau'Py3K'. MotivulprincipalpentruonouversiunemajoralimbajuluiPythonesteeliminareatuturormicilor problemeicriticiacumulatepesteaniiafacelimbajulchiarmaicurat. DacaaidejamultcodPythonversiunea2.x,existunutilitarpentruateajutasconverteticodul sursdinversiunea2.xnversiunea3.x. Maimultedetaliin: IntroducerealuiGuidovanRossum CeenounPython2.6 ([Link] vorfiinclusenPython3.0) CeenounPython3.0 Python2.6igraficuldelansarealversiunii3.0 Python3000(listaoficialdefinitivaschimbrilorpropuse) DiverseplanuriPython3.0 NoutiPython(listadetaliatamodificrilor)
Pythonro:Instalare
DacaveidejainstalatPython2.x,nuaveinevoiesleliminainaintedeinstalareaversiunii [Link].
PentruutilizatoriiLinuxiBSD
DacfolosiiodistribuiedeLinuxprecumUbuntu,Fedora,OpenSUSEsau{puneiaiciopiunea voastr}sauunsistemBSDprecumFreeBSD,atuncifoarteprobabilaveidejainstalatPythonn sistem. PentruaverificadacaveiPythondejainstalatnsistemulLinux,deschideiunprogramshell (precumkonsolesaugnome-terminal)idaicomandapython -Vcumesteartatmai jos.
$ python -V Python 3.0b1
Not
$[Link],nfunciedesetrilesistemuluide operare,deaceeaeulvoiartarestrnsladoarsimbolul$.
Dacseafieazinformaiidespreversiune,nseamncaveidejainstalatPython. Totui,dacvadaunrspunscamaijos:
$ python -V bash: Python: command not found
[Link],darposibil. nacestcazaveidoucideainstalaPythonnsistem. [Link] acelaiwebsite. [AceastaopiunevafidisponibilduplansareafinalaversiuniiPython3.0].Instalai pachetelebinarefolosindprogrameledemanagementdepachetespecificesistemuluide operare(apt-getpentruUbuntu/DebianialtelebazatepeDebian,yumnFedora, pkg_addnFreeBSD,etc.)Reineicvatrebuisaveiaccesinternetpentruafolosi [Link],puteidescrcaexecutabilelebinareprecompilatepentru platformavoastrdinaltparteileputeicopiaiinstalanPC.
PentruutilizatoriiWindows
Vizitai[Link] beta1lamomentulacesteiscrieri.Suntdoar12.8MBceeaceestefoartecompactincomparaiecu [Link]. Atenionare 8
DOSPrompt
DacavreisputeifolosiPythondelaliniadecomandWindows(sauDOSprompt),trebuies setaicorespunzatorvariabila%PATH%. nWindows2000,XP,2003,clickpeControl Panel>System>Advanced> Environment [Link]'SystemVariables', apoiselectaiEditiadugai;C:\[Link], folosiinumelecorectaldirectorului. PentruversiunimaivechideWindows,adugainfiierulC:\[Link]: 'PATH=%PATH%;C:\Python30'(frghilimele)[Link],folosii [Link].
PentruutilizatoriideMacOSX
[Link],rulai python -ViurmairecomandareapentruutilizatoriideLinux.
Rezumat
PeunsistemLinux,[Link],lputei instalafolosindprogramuldemanagementdepachetespecificdistribuieideLinuxrespective.n cazulunuisistemWindows,instalarealuiPythonestelafeldeuoarcaidescrcareainstallerului [Link]. ncontinuarevomscrieprimulnostruprogramnPython.
Pythonro:Primiipai
Introducere
Vomaflaacumcetrebuiefcutpentruarulatradiionalulprogram'HelloWorld'[Link] vomnvacumsscriem,salvmirulmprogramePython. SuntdouacideafolosiPythonpentruarulaunprogramfolosindpromptulinteractival [Link].
Folosindpromptulinterpretorului
Porniiinterpretoruldelaliniadecomandintroducndpythonlaprompt. PentruutilizatoriideWindows,puteirulainterpretoruldinliniadecomanddacaveisetatcorect variabilaPATH. DacfolosiiIDLE(delaIntegratedDeveloppementLinuxEnvironment),daticlicpeStart ProgramsPython 3.0IDLE (Python GUI). Acumintroduceiprint('Hello World')[Link] 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 [Link] vvaajutasscrieiprogramePythonuor,fcndtimpulpetrecutocltorieconfortabilivva ajutasajungeiladestinaie(svatingeiobiectivul)ntromanierarapidisigur. Ocerindebazesteevideniereasintaxei[1]ncarediferitelecomponentealesintaxeisunt coloratedeaanaturnctspoivizualizaprogramulirularealui. 10
DacutilizaiWindows,[Link] [Link]:Nufolosii Notepadesteoopiunereafiindcnufacesyntaxhighlightinginusuportindentareatextului, ceeaceestefoarteimportantncazulnostru,[Link] precumIDLE(iVIM)vvorajutaautomatsindentaitextul. DacutilizaiLinux/FreeBSD,[Link] nceputulcariereideprogramator,poateospreferai'geany'.Areinterfagraficcuutilizatoruli butoanespecialepentrucompilatirulatprogramelePythonfrcomplicaii. Dacsunteiprogramatorexperimentat,[Link] nevoiesprecizmcacesteadousuntcelemaiputerniceeditoareiveiaveanenumrateavantaje [Link] [Link],puteifolosiKatecareesteunuldinfavoritele [Link],v recomandslenvaipeamndou,ntructpetermenlungveiculegefoloasemultmaimari. naceastcartevomfolosiIDLE,[Link] [Link] LinuxiBSDncoleciile('[Link]')respective. [Link],vrogs vizitaidocumentaiaIDLE. Dactotmaidoriisvedeiialteopiunipentrueditor,recomandcuprinztoarealistdeeditoare [Link](IntegratedDevelopmentEnvironment)pentru [Link](IDE)caresuportPythonpentrudetaliisuplimentare. ImediatceveincepesscrieiprogramePythonmari,IDEurilepotficuadevratfoarte folositoare. Repet,vrogsalegeiuneditoradecvatelpoatefacescriereadeprogramePythonmaidistractiv iuoar. PentruutilizatoriideVim Existointroducerebundespre'CumsfaciVimunIDEputernicpentruPython'deJohnM Anderson. PentruutilizatoriideEmacs Existointroducerebundespre'CumsfaciEmacsunIDEputernicpentruPython'deRyan McGuire.
Folosindunfiiersurs
[Link], primulprogrampecarelscriisfieprogramul'HelloWorld'totcefaceelestesafieze'Hello World'[Link][2],este'incantaiatradiionalctrezeii programriicasateajutesnveilimbajulmaibine':). Porniieditorulales,[Link] DacfolosiiIDLE,daiclicpeFileNew [Link] clicpeFileSave.
#!/usr/bin/python
11
Cumfuncioneaz
[Link] dreaptacaracterului#devinecomentariuiesteutilnspecialpentrudocumentareacititorului programului. [Link] fiecaredatcndncepecu#!urmatdelocaiaunuiprogram;astaspunesistemuluinostru Linux/[Link] [Link] oriceplatformspecificndinterpretorulnliniadecomand,canexemplulpython [Link]. Important Folosiicugrijcomentariinprogramepentruaexplicadetaliiimportantealeunor instruciuniAstavaajutacititorulsneleagmaiuorce'face'[Link] puteifidumneavoastr,pesteaseluni! [Link] simplutipretepeecrantextul'Hello World'.Vomnvadesprefunciintrunaltcapitol;ce [Link] 'Hello World',ceeacesepoatenumistringfiifrgrij,vomexploramaitrziu terminologiaaceastandetaliu.
ProgramePythonexecutabile
ParteaaceastaseaplicnumaiutilizatorilordeLinux/Unix,darutilizatoriideWindowsarputeafi [Link],vatrebuisdmfiierului permisiuneadeafiexecutabilfolosindcomandachmodiapoisrulmprogramulsurs.
$ chmod a+x [Link] $ ./[Link] Hello World
12
PutemafiaconinutulvariabileiPATHfolosindcomandaechoiprefixndnumelevariabileicu caracterul$[Link] c/home/swaroop/binesteprintredirectoareledinPATH,undeswaroopestenumelede utilizator[7][Link] [Link],puteiadugaundirectoranumelavariabilaPATHse faceexecutndPATH=$PATH:/home/swaroop/mydirunde'/home/swaroop/mydir' [Link] [Link] cuaicreapropriilecomenzi,precumcdsauoricealtcomandpecareoexecuinterminalul LinuxsauDOSprompt. Atenie DinpunctuldevederealPythonului,programsauscriptsausoftwarenseamnacelailucru!
Cumobinemajutor
DacaveinevoierepededeinformaiidesprevreofunciesaudeclaraiedinPython,atunciputei apelalafunctionalitateainclus[8][Link],maialeslapromptulinterpretorului. Deexemplurulaihelp(print)sevaafiadocumentaiadeasistenpentrufunciaprint folositpentruafiareapeecran. Not Tastaiqpentruaieidinhelp. 13
Rezumat
Acumartrebuisputeiscrie,[Link] utilizatordePython,smainvmctevaconceptedinPython.
14
Pythonro:Elemente
Simplatiprireatextului'HelloWorld'nuajunge,aai?Vreisfaceimaimultdeattvreis preluaicevaintrri,[Link] constanteivariabile.
Constanteliterale
Oconstantaliteralesteunnumrprecum5,1.23,9.25e-3sauunir[1]precum'Acesta este un ir'sau"E string!".Senumeteliteralfiindcestefolositliteralifolosim valoarealiteralmente.Numrul2sereprezintntotdeaunapesineinimicaltcevaesteo [Link].
Numere
NumerelenPythonsuntdetreitipuriinteger,floaticomplex. Unexempludeinteger([Link])este2careesteunnumrntreg. Exempledefloatsaufloatingpoint[2][Link] [Link],52.3E-4nseamn52.3 * 10-4. Exempledenumerecomplexesunt(-5+4j)i(2.3 - 4.6j) Notpentruprogramatoriiexperimentai Nuexistuntipseparat'longint'.Tipulimplicitintegerpoatefioricevaloaremare.
iruri
Unir([Link])[Link] [Link], ceeacenseamnaproapeoricelimbdinlume. Notpentruprogramatoriiexperimentai Nuexistiruri"ASCII"[Link] programunfluxdeocteicodatASCII,[Link]("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][Link]"Cum te cheam?"
Ghilimeletriple
Puteispecificairuricaresentindpemaimulteliniifolosindghilimeletriple([Link]) ("""sau''').[Link] 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?'[Link] sspecificmcacelapostroffacepartedinir,[Link] secvendeevadare[6].Specificmapostroful\'[Link] irul'What\'s your name?'. Altcaledeaspecificaacestiresteutilizareaghilimelelordublepentrudelimitareasirului. Problemaapareilaincludereauneighilimeledublentrunirdelimitatcughilimeleduble.i pentruevadareabackslashuluitrebuietotbackslash\\. Dardacamvreasspecificmunirpedournduri?Osoluieestesfolosimghilimeletriple cumamvzutmaidevreme,darputemsfolosimosecvendeevadarepentrusfritulliniei\n [Link] este prima linie\nAceasta este a doua [Link] pentruTAB\[Link],darleamprezentataicipecelemaifolositedenoi. Unlucrunotabilestecntrunirunbackslashlasfritullinieiaratcontinuareairuluipelinia urmtoare,[Link]:
"Aceasta este prima propoziie. \ Aceasta este a doua propoziie".
iruribrute
Dacaveinevoiesspecificaiirurincaresnufieprocesatesecvenedeevadaretrebuies folosiiiruribrute[7][Link]"Caracterul newline este indicat de \n".
16
irurilesuntimuabile
Astanseamncodatcreate,[Link],[Link] ndiferiteleprogrameprezentatedeceastanuesteolimitare.
Concatenarealiteralilorir
Dacsealturadoiliterali,[Link]'What\'s ' 'your name?'esteconvertitautomatn"What's your name?". NotpentruprogramatoriiC/C++ [Link], decisuntsigurcnosiduceidorul. NotpentruprogramatoriiPerl/PHP Reineicairuriledelimitatedegihilimelesimplesaudublesuntlafel,nudiferprinnimic. Notpentruutilizatoriideexpresiiregulare Folosiintotdeaunairuribrutecandaveideafacecuexpresiiregulare,altfelosfienevoie [Link][8]pot fiutilizateca'\\1'saur'\1'.
Metodaformat
[Link]().
#!/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 [Link],adouaspecificaieeste{1}corespunzatoarevariabilei vrstcareestealdoileaargumentpentrumetodaformat. Observaicputeamobineacelailucruprinconcatenare:nume + ' are ' + str(vrst) + ' de ani',[Link] doilearnd,conversianirestefcutautomatdemetodaformatnloculuneiconversii [Link],folosindmetodaformatputemschimbamesajulfrsavemdeaface 17
DetaliidespreacestespecificaiideformataresuntdatenPEP3101(PEP=PythonEnhancement Proposal).
Variabile
Folosireaexclusivaliteralilorpoatedevenirapidplictisitoareavemnevoiesstocmorice [Link] numelelorvaloarealorpoatefimodificat,vaszicsepoatestocaoricentrovariabil. [Link] deosebiredeconstante,enevoiedeaaccesaaceastinformaie,dinacestmotivvariabileleaunume.
Numedeidentificatori
[Link]. 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
[Link] iruri,[Link] tipuridedate,folosindclase.
Obiecte
Reinei,Pythonconsiderctotcesefolosetenprogramesteobiect,[Link] 18
spunecevaul,spunemobiectul. NotpentruutilizatoriidePOO Pythonesteputernicorientatpeobiectensensulctoatesuntobiecte,inclusivnumerele,irurilei funciile. [Link] rulail. CumsescriuprogramelePython Deacumncolo,procedurastandarddeasalvairulaprogramelePythonesteastfel: 1. Deschideieditorulpreferat. 2. Introduceicodulprogramuluidatnexemplu. 3. [Link] [Link]. 4. Rulailfolosindinterpretorulcucomandapython [Link] [Link] maidevreme.
Exemplu:Folosireavariabilelorialiteralilor
# Fiier : [Link] 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 [Link] 5 6 Acesta este un ir multi-linie. Aceasta este linia a doua.
Cumfuncioneaz: Iatcumlucreazprogramul:nti,atribuimvaloareaconstanteiliterale5variabileiifolosind operatoruldeatribuire(=).Aceastalinieesteodeclaraiedeoarecesusinectrebuiefcutceva,n acestcaz,[Link],tiprimvaloarealuiifolosind declaraiaprintcare,previzibil,tiprestevaloareavariabileipeecran. [Link] obinemceamprevzut,valoarea6. Similar,atribuimliteralulirvariabileisiotiprim. Notpentruprogramatoriinlimbajecutipuristatice [Link] 19
saudefiniiedetipdedate.
Liniilogiceiliniifizice
[Link] [Link]. 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
[Link],[Link] [Link](spaiiitaburi)delanceputullinieilogiceestefolositpentrua determinaniveluldeindentareallinieilogice,carelarndulluiestefolositpentruadetermina grupareadeclaraiilor. [Link] [Link] urmtoare. [Link]:
i = 5 print('Valoarea este ', i) # Eroare! Observai un spaiu la nceputul liniei. print('Repet, valoarea este ', i)
Cndrulaiasta,obineiurmtoareaeroare:
File "[Link]", line 4 print('Valoarea este ', i) # Eroare! Observai un singur spaiu la nceputul liniei. ^ IndentationError: unexpected indent
[Link] sintaxaestegreit,[Link] nmodarbitrarnoiblocuridedeclaraiicuexcepiabloculuiprincipal[9]implicitpecarelai [Link] finale,cumarficapitoluldesprecontrolulexecuiei. Cumseindenteaz NufolosiiunamestecdeSPACEiTABfiindcprogramelenuvorlucracorectpetoate [Link] niveldeindentare. [Link],alegeiunstilifolosiiln modconsistentiexclusiv. Notpentruprogramatoriinlimbajecutipuristatice [Link] __future__ import bracespentruaaflamaimultedetalii.
Rezumat
Acumcamtrecutprinmultedetaliieseniale,putemcontinuaculucrurimaiinteresantecumarfi [Link].
21
22
Pythonro:Operatoriiexpresii
Introducere
Majoritateadeclaraiilor(liniilogice)[Link] simpleste2 + [Link]. Operatoriisuntfunctionaliticareexecutcevaipotfireprezentaiprinsimboluriprecum+sau [Link],numite [Link],2i3suntoperanzii.
Operatori
Vomaruncaoprivirerapidasupraoperatoriloriafolosiriilor: [Link], 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 [Link] 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 [Link] evaluarencircuitscurt.
or
SAUlogic
Prescurtarepentruoperaiimatematiceiatribuiri
Esteuzualsfacioprelucrarematematicauneivariabileispstreziapoirezultatultotnea;de aceeaexistoprescurtarepentruacestfeldeexpresii: nlocde:
a = 2; a = a * 3
puteiscrie:
a = 2; a *= 3
Ordineadeevaluare
Dacaaveioexpresieprecum2 + 3 * 4,sevaevaluantioperaiadeadunaresauceade nmulire?[Link] operatoruldenmulireareprecedenmaimaredectoperatoruldeadunare. TabelulurmtordprecedenaoperatorilornPython,delaceamaimicpreceden(ceamaislab legtur)pnlaceamaimarepreceden(ceamaistrnslegtur).Astanseamncntro expresiedat,Pythonvaevaluantioperatoriiiexpresiilecelemaidejosntabelnainteacelor maidesus. Urmtorultabel,extrasdinmanualuldereferinePython,[Link] departemaibinesfolosimparantezepentruagrupaoperatoriiioperanziinmodadecvatpentrua [Link] Schimbareaordiniideevaluare. 26
Precedenaoperatorilor Operator lambda or and notx in,notin is,isnot Expresielambda SAUlogic Descriere
Testedeidentitate
Ibinar Translaii
27
Referinlaatribut
Operatoriipecarenuiamntlnitpnacumvorfidescriincapitoleleviitoare. [Link],+iauaceeaipreceden.
Schimbareaordiniideevaluare
Pentruafaceexpresiilemailizibile,[Link],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 [Link],expresia2 + 3 + 4esteevaluataca(2 + 3) + [Link],precumatribuireasuntasociativideladreaptalastngaastfelespresiaa = b = cesteevaluatcaa = (b = c).
Expresii
Exemplu:
#!/usr/bin/python # Fiier: [Link] lungime = 5
28
lime = 2 aria = lungime * lime print('Aria este', aria) print('Perimetrul este', 2 * (lungime + lime))
Rezultat:
$ python [Link] Aria este 10 Perimetrul este 14
Cumfuncioneaz: [Link] [Link] lungime * [Link], folosimdirectvaloareaexpresiei2 * (lungime + lime)nfunciaprint. Deasemenea,observaicumPython'cosmetizeaz'[Link] unspaiuntre'Aria este'ivariabilaaria,Pythonofacepentrunoicasobinemo prezentaremaiclariastfelprogramulestemultmailizibil(fiindcnumaitrebuiesnengrijim despaiereairurilorfolositepentruafiare).AcestaesteunexempludesprecumfacePythonviaa programatoruluimaiuoar.
Rezumat
Amnvatcesuntoperatorii,operanziiiexpresiileacesteasuntcomponenteledebazale [Link].
29
Pythonro:Controlulexecuiei
Introducere
nprogramelepecareleamvzutpnacumerauoseriededeclaraiiiPythonleexecuta [Link]?De exemplu,vreicaprogramulsianitedeciziiisfacprocesridiferitendiferitesituaii,precum atipri'Bunziua'sau'Bunseara'nfunciedeoralacareseexecutprogramul? Cumpoateaighicit,[Link] controlalexecuieinPythonif,foriwhile.
Declaraiaif
Declaraiaifestefolositpentruatestaocondiiei,dacaceastaesteadevrat,srulezeunbloc dedeclaraii(numit'bloculif'),iarncazcontrarsrulezealtblocdedeclaraii(blocul'else'). Clauza'else'esteoptional. Exemplu:
#!/usr/bin/python # Fiier: [Link] 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 [Link] Introducei un ntreg : 50 Nu, e un pic mai mic. Gata $ python [Link] Introducei un ntreg : 22 Nu, e un pic mai mare. Gata
30
$ python [Link] Introducei un ntreg : 23 Felicitri, ai ghicit, dar nu ctigai niciun premiu! Gata
Cumfuncioneaz: nacestprogramprelumdelautilizatorncercrideaghicinumruliverificmdaceste [Link],[Link] ncercatdeutilizatorfolosindfunciainput().Funciilesuntniteporiunideprogram [Link]. Furnizmunirfuncieiimpliciteinput()careltipretepeecraniateaptintroducereade [Link]([Link]/introduce)iapsm tastaENTER,funciainput()dcarezultatceeaceamintrodus,[Link] [Link] esteoclas,darcetrebuiestiinacestmomentesteclfolosiipentruaconvertiunirntrun ntreg(presupunndcirulconineunntregvalidntext). [Link], [Link] [Link] [Link]? ObservaicumdeclaraiaifconinesemnuldoupunctelasfritaaispunemPythonuluic urmeazunblocdedeclaraii. Maideparte,testmdacnumrulfurnizatdeutilizatorestemaimicdectnumruli,dacesteaa, [Link] caredefaptcombindoudeclaraiiif else-if [Link]. iclauzeleelifielsetrebuiesaiblasfritullinieilogicesemnuldoupunctedupcare poateurmablocullordedeclaraii(cuindentareaadecvat,desigur). Puteipuneoaltdeclaraieifninteriorulblocului'if'[Link] declaraiileifsenumescimbricate([Link]). [Link]:
if True: print('Da, e adevarat.')
DupcePythonaterminatexecuiantregiideclaraiiifinclusivclauzeleelifielse,eltrece [Link] main([Link]),undencepentotdeaunaexecuiaprogramului,iarinstruciuneaurmtoare estedeclaraiaprint('Gata').Dupaceasta,Pythonvedesfritulprogramuluiincheie. Deiacestaesteunprogramfoartesimplu,amindicatomulimedelucruricaretrebuieobservate. Toateacesteasuntdestuldedirecte(isimplepentruceicareaucunotinedeC/C++)iiniial necesitsdeveniiconstienideele,darapoivordeveniuzualeivvorprea'naturale'. NotpentruprogramatoriinC/C++ [Link]..elif..elsepentrua faceacelailucru(inunelecazuri,puteifolosiostructurdedatepentruarezolvarepede). 31
Declaraiawhile
Declaraiawhilenepermitesexecutmrepetatunblocdedeclaraiiatttimpctocondiie [Link] clauzaelse. Exemplu:
#!/usr/bin/python # Fiier: [Link] 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 [Link] 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 [Link]. Deplasmdeclaraiileinputiifninteriorulbucleiwhileiiniializmvariabilaciclucu [Link] [Link],condiiaesteevaluatdinnoui,nacest caz,[Link],executmbloculwhiledinnou,altfel verificmdacexistoclauzelsecasoexecutm. BloculelseesteexecutatatuncicandcondiiadeciclaredevineFalseastapoatefichiari [Link],eavafi ntotdeaunaexecutat,dacnuseieseforatdinbuclcuodeclaraiebreak. 32
Buclafor
Declaraiafor..inesteodeclaraiedeciclarecareitereazelementeleuneisecvenedeobiecte. [Link] [Link]:
#!/usr/bin/python # Fiier: [Link] for i in range(1, 5): print(i) else: print('Bucla s-a terminat')
Rezultat:
$ python [Link] 1 2 3 4 Bucla s-a terminat
Cumfuncioneaz: nacestprogram,[Link] range. Noidmfuncieirangedounumereieanedsecvenadenumerencepndcuprimulnumri [Link],range(1,5)nseamnsecvena[1, 2, 3, 4].Implicit, [Link],[Link] exemplurange(1,5,2)d[1,3].Reineicgamadenumere([Link])seextindepnla aldoileanumr,darnu'liinclude. Aadarbuclaforitereazpesteacestagamfor i in range(1,5)esteechivalentcufor i in [1, 2, 3, 4]ceeaceestecaicumsaratribuifiecareobiectdinsecvenluii,pe rnd,[Link],nufacem altcevadectstiprimvaloareaobiectului. [Link],esteexecutatntotdeaunaodat, dupncheiereabucleifor,cuexcepiacazuluincaresentlneteodeclaraiebreak. Dereinutcbuclafor..[Link] 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([Link])executareauneideclaraiideciclare, chiaridaccondiiatestatnuadevenitncFalsesausecvenanuafostparcurscomplet. Onotimportantestecdacsentrerupeobuclaforsauwhile,niciclauzaelsenuvafi executat. Exemplu:
#!/usr/bin/python # Fiier: [Link] while True: s = (input('Introducei ceva:')) if s == 'quit': break print('Lungimea irului introdus este', len(s)) print('Gata')
Rezultat:
$ python [Link] 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: [Link] 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 [Link] 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,[Link] utilizatepridinPythonideaceeaesteesenialsteobinuieticuele. ncontinuarevomnvasconstruimisfolosimfuncii.
35
Pythonro:Funcii
Introducere
[Link] [Link] amfolositdejamultefunciipredefiniteprecumlenirange. Conceptuldefuncieesteprobabilcelmaiimportantblocconstructivaloricruiprogramnonbanal (noricelimbajdeprogramare),decivomexploradiverseaspectealefunciilornacestcapitol. [Link] pentrufuncieurmatdeoperechedeparantezecarepotincludenitenumedevariabile.n [Link] simplu: Exemplu:
#!/usr/bin/python # Fiier: [Link] def sayHello(): print('Hello World!') # blocul funciei # Sfritul funciei sayHello() # apel la funcia sayHello() sayHello() # din nou apel la funcia sayHello()
Rezultat:
$ python [Link] Hello World! Hello World!
Parametriifunciilor
Ofunciepoateacceptaparametri,caresuntvalorifurnizatefuncieipentrucaaceastaspoatface [Link] definitenmomentulapeluluifuncieiidejalesuntatribuitevalorilamomentulexecutriiblocului funciei. 36
Rezultat:
$ python func_param.py 4 este maximum 7 este maximum
Variabilelocale
Cndsedeclarvariabileninterioruldefiniieifunciei,acesteanuauniciunfeldelegturcualte variabiledinafaradefiniieifunciei,nicichiardacaraveaacelainume,deaceeasenumesc [Link] 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 [Link] funciisatribuiovaloareuneivariabiledefinitenafarafuncieifrdeclaraiaglobal. Puteifolosivaloriledefinitenafarafunciilor(presupunndcnuexistovariabilcuacelai numedefinitnbloculfunciei).Totui,acestfaptnuestencurajatitrebuieevitatntructdevine [Link] 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
[Link] funciilor,numit"nonlocal"[Link] 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 [Link] [Link] definiiafunciei,punndoperatoruldeatribuire(=)urmatdevaloareaimplicit. [Link],trebuiesfie [Link] 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: [Link] nufurnizmaceavaloare,atuncivafifolositvaloareaimplicit,[Link] valoareaimplicit1aparametruluiori. Laprimafolosireafuncieisay,[Link] funcieisayiiruliunargument5ceeacespunecvremsfietipritirulde5ori. Important Numaiparametriidelasfritullisteideparametripotaveavaloriimplicitedecinuputeiavea unparametrucuvaloareimplicitnainteaaltuiafrvaloareimplicitnlistadeparametria funciei. [Link],def func(a, b=5)estevalid,dardef func(a=5, b)esteinvalid.
Argumentecuvntcheie
Dacaveifunciicumuliparametriivreisspecificainumaipeunii,atunciputeisdaivalori parametrilorprinnumeleloracestmoddespecificaresenumeteprinargumentecuvntcheie folosimcuvntulcheie([Link])nloculpoziiei(pecareamfolositopnacum)pentrua specificaargumentefunciei. Existdouavantajeunu,folosireafuncieiestemaiuoar,ntructnutrebuiesnepreocupm [Link],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),[Link] urm,[Link] 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: [Link] 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 [Link] 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 "[Link]", 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: [Link] simplif..elsepentruagsinumrulcelmaimareiapointoarce([Link])aceavaloare. Observaicdeclaraiareturnfrovaloareesteechivalentcureturn [Link] [Link],estefolositpentruaindicafaptulco variabilnuareniciovaloare,deciarevaloareaNone. Oricefuncie,nmodimplicit,conineodeclaraiereturn Nonelasfritulbloculuide declaraii,[Link] print o_funcie_oarecare()ncarenuestedatodeclaraiereturnprecum:
def o_functie_oarecare(): pass
DocStrings
Pythonareofacilitatedrgunumitdocumentationstrings,numitdeobiceipenumelescurt [Link]([Link],[Link])suntounealtimportantpentru [Link],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: [Link] seaplicilamoduleiclase,desprecarevomnvancapitolelerespective. Conveniaurmatpentruundocstringeste:unirmultiliniencareprimaliniencepecumajuscul [Link] [Link] funciilornebanalepecarelescriei. PutemaccesadocstringulfuncieiprintMaxfolosindatributul__doc__(observaidublu underscore)[Link],[Link] maimultdespreobiectencapitoluldespreclase. Dacaaifolosithelp()nPython,aivzutdejacumsefolosetedocstring!Ceeacefaceeaeste cextrageatributul__doc__alfuncieiilafieazntromanieraconvenabil.Puteincerca astaasuprafuncieidemaisusincludeipurisimpludeclaraiahelp(printMax)nprogram. Nuuitaistastaiqpentruaieidinhelp. [Link] [Link] pydocinclusndistribuiaPythonfuncioneazsimilarcuhelp()folosinddocstringurile.
Adnotri
Funciilemaiauofacilitateavansatnumitadnotare([Link])careesteocaledeteapt [Link] limbajulPythonnsinenuinterpreteazacesteadnotrinniciunfel(aceastfuncionalitateeste lsatbibliotecilorthirdpartysinterpretezeelencefelvor),vomtrecepesteaceastfacilitaten [Link],puteicitiPEPNo.3107.
44
Rezumat
Amdiscutatmulteaspectealefunciilor,darreineicnuamacoperittoateaspecteleposibile. Totui,amacoperitdejamajoritateaaspectelorpecarelevomfolosinmoduzual. Vomaflancontinuarecumsfolosim,dariscreammodulePython.
45
Pythonro:Module
Introducere
[Link] srefolosiiunnumrmaimaredefunciinalteprogramedectcelpecarelscriei?Aacumai ghicit,rspunsulestefolosireamodulelor. Existvariatemetodedeascriemodule,darceamaisimplcaleestedeacreaunfiiercuextensia .pycareconinefunciiivariabile. [Link] exemplu,puteiscriemodulenlimbajuldeprogramareCidupacompilare,elepotfifolositedin codulPythoncndsefoloseteinterpretorulPythonstandard. [Link] [Link] standard. Exemplu:
#!/usr/bin/python # Fiier: using_sys.py import sys print('Argumentele la linia de comand sunt:') for i in [Link]: print(i) print('\n\nPYTHONPATH este', [Link], '\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\\[Link]', 'C:\\Python30\\DLLs', 'C:\\Python30\\lib', 'C:\\Python30\\lib\\plat-win', 'C:\\Python30', 'C:\\Python30\\lib\\site-packages']
Dacnuarfifostunmodulcompilat,ciunmodulscrisnPython,interpretorularficutatn [Link],declaraiiledininteriorul [Link] importmunmodul. Variabilaargvdinmodululsysesteaccesatfolosindnotaiacupuncte,[Link] [Link] nudconflictcuniciovariabilargvfolositnprogram. [Link](listelesuntexplicatendetaliuncapitoluldespreliste. nspecial,[Link] argumentetransmiseprogramuluiprinadugarealorlaliniadecomandcarelanseazprogramul. DacafolosiiunIDEpentruascrieirulaacesteprograme,cutainmeniuriocaledeaspecifica argumentelaliniadecomand. Aici,cndseexecutpython using_sys.py noi suntem argumente,rulmmodulul using_sys.pycucomandapythonicelelaltelucruricarelurmeazsunttransmise [Link]. Reinei,[Link]. Decinacestcazvomavea'using_sys.py'[Link][0],'noi'npoziia [Link][1],'suntem'[Link][2]i'argumente'npoziia [Link][3].ObservaicPythonncepenumerotareacu0nucu1. [Link] [Link] [Link] [Link] [Link].
[Link]
Importulunuimodulesterelativcostisitor,astfelcPythonfacenitesmecheriicaslaccelereze. Ocaleestescreezefiierecompilatenoctei([Link])[Link] niteformeintermediarencarePythontransformprogramul(vamintiidincapitolulintroductiv cumlucreazPython?).[Link] programeelevorfimultmairapidentructparteadeprocesarelegatdeimportulmodululuieste [Link],acestefiierecompilatenocteisuntindependentedeplatform. Not [Link] Pythonnuarepermisiuneadeascriefiierenaceldirector,[Link].
Declaraiafrom...import...
Dacvreisimportaidirectvariabilaargvnprogramulvostru(pentruaevitascriereanumelui [Link]),puteifolosideclaraiafrom sys import [Link] importaitoatenumelefolositenmodululsysatunciputeifolosideclaraiafrom sys import *.Funcioneazpentruoricemodul.
47
ngeneral,trebuiesevitaifolosireaacestordeclaraiiinschimbsfolosiideclaraiaimport. Casfieevitateoriceconflictedenumeiprogramelesfiemailizibile.
Atributul__name__almodulului
Oricemodulareunnume,[Link], maialesnsituaiaparticularncaresedoreteaflarearegimuluimodulului(autonomsau importat).Cumammenionatanterior,cndunmodulesteimportatpentruprimadat,coduldin [Link] 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 [Link] exempluartrebuisclarificesituaia. Exemplu:
#!/usr/bin/python # Fiier: [Link] def zisalut(): print('Salut, aici este modulul meu.') __versiune__ = '0.1' # Sfritul modulului [Link]
48
Rezultat:
$ python meu_demo.py Salut, aici este modulul meu. Versiunea 0.1
49
Funciadir
[Link] exemplu,pentruunmodul,claseleivariabileledefinitenacelmodul. Cndfurnizaiunnumefuncieidir(),[Link] 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,[Link] uriadeatributepecareoconine. [Link],[Link] clistamodulelorimportateesteinclusnlistamodululuilistat. Pentruavedeafunciadirnaciune,definimonouvariabil,a,iiatribuimovaloare,apoi [Link] variabila/atributulmodululuicurentfolosinddeclaraiadelidinnouschimbareaestereflectatn rezultatulfuncieidir. Onotasupradeclaraieidelaceastdeclaraieestefolositpentruatergeunnumedevariabila idupceafostexecutat(del a),numaiputeiaccesavariabilaaestecaicumnuaexistat 50
Pachete
Laacestnivel,[Link] [Link] cumseorganizeaz?Aiciintervinpachetele. Pachetelesuntnitefolderedemodulecuunfiierspecial__init__.pycareindicluiPythonc acelfolderestespecial,deoarececoninemodulePython. Szicemcvreiscreaiunpachetnumit'mapamond'cusubpachetele'asia','africa',[Link] pacheteconinlarndullormoduleprecum'india','madagascar','romnia'etc. Iatcumaistructurafolderele:
- <un folder prezent n [Link]>/ - mapamond/ - __init__.py - asia/ - __init__.py - india/ - __init__.py - [Link] - africa/ - __init__.py - madagascar/ - __init__.py - [Link] - europa/ - __init__.py - romnia/ - __init__.py - foo_bar.py
[Link] nbibliotecaPythonstandard.
Rezumat
Aacumfunciilesuntprireutilizabiledeprogram,modulelesuntprograme(ntregi)reutilizabile. [Link] Pythonesteunexempludesetdepacheteimodule. Amvzutcumsefolosescmoduleleicumsecreeazamoduleproprii. ncontinuarevomnvadesprectevaconcepteinteresantenumite'structuridedate'.
51
Pythonro:Structuridedate
Introducere
[Link] cuvinte,suntfolositepentruastocacoleciidedatenrudite. ExistpatrustructuripredefinitenPythonliste,tupluri,[Link] folosimpefiecareicumnepotuuraeleviaa.
Liste
Olist([Link])esteostructurdedatecarepstreazocolecieordonatdeelementedecise [Link] listdecumprturi,numaicpelistfiecareitemocupunrndseparat,iarnPythonpunem virguleintreele. ElementelelisteitrebuieinclusenparantezedrepteastfelnctPythonsneleagcesteo [Link],putemaduga,[Link] sepoatespuneclistelesuntmuabile,acesttipdedatepoatefimodificat.
Introducererapidnobiecteiclase
Deingeneralamamnatdiscutareaobiecteloriclaselorpnaacum,estenecesaroscurt introducere,[Link] acestora. [Link] ovaloare,szicemntregul5,putemgndicamcreatunobiect(defaptinstan)idinclasa(de fapttipul)[Link](int)pentruonelegeremaiaprofundatat. Oclaspoateaveaimetodeadicfunciidefinitepentruafifolositeexclusivnraportcuacea [Link], Pythonoferometodappendpentruclasalistcarenepermitesadugmunelementla sfritullistei.Prinurmarelista_mea.append('un item')vaadugaacelirla lista_mea.Dereinutfolosireanotaieicupunctpentruaccesareametodelorobiectelor. Oclaspoateaveaicmpuri([Link])carenusuntaltcevadectvariabiledefinitenraport [Link]/numenumainraportunobiectdinaceaclas. Cmpurilesuntaccesatetotprinnotaiacupunct,[Link]. 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.') [Link]('orez') print('Lista mea de cumprturi este acum', shoplist) print('Acum vom sorta lista') [Link]() 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: [Link], memormiruricarereprezintnumelelucrurilorpecareleavemdecumprat,darputemaduga oricefeldeobiectinclusivnumeresaualteliste. Amfolositbuclafor..[Link] [Link]. Observaiutilizareaargumentuluicuvntcheieendalfuncieiprintpentruaitransmitecvrem sncheiemliniacuunspaiu('')nlocdencheiereauzual. ncontinuareadugmunitemlalistfolosindmetodaappendaobiectuluilist,aacumam [Link] funcieiprintcareotipretefrumospeecran. [Link] metodafecteazansilistainuntoarceolistmodificatspredeosebiredecomportamentul [Link]. Dupcecumprmunitemdelapia,[Link] [Link] 53
Tupluri
[Link],darfr [Link] 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: [Link] asemeneaastaaratctuplurilesuntisecvene. Acummutmacesteanimalentrunnouzoo,deoarecevechiulzoosanchis,[Link] tuplulzoo_nouconineniteanimalecareerauacolompreuncuanimaleleadusedinvechiul [Link],acum,reineicuntupluninteriorulaltuituplunuipierdeidentitatea. Putemaccesaitemuriledintupluspecificndpoziiantroperechedeparantezeptrate,capentru [Link].Accesmaltreileaitemdinzoo_nouspecificnd zoo_nou[2]iaccesmaltreileaitemaltupluluizoodintuplulzoo_nouspecificnd zoo_nou[2][2].Edestuldesimpludupceaintelesregula.
54
Paranteze Deiparantezelesuntopionale,eupreferslepunmereu,pentruafaceevidentcevorbade untuplu,[Link](1,2,3)i print( (1,2,3) )nseamndoulucrurifoartediferiteprimatipretetreinumere,iar adouatipreteuntuplu(careconinetreinumere). Tupluricu1sau0elemente Untupluvidesteconstruitfolosindoperechedeparantezegoalemyempty = ().Totui,un [Link] primul(iultimul)element,caPythonspoatdifereniantretupluiunaltobiectcuprinsn parantezentroexpresiedecivatrebuisspecificaisingleton = (2 , )dacvreis seneleag'tuplulcareconinedoarelementul2'. NotpentruprogramatoriinPerl [Link] pentruuntupluntruntuplu,olistntruntuplu,[Link] Python,elesuntniteobiectestocatenalteobiecte.
Dicionare
Undicionarestecaocartedeadresencarepoigsiadresasaudateledecontactalepersoanei doartiinduinumele,adicasociemchei(nume)cuvalori(detalii).Deobservatcocheietrebuie sfieunic,pentruanuexistaconfuzii,exactcaatuncicndnupoideosebidoupersoanedacau acelainume. Pepostdecheiputeifolosinumaiobiecteimuabile(precumirurile),darpepostdevaloriputem [Link] simple. Perechilecheievaloaresuntspecificatentrundicionarfolosindnotaiad = {cheie1 : valoare1, cheie2 : valoare2 }.Observaicperechilecheievaloaresuntseparate prinvirgul,[Link] deoperechedeacolade. [Link] 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@[Link]', 'larry@[Link]', 'matz@[Link]', 'spammer@[Link]'
55
# tergerea unei perechi cheie - valoare del ab['Spammer'] print('\nExist {0} contacte n address-book\n'.format(len(ab))) for nume, adresa in [Link](): print('Contactai pe {0} la adresa {1}'.format(nume, adresa)) # Adugarea unei perechi cheie - valoare ab['Guido'] = 'guido@[Link]' 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@[Link] Exist 3 contacte n address-book Contactai pe Swaroop la adresa swaroop@[Link] Contactai pe Matsumoto la adresa matz@[Link] Contactai pe Larry la adresa larry@[Link] Adresa lui Guido este guido@[Link]
Cumfuncioneaz: [Link] cheiaifolosindoperatoruldeindexare,[Link] sintaxei. [Link] specificmdicionarulioperatoruldeindexarepentrucheiacaretrebuietearsiledm [Link] operaie. ncontinuareaccesmfiecareperechecheievaloaredindicionarfolosindmetodaitemsa dicionaruluicarentoarceolistdetuplurincarefiecaretupluconineoperechedeitemuricheia [Link] 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 [Link]. Aufostmenionatetreitipuridesecveneliste,tupluriiiruriioperaiadefeliere,carene permitesextragemoparte([Link])dinsecven. Exemplu:
#!/usr/bin/python # Fiier: [Link] 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 [Link] 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,[Link] [Link] dreptealturateuneisecvene,Pythonvvaextrageitemulcorespunzatorpoziieinsecven. [Link][0]extrageprimulitemi shoplist[3]lextragepealpatruleadinsecvenashoplist. Indexulpoatefiiunnumrnegativ,[Link] acestmotivshoplist[-1]indicultimulitemdinsecven,iarshoplist[-2]penultimul item. Operaiadefeliereestefolositspecificndnumelesecveneiurmatdeoperecheopionalde numereseparateprinsemnuldouapuncte([Link])[Link] [Link] opionale,semnuldoupuncteNUesteopional. Primulnumr(naintededoupuncte)noperaiadefeliereindicpunctulundencepefelia,iaral [Link],Pythonvancepecu [Link],Pythonsevaoprilasfritulsecvenei. Observaicfeliantoars(uneorisespune'returnat')ncepecupoziiadatdeprimulnumr,dar sencheieimediatnaintedepoziiadatdealdoileanumradicnceputulesteinclus,sfritulnu esteinclusnfelie. Astfel,shoplist[1:3]ntoarceofeliedinsecvenacarencepecupoziia1,includepoziia2, [Link],shoplist[:]ntoarce ocopieasecvenei. [Link] [Link],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
[Link] 58
Referine
Cndcreaiunobiectiiatribuiiovaloare,variabiladoarindicobiectulcreat,nureprezint obiectulnsui!Astanseamncnumelevariabileiesteunindicatorctreaceaparteamemoriei [Link]([Link])anumeluila obiect. ngeneral,nutrebuiesvngrijoraideasta,darexistunefectsubtildaroratreferineidecare trebuiesfiicontieni: Exemplu:
#!/usr/bin/python # Fiier: [Link] 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 [Link] 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
[Link]?Eibine,tiaicirurilesunt obiecteiaumetodecarefacoricedelaverificareaunorprialeiruluipnlaeliminarea spaiilor? [Link] [Link],citiihelp(str). Exemplu:
#!/usr/bin/python # Fiier: str_methods.py nume = 'Swaroop' # Acesta este obiectul ir if [Link]('Swa'): print('Da, irul ncepe cu "Swa"') if 'a' in nume: print('Da, irul conine subirul "a"') if [Link]('war') != -1: print('Da, irul conine subirul "war"') delimitator = '_*_' Lista_mea= ['Brazilia', 'Rusia', 'India', 'China'] print([Link](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
[Link] deveniesenialepentruscriereadeprogramededimensiunirezonabile. AcumcavemomulimedeelementePythonasimilate,vomvedeacumseproiecteazisescriu programePythonnlumeadezicuzi.
61
Pythonro:Rezolvareaproblemelor
AmexploratdiversepridinlimbajulPythoniacumvomvedeacumconlucreazacesteaprin [Link] programPythonpropriu.
Problema
Problemaeste"Vreauunprogramcaresfacunbackupaltuturorfiierelormeleimportante". Deiaceastaesteoproblemasimpl,nuavemdestuleinformaiipentruancepegsireauneisoluii. [Link],cumspecificmcarefiieretrebuiesalvate?Cum vorfielestocate?Undevorfistocate? Dupoanalizcorectaproblemei,[Link] [Link],amcreatlistaurmtoarecaredescriecum [Link],ntruct fiecarefacelucrurilenfelullui,decieperfectOK. 1. 2. 3. 4. 5. Fiiereleidirectoarelecaretrebuiesalvatesuntspecificatentrolist. Backupultrebuiestocatndirectorulprincipaldebackup Fiierelesuntstocatentroarhivzip. Numelearhiveizipestedataiora. FolosindcomandastandardzipdisponibilimplicitntoatedistribuiileLinux/Unix. UtilizatoriideWindowspotinstaladinpaginaproiectuluiGnuWin32iadauga C:\Program Files\GnuWin32\binlavariabilademediuPATH,similarmoduluin [Link] 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 + [Link] + [Link]('%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 [Link](zip_command) == 0: print('Salvare reuit n ', target) else: print('Backup EUAT')
Rezultat:
$ python backup_ver1.py Salvare reuit n E:\Backup\[Link]
[Link] secomportcumtrebuie,vafinevoiededebuggingadiceliminareaerorilordinprogram. Dacprogramulnuvamerge,puneiodeclaraieprint(zip_command)imediatnaintede [Link].Acumcopiaicomandazip_commandlapromptulshell [Link],citiimanualulcomenziizipca [Link],verificaiprogramulPythoncasvedeidacesteexact camaisus. Cumfuncioneaz: Veiobservacumamtransformatdesignulncodntromanierpascupas. [Link] [Link] estespecificatnvariabilatarget_dir.Numelearhiveizippecareovomcreaeste"data curent+oracurent"[Link]().Arhivavaavea extensia.zipivafistocatndirectorultarget_dir. [Link] deoperare;acestavafi'/'nLinuxiUnix,'\\'nWindowsi':'[Link] [Link]. [Link]()[Link]%Y vafinlocuitcuanul,[Link]%mvafinlocuitculuna,canumarzecimalntre01 [Link]. Cremnumeledirectoruluidestinaiefolosindoperatoruldeadunarecareconcateneazirurile adicalturirurileiproduceunulmailung.Atuncinoicremunirzip_commandcare [Link] executareaeidesinestttoarentrunshell(terminalLinuxsauDOSprompt). [Link]-qestefolosit pentruaindicamoduldelucrutcut([Link]).Opiunea-rspecificmodulrecursivde parcurgereadirectoarelor,adictrebuiesincluditoatesubdirectoareleisubdirectoarele [Link] 63
[Link] sourcentrunirfolosindmetodajoinairurilor,pecareamnvatdejasofolosim. nfine,[Link] lansatdinsistemadicnshelleantoarce0daccomandaafostexecutatcusucces,altfel ntoarceuncoddeeroare. nfunciederezultatulcomenzii,tiprimpeecranmesajuladecvat,cumcsalvareaareuitsaunu. Astae,amcreatunscriptcaresfacaunbackupalfiierelorimportantedinsistem! NotpentruutilizatoriideWindows nloculsecvenelordeevadarecudublubackslash,[Link], folosii'C:\\Documents'saur'C:\Documents'.noricecaz,nufolosii 'C:\Documents'ntructveiajungesfolosiiosecvendeevadarenecunoscut,\D. Acumcavemunscriptfuncionaldesalvare,lputemruladecteorivremsobinemosalvarea [Link]/Unixsuntsftuiisfoloseascmetodeexecutabileaacumam discutatncapitoleleprecedente,astfelcaelespoatruladeoriunde,[Link] fazadeoperaresaudedistribuireasoftwareului. Programuldemaisusfuncioneazcorect,dar(deobicei)primulprogramnufuncioneazcumne [Link] oeroarededactilografierenscriereacodului([Link]),[Link],vveintoarcela fazadedesignsaudebuggiggpentruarezolvaproblema.
Adouaversiune
[Link],putemrafinaprogramulpentrualucramai [Link](engl. maintenance). Unuldinrafinamentelepecareleamconsiderateuutileafostunmecanismmaibundedenumirea salvrilor,folosindoracanumealfiierului,iardatacanumedesubdirectoraldirectoruluide [Link] [Link] [Link] 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 + [Link] + [Link]('%Y%m%d') # Ora curent este numele arhivei zip acum = [Link]('%H%M%S') # Crem subdirectorul, dac nu exista nainte if not [Link](azi): [Link](azi) # crem directorul print('Am creat cu succes directorul ', azi) # Numele fiierului arhiva zip target = azi + [Link] + 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 [Link](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\[Link] $ python backup_ver2.py Salvare reuit n E:\Backup\20090209\[Link]
Versiuneaatreia
Adouaversiunemergebinecndfacemmultesalvri,daregreudevzutceestesalvatnfiecare arhiva!Deexemplu,poateamfcutoschimbaremareunuiprogramsauuneiprezentriiavreas [Link] 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 + [Link] + [Link]('%Y%m%d') # Ora curent este numele arhivei zip acum = [Link]('%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 + [Link] + acum+ '_' + [Link](' ', '_') + '.zip' # Crem subdirectorul dac nu exist deja if not [Link](azi): [Link](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 [Link](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 + [Link] + now + '_' + SyntaxError: invalid syntax ^
Cum(nu)funcioneaz: Acestprogramnufuncioneaz!Pythonspuneceundevaoeroaredesintaxceeacenseamnc programulnuafostbinescris,cnurespectstructurapecareseateaptPythonsogseasc [Link],[Link] eliminareaerorilor([Link])programuluidelaacealinie. Laoobservaieatent,vedemcaolinielogicafostextinspedouliniifizicefrssespecifice [Link](+)frvreunoperandnacealiniei [Link] [Link] [Link]([Link] 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 + [Link] + [Link]('%Y%m%d') # Ora curent este numele arhivei zip acum = [Link]('%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 + [Link] + acum + '.zip' else: target = azi + [Link] + acum + '_' + \ [Link](' ', '_') + '.zip' # Crem subdirectorul, dac nu exista deja if not [Link](azi): [Link](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 [Link](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\[Link]
Cumfunctioneaz:
67
Alterafinamente
Apatraversiuneesteunasatisfctoarepentrumajoritateautilizatorilor,darestemereulocpentru [Link]([Link])pentruprogram,cu ajutorulopiunii-vPentruafaceprogramulmaivorbre. Altmbuntireposibilarfispermitemcafiiereleidirectoareledesalvatsfietransmise [Link] variabilalistsourcefolosindmetodaextendaclaseilist. [Link] [Link] dejadisponibilepentruascrieunprogramfrdependenteexternepentruprogramuldearhivare. Totui,[Link],pentrucaexemplul sfiedestuldesimpludenteles,dariutil. [Link]?
Procesuldedezvoltaredesoftware
[Link]: 1. 2. 3. 4. 5. 6. Ce(Analiza) Cum(Design) Executare(Implementare) Test(Testareieliminareerori) Utilizare(Operaresaudistribuire) Mentenan(Rafinare)
Rezumat
Amvzutcumsecreeazunprogram/scriptPythonidiferitestadiiimplicatedescriereaunui [Link],attpentruacomodareacuPython ctipentruarezolvaprobleme. 68
ncontinuarevomdiscutadespreprogramareaorientatpeobiecte.
69
Pythonro:Programareorientatpeobiecte
Introducere
ntoateprogramelefolositepnacumneamconstruitsoluiilenjurulfunciiloradicblocuride [Link] iunaltmoddeorganizareaprogramelor,ncarefuncionalitateaidatelesuntmpachetate [Link]"orientatpe [Link],darcndscriei programemarisauaveiderezolvatproblemecaresuntmaiaproapedeacestmoddestructurare, puteifolositehniciledeprogramareorientatpeobiecte.. [Link] [Link] setraduceprinaceeacvariabilelecarestocheazntregisuntinstane(obiecte)aleclaseiint. Notpentruprogramatoriinlimbajecutipuristatice Observaicpnintregiisunttrataicaobiecte(aleclaseiint).AstaediferitdeC++i Java(nversiuniledinaintede1.5)[Link] help(int)pentrudetaliidespreclas. ProgramatoriinC#iJava1.5vorgsiosimilaritatecuconcepteledencapsularei decapsulare. [Link] [Link] [Link] neajutasdifereniemntrefunciiivariabileindependenteiceleaparinndunuiobiectsauunei [Link],variabileleifunciilecareaparinuneiclasesenumescatributealeclasei. Cmpurilesuntdedoutipurielepotaparinefiecreiinstane/obiectalclaseisaupotaparine [Link]. [Link] blocindentat.
self
Claseleimetodeleauodiferenspecificfadefunciileobinuiteeletrebuiesaibun prenumesuplimentarcaretrebuieadugatlanceputullisteideparametri,darnutrebuiesidaio valoarecndapelaimetoda,[Link] nsui([Link])iprinconvenieestenumitself. Cutoateacestea,deiputeisidaioricenumeacestuiparametru,esteputernicrecomandats [Link] standardoricecititoralprogramuluivanelegeimediatdespreceestevorbaichiarmediileIDE (IntegratedDevelopmentEnvironments)specializatetepotajutadacfolosetiself. 70
NotpentruprogramatoriinC++/Java/C# selfdinPythonesteechivalentcupointerulthisdinC++icureferinathisdinJavai C#. ProbabilvntrebaicumdPythonvaloareacorectluiselfidecenutrebuiesidmo [Link] instanaacesteiclase,[Link] [Link](arg1, arg2),apelulesteautomatconvertitdePythonn [Link](myobject, arg1, arg2)astaetoatmareaspecialitatealuiself. Astanseamnicdacaveiometodcarenuprimeteargumente,totvatrebuisaveiun argumentself.
Clase
Ceamaisimplclasposibilesteartatnexemplulurmtor.
#!/usr/bin/python # Fiier: [Link] class Persoana: pass # Un bloc gol p = Persoana() print(p)
Rezultat:
$ python [Link] <__main__.Persoana object at 0x019F85F0>
Cumfuncioneaz: [Link] [Link],artatdedeclaraia pass. ncontinuarecremunobiect/instanaacesteiclasefolosindnumeleclaseiurmatdeoperechede paranteze.(Vomnvamaimultedespreinstanierenparagrafulurmtor).Pentrupropria verificare,[Link] dinclasaPersoanadinmodulul__main__. [Link] aceastavaaveaovaloarediferitnaltcalculatordeoarecePythonlstocheazundeareloc.
Metodeleobiectelor
Amdiscutatdejacobiectele/claselepotaveametode,exactcafunciile,doarcauunargument [Link].
#!/usr/bin/python # Fiier: [Link] class Persoana:
71
def ziSalut(self): print('Salut, ce mai faci?') p = Persoana() [Link]() # Acest exemplu poate fi scris i ca Persoana().ziSalut()
Rezultat:
$ python [Link] Salut, ce mai faci?
Metoda__init__
[Link] semnificaiametodei__init__. Metoda__init__esteexecutatimediatceesteinstaniatunobiectalclasei.Metodaesteutil [Link] dubluunderscore. Exemplu:
#!/usr/bin/python # Fiier: class_init.py class Persoana: def __init__(self, nume): [Link] = nume def ziSalut(self): print('Salut, numele meu este ', [Link]) p = Persoana('Swaroop') [Link]() # Acest exemplu putea fi scris Persoana('Swaroop').ziSalut()
Rezultat:
$ python class_init.py Salut, numele meu este Swaroop
[Link],ceeaceesteartatnmetoda ziSalut.
Variabiledeclas,variabiledeinstan
Amdiscutatdejaparteadefuncionalitateaclaseloriobiectelor(adicmetodele),acumsnvm [Link],aanumitelecmpuri,nusuntaltcevadectvariabile [Link] [Link] numitespaiidenume([Link]). Existdoufeluridecmpurivariabiledeclasaivariabiledeobiect/instan,caresuntclasificate nfunciedeproprietarulvariabilei. [Link] exemplaralvariabileideclasicndoinstanimodificvaloarea,aceastmodificareestevzut imediatdecelelalteinstane. [Link],fiecareobiectare propriulexemplaralaceluicmpadicelenusuntrelaionatenniciunfelcucmpurileavnd [Link]:
#!/usr/bin/python # Fiier: [Link] clasa Robot: '''Reprezint un robot cu nume.''' # O variabil de clas, numrtorul populaiei de roboi populaie = 0 def __init__(self, nume): '''Iniializeaz datele.''' [Link] = nume print('(Iniializez robotul {0})'.format([Link])) # Cnd aceast instan este creat, robotul se # adaug la populaie [Link] += 1 def __del__(self): '''Dispar...''' print('{0} este dezmembrat!'.format([Link])) [Link] -= 1 if [Link] == 0: print('{0} a fost ultimul.'.format([Link])) else: print('Mai exist {0:d} roboi api de lucru.'.format([Link])) def ziSalut(self): '''Salutare de la robot. Da, pot s fac i asta.''' print('Salut. Stpnii mei mi zic {0}.'.format([Link]))
73
def ci(): '''Tiprete populaia curent.''' print('Avem {0:d} roboi.'.format([Link])) ci = staticmethod(ci) droid1 = Robot('R2-D2') [Link]() [Link]() droid2 = Robot('C-3PO') [Link]() [Link]() print("\nRoboii pot s fac nite treab aici.\n") print("Roboii au terminat treaba. Deci s-i distrugem.") del droid1 del droid2 [Link]()
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,[Link] [Link] aparineobiectului(iesteatribuitfolosindself.)deciesteovariabildeobiect/instan. [Link] [Link] [Link] observaiicovariabildeobiectcuacelainumecaovariabildeclas,vaascundevariabilade clasfademetodeleclasei! [Link] cudeclaraiaclassmethodsaustaticmethodDacvremstimcruispaiudenumei [Link],ovomdefinicustaticmethod. Amfipututobineacelailucrufolosinddecoratori:
@staticmethod
74
Decoratoriipotficoncepuicascurtturipentruapelareaunordeclaraiiexplicite,aacumamvzut nacestexemplu. Observaicmetoda__init__estefolositpentruainiializacuunnumeinstanaclaseiRobot. naceastmetod,[Link] [Link],ceeaceindicnaturadevariabildeinstana variabilei. [Link] moddeindicaresenumetereferinlaatribut. [Link] nruntime([Link])folosindnotaiaRobot.__doc__idocstringulmetodei [Link].__doc__ Exactcaimetoda__init__,maiexistometodspecial,__del__,careesteapelatatunci cndunobiecttrebuiedistrus,adicnuvamaififolosit,iarresurseleluisuntreturnatesistemului. naceastmetodreduceminumrulRobot.populaiecu1. Metoda__del__esteexecutatdacobiectulnumaiestenfolosininuexistogaraniec [Link],vatrebuisfolosiideclaraiadel cumamfcutnoiaici. NotpentruprogramatoriinC++/Java/C# Toimembriiuneiclase(inclusivmembriidate)suntpubliciitoatemetodelesuntvirtualn Python. Oexcepie:Dacfolosiimembriidatecunumecarencepcudubluunderscoreprecum __var_privat,Pythonexploateazacestaspectichiarvafacevariabilasfieprivat. Aadar,conveniaestecoricevariabilcarevremsfiefolositnumaincontextulclaseisau obiectului,artrebuisfienumitcuprimulcaracterunderscore,iartoatecelelaltenumesunt publiceipotfifolositedealteclase/[Link] esteimpusdePython(exceptndprefixuldubluunderscore).
Motenire
Unbeneficiumajoralprogramriiorientatepeobiecteesterefolosireacoduluiiocaledeaobine [Link] implementaorelaientreuntipiunsubtipntreclase. Szicemcscrieiunprogramncaretrebuiesineievidenaprofesoriloristudenilorntrun [Link],precumnume,adres,[Link] specifice,cumarfisalariul,cursurileiperioadeledeabsen,pentruprofesori,respectivnotelei taxelepentrustudeni. Puteicreadouclaseindependentepentrufiecaretipiprocesaacesteclaseprinadugareade [Link]. OcalemaibunarfiscreaioclascomunnumitMembruAlcoliiisfaceiclasele studentiprofesorsmoteneascdelaaceastclas,devenindastfelsubclasealeacesteia,iapoi 75
sadugaicaracteristicilaacestesubtipuri. [Link] MembruAlcolii,[Link],puteiadugaunnou cmpcard IDipentrustudeniipentruprofesoriprinsimplaadugareaacestuialaclasa [Link],[Link] puteifacereferirelaunprofesorsaustudentcaobiectMembruAlcoliiobject,ceeacepoatefi [Link] numitpolimorfism,ncareunsubtippoatefifolositnoricesituatiencareseateaptfolosirea unuitipprinteadicobiectulpoatefitratatdreptinstanatipuluiprinte. Observaiicrefolosimcodulclaseiprinteinuenevoieslrepetmnsubclasecumamfifost nevoiidacamficreatclaseindependente. [Link] profesoristudentsuntnumiteclasederivatesausubclase. Vomvedeaacestexemplupeunprogram.
#!/usr/bin/python # Fiier: [Link] class MembruAlcolii: '''Reprezint orice membru al colii.''' def __init__(self, nume, vrst): [Link] = nume [Link] = vrst print('(Iniializez MembruAlcolii: {0})'.format([Link])) def descrie(self): '''Afieaz detaliile mele.''' print('Nume:"{0}" Vrst:"{1}"'.format([Link], [Link]), end=" ") class profesor(MembruAlcolii): '''Reprezint un profesor.''' def __init__(self, nume, vrst, salariu): MembruAlcolii.__init__(self, nume, vrst) [Link] = salariu print('(Iniializez Profesor: {0})'.format([Link])) def descrie(self): [Link](self) print('Salariu: "{0:d}"'.format([Link])) class student(MembruAlcolii): '''Reprezint un student.''' def __init__(self, nume, vrst, note): MembruAlcolii.__init__(self, nume, vrst) [Link] = note print('(Iniializez student: {0})'.format([Link])) def descrie(self): [Link](self) print('Note: "{0:d}"'.format([Link])) 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: [Link]() # Funcioneaz i pentru profesor i pentru student
Rezultat:
$ python [Link] (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 [Link] reinutPythonnuapeleazaautomatconstructorulclaseibaz,trebuiesfaceiastaexplicit. Maiobservmcapelurilectreclasabazsefacprefixindnumeleclaseiapeluluimetodelori punndvariabilaselfmpreuncucelelalteargumente. Seconfirmcfolosiminstaneleclaselorprofesoristudentcaicumarfiinstaneale claseiMembruAlcoliicndfolosimmetodadescrieaclaseiMembruAlcolii. nplus,observaicesteapelatmetodadescrieasubtipuluinumetodadescrieaclasei [Link] metodelorntipulcurent,[Link],arficutatnclasele printe,unacteuna,nordineaspecificatntupluldindefiniiaclasei. Onotasupraterminologieidacantupluldemotenireestelistatmaimultdeoclas,acestcaz estedemoteniremultipl.
Rezumat
Amexploratdiverseaspectealeclaseloriobiectelorprecumidiferiteterminologiiasociatecu [Link]. Pythonesteputernicorientatpeobiecteinelegereaacestorconceptevvaajutaenormncariera deprogramator. MaidepartevomnvastratmcuintrrileiieirileicumsaccesamfiierenPython.
77
Pythonro:Intrri/ieiri
Introducere
[Link], [Link]()i print(). Pentruieire,putemfolosiidiversemetodealeclaseistr(string).Deexemplu,putemfolosi [Link](str) pentrudetaliisuplimentare. Alttipobinuitdeintrare/[Link],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
[Link],deexemplu-1textulvafiinversat. Funciainput()[Link] [Link]()vantoarcenprogram textulintrodus. [Link],textulesteun palindrom(definiiapentrulimbaengleza). Temapentruacas: Verificareacalitiidepalindromartrebuisignorepunctuaia,[Link] exemplu"Elefaccafele."estedeasemeneapalindrom,[Link] mbuntiacestprogramcasrecunoascacestpalindrom?
Fiiere
Puteideschidefiierepentruscrieresaucitireprincreareaunuiobiectdinclasafile([Link]) ifolosindmetodelesaleread,[Link] [Link], 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('[Link]', 'w') # Deschidere pentru scriere # 'w' vine de la 'writing' (rom. scriere) [Link](poem) # scriem textul n fiier [Link]() # nchidem fiierul f = open('[Link]') # Dac nu este specificat modul, se presupune citire, 'r' vine de la 'read' (rom. citire) while True: linie = [Link]() if len(linie) == 0: # Lungime 0 indic EOF - sfritul fiierului (engl. End Of File) break print(linie, end='') [Link]() # 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 [Link]'modcitire'('r'),mod'scriere'('w') saumod'adugarelasfrit'('a')([Link]).Putemfolosii('t')pentrufiieretextsau ('b')[Link],pecareleputeiaflalansnd help(open).Implicit,open()considerfiierul't'extildeschidenmod'r'(citire). nexemplulnostrudeschidemfiierulnmodscriereifolosimmetodawriteaobiectuluifiier pentruascrienfiieriapoilnchidemcufunciaclose. ncontinuaredeschidemacelaifiierdinnou,[Link] [Link] metodantoarceunrndcomplet,inclusivcaracterul'linienou'([Link])delasfritulliniei. Dacestereturnatunirgol([Link]),nseamncsaajunslasfritulfiieruluiiieimdin buclcudeclaraia'break'. Implicit,funciaprint()tiprestetextuliuncaracternewlinenmodautomatpeecran. Suprimmcaracterulnewlineautomatspecificndend=''deoareceliniacititaredejauncaracter [Link]. [Link] nfiieriacititdinacesta.
Conservarea
Pythonoferunmodulstandardnumitpickle([Link],amura)cuajutorulcruiaputei [Link] stocarepersistent. Exemplu:
#!/usr/bin/python # Fiier: [Link] import pickle # Numele fiierului n care stocm obiectul shoplistfile = '[Link]' # lista de cumprturi shoplist = ['mere', 'mango', 'morcovi'] # Scriem n fiier f = open(shoplistfile, 'wb') [Link](shoplist, f) # depunem (engl. dump) obiectul n fiier [Link]() del shoplist # distrugem variabila shoplist # Refacem din depozit f = open(shoplistfile, 'rb') storedlist = [Link](f) # ncrcm obiectul din fiier print(storedlist)
Rezultat:
80
Rezumat
Amdiscutatvariatetipurideintrri/ieiriimanipulareafiierelorfolosindmodululpickle. Acumvomstudiaconceptuldeexcepie.
81
Pythonro:Excepii
Introducere
[Link],dac trebuiescitiiunfiier,daracestanuexist?Saudaclaitersaccidentalntimpulrulrii programului?Astfeldesituaiisunttratatefolosindexcepii. Similar,dacanprogramerauctevadeclaraiiinvalide?AcestesituaiisunttratatedePythoncare ridicminileivspunecaexistoeroare.
Erori
[Link]? [Link],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 [Link]([Link]).
Excepii
Vomncerca([Link])[Link]-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..[Link],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/[Link] eroaresauexcepiespecificat,sauolistnparantezeaexcepiilor/[Link] numedeerori/excepii,sunttratatetoateerorileiexcepiile. [Link] centelesareunbloctry? Dacoeroaresauexcepienuestetratat,esteapelatrutinaimplicitdetratarealimbajuluiPython [Link] dejaasta. Maipoateexistaioclauzelseasociatcuunbloctry..[Link] dacnuaparenicioexcepie/eroare. nurmtorulexempluvomvedeacumsobinemobiectulexcepie,pentruaiextrageinformaii suplimentare.
Ridicareaexcepiilor
Putetiridicaexcepiifolosinddeclaraiaraiseifurnizndnumeleerorii/excepieiiobiectulcare urmeazafiaruncat([Link]). Eroareasauexcepiapecareoridicaitrebuiesfieoclasderivatdirectsauindirectdinclasa Exception.
#!/usr/bin/python # Fiier: [Link] class ShortInputException(Excepie): '''O clasa de excepii definit de utilizator.''' def __init__(self, lungime, minim):
83
Excepie.__init__(self) [Link] = lungime [Link] = 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([Link], [Link])) else: print('Nu a fost ridicat nici o excepie.')
Rezultat:
$ python [Link] Introducei ceva --> a ShortInputException: Ai introdus un text de lungime 1, era necesar minim 3 $ python [Link] Introducei ceva --> abc Nu a fost ridicat nici o excepie.
try..finally
[Link] corectindiferentdacaaprutsaunuoeroare?Astasepoatefacefolosindbloculfinally. Observaicputeifolosioclauzexceptmpreuncuclauzafinallypentruacelaibloctry. Vatrebuisleimbricaidaclevreipeamndou.
#!/usr/bin/python # Fiier: [Link] import time try: f = open('[Link]') while True: # citirea obinuit line = [Link]() if len(line) == 0: break
84
print(line, end='') [Link](2) # Ca s ne asigurm c funcioneaz un timp except KeyboardInterrupt: print('!! Ai anulat citirea din fiier.') finally: [Link]() print('(Curenie: Am nchis fiierul)')
Rezultat:
$ python [Link] 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("[Link]") as f: for line in f: print(line, end='')
Cumfuncioneaz: Rezultatultrebuiesfielafelcanexemplulprecedent,diferenaestecacumfolosimfuncia opencudeclaraiawithlsmnchidereafiieruluisfiefcutautomatdedeclaraiawith open .... [Link] funciaopen,sizicem"fiierul"nacestcaz. Eaapeleazntotdeaunafunciafiierul.__enter__naintedeancepebloculdedeclaraii pecarelincludeifunciafiierul.__exit__dupncheiereabloculuidedeclaraii. Astfelcodulcarearfitrebuitsfiescrisnbloculfinallyestenlocuitautomatdemetoda __exit__.Astfelsuntemajutaisevitmutilizareaexplicitadeclaraiilortry..finallyn modrepetat. Discuiamaiaprofundataacestuisubiectestedincolodeobiectivulacesteicrti,decivrogs citiiPEP343pentruoexplicaiecomplet. 85
Rezumat
Amdiscutatutilizareadeclaraiilortry..exceptitry..[Link] creapropriultipdeexcepieicumsridicmexcepii. VomexplorancontinuarebibliotecaPythonstandard.
86
Pythonro:BibliotecaPythonstandard
Introducere
BibliotecaPythonstandardconineunnumruriademoduleutileiesteparteaoricreiinstalri [Link] potfirezolvaterapiddaccunoateiplajadelucruripecareacestemodulelepotface. [Link](n limbaenglez)desprebibliotecaPythonstandardpotfigsitencapitolul'LibraryReference'din documentaiacarevinecuinstalareaPython. Sexplormcatevamoduleutile. Not [Link],v recomandcldurossreveniiatuncicndveifimaifamiliarizaicufolosirealimbajului Python.
Modululsys
[Link] [Link]. SzicemcvreisverificaiversiuneacomenziiPythonutilizate,szicempentruavasigurac [Link].
>>> import sys >>> sys.version_info (3, 0, 0, 'beta', 2) >>> sys.version_info[0] >= 3 True
Rezultat: 87
$ python2.5 [Link] [Link]: RuntimeWarning: E nevoie de Python 3.0 sau ulterior pentru a rula acest program $ python3 [Link] Continum normal
Modulullogging
Ceedefcutdacvreisstocaiundevamesajeimportantesaudedepanare,astfelnctsle verificaimaitrziucasanalizaimersulprogramului?Cumstocaiundevaacestemesaje?Acest obiectivpatefiatinsfolosindmodulullogging([Link]).
#!/usr/bin/python # Fiier: use_logging.py import os, platform, logging if [Link]().startswith('Windows'): logging_file = [Link]([Link]('HOMEDRIVE'), [Link]('HOMEPATH'), '[Link]') else: logging_file = [Link]([Link]('HOME'), '[Link]') [Link]( level=[Link], format='%(asctime)s : %(levelname)s : %(message)s', filename = logging_file, filemode = 'w', ) [Link]("nceputul programului") [Link]("O prelucrare important") [Link]("ncheiere")
Rezultat:
$python use_logging.py Logging to C:\Users\swaroop\[Link]
[Link],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 [Link]()(pentruinformaiisuplimentareasevedeaimport platform; help(platform)).DacesteWindows,determinmdriveulpecareseafldirectoarele utilizatorului,directorulncaresegsescacesteainumelefiieruluincarevomstocainformaia. [Link] doardirectorulutilizatoruluiiavemcaleacompletafiierului. [Link]()[Link] folosimofunciespecialnlocdesimplaconcatenareestegaraniacrezultatulvaficonform ateptrilorsistemuluideoperare. Configurmmodululloggingsscrietoatemesajelentrunformatanume,nfiierulspecificat. nfinal,putemstocamesajepentrudebugging,urmrire,[Link] ceprogramulafostlansat,putemvedeacesantmplatnprogram,chiardacnuafostafiat nimicpeecranutilizatoruluicarealansatprogramul.
Moduleleurllibijson
CtdedistractivarfidacaiputeascrieprogramecaresdearezultatulunorcutripeInternet? Iasvedem. [Link] [Link]!pentruaobinerezultatelecutriii dinfericireelnevadarezultatelecutriinformatJSONceeaceeuordeprocesatpentrunoi datoritmodululuijsondinbibliotecastandard. TODO Acestprogramnufuncioneazncceeacepareafioeroare([Link])nPython3.0beta2.
#!/usr/bin/python # Fiier: yahoo_search.py import sys if sys.version_info[0] != 3: [Link]('Acest program necesit Python 3.0 sau ulterior') import json import urllib, [Link], [Link], [Link] # V putei lua APP ID la [Link] YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr' SEARCH_BASE = '[Link] class YahooSearchError(Excepie): pass # Luat de la [Link] def search(interogare, rezultate=20, start=1, **kwargs): [Link]({ 'appid': YAHOO_APP_ID, 'query': interogare, 'results': rezultate, 'start': start, 'output': 'json'
89
}) url = SEARCH_BASE + '?' + [Link](kwargs) result = [Link]([Link](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 [Link] cheie1=valoare1&cheie2=valoare2careesteprocesatdefuncia [Link](). Deexemplu,deschideiacestlinknbrowserulweb(InternetExplorersausimilar)iveivedea20 derezultate,ncepndcuprimul,dupcuvintele"byteofpython",icurezultatulnformatJSON. [Link]()itransmitem [Link]()carevaciticoninutulpaginiiivaconvertifiecarerezultat [Link].
SeriaModululsptmnii
Suntmultedeexploratnbibliotecastandardcumarfidepanarea,gestiuneaopiunilorlinieide comand,expresiileregulares.a.m.d. CeamaibuncaledeacontinuaexplorareabiblioteciistandardestecitireaexcelenteiseriiModulul PythonalsptmniialuiDougHellmann.
Rezumat
[Link] recomandatsparcurgeidocumentaiabiblioteciiPythonstandardpentruavfaceoideeasupra modulelordisponibile. ncontinuarevomacoperidiverseaspectecarepotfacePythonmaicomplet.
90
Pythonro:Plus
Introducere
[Link] vommaiacoperictevaaspectecarevor'rotunji'cunotinelevoastredesprePython.
Transmitereatuplurilor
Vaidoritvreodatsreturnaimaimulterspunsuridintrofuncie?[Link] 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. [Link] exemplu,dacvreisfolosiioperaiadeindexarex[cheie]pentruoclas(aacumaifolosio pentrulistesautupluri),atuncinutrebuiedectsimplementaimetoda__getitem__()i [Link],astafacePythonpentrunsiclasalist! [Link] 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
[Link] bine,[Link],atuncio [Link] urmtorvaajutalaclarificareaproblemei:
>>> indicator = True >>> if indicator: print 'Da' ... Da
Formulelambda
Odeclaraielambdasefolosetepentruacreaobiectefuncienruntime.
#!/usr/bin/python # Fiier: [Link] def repetor(n):
92
Rezultat:
$ python [Link] cuvntcuvnt 10
Includerideliste
[Link] olistdenumereivremsobinemolistanumerelornmulitecu2darnumaidacnumruleste [Link].
#!/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 [Link] executmfolosinddeclaraiaexec:
>>> exec('print("Hello World")') Hello World
Similar,[Link] exemplusimplu.
>>> eval('2*3') 6
Declaraiaassert
[Link] celpuinunelementnlistapecareofolosiiivreisverificaiastaprinridicareauneieroridac [Link],este ridicatoexcepieAssertionError.
>>> list= ['item'] >>> assert len(lista) >= 1 >>> [Link]() 'item' >>> lista [] >>> assert len(lista) >= 1 Traceback (most recent call last): File "<stdin>", line 1, in <module>
94
AssertionError
[Link] fiectrateziproblemafiecafieziunmesajdeeroareinchiziprogramul.
Funciarepr
Funciareprsefolosetepentruaobineoreprezentarecanonicaobiectuluisubformdeir. Parteainteresantestecveiaveaeval(repr(obiect)) == obiectaproapetottimpul.
>>> i = [] >>> [Link]('item') >>> repr(i) "['item']" >>> eval(repr(i)) ['item'] >>> eval(repr(i)) == i True
Rezumat
AmmaiacoperitctevafacilitialelimbajuluiPythonnacestcapitoldarncnuleamacoperitpe [Link],[Link] estesuficientpentrupornirenoriceprogramdoriiscreai. MaidepartevomdiscutacumscontinumexplorarealimbajuluiPython.
95
Pythonro:Ceurmeaz
Dacaicititaceastcartecuateniepnacumiaiexersatomulimedeprograme,vai [Link] [Link],[Link]'Ceurmeaz?' Vasugerasabordaiaceastproblem: Creaivpropriacartedeadresecuinterfalaliniadecomand,pecareoputei rsfoi,puteiaduga,terge,modificacontacteprecumprieteni,familiecolegietc.i [Link] pentruoaccesarenviitor. Astaestedestuldeuordacvgndiilaeaprinprismadiverselorelementestudiatepnacum. Dacncmaivreiindicaiicumspornii,iatunpont. Pont(nucitii) [Link] [Link] [Link], tergeimodificapersoanele. Odatceputeifaceasta,[Link] unemaildemulumirepentruminunatacarte;).Acestpasesteopional,[Link] asemenea,vrogsluaincalculodonaie,participareacumbuntirisauvoluntariatulla traduceripentruasusinedezvoltareacontinuacesteicri. Dacprogramulvisaprutuor,iataltul: [Link] fiieredat. Comandareplacepoatefiattdesimplsaudesofisticatcumvrei,delaosimplformulde substituiedeiruripnlacutareadescheme(expresiiregulare). Dupasta,maiexistctevacideavcontinuacltorianPython:
Coduriexemplificative
Ceamaibuncaledeanvaunlimbajdeprogramareestedeacitiiscriemultcod: ProiectulPLEAC DepozituldecodRosetta exemplePythonlajava2s CarteadebucatePython esteocoleciefoartevaloroasdereeteiponturipentruarezolva [Link] Python.
96
ntrebriirspunsuri
DAuriiNUurioficialePython FAQoficialPython ListaluiNorvigdentrebrirare([Link]) InterviucuntrebriirspunsuriPython ntrebricutag'Python'peStackOverflow
Ponturisismecherii
([Link]) PythonTips&Tricks AdvancedSoftwareCarpentryusingPython ([Link] Python) CharmingPython esteoserieexcelentadearticoleinlegaturacuPythondeDavidMertz.
Carti,documentatii,tutoriale,filmulete
UrmatorulpaslogicdupacarteaaceastaestesacititiminunatacartealuiMarkPilgrimDiveInto Python(romAprofundareinPython)[Link] exploreazasubiectecaexpresiiregulare,procesaredeXML,serviciiweb,testarideunitati,[Link] detaliu. Alteresursefolositoaresunt: filmuleteShowMeDopentruPython filmuleteGoogleTechTalksdesprePython ListadetutorialePythonaluiAwaretek ZonaPythonEffbot's LinkurilasfarsitulfiecarulmesajPythonURL! DocumentatiiPython
Discuie
DacvncurcoproblemPythoninutiipecinesntrebai,grupuldediscuii [Link]. Asiguraivcvaifcuttemancercndntisorezolvaisinguri.
Nouti
DacvreisnvaiceleaprutemainounlumeaPythonatuncimergeilaPlanetaoficial Pythoni/sauPlanetaneoficialPython.
Instalareabibliotecilor
ExistunnumruriadebiblioteciopensourcepecareleputeifolosinprogramelaIndexul 97
pachetelorPython. PentrualeinstalaiutilizaputeisfolosiiexcelentulutilitarEasyInstall.
Softwaregrafic
Szicemcvreisacreaipropriulprogramcuinterfagrafic(GUI)[Link] poatefacefolosindobibliotecaGUI([Link])cuconexiunileeiPython. LegturilesuntceeacenepermitesscriemprogramenPythonisfolosimbiblioteciscrisenC sauC++,darinaltelimbaje. ExistaomulimedeopiunideGUIcarefolosescPython: PyQt AceastaesteoconexiunePythonpentrukituldeutilitareQtcareestefundaiapecareeste [Link],nspecialdatoritmediului [Link] source(licentaGPL)respectivtrebuieslcumparaidacvreiscreaisoftcusursele protejate(nchise).[Link] ncepecitiitutorialulPyQtsaucarteaPyQt. PyGTK AceastaesteconexiuneaPythonpentrukituldeutilitareGTK+careestebazapecareeste [Link]+aremultecomplicaiinutilizare,darndatacetefamiliarizezicu el,[Link] [Link]+lucreazbinepeLinux,iar [Link]+attsoftopensourceisoft [Link]. wxPython [Link] [Link],Windows,Macichiarpe platformeimplantate([Link]).ExistmulteIDEuridisponibilepentruwxPython careincludmediideproiectareGUIprecumSPE(Stani'sPythonEditor)iconstructorulde [Link] citiitutorialulwxPython. TkInter [Link],aivzut [Link]. TkInteresteportabilimergeattpeLinux/[Link],TkIntereste [Link]. PentrumaimulteopiunirsfoiipaginawikiGuiProgrammingdepewebsituloficialPython].
RezumatulutilitarelorGUI
[Link] unelteledemaisus,[Link] [Link],numaipeMac 98
Diverseimplementri
[Link] [Link]. Pentruarulaprogramelenoastreamfolositsoftwareul(pescurtsoftul)[Link] CPythonpentrucestescrisnlimbajulCiesteinterpretorulPythonclasic. MaiexistialtesofturicarepotrulaprogramePython: Jython [Link] bibliotecileJavaiclasedinPythonireciproc. IronPython [Link] [Link]. 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 [Link]!
99
Pythonro:ApendixFLOSS
Free/LibreandOpenSourceSoftware(FLOSS)
FLOSSestebazatpeconceptuldecomunitatecareesteelnsuibazatpeconceptuldepartajare,n [Link],modificareiredistribuire. Dacaicititdejacarteaaceasta,sunteidejafamiliarcuFLOSSntructaifolositPythontot timpul,iarPythonestesoftware'opensource'! IatctevaexempledeFLOSSpentruadaoideedespregenuldelucruripecarelepoatecreao comunitatecareconstruietencomun: [Link],ncetlmbrieaztoat lumea![Link] pentruMicrosoftWindows.[NucleulLinux] [Link],sponsorizatdefirma [Link] [Link] dectatt,puteirestartacalculatorulirulaLinuxdepeunCD!Acestlucruvpermites ncercaitoatefacilitilenouluisistemdeoperarenaintedealinstalancalculator. [UbuntuLinux] [Link],prezentri,foide [Link] [Link].[OpenOffice] [Link] [Link] [Link] feldeplugin([Link]). ProdusulsupartenerThunderbird([Link])esteunexcelentclientdeemail careciteteemailulctaiclipi.[MozillaFirefox,MozillaThunderbird] [Link] [Link],Windows, FreeBSD,MacOSipemultealteplatforme.[Mono,ECMA,[Link]] [Link],estecel maipopularserverwebdepeplanet!Elruleazmaimultdejumtatedinwebsiturile [Link],aaeApachesusinemaimultewebsituridecttoatcompetiialaunloc (inclusivMicrosoftIIS).[Apache] [Link] [Link] 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: [Link] LinuxToday NewsForge DistroWatch
101
Pythonro:ApendixDespre...
Aprecierefinal
Aproapetotsoftulfolositlacreareaacesteicriestefreeiopensource.
Natereaacesteicri
nprimuldraftaleiamfolositLinuxRedHat9.0cabazamediuluimeudelucruincepndcual aseleadraftLinuxFedoraCore3. IniialfoloseamKWordpentruascriecartea(cumamexplicatnleciadeistoriedinprefa).
Aniiadolescenei
MaitrziuamtrecutpeDocBookXMLfolosindKate,[Link] laOpenOfficecareaveauncontrolexcelentalformatriiialgenerriidePDF,darproducea documenteHTMLcamopite. nfinalamdescoperitXEmacsiamrescriscarteadela0nDocBookXML(dinnou)dupceam deciscaceastaestesoluiadetermenlung. nalaseleadraftmamhotrtsfolosescQuanta+[Link] [Link],amscrisundocument [Link],nPython desigur,careaduceaevideniereaautomatasintaxeintoatelistingurile.
Acum
Pentruacestalapteleadraft,[Link] onlineicititoriipotciti/edita/comentadirectnsitulwiki. ncfolosescVimpentrueditaredatoritextensieiViewSourceWithpentruFirefoxcarese integreazcuVim.
Despreautor
[Link]
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 [Link].RescrisaranjamentulDocBookdela0. 28/03/2004 Reviziiminore 16/03/2004 Adugiriicorecturi. 09/03/2004 Altecorecturidactilodatoratemultorcititoriutiliientuziati. 08/03/2004 Dupaenormdemultfeedbackisugestiidelacititoriamfacutmultemodificrila coninuticorecturidactilo.
0.99 22/02/2004 Adaugtuncapitolnou,[Link] argumentenfuncii. 0.98 16/02/2004 ScrisscriptPythonifoaiedestiluriCSSpentruambuntirezultatulXHTML, inclusivunanalizorlexicalbrut,darfuncionalpentruevideniereasintaxeinstil Vimnlistinguriledeprograme. 0.97 13/02/2004 Altdraftcompletrescris,[Link] masivestemaicoerentilizibil. 0.93 25/01/2004 AdugatdiscuiadespreIDLEialtelespecificeWindows 0.92 05/01/2004 103
Schimbrilauneleexemple. 30/12/2003 [Link]. 18/12/2003 [Link]. 21/11/2003 Rescrisiexpandatcartea. 20/11/2003 Corectatcatevaeroriminoreidactilo. 20/11/2003 ConversienXMLDocBook. 14/11/2003 DraftiniialeditatcuKWord.
104