Sunteți pe pagina 1din 92

Python ro:Primii pa i

Contents

1 Introducere 2 Folosind promptul interpretorului 3 Alegerea unui editor 4 Folosind un fi ier surs 4.1 Cum func ioneaz 4.2 Programe Python executabile 5 Cum ob inem ajutor 6 Rezumat

Introducere
Vom afla acum ce trebuie f cut pentru a rula tradi ionalul program 'Hello World' n Python. Astfel vom nv a cum s scriem, salv m i rul m programe Python. Sunt doua c i de a folosi Python pentru a rula un program - folosind promptul interactiv al interpretorului sau folosind fi ierul surs . Vom afla cum se folosesc ambele metode.

Folosind promptul interpretorului


Porni i interpretorul de la linia de comand introducnd python la prompt. Pentru utilizatorii de Windows, pute i rula interpretorul din linia de comand dac ave i setat corect variabila PATH. Dac folosi i IDLE (de la Integrated Developpement Linux Environment), dati clic pe Start

Programs

Python

3.0

IDLE (Python GUI).

Acum introduce i print('Hello World') urmat de tasta Enter. Ar trebui s vede i ca rezultat cuvintele Hello

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 >>>
Observa i c Python va da rezultatul comenzii imediat! Ceea ce tocmai a i introdus este o declara ie Python singular . Folosim print pentru (nesurprinzator) a tip ri orice valoare pe care i-o furniz m. Aici i furniz m textul Hello

World i acesta este tip rit rapid pe ecran.


Cum s p r si i interpretorul

Ca s p r si i prompt-ul, tasta i Ctrl-D dac folosi i IDLE sau un shell Linux/BSD. n cazul consolei Windows (Command prompt), tasta i Ctrl-Z urmat de tasta ENTER.

Alegerea unui editor


nainte de a trece la scrierea de programe Python n fi iere surs avem nevoie de un editor pentru a crea aceste fi iere. Alegerea editorului este crucial . Trebuie ales la fel ca i ma inile. Un editor bun v va ajuta s scrie i programe Python u or, f cnd timpul petrecut o c l torie confortabil v atinge i obiectivul) ntro maniera rapid O cerin i sigur .
[1]

i v va ajuta s ajunge i la destina ie (s

de baz este eviden ierea sintaxei

n care diferitele componente ale sintaxei sunt colorate de a a

natur nct s po i vizualiza programul i rularea lui. Dac utiliza i Windows, v recomand s folosi i IDLE. IDLE face syntax highlighting i multe altele printre care faptul c v permite s rula i programele tot n IDLE. O not special : Nu folosi i Notepad - este o op iune rea fiindc nu face syntax highlighting i nu suport indentarea textului, ceea ce este foarte important n cazul nostru, a a cum ve i vedea n continuare. Editoarele bune precum IDLE ( i VIM) v vor ajuta automat s indenta i textul. Dac utiliza i Linux/FreeBSD, atunci ave i o mul ime de op iuni pentru editor. Dac sunte i chiar la nceputul carierei de programator, poate o s prefera i 'geany'. Are interfa pentru compilat i rulat programele Python f r complica ii. Dac sunte i programator experimentat, atunci probabil c folosi i deja Vim sau Emacs. Nu mai e nevoie s preciz m c acestea dou sunt cele mai puternice editoare i ve i avea nenum rate avantaje din folosirea lor la scrierea de programe Python. Eu personal folosesc Vim pentru majoritatea programelor. Dac sunte i programator ncep tor, pute i folosi Kate care este unul din favoritele mele. n cazul n care dori i s aloca i timpul necesar nv rii lucrului cu Vim sau Emacs, v recomand s le nv a i pe amndou , ntruct pe termen grafic cu utilizatorul i butoane speciale

lung ve i culege foloase mult mai mari. n aceast carte vom folosi IDLE, editorul nostru IDE cel mai recomandat. IDLE este instalat n mod implicit de c tre installerele Python pentru Windows i Mac OS X. Este disponibil i pentru Linux i BSD n colec iile ('engl. repositories') respective. Vom explora folosirea mediului IDLE n capitolul urm tor. Pentru mai multe detalii, v rog s vizita i documenta ia IDLE . Dac tot mai dori i s vede i i alte op iuni pentru editor, recomand cuprinz toarea list de editoare pentru Python i s opta i. Pute i alege i un IDE (Integrated Development Environment) pentru Python. A se vedea lista de medii integrate (IDE) care suport Python pentru detalii suplimentare. Imediat ce ve i ncepe s scrie i programe Python mari, IDE-urile pot fi cu adev rat foarte folositoare. Repet, v rog s alege i un editor adecvat - el poate face scrierea de programe Python mai distractiv Pentru utilizatorii de Vim Exist o introducere bun despre 'Cum s faci Vim un IDE puternic pentru Python' de John M Anderson. Pentru utilizatorii de Emacs Exist o introducere bun despre 'Cum s faci Emacs un IDE puternic pentru Python' de Ryan McGuire. i u oar .

Folosind un fi ier surs

S ne ntoarcem la programare. Exist o tradi ie ca de cte ori nve i un nou limbaj de programare, primul program pe care l scrii s fie programul 'Hello World' - tot ce face el este s afi eze 'Hello World' cnd l rulezi. Dup expimarea lui Simon Cozens sa te ajute s nve i limbajul mai bine' :) . Porni i editorul ales, introduce i programul urm tor i salva i-l sub numele helloworld.py Dac folosi i IDLE, da i clic pe File
[2]

, este 'incanta ia tradi ional c tre zeii program rii ca

New Window i introduce i programul de mai jos. Apoi clic pe

File

Save.

#!/usr/bin/python #Fisier: helloworld.py

print('Hello World')
Rula i programul deschiznd un shell
[3]

i introducnd comanda python helloworld.py.

Daca folosi i IDLE, deschide i meniul Run Rezultatul este afi at astfel:

Run Module sau direct F5 de pe tastatur .

$ python helloworld.py Hello World


Daca a i ob inut rezultatul afi at mai sus, felicit ri! - a i rulat cu succes primul program n Python. n caz ca a i ob inut un mesaj de eroare, v rog, tasta i programul anterior exact ca n imagine i rula i programul din nou. De re inut c Python este case-sensitive
[4]

a adar print nu este acela i lucru cu

Print - observa i p minuscul n primul exemplu i P majuscul n al doilea exemplu. De asemenea,


asigura i-v c nu exist spa ii sau TAB naintea primului caracter din fiecare linie - vom vedea mai trziu de ce este att de important.

Cum func ioneaz


S consider m primele dou linii din program. Acestea sunt numite comentarii - orice s-ar afla la dreapta caracterului # devine comentariu i este util n special pentru documentarea cititorului programului. Python folose te comentarii numai pentru acest caz. Prima linie este numita linie shebang - de fiecare dat cnd ncepe cu #! urmat de loca ia unui program; asta spune sistemului nostru Linux/Unix c fi ierul trebuie nteles prin acest interpretor atunci cnd este executat. O explica ie mai detaliat va fi prezentat n capitolele urm toare. De re inut c pute i rula oricnd programul pe orice platform specificnd interpretorul n linia de comand , ca n exemplul python helloworld.py . Important Folosi i cu grij comentarii n programe pentru a explica detalii importante ale unor instruc iuni - Asta va ajuta cititorul s n eleag mai u or ce 'face' programul. Acel cititor pute i fi dumneavoastr , peste ase luni! Comentariile sunt urmate de o declara ie Python. n cazul nostru apel m func ia print care pur i simplu tip re te pe ecran textul 'Hello World'. Vom nv a despre func ii ntr-un alt capitol; ce trebuie re inut acum este c orice am fi pus n paranteze ar fi aparut pe ecran. n acest caz punem

'Hello World', ceea ce se poate numi string - fi i f r grij , vom explora mai trziu terminologia
aceasta n detaliu.

Programe Python executabile


Partea aceasta se aplic numai utilizatorilor de Linux/Unix, dar utilizatorii de Windows ar putea fi curio i n leg tur cu prima linie din program. Pentru nceput, va trebui s d m fi ierului permisiunea de a fi executabil folosind comanda chmod i apoi s rul m programul surs .

$ chmod a+x helloworld.py $ ./helloworld.py Hello World


Comanda chmod este folosit aici pentru a schimba pentru to i
[6] [5]

mod-ul fi ierului dndu-i drept de execu ie

utilizatorii sistemului. Pe urm execut m programul direct, specificnd loca ia

programului surs . Folosim ./ pentru a indica localizarea programului executabil n directorul curent. Pentru a face lucrurile i mai distractive, pute i redenumi fi ierul cu numele helloworld i l pute i rula cu ./helloworld i tot va merge, folosind interpretorul de la loca ia specificat pe primul rnd din fi ier.. Ce e de f cut dac nu tim unde este localizat Python? Atunci pute i folosi programul env specific sistemelor Linux. Modifica i primul rnd astfel:

#!/usr/bin/env python
Programul env la rndul lui va c uta interpretorul Python care va rula programul. Pn acum am putut s execut m programele noastre doar dac tiam calea exact . Dar dac dorim

s rul m programul din orice director? Putem s facem asta dac memor m programul ntrunul din directoarele listate n variabila de mediu PATH. Oridecte ori rula i vreun program, sistemul caut acel program n directoarele listate n variabila PATH i apoi ruleaz programul. Putem face programul nostru disponibil n orice director prin copierea programului ntrunul din directoarele din PATH.

$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/swaroop/bin $ cp helloworld.py /home/swaroop/bin/helloworld $ helloworld Hello World


Putem afi a con inutul variabilei PATH folosind comanda echo i prefixnd numele variabilei cu caracterul $ pentru a-i transmite shell-ului c avem nevoie de valoarea acestei variabile. Observ m c /home/swaroop/bin este printre directoarele din PATH, unde swaroop este numele de utilizator
[7]

pe care eu l folosesc n sistemul meu. Exist unul similar pentru numele de utilizator al fiecaruia

pe sistemul s u. Ca alternativ , pute i ad uga un director anume la variabila PATH - se face executnd PATH=$PATH:/home/swaroop/mydir unde '/home/swaroop/mydir' este directorul pe care eu vreau sa-l adaug la variabila PATH. Aceast metod este foarte util dac vre i s scrie i

scripturi utile pe care vre i s le rula i oricnd din orice loca ie a sistemului. Seam n cu a- i crea propriile comenzi, precum cd sau orice alt comand pe care o execu i n terminalul Linux sau DOS prompt. Aten ie Din punctul de vedere al Python-ului, program sau script sau software nseamn acela i lucru!

Cum ob inem ajutor


Dac ave i nevoie repede de informa ii despre vreo func ie sau declara ie din Python, atunci pute i apela la functionalitatea inclus
[8]

help. Este foarte folositor, mai ales la promptul


pentru

interpretorului. De exemplu rula i help(print) - se va afi a documenta ia de asisten func ia print folosit pentru afi area pe ecran. Not Tasta i q pentru a ie i din help.

Similar, pute i ob ine informa ii despre aproape orice din Python. Folosi i help() pentru a afla mai multe despre nsu i help! n cazul n care ave i nevoie de ajutor n leg tur cu operatori precum return, atunci va trebui s -i pune i n ghilimele (ca n help('return')) pentru ca Python s in eleag f r confuzie ce ncerca i s face i.

Rezumat
Acum ar trebui s pute i scrie, salva i rula cu u urin devenit utilizator de Python, s mai nv programe Python. Pentru ca a i m cteva concepte din Python.

Referin e: 1. 2. 3. 4. 5. 6. 7. 8. engl. syntax highlighting autorul minunatei c r i 'Beginning Perl' terminal Linux sau DOS prompt sensibil fa de cazul caracterelor n.tr. minuscule/majuscule

engl. change engl. all engl. username engl. built-in

Python ro:Elemente
Simpla tip rire a textului 'Hello World' nu ajunge, a a-i? Vre i s face i mai mult de att - vre i s prelua i ceva intr ri, s le prelucra i i s ob ine i un rezultat. Putem face asta n Python folosind constante i variabile.

Contents

1 Constante literale 2 Numere 3 iruri 3.1 Ghilimele simple 3.2 Ghilimele duble 3.3 Ghilimele triple 3.4 Secven e de evadare 3.5 3.6 iruri brute irurile sunt imuabile

3.7 Concatenarea literalilor ir 3.8 Metoda format 4 Variabile 5 Nume de identificatori 6 Tipuri de date 7 Obiecte 7.1 Exemplu: Folosirea variabilelor i a literalilor 8 Linii logice i linii fizice 9 Indentarea 10 Rezumat

Constante literale
O constanta literal este un num r precum 5, 1.23, 9.25e-3 sau un ir
[1]

precum 'Acesta este un

ir' sau "E

string!". Se nume te literal fiindc este folosit literal - i folosim valoarea literalmente. Num rul 2 se reprezint
ntotdeauna pe sine i nimic altceva - este o constant deoarece valoarea sa nu poate fi schimbat . De aici denumirea de constante literale.

Numere
Numerele n Python sunt de trei tipuri - integer, float i complex. Un exemplu de integer (rom. ntreg) este 2 care este un num r ntreg. Exemple de float sau floating point
[2]

sunt 3.23 i 52.3E-4. Nota ia E indic puterile lui 10. n acest caz,

52.3E-4 nseamn 52.3 * 10 .


-4

Exemple de numere complexe sunt (-5+4j) i (2.3 - 4.6j) Not pentru programatorii experimenta i Nu exist un tip separat 'long int'. Tipul implicit integer poate fi orice valoare mare.

iruri

Un ir (engl. string) este o secven

de caractere.

irurile sunt n esen

doar o succesiune de cuvinte. Cuvintele

pot fi n limba englez sau n orice alt limb suportat de standardul Unicode, ceea ce nseamn aproape orice limb din lume. Not pentru programatorii experimenta i Nu exist iruri "ASCII" pure pentru c Unicode este un superset al ASCII. Dac se impune n program un flux

de octe i codat ASCII, atunci folosi i str.encode("ascii"). Pentru detalii, urm ri i discu ia pe acest subiect de la StackOverflow. Implicit, toate irurile sunt n Unicode. Aproape pot garanta c ve i folosi iruri n aproape toate programele Python pe care le scrie i, a a c acorda i aten ie p r ii urm toare despre cum se folosesc irurile n Python.

Ghilimele simple
Pute i specifica iruri folosind ghilimele simple
[3]

precum 'Citeaza-ma referitor la acest

subiect'. Tot spa iul alb precum SPACE i TAB sunt p strate ca atare [4].

Ghilimele duble
irurile n ghilimele duble [5] func ioneaza la fel ca i cele n ghilimele simple. De exemplu "Cum te

cheam ?"

Ghilimele triple
Pute i specifica iruri care se ntind pe mai multe linii folosind ghilimele triple (engl. triple quotes) - (""" sau '''). Pute i folosi liber ghilimele simple dau duble n interiorul ghilimelelor triple. Iat un exemplu:

'''Acesta este un

ir multi-linie. Aceasta este prima linie.

Aceasta este a doua linie. 'Cum te nume ti?', l-a intrebat. El a zis "Bond, James Bond". '''

Secven e de evadare
S presupunem c vrem s utiliz m un ir care con ine un apostrof (una din ghilimele simple) '. Cum o s specific m irul What's your name?. Nu-l putem specifica 'What's your name?' pentru c Python va confunda apostroful cu sfr itul irului. ntr-un fel sau altul va trebui s specific m c acel apostrof face parte din ir, nu este un delimitator. Pentru aceasta se folose te o secven de evadare
[6]

Specific m apostroful \' - observa i backslash-ul. Astfel putem specifica irul 'What\'s your name?'. Alt cale de a specifica acest ir este utilizarea ghilimelelor duble pentru delimitarea sirului. Problema apare i la includerea unei ghilimele duble ntr-un ir delimitat cu ghilimele duble. i pentru evadarea backslash-ului trebuie tot backslash \\. Dar dac am vrea s specific m un ir pe dou rnduri? O solu ie este s folosim ghilimele triple cum am v zut mai devreme, dar putem s folosim o secven de evadare pentru sfr itul liniei - \n pentru a

indica trecerea pe o linie nou . Un exemplu ar fi Aceasta este prima linie\nAceasta este a

doua linie. Alt exemplu util de secven

de evadare este pentru TAB - \t. Exist mult mai multe, dar

le-am prezentat aici pe cele mai folosite de noi. Un lucru notabil este c ntr-un ir un backslash la sfr itul liniei arat continuarea irului pe linia urm toare, f r s se adauge caracterul newline. De exemplu:

"Aceasta este prima propozi ie. \ Aceasta este a doua propozi ie".
este echivalent cu "Aceasta este prima propozi ie. Aceasta este a doua propozi ie".

iruri brute
Dac ave i nevoie s specifica i iruri n care s nu fie procesate secven e de evadare trebuie s folosi i iruri brute
[7]

prefixnd irul cu r sau R. De exemplu r"Caracterul newline este indicat de

\n".

irurile sunt imuabile


Asta nseamn c odat create, nu mai pot fi modificate. De i pare un lucru r u, nu este. Vom vedea n diferitele programe prezentate de ce asta nu este o limitare.

Concatenarea literalilor ir
Dac se al tura doi literali, ei sunt concatena i de Python automat. De exemplu 'What\'s ' 'your

name?' este convertit automat n "What's your name?".


Not pentru programatorii C/C++ Nu exist n Python un tip de date separat char. Nu exist nici o nevoie real de a a ceva, deci sunt sigur c n-o s -i duce i dorul. Not pentru programatorii Perl/PHP Re ine i ca irurile delimitate de gihilimele simple sau duble sunt la fel, nu difer prin nimic. Not pentru utilizatorii de expresii regulare Folosi i ntotdeauna iruri brute cand ave i de-a face cu expresii regulare, altfel o s fie nevoie de multe c ut ri n urm pentru a g si ce nu merge. De exemplu referin ele retroactive
[8]

pot fi utilizate ca '\\1' sau

r'\1'.

Metoda format
Uneori vrem s construim iruri din alte informa ii. Aici este folositoare metoda format().

#!/usr/bin/python # Fi ier: str_format.py

vrst

= 25

nume = 'Swaroop'

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

print('De ce se joac
Rezultat:

{0} cu python-ul

la?'.format(nume))

$ python str_format.py Swaroop are 25 de ani. De ce se joac


Cum func ioneaz : Un ir poate folosi anumite specifica ii i apoi poate apela metoda format pentru a substitui acele specifica ii care corespund argumentelor metodei format. Observa i prima folosire, unde folosim {0} i asta corespunde cu varibila nume care este primul argument al metodei format. Similar, a doua specifica ie este {1} corespunzatoare variabilei vrst care este al doilea argument pentru metoda format.

Swaroop cu python-ul

la?

Observa i c puteam ob ine acela i lucru prin concatenare: nume + ' are ' +

str(vrst ) + ' de ani', dar uite ce urt

i predispus la erori este aceast cale. n al

doilea rnd, conversia n ir este f cut automat de metoda format n locul unei conversii explicite. n al treilea rnd, folosind metoda format putem schimba mesajul f r s avem de-a face cu variabilele i reciproc. Ce face Python n metoda format este c nlocuie te valoarea fiec rui argument n locurile specificate. Pot exista i specific ri mai detaliate, cum ar fi:

>>> '{0:.3}'.format(1./3) # zecimal (.) precizie de 3 zecimale pentru float '0.333' >>> '{0:_^11}'.format('hello') # umple pn centrat i bordat cu underscore (_) '___hello___' >>> '{nume} a scris {carte}.'.format(nume='Swaroop', carte='Un pic de Python') # pe baz de cuvinte-cheie 'Swaroop a scris Un pic de Python.'
Detalii despre aceste specifica ii de formatare sunt date n PEP 3101 (PEP=Python Enhancement Proposal).

la 11 caractere cu textul

Variabile
Folosirea exclusiv a literalilor poate deveni rapid plictisitoare - avem nevoie s stoc m orice informa ie i s o prelucr m. Aici este locul variabilelor. Variabilele sunt exact ceea ce spune numele lor - valoarea lor poate fi modificat , va s zic se poate stoca orice ntro variabil . Variabilele sunt ni te mici zone din memoria calculatorului unde se stocheaz ni te informa ie. Spre deosebire de constante, e nevoie de a accesa aceast informa ie, din acest motiv variabilele au nume.

Nume de identificatori
Variabilele sunt exemple de identificatori. Identificatorii sunt nume date pentru a identifica ceva. Exist cteva reguli care trebuie s fie urmate la stabilirea identificatorilor: Primul caracter al numelui trebui s fie o litera a alfabetului (majuscul ASCII, minuscul ASCII, caracter Unicode) sau underscore ('_'). Restul numelui identificatorului poate include i cifre (de la 0 la 9). Pentru numele de identificatori majusculele si minusculele sunt considerate diferite (engl. case-sensitive). De exemplu, myname i myName nu desemneaz aceea i variabil . Observa i minuscula n n primul caz i majuscula N n al doilea. Exemple de nume valide de identificator sunt i, __chiar_a a, nume_23, a1b2_c3 i

resum _count.
Exemple de nume invalide de identificator sunt 2chestii, asta contine spa ii i

cal-breaz.

Tipuri de date
Variabilele pot lua valori de diferite tipuri numite tipuri de date. Tipurile de baz sunt numere i iruri, despre care am discutat deja. n ultimele capitole vom nv a cum s cre m propriile noastre tipuri de date, folosind clase.

Obiecte
Re ine i, Python consider c tot ce se folose te n program este obiect, n sens generic. n loc de a spune ceva-ul, spunem obiectul. Not pentru utilizatorii de POO Python este puternic orientat pe obiecte n sensul c toate sunt obiecte, inclusiv numerele, irurile i func iile. Acum vom vedea cum se folosesc variabilele mpreun cu literalii. Salva i urm torul program i rula i-l. Cum se scriu programele Python De acum ncolo, procedura standard de a salva i rula programele Python este astfel: 1. Deschide i editorul preferat. 2. Introduce i codul programului dat n exemplu. 3. Salva i-l ntrun fi ier cu numele men ionat n comentariu. Eu urmez conven ia de a salva toate programele Python n fi iere cu extensia .py. 4. Rula i-l folosind interpretorul cu comanda python program.py sau folosi i IDLE pentru a rula programe. De asemenea pute i folosi metoda executabil cum am explicat mai devreme.

Exemplu: Folosirea variabilelor i a literalilor


# Fi ier : var.py

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

s = '''Acesta este un

ir multi-linie.

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


Rezultat:

$ python var.py 5 6 Acesta este un ir multi-linie.

Aceasta este linia a doua.


Cum func ioneaz : Iat cum lucreaz programul: nti, atribuim valoarea constantei literale 5 variabilei

i folosind operatorul de atribuire (=). Aceasta linie este o declara ie deoarece sus ine
c trebuie f cut ceva, n acest caz, conect m variabila i la valoarea 5. n continuare, tip rim valoarea lui i folosind declara ia print care, previzibil, tip reste valoarea variabilei pe ecran. Apoi ad ug m 1 la valoarea stocat n i i p str m noul rezultat. Tip rim valoarea variabilei i ob inem ce am prev zut, valoarea 6. Similar, atribuim literalul ir variabilei s i o tip rim. Not pentru programatorii n limbaje cu tipuri statice Variabilele sunt folosite prin simpla atribuire a unei valori. Nu este necesar nici o declara ie sau defini ie de tip de date.

Linii logice i linii fizice


O linie fizic este ceea ce vede i cnd scrie i programul. O linie logic este ceea ce vede Python ca o singur declara ie. Python presupune implicit c fiecare linie fizic corespunde unei linii logice. Un exemplu de linie logic este o declara ie precum print('Hello World') dac aceasta este singur pe linie (cum se vede n editor), atunci ea corespunde i unei linii fizice. Implicit, Python ncurajeaz folosirea unei singure linii logice pe linia fizic (rnd), ceea ce face codul mult mai lizibil.

Dac vre i s specifica i mai mult de o linie logic pe linie fizic , va trebui s specifica i explicit ncheierea liniei logice cu (;). De exemplu,

i = 5 print(i)
este efectiv la fel ca

i = 5; print(i);
i acela i lucru poate fi scris

i = 5; print(i);
sau chiar

i = 5; print(i)
Totu i, recomand cu t rie s r mne i la scrierea cel mult a unei singure linii logice pe fiecare linie fizic . Prin folosirea mai multor linii logice pe o linie fizic se ob ine realmente cod mai lung. Ideea este s se evite semnul punct i virgul la maxim posibil pentru a ob ine un cod ct mai lizibil. De fapt, eu n-am folosit niciodat i nici n-am v zut punct i virgul ntr-un program Python.

S d m un exemplu de linie logic ntins pe mai multe linii fizice, care se nume te reunire explicit a liniilor.

s = 'Acesta este un care continu print(s)


Se ob ine rezultatul:

ir \

pe a doua linie.'

Acesta este un
Similar,

ir care continu

pe a doua linie.

print\ (i)
este la fel ca

print(i)
Exist i reunire implicit a liniilor, conform unei prezum ii care elimin

nevoia de backslash. Este cazul n care linia logic folose te paranteze rotunde,

paranteze drepte sau acolade. Le ve i vedea n ac iune cnd vom scrie programe folosind liste n capitolele finale.

Indentarea
Spa iul alb este important n Python. De fapt, spa iul alb la nceputul liniei este important. Acesta se nume te indentare. Spa iul alb (spa ii i taburi) de la nceputul liniei logice este folosit pentru a determina nivelul de indentare al liniei logice, care la rndul lui este folosit pentru a determina gruparea declara iilor. Asta nseamn c declara iile care merg mpreun trebuie s aib aceea i indentare. Fiecare astfel de set de declara ii se nume te bloc. Vom vedea exemple despre importan a blocurilor n capitolele urm toare. Un lucru demn de re inut este c indentarea gre it poate produce erori. De exemplu:

i = 5 print('Valoarea este ', i) # Eroare! Observa i un spa iu la nceputul liniei. print('Repet, valoarea este ', i)
Cnd rula i asta, ob ine i urm toarea eroare:

File "whitespace.py", line 4 print('Valoarea este ', i) # Eroare! Observa i un singur spa iu la nceputul liniei. ^ IndentationError: unexpected indent
Observa i c exist un spa iu la nceputul liniei a doua. Eroarea indicat de Python ne spune c sintaxa este gre it , adic programul nu a fost scris corespunz tor. Asta nseamn c nu po i ncepe n mod arbitrar noi blocuri de declara ii - cu excep ia blocului principal[9] implicit pe care l-a i folosit tot timpul. Cazurile n care pute i folosi un nou bloc de declara ii vor fi detaliate n capitolele finale, cum ar fi capitolul despre controlul execu iei. Cum se indenteaz Nu folosi i un amestec de SPACE i TAB fiindc programele nu vor lucra corect pe toate platformele. V recomand c lduros s folosi i un singur TAB sau patru spa ii pentru fiecare nivel de indentare. Alege i oricare din aceste stiluri de indentare. i exclusiv. Not pentru programatorii n limbaje cu tipuri statice Python va folosi mereu indentarea pentru blocuri i niciodat acolade. Rula i from __future__ import i mai important, alege i un stil i folosi i-l n mod consistent

braces pentru a afla mai multe detalii.

Rezumat
Acum c am trecut prin multe detalii esen iale, putem continua cu lucruri mai interesante cum ar fi declara ii pentru controlul execu iei. Asigura i-v c a i n eles ce a i nvatat n acest capitol.

Python ro:Operatori i expresii

Contents

1 Introducere 2 Operatori 2.1 Prescurtare pentru opera ii matematice i atribuiri 3 Ordinea de evaluare 4 Schimbarea ordinii de evaluare 5 Asociativitatea 6 Expresii 7 Rezumat

Introducere
Majoritatea declara iilor (linii logice) pe care le scrie i con in expresii. Un exemplu de expresie simpl este 2 + 3. O expresie poate fi descompus n operatori i operanzi. Operatorii sunt functionalit i care execut ceva i pot fi reprezenta i prin simboluri precum + sau prin cuvinte cheie speciale. Operatorii au nevoie de ni te date asupra c rora s opereze, numite operanzi. n acest caz, 2 i 3 sunt operanzii.

Operatori
Vom arunca o privire rapid asupra operatorilor i a folosirii lor: Re ine i c pute i evalua expresiile date n exemple folosind interactiv interpretorul. De exemplu, pentru a testa expresia 2 + 3, folosind interactiv interpretorul Python:

>>> 2 + 3 5 >>> 3 * 5 15 >>>

Operatori i folosirea lor


Operator + Nume Plus Explica ie adun dou obiecte Exemple

3 + 5 fac 8

'a' + 'b' fac 'ab'.


fie face un num r s fie negativ fie d diferen a ntre dou numere d produsul a dou numere sau repetarea unui ir de num rul specificat de ori

Minus

-5.2 face negativ num rul 5.2 50 - 24 fac 26.

Inmul ire

2 * 3 fac 6 'la' * 3 d 'lalala'. 3 ** 4 d 81 (adic 3 * 3 * 3 * 3) 4 / 3 d 1.3333333333333333.

**

Putere

d x la puterea y

mp r ire mp r ire ntreag

mparte x la y

//

d partea ntreag a ctului

4 // 3 fac 1.

Modulo

d restul mp r irii

8 % 3 fac 2 -25.5 % 2.25 fac 1.5.

<<

Transla ie la stnga

Translateaza bi ii unui num r la stnga cu num rul specificat de bi i. (Orice num r este reprezentat n memorie sub forma de bi i - cifre binare 0 i 1)

2 << 2 da 8 2 este reprezentat prin 10 n bi i. Prin transla ie la stnga cu doi bi i se ob ine 1000 ceea ce reprezint num rul 8.

>>

Transla ie la dreapta

Translateaza bi ii num rului la dreapta cu num rul specificat de bi i.

11 >> 1 d 5 11 este reprezentat n bi i prin 1011 care translatat la dreapta cu un bit d 101 ceea ce reprezint num rul 5. 5 & 3 da 1. 5 | 3d 7 5 ^ 3 fac 6 ~5 d -6.

& | ^

AND OR XOR Complement binar

I binar ntre numere SAU binar ntre numere SAU exclusiv binar ntre numere

complementul lui x este -(x+1)

<

Mai mic (dect)

Valoarea de adev r a propozi iei x este mai mic dect y. To i operatorii de compara ie iau valorile logice True sau False. Observa i c aceste nume ncep cu majuscul . Valoarea de adev r a propozi iei x este mai mare dect y. Valoarea de adev r a

5 < 3 d False 3 < 5 d True.


Compara iile pot fi nl n uite arbitrar: 3 < 5 < 7 d True.

>

Mai mare (dect)

5 > 3 d True. Dac ambii operanzi sunt numere,


ace tia sunt converti i nti la un tip comun. n caz contrar opera ia ar avea mereu valoarea False.

<=

Mai mic sau

x = 3; y = 6; x <= y d True.

egal (cu)

propozi iei x este mai mic sau cel mult egal cu y. Valoarea de adev r a propozi iei x este mai mare sau cel pu in egal cu y.

>=

Mai mare sau egal (cu)

x = 4; y = 3; x >= 3 da True.

x = 2; y = 2; x == y d True.
== Egal (cu) Verific dac dou numere sunt egale

x = 'str'; y = 'stR'; x == y d False. x = 'str'; y = 'str'; x == y d True.

!=

Diferit (de)

Verific dac dou numere sunt diferite

x = 2; y = 3; x != y d True.

not

NU logic

dac x este True, d False. Dac x este False, d True.

x = True; not x d False.

x = False; y = True; x and y d False


and I logic

x and y d False dac x este False, altfel d valoarea lui y

ntruct x este False. n acest caz, Python nu va evalua pe y fiindc tie c partea stng a expresiei 'and' este False ceea ce d ntregii expresii valoarea

False indiferent de celelalte valori. Acest fapt se


nume te evaluare n circuit scurt. dac x este True, d True, altfel d valoarea lui y

or

SAU logic

x = True; y = False; x or y d True. i aici se


aplic evaluarea n circuit scurt.

Prescurtare pentru opera ii matematice i atribuiri


Este uzual s faci o prelucrare matematic a unei variabile i s p strezi apoi rezultatul tot n ea; de aceea exist o prescurtare pentru acest fel de expresii: n loc de:

a = 2; a = a * 3
pute i scrie:

a = 2; a *= 3
Observa i c var = var opera ie expresie devine var opera ie= expresie.

Ordinea de evaluare
Daca ave i o expresie precum 2 + 3 * 4, se va evalua nti opera ia de adunare sau cea de nmul ire? Matematica de liceu ne nva c multiplicarea ar trebui f cut nti. Asta nseamn c operatorul de nmul ire are preceden mai

mare dect operatorul de adunare. Tabelul urm tor d preceden a operatorilor n Python, de la cea mai mic preceden cea mai mare preceden (cea mai slab leg tur ) pn la

(cea mai strns leg tur ). Asta nseamn c ntr-o expresie dat , Python va evalua nti

operatorii i expresiile cele mai de jos n tabel naintea celor mai de sus.

Urm torul tabel, extras din manualul de referin e Python, este dat de dragul completitudinii. Este de departe mai bine s folosim paranteze pentru a grupa operatorii i operanzii n mod adecvat pentru a specifica preceden a. Astfel programul devine mai lizibil. Pentru detalii v rog s urm ri i mai jos Schimbarea ordinii de evaluare.

Preceden a operatorilor
Operator lambda or and not x in, not in is, is not <, <=, >, >=, !=, == | ^ & <<, >> +, *, /, //, % +x, -x ~x ** x.atribut x[index] x[index1:index2] f(argumente ...) (expresii, ...) [expresii, ...] Descriere Expresie lambda SAU logic I logic NU logic Teste de apartenen Teste de identitate Compara ii SAU binar SAU-exclusiv binar I binar Transla ii Adunare i sc dere nmul ire, mp r ire, mp r ire ntreag , modulo Pozitiv, negativ NU binar Exponen iere Referin Referin Feliere Apel la func ie Leg tura sau afi area unui cuplu Afi area unei liste la atribut la element

{cheie:date, ...}

Afi area unui dic ionar

Operatorii pe care nu i-am ntlnit pn acum vor fi descri i n capitolele viitoare. Operatorii cu aceea i preceden preceden . sunt lista i n acela i rnd n tabelul anterior. De exemplu, + i - au aceea i

Schimbarea ordinii de evaluare


Pentru a face expresiile mai lizibile, putem folosi paranteze. De exemplu, 2 + (3 * 4) este n mod clar mai u or de n eles dect 2 + 3 * 4 care necesit cunoa terea preceden ei operatorilor. Ca i orice altceva, parantezele trebuie folosite cu discern mnt (nu exagera i) i f r redundan (ca n 2 + (3 + 4)).

Exist un avantaj suplimentar n folosirea parantezelor - ne ajut s schimb m ordinea de evaluare. De exemplu, dac vre i s fie evaluat adunarea naintea nmul irii ntro expresie, trebuie s o scrie i (2 + 3) * 4.

Asociativitatea
Operatorii sunt de obicei asociativi de la stnga la dreapta, adic operatorii cu aceea i preceden sunt evalua i de la stnga la dreapta. De exemplu, expresia 2 + 3 + 4 este evaluata ca (2 + 3) + 4. C iva operatori, precum atribuirea sunt asociativi de la dreapta la stnga astfel espresia a = b = c este evaluat caa = (b = c).

Expresii
Exemplu:

#!/usr/bin/python # Fi ier: expression.py

lungime = 5 l ime = 2

aria = lungime * l

ime

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


Rezultat:

ime))

$ python expression.py Aria este 10 Perimetrul este 14


Cum func ioneaz : Lungimea i l imea dreptunghiului sunt stocate n variabile cu numele respective. Le folosim pentru a calcula aria i perimetrul dreptunghiului cu ajutorul expresiilor. Stoc m rezultatul expresiei lungime * l o afi

ime n variabila aria i ime) n

m folosind func ia print. n al doilea caz, folosim direct valoarea expresiei 2 * (lungime + l

func ia print.

De asemenea, observa i cum Python 'cosmetizeaz ' tip rirea rezultatului. De i noi n-am specificat un spa iu ntre

'Aria este' i variabila aria, Python o face pentru noi ca s ob inem o prezentare mai clar

i astfel programul

este mult mai lizibil (fiindc nu mai trebuie s ne ngrijim de spa ierea irurilor folosite pentru afi are). Acesta este un exemplu despre cum face Python via a programatorului mai u oar .

Rezumat
Am nv at ce sunt operatorii, operanzii i expresiile - acestea sunt componentele de baz ale oricarui program. n continuare vom vedea cum se folosesc n declara ii.

Python ro:Controlul execu iei

Contents

1 Introducere 2 Declara ia if 3 Declara ia while 4 Bucla for 5 Declara ia break 5.1 Poezia lui Swaroop despre Python 6 Declara ia continue 7 Rezumat

Introducere
n programele pe care le-am v zut pn acum erau o serie de declara ii i Python le executa credincios n aceea i ordine. Dar dac am fi vrut s schimbam fluxul sau modul lui de lucru? De exemplu, vre i ca programul s ia ni te decizii i s fac proces ri diferite n diferite situa ii, precum a tip ri 'Bun ziua' sau 'Bun seara' n func ie de ora la care se execut programul? Cum poate a i ghicit, asta se poate face cu declara ii de control al execu iei. Exist trei declara ii de control al execu iei n Python - if, for i while.

Declara ia if
Declara ia if este folosit pentru a testa o condi ie i, dac aceasta este adev rat , s ruleze un bloc de declara ii (numit 'blocul if'), iar n caz contrar s ruleze alt bloc de declara ii (blocul 'else'). Clauza 'else' este optional . Exemplu:

#!/usr/bin/python # Fi ier: if.py

num r = 23 ghici = int(input('Introduce i un ntreg : '))

if ghici == num r: print('Felicit ri, a i ghicit,') # Noul bloc ncepe aici print('(dar nu c tiga i niciun premiu!)') # Noul bloc se ncheie aici

elif ghici < num r: 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 ajunge i aici e sigur ca ghici > num r

print('Gata') # Aceasta ultim


Rezultat:

declara ie este executat

ntotdeauna, dup

declara ia if

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

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

$ python if.py Introduce i un ntreg : 23 Felicit ri, a i ghicit, dar nu c tiga i niciun premiu! Gata
Cum func ioneaz : n acest program prelu m de la utilizator ncerc ri de a ghici num rul i verific m dac este num rul memorat. Set m variabila num r la ce valoare vrem, s zicem 23. Apoi prelu m num rul ncercat de utilizator folosind func ia

input(). Func iile sunt ni te por iuni de program reutilizabile. Vom afla mai multe despre ele n capitolul urm tor.
Furniz m un ir func iei implicite input() care l tip re te pe ecran i a teapt introducerea de informa ie de la utilizator. ndat ce introducem ceva (ENTER - rom. a intra/introduce) i ap s m tasta ENTER, func ia input() d ca rezultat ceea ce am introdus, sub form de ir. Convertim acest ir ntrun ntreg folosind declara ia int i stoc m

valoarea n variabila ghici. De fapt int este o clas , dar ce trebuie s a converti un ir ntr-un ntreg (presupunnd c

ti i n acest moment este c l folosi i pentru

irul con ine un ntreg valid n text).

n continuare compar m alegerea utilizatorului cu num rul stabilit de noi. Dac acestea sunt egale, tip rim un mesaj de succes. Observa i c folosim nivele de indentare pentru a-i spune Pythonului c rui bloc apar ine fiecare declara ie. Iat de ce este indentarea atat de important n Python. Sper c v-a i ata at de regula indent rii consistente. Este a a? Observa i cum declara ia if con ine semnul dou puncte la sfr it - a a i spunem Pythonului c urmeaz un bloc de declara ii. Mai departe, test m dac num rul furnizat de utilizator este mai mic dect num rul i, dac este a a, inform m utilizatorul c trebuie s inteasc mai sus de att. Ce am folosit aici este clauza elif care de fapt combin dou

declara ii if else-if else ntr-o singur declara ie if-elif-else. Asta face programul mai u or i reduce num rul de indent ri necesar. i clauzele elif i else trebuie s aib la sfr itul liniei logice semnul dou puncte dup care poate urma blocul lor de declara ii (cu indentarea adecvat , desigur). Pute i pune o alt declara ie if n interiorul blocului 'if' al declara iei if s.a.m.d. - n acest caz declara iile if se numesc imbricate (engl. nested). Clauzele elif i else sunt op ionale. O declara ie if minimal este:

if True: print('Da, e adevarat.')


Dup ce Python a terminat execu ia ntregii declara ii if inclusiv clauzele elif i else, el trece la urm toarea declara ie din blocul care con ine declara ia if. n acest caz este vorba de blocul main (rom. principal), unde ncepe ntotdeauna execu ia programului, iar instruc iunea urm toare este declara ia print('Gata'). Dup aceasta, Python vede sfr itul programului i ncheie. De i acesta este un program foarte simplu, am indicat o mul ime de lucruri care trebuie observate. Toate acestea sunt destul de directe ( i simple pentru cei care au cuno tin e de C/C++) i ini ial necesit s deveni i constien i de ele, dar apoi vor deveni uzuale i v vor p rea 'naturale'. Not pentru programatorii n C/C++ Nu exist declara ia switch n Python. Pute i utiliza declara ia if..elif..else pentru a face acela i lucru ( i n unele cazuri, pute i folosi o structur de date pentru a rezolva repede).

Declara ia while
Declara ia while ne permite s execut m repetat un bloc de declara ii att timp ct o condi ie r mne adev rat . O declara ie while este un exemplu de instruc iune de ciclare. Poate avea i clauza else. Exemplu:

#!/usr/bin/python # Fi ier: while.py

num r = 23

ciclu = True

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

if ghici == num r: print('Felicit ri, a i ghicit!') ciclu = False # asta face ciclul s elif ghici < num r: print('Nu, este pu in mai mare.') else: print('Nu, este pu in mai mic..') else: print('Bucla s-a ncheiat.') # Aici pute i face ce prelucr ri vre i se ntrerup

print('Gata')
Rezultat:

$ python while.py Introduce i un ntreg : 50 Nu, este pu in mai mic. Introduce i un ntreg : 22 Nu, este pu in mai mare Introduce i un ntreg : 23 Felicit ri, a i ghicit. Bucla s-a ncheiat. Gata
Cum func ioneaz : n acest program juc m tot jocul cu ghicirea num rului, dar avantajul este ca utilizatorul poate continua ncerc rile pn cnd ghice te - nu trebuie s ruleze programul de fiecare dat , cum am facut n programul precedent. Ceea ce este chiar o demostra ie de declara ie while. Deplas m declara iile input i if n interiorul buclei while i ini ializ m variabila ciclu cu True naintea buclei. La nceput test m dac variabila ciclu este True i apoi continu m cu executarea blocului while. Dup ce blocul a fost executat, condi ia este evaluat din nou i, n acest caz, condi ia este variabila ciclu. Dac este

True, execut m blocul while din nou, altfel verific m dac exist o clauz else ca s-o execut m.

Blocul else este executat atunci cand condi ia de ciclare devine False - asta poate fi chiar i prima dat cnd se testeaz condi ia. Dac exista un bloc else la bucla while, ea va fi ntotdeauna executat , dac nu se iese for at din bucl cu o declara ie break. Valorile True i False sunt numite booleene i pot fi considerate a fi echivalente cu valorile 1 i respectiv 0. Not pentru programatorii n C/C++ Re ine i c poate exista o clauz else la bucla while.

Bucla for
Declara ia for..in este o declara ie de ciclare care itereaz elementele unei secven e de obiecte. Vom afla mai multe despre secven e n capitolele urm toare. Ce trebuie tiut acum este c o secven simplu o colec ie ordonat de elemente. Exemplu: este pur i

#!/usr/bin/python # Fi ier: for.py

for i in range(1, 5): print(i) else: print('Bucla s-a terminat')


Rezultat:

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


Cum func ioneaz : n acest program, tip rim o secven de numere. Gener m secven a cu ajutorul func iei predefinite range.

Noi d m func iei range dou numere i ea ne d secven a de numere ncepnd cu primul num r i pn la cel de-al doilea. De exemplu, range(1,5) nseamn secven a [1, 2, 3, 4]. Implicit, range are pasul 1. Dac i d m i un al treilea num r, range acela devine pasul secven ei. De exemplu range(1,5,2) d

[1,3]. Re ine i c gama de numere (engl. range) se extinde pn la al doilea num r, dar nu' l i include.
A adar bucla for itereaz peste acesta gam - for i in range(1,5) este echivalent cu for i in [1,

2, 3, 4] ceea ce este ca i cum s-ar atribui fiecare obiect din secven

lui i, pe rnd, i executarea blocului

de declara ii pentru fiecare valoare a lui i. n acest caz, nu facem altceva dect s tip rim valoarea obiectului. Aminti i-v c clauza else este op ional . Cnd este inclus , este executat ntotdeauna o dat , dup ncheierea buclei for, cu excep ia cazului n care se ntlne te o declara ie break.

De re inut c bucla for..in func ioneaz pentru orice secven . n acest caz avem doar o list de numere, generat cu func ia predefinit range, dar n general, putem folosi orice fel de secven obiecte. Not pentru programatorii n C/C++/Java/C# n Python bucla for este radical diferit de bucla for din C/C++. Programatorii C# vor re ine c bucla for din Python este similar cu bucla foreach din C#. Programatorii Java s observe c acela i lucru este similar cu for (int i : IntArray) n Java 1.5. n C/C++, dac vrei s scrii for (int i = 0; i < 5; i++), atunci n Python scrii doar for i in de orice fel de

range(0,5). A a cum vede i, n Python bucla for este mai simpl , mai expresiv
erori.

i mai pu in predispus la

Declara ia break
Declara ia break este folosit pentru a ntrerupe (engl. break) executarea unei declara ii de ciclare, chiar i dac condi ia testat nu a devenit nc False sau secven a nu a fost parcurs complet. O not important este c dac se ntrerupe o bucla for sau while, nici clauza else nu va fi executat . Exemplu:

#!/usr/bin/python # Fi ier: break.py

while True: s = (input('Introduce i ceva:')) if s == 'quit': break print('Lungimea print('Gata')


Rezultat:

irului introdus este', len(s))

$ python break.py Introduce i ceva: Programarea e mi to Lungimea irului introdus este 15

Introduce i ceva: Cnd treaba e facut Lungimea irului introdus este 20 vrei s te i distrezi:

Introduce i ceva: Dac Lungimea

irului introdus este 27 folose te Python!

Introduce i ceva: Lungimea

irului introdus este 17

Introduce i ceva: quit

Gata
Cum func ioneaz : n acest program, prelu m datele de intrare n mod repetat de la utilizator i tip rim lungimea fiec rui ir introdus. Prevedem i o condi ie special pentru oprirea programului, prin c utarea cuvntului 'quit'. Oprim programul prin ntreruperea buclei i ajungerea la sfr itul blocului de declara ii. Lungimea irului de intrare poate fi g sit folosind func ia predefinit len. Re ine i c declara ia break poate fi folosit i cu declara ia for.

Poezia lui Swaroop despre Python


Ce am folosit aici drept intrare (de la utilizator) este un mini poem scris de mine, numit Swaroop's Poetic Python (n limba englez ):

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

Declara ia continue
Declara ia continue se folose te pentru a spune lui Python s treac la urm toarea itera ie f r s execute instruc iunile r mase din blocul declara iei de ciclare. Exemplu:

#!/usr/bin/python # Fi ier: continue.py

while True: s = input('Introduce i ceva: ') if s == 'quit': break if len(s) < 3: print('Prea pu in') continue print(' irul introdus are lungime suficient ') # Face i alte proces ri aici...
Rezultat:

$ python test.py Introduce i ceva: a

Prea pu in Introduce i ceva: 12 Prea pu in Introduce i ceva: abc irul introdus are lungime suficient Introduce i ceva: quit
Cum func ioneaz : n acest program accept m date de la utilizator, dar le proces m doar dac au cel pu in 3 caractere lungime. A adar, folosim func ia len pentru a ob ine lungimea i, dac aceasta este mai mic dect 3, s rim peste ce a mai r mas din itera ia curent folosind declara ia continue. n caz contrar, restul declara iilor din bucl sunt executate i putem s facem orice fel de procesare n zona unde este acel comentariu. Retine i c declara ia continue func ioneaz i cu bucla for.

Rezumat
Am v zut cum se folosesc cele trei instruc iuni de control al execu iei - if, while i for mpreun cu asociatele lor, declara iile break i continue. Acestea sunt unele dintre cele mai utilizate p r i din Python i de aceea este esen ial s te obi nuie ti cu ele. n continuare vom nv a s construim i s folosim func ii.

Python ro:Func ii

Contents

1 Introducere 2 Parametrii func iilor 3 Variabile locale 4 Folosirea declara iei global 5 Folosirea declara iei nonlocal 6 Valori implicite ale argumentelor 7 Argumente cuvnt cheie 8 Parametri VarArgs 9 Parametri exclusiv cuvnt cheie 10 Declara ia return 11 DocStrings 12 Adnot ri 13 Rezumat

Introducere

Func iile sunt por iuni de program reutilizabile. Ele v permit s da i nume unui bloc de declara ii i pute i rula acel bloc de declara ii n program de cte ori vre i. Asta se nume te apel al func iei. Noi am folosit deja multe func ii predefinite precum len i range. Conceptul de func ie este probabil cel mai important bloc constructiv al oric rui program nonbanal (n orice limbaj de programare), deci vom explora diverse aspecte ale func iilor n acest capitol. Func iile sunt definite folosind cuvntul cheie def. Acesta este urmat de un nume identificator pentru func ie urmat de o pereche de paranteze care pot include ni te nume de variabile. n continuare este plasat blocul de declara ii care compun func ia. Un exemplu va ar ta ct este de simplu: Exemplu:

#!/usr/bin/python # Fi ier: function1.py

def sayHello(): print('Hello World!') # blocul func iei # Sfr itul func iei

sayHello() # apel la func ia sayHello() sayHello() # din nou apel la func ia sayHello()
Rezultat:

$ python function1.py Hello World! Hello World!


Cum func ioneaz : Definim o func ie numit sayHello folosind sintaxa explicat mai sus. Aceasta func ie nu prime te parametri i deci nu sunt declarate variabile n paranteze. Parametrii pentru func ie sunt doar ni te modalit i de a-i transmite func iei diferite valori sau/ i de a extrage valorile corespunz toare. Observa i c putem apela aceea i func ie de dou ori, ceea ce nseamn c nu mai trebuie s scriem aceea i por iune de cod din nou.

Parametrii func iilor


O func ie poate accepta parametri, care sunt valori furnizate func iei pentru ca aceasta s poat face ceva cu aceste valori. Ace ti parametri sunt ca variabilele numai c valorile acestor variabile sunt definite n momentul apelului func iei i deja le sunt atribuite valori la momentul execut rii blocului func iei. Parametrii sunt specifica i ntr-o pereche de paranteze n defini ia func iei, separate prin virgule. Cnd apel m func ia, furniz m aceste valori ntr-un fel sau altul. Observa i terminologia folosit - numele date n func ie se numesc parametri n timp ce valorile pe care le furniz m n apelul func iei se numesc argumente. Exemplu:

#!/usr/bin/python # Fi ier: func_param.py

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

printMax(3, 4) # argumente date prin literali

x = 5 y = 7

printMax(x, y) # argumente date prin variabile


Rezultat:

$ python func_param.py 4 este maximum 7 este maximum


Cum func ioneaz : Aici definim o func ie numit printMax care prime te doi parametri numi i a i b. G sim cel mai mare num r dintre ele folosind o simpla declara ie if..else i tip rim pe ecran cel mai mare num r. n primul apel al func iei printMax, furniz m argumentele n forma literal . n al doilea apel d m func iei valorile parametrilor prin intermediul variabilelor. printMax(x, y) face ca valoarea variabilei x s fie atribuit parametrului

a i valoarea variabilei y s fie atribuit parametrului b. Func ia printMax lucreaz la fel n ambele cazuri.

Variabile locale
Cnd se declar variabile n interiorul defini iei func iei, acestea nu au nici un fel de leg tur cu alte variabile din afara defini iei func iei, nici chiar dac ar avea acela i nume, de aceea se numesc variabile locale func iei. Acesta este domeniul variabilei. Toate variabilele au ca domeniu blocul n care sunt declarate, ncepnd cu punctul n care a fost definit numele ei. Exemplu:

#!/usr/bin/python # Fi ier: func_local.py

x = 50

def func(x): 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


Cum func ioneaz : n func ie, prima dat cnd folosim valoarea numelui x, Python folose te valoarea parametrului declarat n func ie. n continuare atribuim valoarea 2 lui x. Numele x este local func iei noastre. Prin urmare, cnd schimb m valoarea lui

x n func ie, x definit n blocul principal r mne neafectat.


n ultimul apel al func iei print, afi m valoarea lui x din blocul principal ca s confirm m c a r mas neafectat .

Folosirea declara iei global


Dac vre i s atribui i o valoare unui nume definit la nivelul cel mai nalt al programului (adic nu n interiorul domeniului func iei sau clasei), va trebui s -i spune i lui Python c acel nume nu este local ci global. Ob inem asta folosind declara ia global. Este imposibil ca n interiorul unei func ii s atribui o valoare unei variabile definite n afara func iei f r declara ia global. Pute i folosi valorile definite n afara func iilor (presupunnd c nu exist o variabil cu acela i nume definit n blocul func iei). Totu i, acest fapt nu este ncurajat i trebuie evitat ntruct devine neclar cititorului unde este defini ia acelei variabile. Folosind declara ia global marc m foarte clar c variabila este definit n cel mai exterior bloc. Exemplu:

#!/usr/bin/python # Fi ier: 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 x este 50 Am schimbat x global n 2 Valoarea lui x este 2


Cum func ioneaz : Declara ia global este folosit pentru a declara c x este o variabil global - de aceea, cnd atribuim o valoare lui x n interiorul func iei, acea schimbare se reflect cnd folosim valoarea lui x n blocul principal. Pute i specifica mai multe variabile globale folosind declara ia global. De exemplu, global x, y, z.

Folosirea declara iei nonlocal


Am nv at s acces m variabile n domeniul local i global. Mai exist un domeniu specific func iilor, numit "nonlocal" i care se afl ntre cele dou . Domeniile nonlocal se observ cnd defini i func ii n interiorul func iilor. ntruct totul n Python este cod executabil, se pot defini func ii oriunde. S lu m un exemplu:

#!/usr/bin/python # Fi ier: 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


Cum func ioneaz : Cnd ne afl m n interiorul unei func ii func_inner, 'x' definit n prima linie a func iei func_outer este undeva ntre global i local. Declar m c folosim acest x cu declara ia nonlocal x i astfel ob inem acces la acea variabil . ncerca i s schimba i nonlocal x cu global x i s elimina i complet declara ia, ca s vede i ce diferen e de comportament sunt n aceste cazuri.

Valori implicite ale argumentelor


Pentru unele func ii, poate vre i s face i unii parametri op ionali i s folosi i valori implicite n cazul n care utilizatorul nu furnizeaz o valoare pentru parametrul respectiv. Asta se face cu ajutorul valorilor implicite ale parametrilor. Pute i specifica valorile implicite ale argumentelor n defini ia func iei, punnd operatorul de atribuire (=) urmat de valoarea implicit . Observa i c valoarea implicit a argumentului trebuie s fie o constant . Mai precis, trebuie s fie imuabil - acest fapt va fi explicat n detaliu n capitolele urm toare. Pentru moment re ine i doar att. Exemplu:

#!/usr/bin/python # Fi ier: func_default.py

def say(mesaj, ori = 1): print(mesaj * ori)

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

$ python func_default.py Hello WorldWorldWorldWorldWorld


Cum func ioneaz : Func ia numit say este folosit pentru a tip ri pe ecran un ir de attea ori ct se specific . Dac nu furniz m acea valoare, atunci va fi folosit valoarea implicit , 1. Ob inem aceasta punnd valoarea implicit 1 a parametrului ori.

La prima folosire a func iei say, d m numai irul i ea l tip re te o dat . n a doua folosire d m func iei say i irul i un argument 5 ceea ce spune c vrem s fie tip rit irul de 5 ori. Important Numai parametrii de la sfr itul listei de parametri pot avea valori implicite deci nu pute i avea un parametru cu valoare implicit naintea altuia f r valoare implicit n lista de parametri a func iei. Motivul este c valorile sunt atribuite parametrilor prin pozi ie. De exemplu, def func(a, b=5) este valid , dar def func(a=5, b) este invalid .

Argumente cuvnt cheie


Dac ave i func ii cu mul i parametri i vre i s specifica i numai pe unii, atunci pute i s da i valori parametrilor prin numele lor - acest mod de specificare se nume te prin argumente cuvnt cheie - folosim cuvntul cheie (engl. keyword) n locul pozi iei (pe care am folosit-o pn acum) pentru a specifica argumente func iei. Exist dou avantaje - unu, folosirea func iei este mai u oar , ntruct nu trebuie s ne preocup m de ordinea parametrilor. Doi, putem da valori numai unor parametri selecta i, cu condi ia ca to i ceilal i sa aib n defini ia func iei valori implicite. Exemplu:

#!/usr/bin/python # Fi ier: func_key.py

def func(a, b=5, c=10): print('a este', a, ' i b este', b, ' i c este', c)

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


Rezultat:

$ python func_key.py a este 3 a este 25 a este 100


Cum func ioneaz : Func ia numit func are un parametru f r valoare implicit , urmat de doi parametri cu valori implicite. n primul apel, func(3, 7), parametrul a prime te valoarea 3, parametrul b prime te valoarea 7, iar c valoarea implicit , 10. n al doilea apel, func(25, c=24), variabila a ia valoarea 25 datorit pozi iei argumentului. Pe urm , parametrul c ia valoarea 24 prin nume - argument cuvnt cheie. Variabila b ia valoarea implicit , 5.

i b este 7 i b este 5 i b este 5

i c este 10 i c este 24 i c este 50

n al treilea apel, func(c=50, a=100), folosim numai tehnica nou , a cuvintelor cheie. Observa i, specific m valoarea parametrului c naintea parametrului a de i a este definit naintea variabilei c n defini ia func iei.

Parametri VarArgs
TODO S scriu despre asta ntr-un capitol urm tor, fiindc nu am vorbit nc despre liste i dic ionare? Uneori a i putea dori s defini i o func ie care s ia orice num r de parametri, asta se poate face folosind asteriscul:

#!/usr/bin/python # Fi ier: total.py

def total(ini ial=5, *numere, **keywords): num r tor = ini ial for num r in numere: num r tor += num r for cheie in keywords: num r tor += keywords[cheie] return num r tor

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


Rezultat:

$ python total.py 166


Cum func ioneaz : Cnd declar m un parametru cu asterisc precum *parametri, to i parametrii pozi ionali de la acel punct ncolo sunt colecta i ntro list numit 'parametri'. Similar, cnd declar m un parametru cu dou asteriscuri, precum **parametri, toate argumentele cuvnt cheie de la acel punct ncolo sunt colectate ntr-un dic ionar numit 'parametri'. Vom explora listele i dic ionarele ntrun capitol urm tor.

Parametri exclusiv cuvnt cheie


Dac vrem s specific m anumi i parametri cuvnt cheie pentru a fi disponibili numai n forma cuvnt cheie i niciodat ca parametri pozi ionali, ace tia pot fi declara i dup un parametru cu asterisc:

#!/usr/bin/python # Fi ier: keyword_only.py

def total(ini ial=5, *numere, legume): num r tor = ini ial for num r in numere: num r tor += num r num r tor += legume return num r tor

print(total(10, 1, 2, 3, legume=50)) print(total(10, 1, 2, 3)) # Ridic


Rezultat:

o eroare pentru c

nu am furnizat o valoare implicit

pentru 'legume'

$ python keyword_only.py 66 Traceback (most recent call last): File "test.py", line 12, in <module> print(total(10, 1, 2, 3)) TypeError: total() needs keyword-only argument legume
Cum func ioneaz : Declararea de parametri dup un parametru cu asterisc (engl. starred parameter) produce argumente exclusiv cuvnt cheie. Dac acestea nu sunt definite cu valori implicite, apelurile func iei vor ridica o eroare dac nu se furnizeaz argumentul cuvnt cheie, a a cum s-a v zut mai sus. Dac vre i s ave i parametri exclusiv cuvnt cheie, dar nu ave i nevoie de nici un parametru cu asterisc, folosi i un asterisc izolat, ca n exemplul:

def total(ini ial=5, *, legume).

Declara ia return
Declara ia return este folosit pentru a ne ntoarce dintr-o func ie (deci a evada din ea - engl. break out). Op ional putem ntoarce o valoare la fel de bine. Exemplu:

#!/usr/bin/python # Fi ier: 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
Cum func ioneaz : Func ia maximum ntoarce parametrul cel mai mare furnizat func iei. Ea folose te o declara ie simpl

if..else pentru a g si num rul cel mai mare i apoi ntoarce (engl. return) acea valoare.
Observa i c declara ia return f r o valoare este echivalent cu return None. None este un tip special n Python care reprezint nimicul. De exemplu, este folosit pentru a indica faptul c o variabil nu are nici o valoare, deci are valoarea None. Orice func ie, n mod implicit, con ine o declara ie return None la sfr itul blocului de declara ii, cu excep ia cazului n care i scrie i o alt declara ie return. Pute i vedea asta rulnd print

o_func ie_oarecare() n care nu este dat o declara ie return precum: def o_functie_oarecare(): pass
Declara ia pass este folosit n Python pentru a indica un bloc de declara ii gol. Not Exist o func ie predefinit numit max care implementeaz aceast func ionalitate de a 'g si maximul', deci folosirea aceste func ii este posibil oricand.

DocStrings
Python are o facilitate dr gu numit documentation strings, numit de obicei pe numele scurt docstrings. DocStrings (rom. iruri de documenta ie, sg. docstring) sunt o unealt important pentru c v ajut s documenta i programele mai bine i le face mai u or de n eles. Uimitor, putem chiar s extragem irurile de documentare ale, s zicem, unei func ii chiar n timp ce programul ruleaz ! Exemplu:

#!/usr/bin/python # Fi ier: func_doc.py

def printMax(x, y): '''Tip re te pe ecran cel mai mare din dou numere.

Cele dou

numere trebuie s

fie ntregi.''' este posibil

x = int(x) # converte te n integer, dac

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 Tip re te pe ecran cel mai mare din dou numere.

Cele dou 5 este maximum


Cum func ioneaz :

numere trebuie s

fie ntregi.

Un ir pe prima linie logic a func iei devine docstring pentru acea func ie. De retinut c DocStrings se aplic i la module i clase, despre care vom nv a n capitolele respective. i

Conven ia urmat pentru un docstring este: un ir multilinie n care prima linie ncepe cu majuscul se ncheie cu punct. Apoi linia a doua este goal i urmat de o explica ie mai detaliat ncepand cu

linia a treia. V sf tuim cu c ldur s urma i aceasta conven ie pentru toate docstringurile tuturor func iilor nebanale pe care le scrie i. Putem accesa docstringul func iei printMax folosind atributul __doc__ (observa i dublu underscore) al func iei. Aminti i-v c Python trateaz totul ca obiect, inclusiv func iile. Vom nv a mai mult despre obiecte n capitolul despre clase. Daca a i folosit help() n Python, a i v zut deja cum se folose te docstring! Ceea ce face ea este c extrage atributul __doc__ al func iei i l afi eaz ntr-o maniera convenabil . Pute i ncerca asta asupra func iei de mai sus - include i pur i simplu declara ia help(printMax) n program. Nu uita i s tasta i q pentru a ie i din help. Utilitarele pot colecta automat documenta ia din programe n aceast maniera. De aceea v recomand insistent s folosi i docstring pentru orice func ie nebanal pe care o scrie i. Comanda

pydoc inclus n distribu ia Python func ioneaz similar cu help() folosind docstringurile.

Adnot ri
Func iile mai au o facilitate avansat numit adnotare (engl. annotations) care este o cale de teapt de a ata a informa ie pentru fiecare din parametri precum i pentru valoarea ntoars . ntruct limbajul Python n sine nu interpreteaz aceste adnot ri n nici un fel (aceast func ionalitate este

l sat bibliotecilor third-party s interpreteze ele n ce fel vor), vom trece peste aceast facilitate n discu ia noastr . Dac sunte i interesa i despre adnot ri, pute i citi PEP No. 3107.

Rezumat
Am discutat multe aspecte ale func iilor, dar re ine i c nu am acoperit toate aspectele posibile. Totu i, am acoperit deja majoritatea aspectelor pe care le vom folosi n mod uzual. Vom afla n continuare cum s folosim, dar i s cream module Python.

Python ro:Module

Contents

1 Introducere 2 Fisiere .pyc compilate in octeti 3 Declara ia from ... import ... 4 Atributul __name__ al modulului 5 Crearea propriilor module 6 Func ia dir 7 Pachete 8 Rezumat

Introducere
A i v zut cum se poate refolosi o por iune de cod n program prin definirea func iilor. Dar dac vre i s refolosi i un num r mai mare de func ii n alte programe dect cel pe care l scrie i? A a cum a i ghicit, r spunsul este folosirea modulelor. Exist variate metode de a scrie module, dar cea mai simpl cale este de a crea un fi ier cu extensia .py care con ine func ii i variabile. Alt metod este scrierea modulelor n limbajul n care chiar interpretorul Python a fost scris. De exemplu, pute i scrie module n limbajul de programare C i dupa compilare, ele pot fi folosite din codul Python cnd se folose te interpretorul Python standard. Un modul poate fi importat de un alt program pentru a folosi func ionalitatea acestuia. A a putem i noi s folosim biblioteca standard Python. nti vom vedea cum se folosesc modulele bibliotecii standard. Exemplu:

#!/usr/bin/python # Fi ier: using_sys.py

import sys

print('Argumentele la linia de comand

sunt:')

for i in sys.argv: print(i)

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


Rezultat:

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

PYTHONPATH este ['', 'C:\\tmp', 'C:\\Python30\\python30.zip', 'C:\\Python30\\DLLs', 'C:\\Python30\\lib', 'C:\\Python30\\lib\\plat-win', 'C:\\Python30', 'C:\\Python30\\lib\\site-packages']
Cum func ioneaz : La nceput import m modulul sys folosind declara ia import. n esen , asta i spune lui Python c vrem s folosim acest modul. Modulul sys con ine func ionalitate legat de interpretorul Python i mediul s u, system. Cnd Python execut declara ia import sys, el caut modulul sys. n acest caz, este vorba de un modul preinstalat i de aceea Python tie unde s -l g seasc . Dac nu ar fi fost un modul compilat, ci un modul scris n Python, interpretorul ar fi c utat n directoarele listate n variabila sys.path. Dac modulul este g sit, declara iile din interiorul modului sunt executate. Observa i c aceast ini ializare este f cut numai prima dat cnd import m un modul. Variabila argv din modulul sys este accesat folosind nota ia cu puncte, adic sys.argv. Ea arat clar c acest nume este parte a modulului sys. Alt avantaj al acestei abord ri este c numele nu d conflict cu nici o variabil

argv folosit n program.


Variabila sys.argv este o list de iruri (listele sunt explicate n detaliu n capitolul despre liste. n special, variabila

sys.argv con ine lista argumentelor din linia de comand adic acele argumente transmise programului prin
ad ugarea lor la linia de comand care lanseaz programul. Daca folosi i un IDE pentru a scrie i rula aceste programe, c uta i n meniuri o cale de a specifica argumente la linia de comand . Aici, cnd se execut python using_sys.py noi suntem argumente, rul m modulul using_sys.py cu comanda python i celelalte lucruri care l urmeaz sunt transmise programului. Python p streaz linia de comand n variabila sys.argv ca s le putem folosi. Re ine i, numele scriptului care ruleaz este ntotdeauna primul argument din lista sys.argv. Deci n acest caz vom avea 'using_sys.py' n pozi ia sys.argv[0], 'noi' n pozi ia sys.argv[1], 'suntem' n pozi ia

sys.argv[2] i 'argumente' n pozi ia sys.argv[3]. Observa i c Python ncepe numerotarea cu 0 nu cu 1.

Variabila sys.path con ine lista numelor de director de unde pot fi importate module. Observa i c primul sir din

sys.path este vid - asta arat c directorul curent este parte a variabilei sys.path ceea ce este totuna cu variabila
de mediu PYTHONPATH. Acest comportament este prev zut pentru a permite importul direct al modulelor aflate n directorul curent. n caz contrar modulele care trebuie importate trebuie pozi ionate ntr-unul din directoarele listate n sys.path.

Fisiere .pyc compilate in octeti


Importul unui modul este relativ costisitor, astfel c Python face ni te smecherii ca s l accelereze. O cale este s creeze fi iere compilate n octe i (engl. byte-compiled) cu extensia .pyc care sunt ni te forme intermediare n care Python transform programul (v aminti i din capitolul introductiv cum lucreaz Python?). Acest fi ier .pyc este util cnd importa i un modul a doua oar din alte programe - ele vor fi mult mai rapide ntruct partea de procesare legat de importul modulului este deja realizat . De asemenea, aceste fi iere compilate n octe i sunt independente de platform . Not Fi ierele .pyc sunt create de obicei n acela i director ca i fi ierul .py corespondent. Dac Python nu are permisiunea de a scrie fi iere n acel director, fi ierele .pyc nu vor fi create.

Declara ia from ... import ...


Dac vre i s importa i direct variabila argv n programul vostru (pentru a evita scrierea numelui sys. de fiecare dat ), pute i folosi declara ia from sys import argv. Dac vre i s importa i toate numele folosite n modulul

sys atunci pute i folosi declara ia from sys import *. Func ioneaz pentru orice modul.
n general, trebuie s evita i folosirea acestor declara ii i n schimb s folosi i declara ia import. Ca s fie evitate orice conflicte de nume i programele s fie mai lizibile.

Atributul __name__ al modulului


Orice modul are un nume, iar declara iile din modul pot g si numele modulului. Este comod a a, mai ales n situa ia particular n care se dore te aflarea regimului modulului (autonom sau importat). Cum am men ionat anterior, cnd un modul este importat pentru prima dat , codul din modul este executat. Putem folosi acest concept pentru a altera comportamentul modulului dac programul este executat autonom i l putem l sa neschimbat dac modulul este importat din alt modul. Acestea sunt posibile folosind atributul __name__ al modulului. Exemplu:

#!/usr/bin/python # Fi ier: using_name.py

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

autonom')

$ python using_name.py Acest program ruleaz autonom

$ python >>> import using_name Acest program a fost importat din alt modul >>>
Cum func ioneaz : Orice modul Python are propriul atribut __name__ definit i dac acesta este '__main__', rezult c acel

modul este rulat de sine st t tor de c tre utilizator i putem lua m surile adecvate.

Crearea propriilor module


Crearea propriilor noastre module este u oar , a i f cut asta tot timpul! Asta din cauz c orice program Python este un modul. Trebuie doar s ne asigur m c fi ierul are extensia .py. Urm torul exemplu ar trebui s clarifice situa ia. Exemplu:

#!/usr/bin/python # Fi ier: meu.py

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

__versiune__ = '0.1'

# Sfr itul modulului meu.py


Mai sus a fost un model de modul. A a cum vede i, nu este nimic deosebit n leg tur cu modulele n compara ie cu programele Python obi nuite. Vom vedea n continuare cum putem s folosim acest modul n programele noastre Python. Aminti i-v c modulul ar trebui plasat n acela i director cu programul care l import sau ntr-un director listat n variabila sys.path.

#!/usr/bin/python # Fi ier: meu_demo.py

import meu

meu.zisalut()

print ('Versiunea', meu.__versiune__)


Rezultat:

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


Cum func ioneaz : Observa i c folosim aceea i nota ie cu punct pentru a accesa membrii modulului. Python refolose te cu spor aceea i nota ie pentru a da un sentiment distinctiv 'Pythonic' programelor, astfel nct s nu fim nevoi i s nv m noi moduri de a face lucrurile.

Iat o nou variant folosind sintaxa declara iei from..import:

#!/usr/bin/python # Fi ier: meu_demo2.py

from meu import zisalut, __versiune__

zisalut() print('Versiunea', __versiune__)


Rezultatul programului meu_demo2.py este acela i ca i rezultatul programului meu_demo.py. Observa i c dac ar fi existat un nume __versiune__ declarat n modulul care import modulul meu, ar fi ap rut un conflict. i asta este probabil, ntruct este o practic uzual pentru fiecare modul s se declare

versiunea sa folosind acest nume. De aceea este ntotdeauna recomandabil s se foloseasc declara ia import de i ar putea face programul un pic mai lung. S-ar mai putea folosi:

from meu import *


Astfel ar fi importate toate numele publice, precum zisalut dar nu s-ar importa __versiune__ pentru ca ncepe cu dublu underscore. Calea (Zen) n Python Un principiu director n Python este "Explicit este mai bine dect implicit". Rula i import this pentru a afla mai multe i urm ri i aceast discu ie care enumer exemple pentru fiecare din principii.

Func ia dir
Pute i folosi func ia predefinit dir pentru a lista identificatorii pe care i define te un obiect. De exemplu, pentru un modul, clasele i variabilele definite n acel modul. Cnd furniza i un nume func iei dir(), ea ntoarce lista numelor definite n acel modul. Dac se lanseaz func ia f r argumente, ea ntoarce lista numelor definite n modulul curent.

Exemplu:

$ python

>>> import sys # ob ine 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() # ob ine 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']

>>>
Cum func ioneaz : Pentru nceput, vedem folosirea func iei dir asupra modulului importat sys. Putem vedea lista uria atribute pe care o con ine. de

Apoi folosim dir f r parametri. Implicit, ea ntoarce lista atributelor modulului curent. Observa i c lista modulelor importate este inclus n lista modulului listat. Pentru a vedea func ia dir n ac iune, definim o nou variabil , a, i i atribuim o valoare, apoi test m cu dir dac a ap rut nc o valoare n lista de atribute a aceluia i nume. Elimin m variabila/atributul modulului curent folosind declara ia del i din nou schimbarea este reflectat n rezultatul func iei dir. O not asupra declara iei del - aceast declara ie este folosit pentru a terge un nume de variabila i dup ce a fost executat (del a), nu mai pute i accesa variabila a - este ca i cum nu a existat niciodat . Re ine i c func ia dir() lucreaz pe orice obiect. De exemplu, rula i dir(print) pentru a descoperi atributele func iei print sau dir(str) pentru atributele clasei str.

Pachete
La acest nivel, a i nceput probabil s observa i o ierarhie n organizare a programelor. Variabilele sunt de obicei n interiorul func iilor. Func iile i variabilele globale intr n module. Dar modulele cum se organizeaz ? Aici intervin pachetele. Pachetele sunt ni te foldere de module cu un fi ier special __init__.py care indic lui Python c acel folder este special, deoarece con ine module Python. S zicem c vre i s crea i un pachet numit 'mapamond' cu subpachetele 'asia', 'africa', etc. i aceste pachete con in la rndul lor module precum 'india', 'madagascar', 'romnia' etc. Iat cum a i structura folderele:

- <un folder prezent n sys.path>/ - mapamond/ - __init__.py - asia/ - __init__.py - india/ - __init__.py - foo.py - africa/ - __init__.py - madagascar/ - __init__.py - bar.py - europa/ - __init__.py - romnia/ - __init__.py - foo_bar.py

Pachetele sunt doar un mod convenabil de a organiza ierarhic modulele. Ve i vedea de multe ori asta n biblioteca Python standard.

Rezumat
A a cum func iile sunt p r i reutilizabile de program, modulele sunt programe (ntregi) reutilizabile. O alt ierarhie de organizare a modulelor o reprezint pachetele. Biblioteca standard care vine cu Python este un exemplu de set de pachete i module. Am v zut cum se folosesc modulele i cum se creeaza module proprii. n continuare vom nv a despre cteva concepte interesante numite 'structuri de date'.

Python ro:Structuri de date

Contents

1 Introducere 2 Liste 2.1 Introducere rapid n obiecte i clase 3 Tupluri 4 Dic ionare 5 Secven e 6 Seturi 7 Referin e 8 Alte detalii despre iruri 9 Rezumat

Introducere
Structurile de date sunt n esen exact asta - structuri care pot memora date grupate. Cu alte cuvinte, sunt folosite pentru a stoca colec ii de date nrudite. Exist patru structuri predefinite n Python - liste, tupluri, dic ionare i seturi. Vom nv a s le folosim pe fiecare i cum ne pot u ura ele via a.

Liste
O list (engl. list) este o structur de date care p streaz o colec ie ordonat de elemente deci se poate memora o secven de elemente ntro list . Asta este u or de imaginat dac ne gndim la o list de cump r turi, numai c pe

list fiecare item ocup un rnd separat, iar n Python punem virgule intre ele. Elementele listei trebuie incluse n paranteze drepte astfel nct Python s n eleag c este o specificare de list . Odat ce am creat lista, putem ad uga, terge sau c uta elemente n ea. De aceea se poate spune c listele sunt muabile, acest tip de date poate fi modificat.

Introducere rapid

n obiecte i clase

De i n general am amnat discutarea obiectelor i claselor pna acum, este necesar o scurt introducere, pentru a se putea n elege listele mai bine. Detaliile le vom afla n capitolul dedicat acestora. O list este un exemplu de utilizare a obiectelor i claselor. Cnd folosim o variabil i i i atribuim o valoare, s zicem ntregul 5, putem gndi c am creat un obiect (de fapt instan ) i din clasa (de fapt tipul) int. De fapt se poate citi help(int) pentru o n elegere mai aprofundatat . O clas poate avea i metode adic func ii definite pentru a fi folosite exclusiv n raport cu acea clas . Pute i folosi aceste func ionalit i numai asupra unui obiect din acea clas . De exemplu, Python ofer o metod append pentru clasa list care ne permite s ad ug m un element la sfr itul listei. Prin urmare lista_mea.append('un item') va ad uga acel ir la lista_mea. De re inut folosirea nota iei cu punct pentru accesarea metodelor obiectelor. O clas poate avea i cmpuri (engl. fields) care nu sunt altceva dect variabile definite n raport exclusiv cu acea clas . Se pot folosi acele variabile/nume numai n raport un obiect din acea clas . Cmpurile sunt accesate tot prin nota ia cu punct, de exemplu lista.cmp. Exemplu:

#!/usr/bin/python # Fi ier: using_list.py

# Lista mea de cump r turi shoplist = ['mere', 'mango', 'morcovi', 'banane']

print('Am de cump rat', len(shoplist), 'itemuri.')

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

print('\nTrebuie s

cump r

i orez.')

shoplist.append('orez') print('Lista mea de cump r turi este acum', shoplist)

print('Acum vom sorta lista') shoplist.sort() print('Lista sortat este', shoplist)

print('Primul lucru de cump rat este', shoplist[0]) item_cump rat = shoplist[0] del shoplist[0] print('Am cump rat', item_cump rat) print('Lista mea este acum', shoplist)

Rezultat:

$ python using_list.py Am de cump rat 4 itemuri. Acestea sunt: mere mango morcovi banane Trebuie s cump r i orez.

Lista mea de cump r turi este acum ['mere', 'mango', 'morcovi', 'banane', 'orez'] Acum vom sorta lista Lista sortat este

['banane', 'mango', 'mere', 'morcovi', 'orez'] Primul lucru de cump rat este banane Am cump rat banane Lista mea este acum ['mango', 'mere', 'morcovi', 'orez']
Cum func ioneaz : Variabila shoplist este o list de cump r turi pentru cineva care merge la pia . n shoplist, memor m iruri care reprezint numele lucrurilor pe care le avem de cump rat, dar putem ad uga orice fel de obiect inclusiv numere sau alte liste. Am folosit bucla for..in pentru a itera prin itemurile listei. Pn acum cred c a i realizat ca o list este i secven n acela i timp. Specificul secven elor va fi discutat ntrun subcapitol urm tor. Observa i utilizarea argumentului cuvnt cheie end al func iei print pentru a-i transmite c vrem s ncheiem linia cu un spa iu (' ') n loc de ncheierea uzual . n continuare ad ug m un item la list folosind metoda append a obiectului list , a a cum am discutat anterior. Verific m c ad ugarea s-a realizat tip rind con inutul listei prin transmiterea ei func iei print care o tip re te frumos pe ecran. Mai departe sort m lista folosind metoda sort a listei. Este important s ntelegem c aceast metod afecteaza ns i lista i nu ntoarce o list modificat - spre deosebire de comportamentul sirurilor. Asta vrem s zicem prin

muabile pe cnd irurile sunt imuabile. Dup ce cump r m un item de la pia , vrem s -l elimin m din list . Pentru aceasta utiliz m declara ia del. Trebuie men ionat aici itemul pe care vrem s -l elimin m i declara ia del l elimin pentru noi. Specific m c vrem s elimin m primul item, de aici declara ia del shoplist[0] (aminti i-v c Python ncepe num r toarea de la 0). Dac vre i s ti i toate metodele definite de obiectul list , citi i help(list).

Tupluri
Tuplurile sunt folosite pentru p stra colec ii de obiecte. Sunt similare cu listele, dar f r func ionalitatea extins pe care o dau clasele. O facilitate major a tuplurilor este c ele sunt imuabile ca i irurile adic nu pot fi modificate. Tuplurile sunt definite prin specificarea itemurilor separate prin virgule ntro pereche op ional de paranteze.

Tuplurile sunt folosite de obicei n cazurile n care o declara ie sau o func ie definit de utilizator poate presupune f r risc de gre eal c o colec ie de valori nu se va schimba.. Exemplu:

#!/usr/bin/python # Fi ier: using_tuple.py

zoo = ('piton', 'elefant', 'pinguin') # re ine i c print('Num rul animalelor n zoo este', len(zoo))

parantezele sunt op ionale

zoo_nou = ('maimu

', 'c mil ', zoo)

print('Num rul de cu ti 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('Num rul de animale n noul zoo este', len(zoo_nou)-1+len(zoo_nou[2]))
Rezultat:

$ python using_tuple.py Num rul animalelor n zoo este 3 Num rul de cu ti n noul zoo este 3 Animalele din noul zoo sunt ('maimu ', 'c mil ', ('piton', 'elefant', 'pinguin'))

Animalele aduse din vechiul zoo sunt ('piton', 'elefant', 'pinguin') Ultimul animal adus din vechiul zoo este pinguin Num rul de animale n noul zoo este 5
Cum func ioneaz : Variabila zoo este un tuplu de itemuri. Vedem c func ia len lucreaz tuplurile sunt i secven e. Acum mut m aceste animale ntr-un nou zoo, deoarece vechiul zoo s-a nchis, s zicem. Ca urmare tuplul zoo_nou con ine ni te animale care erau acolo mpreun cu animalele aduse din vechiul zoo. n realitate, acum, re ine i c un tuplu n interiorul altui tuplu nu i pierde identitatea. Putem accesa itemurile din tuplu specificnd pozi ia ntro pereche de paranteze p trate, ca pentru liste. Acesta se nume te operator de indexare. Acces m al treilea item din zoo_nou specificnd zoo_nou[2] i acces m al treilea item al tuplului zoo din tuplul zoo_nou specificnd zoo_nou[2][2]. E destul de simplu dup ce a i nteles regula. Paranteze De i parantezele sunt op ionale, eu prefer s le pun mereu, pentru a face evident c e vorba de un tuplu, n special pentru a evita ambiguitatea. De exemplu print(1,2,3) i print( (1,2,3) ) nseamn dou lucruri foarte diferite - prima tip re te trei numere, iar a doua tip re te un tuplu (care con ine trei numere). i pentru tupluri. De asemenea asta arat c

Tupluri cu 1 sau 0 elemente Un tuplu vid este construit folosind o pereche de paranteze goale myempty = (). Totu i, un tuplu cu un singur element nu e a a de simplu. Trebuie s l specifica i folosind virgula dup primul ( i ultimul) element, ca Python s poat diferen ia ntre tuplu i un alt obiect cuprins n paranteze ntro expresie deci va trebui s specifica i singleton = (2 , ) dac vre i s se n eleag 'tuplul care con ine doar elementul 2'. Not pentru programatorii n Perl O list ntro list nu- i pierde identitatea adic nu este asimilat ca n Perl. Asta se aplic i pentru un tuplu

ntrun tuplu, o list ntrun tuplu, un tuplu ntro list etc. n ce prive te limbajul Python, ele sunt ni te obiecte stocate n alte obiecte.

Dic ionare
Un dic ionar este ca o carte de adrese n care po i g si adresa sau datele de contact ale persoanei doar tiindu-i numele, adic asociem chei (nume) cu valori (detalii). De observat c o cheie trebuie s fie unic , pentru a nu exista confuzii, exact ca atunci cnd nu po i deosebi dou persoane dac au acela i nume. Pe post de chei pute i folosi numai obiecte imuabile (precum irurile), dar pe post de valori putem folosi orice fel de valori. n esen nseamn c ar trebui s folosim pe post de chei numai obiecte simple.

Perechile cheie - valoare sunt specificate ntrun dic ionar folosind nota ia d = {cheie1 : valoare1,

cheie2 : valoare2 }. Observa i c perechile cheie - valoare sunt separate prin virgul , iar cheia este
separat de valoare prin semnul dou puncte. Dic ionarul este delimitat de o pereche de acolade. Re ine i c ntrun dic ionar perechile cheie - valoare nu sunt ordonate n nici un fel. Dac vre i o anumit ordine, va trebui s l sorta i singuri nainte de folosire. Dic ionarele pe care le ve i folosi sunt instan e/obiecte ale clasei dict. Exemplu:

#!/usr/bin/python # Fi ier: using_dict.py

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

ab = {

'Swaroop' 'Larry'

: 'swaroop@swaroopch.com', : 'larry@wall.org',

'Matsumoto' : 'matz@ruby-lang.org', 'Spammer' } : 'spammer@hotmail.com'

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

tergerea unei perechi cheie - valoare

del ab['Spammer']

print('\nExist

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

for nume, adresa in ab.items(): print('Contacta i pe {0} la adresa {1}'.format(nume, adresa))

# Ad ugarea unei perechi cheie - valoare ab['Guido'] = 'guido@python.org'

if 'Guido' in ab: # OR ab.has_key('Guido') print("\nAdresa lui Guido este", ab['Guido'])


Rezultat:

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

Exist

3 contacte n address-book

Contacta i pe Swaroop la adresa swaroop@swaroopch.com Contacta i pe Matsumoto la adresa matz@ruby-lang.org Contacta i pe Larry la adresa larry@wall.org

Adresa lui Guido este guido@python.org


Cum func ioneaz : Cre m dic ionarul ab folosind nota ia deja discutat . Acces m perechile cheie - valoare specificnd cheia i folosind operatorul de indexare, a a cum am discutat la liste i tupluri. Observa i simplitatea sintaxei. Putem terge perechi cheie valoare folosind vechiul nostru prieten - declara ia del. Pur i simplu specific m dic ionarul i operatorul de indexare pentru cheia care trebuie tears i le d m declara iei

del. Nu este necesar s se cunoasc

i valoarea asociata cheii pentru a realiza aceast opera ie.

n continuare acces m fiecare pereche cheie - valoare din dic ionar folosind metoda items a dic ionarului care ntoarce o list de tupluri n care fiecare tuplu con ine o pereche de itemuri - cheia urmat de valoare. Extragem aceast pereche i o atribuim variabilelor nume i adres corespunz tor pentru fiecare pereche folosind o bucl for..in n care tip rim aceste informa ii. Putem ad uga perechi noi cheie - valoare prin simpla utilizare a operatorului de indexare pentru a accesa cheia i a atribui acea valoare, a a cum am f cut pentru Guido n cazul de mai sus. Putem testa dac exist n dic ionar o anumit pereche cheie - valoare folosind operatorul in sau chiar metoda has_key a clasei dict. Pute i consulta documenta ia pentru o list complet a metodelor clasei

dict folosind comanda help(dict).

Argumente cuvnt cheie i dic ionare ntr-o alt ordine de idei, dac a i folosit argumente cuvnt cheie n func ii, nseamn c a i folosit deja dic ionare! Ia gndi i-v : perechea cheie - valoare este specificat n lista de parametri a defini iei func iei i cnd accesa i variabilele, numele lor sunt chei de acces ale unui dic ionar numit tabel de simboluri n terminologia proiect rii de compilatoare).

Secven e
Listele, tuplurile i irurile sunt exemple de secven e, dar ce sunt secven ele i ce le face att de speciale? Facilitatea cea mai important este c au teste de apartenen (adic expresiile in i not in) i

opera ii de indexare. Opera ia de indexare ne permite s extragem direct un item din secven . Au fost men ionate trei tipuri de secven e - liste, tupluri i iruri i opera ia de feliere, care ne permite s extragem o parte (engl. slice) din secven . Exemplu:

#!/usr/bin/python # Fi ier: seq.py

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

# Opera ia de indexare sau 'subscriere' print('Itemul 0 este', shoplist[0]) print('Itemul 1 este', shoplist[1]) print('Itemul 2 este', shoplist[2]) print('Itemul 3 este', shoplist[3]) print('Itemul -1 este', shoplist[-1]) print('Itemul -2 este', shoplist[-2]) print('Caracterul 0 este', nume[0])

# Felierea unei liste print('Itemurile de la 1 la 3 sunt', shoplist[1:3]) print('Itemurile de la 2 la sfrsit sunt', shoplist[2:]) print('Itemurile de la 1 la -1 sunt', shoplist[1:-1]) print('Itemurile de la nceput la sfr it sunt', shoplist[:])

# Felierea unui

ir

print('Caracterele de la 1 la 3 sunt', nume[1:3]) print('Caracterele de la 2 la end sunt', nume[2:])

print('Caracterele de la 1 la -1 sunt', nume[1:-1]) print('Caracterele de la nceput la sfr it sunt ', nume[:])


Rezultat:

$ python seq.py Itemul 0 este mere Itemul 1 este mango Itemul 2 este morcovi Itemul 3 este banane Itemul -1 este banane Itemul -2 este morcovi Caracterul 0 este s Itemurile de la 1 la 3 sunt ['mango', 'morcovi'] Itemurile de la 2 la sfr it sunt ['morcovi', 'banane'] Itemurile de la 1 la -1 sunt ['mango', 'morcovi'] Itemurile de la nceput la sfr it sunt ['mere', 'mango', 'morcovi', 'banane'] Caracterele de la 1 la 3 sunt wa Caracterele de la 2 la sfr it sunt aroop Caracterele de la 1 la -1 sunt waroo Caracterele de la nceput la sfr it sunt swaroop
Cum func ioneaz : La nceput, vedem cum se folosesc indec ii pentru a ob ine un element anume din secven . Asta se mai nume te opera ia de subscriere. De cte ori specifica i un num r ntro pereche de paranteze drepte al turate unei secven e, Python v va extrage itemul corespunzator pozi iei n secven . Re ine i c Python ncepe num r toarea de la 0. Astfel shoplist[0] extrage primul item i

shoplist[3] l extrage pe al patrulea din secven a shoplist.


Indexul poate fi i un num r negativ, caz n care pozi ia este calculat de la sfr itul secven ei. Din acest motiv shoplist[-1] indic ultimul item din secven , iar shoplist[-2] penultimul item. Opera ia de feliere este folosit specificnd numele secven ei urmat de o pereche op ional de numere separate prin semnul doua puncte (engl. colon) incluse n paranteze drepte. Observa i c este foarte asem n tor cu opera ia de indexare folosit pn acum. De re inut c numerele sunt op ionale, semnul dou puncte NU este op ional. Primul num r (nainte de dou puncte) n opera ia de feliere indic punctul unde ncepe felia, iar al doilea num r indic unde se temin . Dac nu este specificat primul num r, Python va ncepe cu nceputul secven ei. Dac este omis al doilea num r, Python se va opri la sfr itul secven ei. Observa i c felia ntoars (uneori se spune 'returnat ') ncepe cu pozi ia dat de primul num r, dar se ncheie imediat nainte de pozi ia dat de al doilea num r adic nceputul este inclus, sfr itul nu este inclus n felie.

Astfel, shoplist[1:3] ntoarce o felie din secven a care ncepe cu pozi ia 1, include pozi ia 2, dar nu include pozi ia 3 deci este ntoars o felie de dou itemuri. Similar, shoplist[:] ntoarce o copie a secven ei. Mai puteti face feliere i cu indec i negativi. Numerele negative sunt folosite pentru a indica pozi ii de la sfr itul secven ei. De exemplu, shoplist[:-1] va ntoarce o felie din secven ultimul item din secven , dar include tot restul secven ei. De asemenea, putem da al treilea argument pentru feliere, care devine pasul de feliere (implicit pasul este 1): care exclude

>>> 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']
Iat ce se ntmpl cnd pasul este 2, ob inem itemurile cu pozi iile 0, 2, ... Dac pasul este 3, obtinem itemurile din pozi iile 0, 3, etc. ncerca i variate combina ii de specifica ii de feliere n modul interactiv, pentru a vedea imediat rezultatele. Marele avantaj al secven elor este c pute i accesa tuplurile, listele i irurile n acela i fel!

Seturi
Seturile sunt colec ii neordonate de obiecte simple. Acestea sunt folosite atunci cand existen a unui obiect n colec ie este mai important dect pozi ia lui sau num rul de apari ii. Folosind seturi, pute i testa apartenen a, dac un set este subset al altui set, pute i afla intersec ia a dou seturi i a a mai departe.

>>> bri = set(['brazilia', 'rusia', 'india']) >>> 'india' in bri True >>> 'usa' in bri False >>> bric = bri.copy() >>> bric.add('china') >>> bric.issuperset(bri) True >>> bri.remove('rusia')

>>> bri & bric # OR bri.intersection(bric) {'brazilia', 'india'}


Cum func ioneaz : Exemplul este autoexplicativ deoarece implic teoria de baz nv at la coala despre mul imi (seturi).

Referin e
Cnd crea i un obiect i i atribui i o valoare, variabila doar indic obiectul creat, nu reprezint obiectul nsu i! Asta nseamn c numele variabilei este un indicator c tre acea parte a memoriei calculatorului n care este stocat obiectul. Acest fapt se nume te legare (engl. binding) a numelui la obiect. n general, nu trebuie s v ngrijora i de asta, dar exist un efect subtil datorat referin ei de care trebuie s fi i con tien i: Exemplu:

#!/usr/bin/python # Fi ier: reference.py

print('Atribuire simpl ') lista_ini ial = ['mere', 'mango', 'morcovi', 'banane'] # lista_mea este doar un alt nume al aceluia i

lista_mea = lista_ini ial obiect!

del lista_ini ial [0] # Am cump rat primul item, deci s -l

tergem din list

print('lista initial

este', lista_ini ial )

print('lista mea este', lista_mea) # Observa i c # astfel c ambele liste apar f r acela i obiect 'mere', confirmnd

ele indic

print('Copiere f cnd o felie intergal ') lista_mea = lista_ini ial [:] # Face o copie prin feliere integral del lista_mea[0] # elimin m primul item

print('lista_ini ial

este', lista_ini ial )

print('lista_mea este', lista_mea) # Observa i c


Rezultat:

acum cele dou

liste sunt diferite?

$ python reference.py Atribuire simpl lista_ini ial este ['mango', 'morcovi', 'banane']

lista_mea este ['mango', 'morcovi', 'banane'] Copiere f cnd o felie intergal lista_ini ial este ['mango', 'morcovi', 'banane']

lista_mea este ['morcovi', 'banane']


Cum func ioneaz : Partea principal a explica iei se reg se te n comentarii. Re ine i c dac vre i s face i o copie a unei liste sau a unor obiecte complexe (nu simple obiecte, cum ar fi ntregii), atunci trebuie s folosi i felierea. Dac folosi i atribuirea ob ine i nc un nume pentru acela i obiect i asta poate aduce probleme dac nu sunte i aten i. Not pentru programatorii n Perl Re ine i c o declara ie de atribuire pentru liste nu creeaza o copie. Va trebui s folosi i felierea pentru a face o copie a secven ei.

Alte detalii despre iruri


Am discutat deja n detaliu despre iruri. Ce ar mai putea fi de tiut? Ei bine, tia i c irurile sunt obiecte i au metode care fac orice de la verificarea unor p r i ale irului pn la eliminarea spa iilor? Sirurile pe care le folosi i n programe sunt obiecte din clasa str. Cteva metode utile sunt ar tate n exemplul urm tor. Pentru o list complet a metodelor, citi i help(str). Exemplu:

#!/usr/bin/python # Fi ier: str_methods.py

nume = 'Swaroop' # Acesta este obiectul

ir

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

if 'a' in nume: print('Da, irul con ine sub irul "a"')

if name.find('war') != -1: print('Da, irul con ine sub irul "war"')

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


Rezultat:

$ python str_methods.py Da, Da, Da, irul ncepe cu "Swa" irul con ine sub irul "a" irul con ine sub irul "war"

Brazilia_*_Rusia_*_India_*_China
Cum func ioneaz : Aici vedem o mul ime de metode n ac iune. Metoda startswith este folosit pentru a testa dac irul ncepe sau nu cu un ir dat. Operatorul in se folose te pentru a verifica includerea

unui ir n irul dat. Metoda find este folosit pentru a g si pozi ia unui ir dat n irul ini ial, care ntoarce -1 dac nu a g sit nimic. Clasa str are i o metod simpatic join pentru a al tura itemurile dintro secven , cu un ir pe post de delimitator ntre itemuri i intoarce un ir lung generat din toate acestea.

Rezumat
Am explorat diversele structuri de date predefinite n Python n detaliu. Aceste structuri de date vor deveni esen iale pentru scrierea de programe de dimensiuni rezonabile. Acum c avem o mul ime de elemente Python asimilate, vom vedea cum se proiecteaz scriu programe Python n lumea de zi cu zi. i se

Python ro:Rezolvarea problemelor


Am explorat diverse p r i din limbajul Python i acum vom vedea cum conlucreaz acestea prin proiectarea i scrierea unui program care face ceva util. Ideea este de a nv a cum s scriem un program Python propriu.

Contents

1 Problema 2 Solu ia 3 A doua versiune 4 Versiunea a treia 5 Versiunea a patra 6 Alte rafinamente 7 Procesul de dezvoltare de software

8 Rezumat

Problema
Problema este "Vreau un program care s fac un backup al tuturor fi ierelor mele importante". De i aceasta este o problema simpl , nu avem destule informa ii pentru a ncepe g sirea unei solu ii. Se impune o analiz suplimentar . De exemplu, cum specific m care fi iere trebuie salvate? Cum vor fi ele stocate? Unde vor fi stocate? Dup o analiz corect a problemei, proiect m programul. Facem o list cu lucruri care descriu cum trebuie s func ioneze programul nostru. n acest caz, am creat lista urm toare care descrie cum vreau EU s mearg . Dac face i voi proiectarea s-ar putea s rezulte o altfel de analiz , ntruct fiecare face lucrurile n felul lui, deci e perfect OK. 1. Fi ierele i directoarele care trebuie salvate sunt specificate ntr-o list . 2. Backup-ul trebuie stocat n directorul principal de backup 3. Fi ierele sunt stocate ntro arhiv zip. 4. Numele arhivei zip este data i ora. 5. Folosind comanda standard zip disponibil implicit n toate distribu iile Linux/Unix. Utilizatorii de Windows pot instala din pagina proiectului GnuWin32 i adauga C:\Program Files\GnuWin32\bin la variabila de mediu PATH, similar modului n care am f cut pentru recunoa terea ns orice comand de arhivare att timp ct aceast are o interfa argumente din programul nostru. i a comenzii python. Re ine i c pute i folosi

linie de comand , ca s i putem transmite

Solu ia
ntruct designul programului nostru este relativ stabil, putem scrie codul care implementeaz solu ia noastr .

#!/usr/bin/python # Fi ier: backup_ver1.py

import os import time

# 1. Fi ierele

i directoarele de salvat sunt specificate ntr-o list .

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

# 2. Salvarea (engl. backup) trebuie stocat target_dir = 'E:\\Backup' # Nu uita i s

n directorul principal de backup

schimba i asta cu directorul folosit de voi

# 3. Fi ierele sunt salvate ntro arhiv

zip.

# 4. Numele arhivei zip este data

i ora curent

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

# 5. Folosim comanda zip pentru a include fi ierele

i directoarele de salvat n arhiv

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

# Rul m comanda de backup if os.system(zip_command) == 0: print('Salvare reu it else: print('Backup E UAT')


Rezultat:

n ', target)

$ python backup_ver1.py Salvare reu it n E:\Backup\20090208153040.zip

Acum suntem n faza de testare n care verific m dac programul nostru lucreaz corect. Dac nu se comport cum trebuie, va fi nevoie de debugging adic eliminarea erorilor din program. Dac programul nu va merge, pune i o declara ie print(zip_command) imediat nainte de apelul os.system i rula i programul. Acum copia i comanda zip_command la promptul shell-ului i verifica i dac merge pe cont propriu. Dac aceasta e ueaz , citi i manualul comenzii zip ca s afla i ce ar putea fi gre it. Dac reu e te, verifica i programul Python ca s vede i dac este exact ca mai sus. Cum func ioneaz : Ve i observa cum am transformat designul n cod ntro manier pas cu pas. Utiliz m modulele os i time importndu-le de la nceput. Apoi specific m directoarele care trebuie salvate n lista

source. Directorul destina ie este locul unde stoc m toate salv rile i acesta este specificat n variabila target_dir.
Numele arhivei zip pe care o vom crea este "data curent +ora curent " pe care le g sim folosind func ia

time.strftime(). Arhiva va avea extensia .zip i va fi stocat n directorul target_dir.


Observa i folosirea variabilei os.sep - cea care ne d separatorul de director al sistemului vostru de operare; acesta va fi '/' n Linux i Unix, '\\' n Windows i ':' n Mac OS. Folosirea declara iei os.sep n locul acestor caractere va face programul mai portabil ntre aceste sisteme. Func ia time.strftime() prime te o specifica ie ca aceea folosit n program. Specifica ia %Y va fi nlocuit cu anul, f r secol. Specifica ia %m va fi nlocuit cu luna, ca numar zecimal ntre 01 i 12 .a.m.d. Lista complet a specifica iilor poate fi g sit n Manualul de referin Python. irurile adic al tur irurile i

Cre m numele directorului destina ie folosind operatorul de adunare care concateneaz

produce unul mai lung. Atunci noi cre m un ir zip_command care con ine comanda pe care o vom executa. Pute i verifica dac a rezultat o comand corect prin executarea ei de sine st t toare ntr-un shell (terminal Linux sau DOS prompt).

Comanda zip pe care o folosim are cteva op iuni i parametri transmi i. Op iunea -q este folosit pentru a indica modul de lucru t cut (engl. quiet). Op iunea -r specific modul recursiv de parcurgere a directoarelor, adic trebuie s includ i toate subdirectoarele i subdirectoarele acestora etc. Cele dou op iuni se combin i se specific pe

scurt -qr. Op iunile sunt urmate de numele arhivei care va fi creat urmat de lista fi ierelor i directoarelor de salvat. Convertim lista source ntr-un ir folosind metoda join a irurilor, pe care am nv at deja s-o folosim. n fine, rul m comanda folosind func ia os.system care execut comanda ca i cum ar fi fost lansat din sistem adic n shell - ea ntoarce 0 dac comanda a fost executat cu succes, altfel ntoarce un cod de eroare. n func ie de rezultatul comenzii, tip rim pe ecran mesajul adecvat, cum c salvarea a reu it sau nu. Asta e, am creat un script care s faca un backup al fi ierelor importante din sistem! Not pentru utilizatorii de Windows n locul secven elor de evadare cu dublu backslash, pute i folosi i iruri brute. De exemplu, folosi i

'C:\\Documents' sau r'C:\Documents'. n orice caz, nu folosi i 'C:\Documents' ntruct ve i ajunge


s folosi i o secven de evadare necunoscut , \D.

Acum c avem un script func ional de salvare, l putem rula de cte ori vrem s ob inem o salvare a fi ierelor. Utilizatorii de Linux/Unix sunt sf tui i s foloseasc metode executabile a a cum am discutat n capitolele precedente, astfel ca ele s poat rula de oriunde, oricnd. Asta se nume te faza de operare sau de distribuire a software-ului. Programul de mai sus func ioneaz corect, dar (de obicei) primul program nu func ioneaz cum ne-am a tepta. De exemplu ar putea fi probleme dac nu am proiectat corect programul sau dac avem o eroare de dactilografiere n scrierea codului (engl. typo), etc. n modul adecvat, v ve i ntoarce la faza de design sau debuggigg pentru a rezolva problema.

A doua versiune
Prima versiune a scriptului nostru func ioneaz . Totu i, putem rafina programul pentru a lucra mai bine n utilizarea sa de zi cu zi. Asta se nume te ntre inere sau mentenan a software-ului (engl. maintenance).

Unul din rafinamentele pe care le-am considerat eu utile a fost un mecanism mai bun de denumire a salv rilor, folosind ora ca nume al fi ierului, iar data ca nume de subdirector al directorului de backup care s con in salv rile din aceea i data. Primul avantaj este c salv rile vor fi stocate ntr-o manier ierarhic i vor fi mai u or

de gestionat. Al doilea avantaj este c lungimea numelor de fi ier va fi mai mult mai mic . Al treilea avantaj este c se va putea verifica mai u or dac au fost f cute salv ri zilnic (n ziua n care nu s-a facut, directorul avnd ca nume acea dat lipse te, ntruct nu a fost creat).

#!/usr/bin/python # Fi ier: backup_ver2.py

import os import time

# 1. Fi ierele

i directoarele de salvat sunt specificate ntro list .

source = ['"C:\\My Documents"', 'C:\\Code']

# Observa i c au fost necesare ghilimele duble pentru a proteja spa iile din interiorul numelor.

# 2. Salvarea trebuie stocat

n directorul principal de backup schimba i asta cu directorul pe care l

target_dir = 'E:\\Backup' # Nu uita i s folosi i voi

# 3. Fi ierele sunt salvate n fi iere zip. # 4. Data curent este numele subdirectorului din folderul principal

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

acum = time.strftime('%H%M%S')

# Cre m subdirectorul, dac if not os.path.exists(azi):

nu exista nainte

os.mkdir(azi) # cre m directorul print('Am creat cu succes directorul ', azi)

# Numele fi ierului arhiva zip target = azi + os.sep + acum + '.zip'

# 5. Folosim comanda zip pentru a colecta fi ierele n arhiv . zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rul m programul de salvare if os.system(zip_command) == 0: print('Salvare reu it else: print('Salvare E UAT ')
Rezultat:

n ', target)

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

$ python backup_ver2.py Salvare reu it


Cum func ioneaz :

n E:\Backup\20090209\111837.zip

Majoritatea codului ramne neschimbat. Schimb rile constau un testarea existen ei directorului avnd ca nume data curent n interiorului directorului principal de backup folosind func ia os.path.exists. Dac acesta nu exist , l cre m noi folosind func ia os.mkdir.

Versiunea a treia
A doua versiune merge bine cnd facem multe salv ri, dar e greu de v zut ce este salvat n fiecare arhiva! De exemplu, poate am f cut o schimbare mare unui program sau unei prezent ri i a vrea s asociez aceste schimb ri cu numele programului sau prezent rii i arhiva zip. Aceasta se poate realiza u or prin ata area unui comentariu furnizat de utilizator la numele arhivei zip. Not Urm torul program nu func ioneaz , deci nu va alarma i, urma i-l totu i, pentru c e o lec ie n el.

#!/usr/bin/python # Fi ier: backup_ver3.py

import os import time

# 1. Fi ierele

i directoarele de salvat sunt specificate ntro list .

source = ['"C:\\My Documents"', 'C:\\Code'] # Observa i c a fost nevoie de ghilimele duble pentru a proteja spa iile din interiorul numelor.

# 2. Salvarea trebuie stocat

n directorul principal schimba i asta cu ce folosi i voi zip.

target_dir = 'E:\\Backup' # Nu uita i s # 3. Fi ierele sunt salvate ntro arhiv # 4. Data curent

este numele subdirectorului

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

acum = time.strftime('%H%M%S')

# Lu m un comentariu de la utilizator pentru a crea numele comentariu = input('Introduce i un comentariu --> ') if len(comentariu) == 0: # Verifica i dac target = azi + os.sep + acum+ '_' + comentariu.replace(' ', '_') + '.zip' a fost introdus

# Cre m subdirectorul dac

nu exist

deja

if not os.path.exists(azi): os.mkdir(azi) # Cre m directorul

print('Am creat cu succes directorul ', azi)

# 5. Folosim comanda zip pentru a colecta fi ierele n arhiva zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))

# Rul m salvarea if os.system(zip_command) == 0: print('Salvare reu it else: print('Salvare E UAT ')


Rezultat:

n ', target)

$ python backup_ver3.py File "backup_ver3.py", line 25 target = azi + os.sep + now + '_' + ^ SyntaxError: invalid syntax
Cum (nu) func ioneaz : Acest program nu func ioneaz ! Python spune c e undeva o eroare de sintax ceea ce nseamn c programul nu a fost bine scris, c nu respect structura pe care se a teapt Python s o g seasc acolo. Cnd vedem eroarea dat de Python, afl m i locul unde a detectat el eroarea. Deci ncepem eliminarea erorilor (engl. debugging) programului de la acea linie. La o observa ie atent , vedem ca o linie logic a fost extins pe dou linii fizice f r s se specifice acest lucru. n esen Python a g sit operatorul de adunare (+) f r vreun operand n acea linie i prin urmare nu

tie cum s continue. V aminti i c putem specifica trecerea unei linii logice pe urm toarea linie fizic folosind un backslash la sfr itul liniei fizice. Astfel facem corectura la progrmul nostru. Aceasta corec ie a programului cnd gasim erori se nume te depanare (engl. bug fixing).

Versiunea a patra
#!/usr/bin/python # Fi ier: backup_ver4.py

import os import time

# 1. Fi ierele de salvat sunt specificate ntro list . source = ['"C:\\My Documents"', 'C:\\Code']

# Observa i c a trebuit s interiorul numelor.

punem ghilimele duble pentru a proteja spa iile din

# 2. Salvarea trebuie stocat

n directorul principal de backup schimba i asta cu ceea ce folosi i voi

target_dir = 'E:\\Backup' # Nu ui ati s

# 3. Salv rile se fac n arhive zip.

# 4. Ziua curent

este numele subdirectorului din directorul principal de backup

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

acum = time.strftime('%H%M%S')

# Accept m un comentariu de la utilizator comentariu = input('Introduce i un comentariu --> ') if len(comentariu) == 0: # Verific m dac target = azi + os.sep + acum + '.zip' else: target = azi + os.sep + acum + '_' + \ comentariu.replace(' ', '_') + '.zip' a fost introdus un comentariu

# Cre m subdirectorul, dac if not os.path.exists(azi):

nu exista deja

os.mkdir(azi) # cre m directorul print('Am creat cu succes directorul ', today)

# 5. Folosim comanda zip pentru a colecta fi ierele n arhiv

zip

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

# Rul m comanda de backup if os.system(zip_command) == 0: print('Salvare reu it else: print('Salvare E UAT ')
Rezultat:

n ', target)

$ python backup_ver4.py

Introduce i un comentariu --> noi exemple ad ugate Salvare reu it n E:\Backup\20090209\162836_noi_exemple_ad ugate.zip

$ python backup_ver4.py Introduce i un comentariu --> Salvare reu it


Cum functioneaz : Acest program func ioneaz , acum! S parcurgem mbun t irile pe care i le-am adus n versiunea 3. Accept m un comentariu de la utilizator folosind func ia input i apoi test m dac s-a introdus ceva sau nu calculnd lungimea irului introdus cu ajutorul func iei len. Dac utilizatorul a dat ENTER f r s introduc ceva (poate era doar un backup de rutin nainte. Totu i, dac a fost introdus un comentariu, acesta este ata at numelui arhivei zip, chiar naintea extensiei i n-au fost f cute modific ri anume), apoi continu m ca mai

n E:\Backup\20090209\162916.zip

.zip. Observa i c nlocuim spa iile n comentariu cu underscore - ca s fie mai u oar gestiunea fi ierelor cu
nume lungi.

Alte rafinamente
A patra versiune este una satisf c toare pentru majoritatea utilizatorilor, dar este mereu loc pentru mai bine. De exemplu se poate introduce un nivel de logoree (engl. verbosity) pentru program, cu ajutorul op iunii -v Pentru a face programul mai vorb re . Alt mbun t ire posibil ar fi s permitem ca fi ierele i directoarele de salvat s fie transmise scriptului la linia de comand . Noi le putem culege din lista sys.argv i le putem ad uga la variabila list source folosind metoda extend a clasei list. Cea mai importanta extindere ar fi s nu folosim os.system ci direct modulele predefinite zipfile sau

tarfile pentru a crea aceste arhive. Ele sunt parte a bibliotecii standard i sunt deja disponibile pentru a
scrie un program f r dependente externe pentru programul de arhivare. Totu i, am folosit os.system pentru crearea salv rilor din motive pedagogice, pentru ca exemplul s fie destul de simplu de nteles, dar i util. Pute i ncerca s scrie i a cincea variant folosind modulul zipfile n locul apelului os.system?

Procesul de dezvoltare de software


Am trecut prin diverse faze n procesul de scriere a unui program. Aceste faze pot fi rezumate astfel: 1. Ce (Analiza) 2. Cum (Design) 3. Executare (Implementare) 4. Test (Testare i eliminare erori) 5. Utilizare (Operare sau distribuire)

6. Mentenan

(Rafinare)

O cale recomandat de a scrie programe este procedura urmat de noi la scrierea scriptului de salvare: facem analiza i designul. ncepem implementarea cu o versiune simpl . O test m i o depan m. O folosim pentru a ne asigura c merge cum ne-am propus. Acum i ad ug m noi facilit i pe care le dorim i parcurgem ciclul FACI - TESTEZI - UTILIZEZI de cte ori este nevoie. Re ine i, Software-ul este crescut, nu construit.

Rezumat
Am v zut cum se creeaz un program/script Python i diferite stadii implicate de scrierea unui program. A i putea considera util scrierea de programe proprii, att pentru acomodarea cu Python ct i pentru a rezolva probleme. n continuare vom discuta despre programarea orientat pe obiecte.

Python ro:Programare orientat pe obiecte

Contents

1 Introducere 2 self 3 Clase 4 Metodele obiectelor 5 Metoda __init__ 6 Variabile de clas , variabile de instan 7 Mo tenire 8 Rezumat

Introducere
n toate programele folosite pn acum ne-am construit solu iile n jurul func iilor adic blocuri de declara ii care manipuleaz date. Acest mod de programare se nume te orientat pe proceduri. Exist i un alt mod de organizare a

programelor, n care func ionalitatea i datele sunt mpachetate mpreun n unit i numite obiecte. Acest mod de structurare define te paradigma "orientat pe obiecte. Aproape tot timpul pute i folosi abord ri procedurale n programare, dar cnd scrie i programe mari sau ave i de rezolvat probleme care sunt mai aproape de acest mod de structurare, pute i folosi tehnicile de programare orientat pe obiecte.. Clasele i obiectele sunt dou aspecte ale program rii orientate pe obiecte. O clas creeaza un nou tip n care

obiectele sunt instan e ale clasei. O analogie este c pute i avea variabile de tip int care se traduce prin aceea c variabilele care stocheaz ntregi sunt instan e (obiecte) ale clasei int. Not pentru programatorii n limbaje cu tipuri statice Observa i c pn i ntregii sunt trata i ca obiecte (ale clasei int). Asta e diferit de C++ i Java (n versiunile

dinainte de 1.5) n care ntregii sunt tipuri primitive native. A se vedea help(int) pentru detalii despre clas .

Programatorii n C# i Java 1.5 vor g si o similaritate cu conceptele de ncapsulare i decapsulare. Obiectele pot stoca date folosind variabile obi nuite care apar in obiectului. Variabilele care apar in unui obiect sunt numite cmpuri. Obiectele pot avea i func ionalitate folosind func ii care apar in clasei. Aceste func ii se munesc metode ale clasei. Aceast terminologie este important deoarece ne ajuta s diferen iem ntre func ii i variabile independente i cele apar innd unui obiect sau unei clase. mpreun , variabilele i func iile care apar in unei clase se numesc atribute ale clasei. Cmpurile sunt de dou tipuri - ele pot apar ine fiec rei instan e/obiect al clasei sau pot apar ine ns Acestea sunt numite variabile de instan respectiv variabile ale clasei. i clasei.

O clas este creat folosind cuvntul cheie class. Cmpurile i metodele clasei sunt listate ntrun bloc indentat.

self
Clasele i metodele au o diferen specific fa de func iile obi nuite - ele trebuie s aib un prenume suplimentar care trebuie ad ugat la nceputul listei de parametri, dar nu trebuie s -i da i o valoare cnd apela i metoda, Python o va furniza. Aceast variabil special se refer la obiectul nsu i (engl. self) i prin conven ie este numit self. Cu toate acestea, de i pute i s -i da i orice nume acestui parametru, este puternic recomandat s folosi i numele self - orice alt nume este dezaprobat. Exist multe avantaje n folosire numelui standard - orice cititor al programului va n elege imediat despre ce este vorba i chiar mediile IDE (Integrated Development Environments) specializate te pot ajuta dac folose ti self. Not pentru programatorii n C++/Java/C#

self din Python este echivalent cu pointerul this din C++ i cu referin a this din Java i C#.
Probabil v ntreba i cum d Python valoarea corect lui self i de ce nu trebuie s -i d m o valoare. Un exemplu va clarifica aceast problem . S zicem c ave i o clas numit MyClass i o instan a acestei

clase, numit myobject. Cnd apela i o metod a acestui obiect myobject.method(arg1, arg2), apelul este automat convertit de Python n MyClass.method(myobject, arg1, arg2) - asta e toat marea specialitate a lui self. Asta nseamn - self. i c dac ave i o metod care nu prime te argumente, tot va trebui s ave i un argument

Clase
Cea mai simpl clas posibil este ar tat n exemplul urm tor.

#!/usr/bin/python # Fi ier: simplestclass.py

class Persoana: pass # Un bloc gol

p = Persoana()

print(p)
Rezultat:

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


Cum func ioneaz : Cre m o clas nou folosind declara ia class i numele clasei. Aceasta este urmat de un bloc indentat de declara ii care formeaz corpul clasei. n acest caz avem un bloc gol, ar tat de declara ia pass. n continuare cre m un obiect/instan a acestei clase folosind numele clasei urmat de o pereche de

paranteze. (Vom nv a mai multe despre instan iere n paragraful urm tor). Pentru propria verificare, confirm m tipul variabilei prin simpla ei tip rire. Afl m c avem o instan a variabilei din clasa

Persoana din modulul __main__.


Observa i c a fost tip rit i adresa unde este stocat obiectul n memoria calculatorului. Adresa aceasta

va avea o valoare diferit n alt calculator deoarece Python l stocheaz unde are loc.

Metodele obiectelor
Am discutat deja c obiectele/clasele pot avea metode, exact ca func iile, doar c au un argument self n plus. Iat un exemplu.

#!/usr/bin/python # Fi ier: metoda.py

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

p = Persoana() p.ziSalut()

# Acest exemplu poate fi scris


Rezultat:

i ca Persoana().ziSalut()

$ python metoda.py Salut, ce mai faci?


Cum func ioneaz : Aici vedem particula self n ac iune. Observa i c metoda ziSalut nu prime te parametri, dar tot are argumentul self n defini ia func iei.

Metoda __init__
Exist multe nume de metode care au un nteles special n clasele Python. Acum vom afla semnifica ia metodei __init__. Metoda __init__ este executat imediat ce este instan iat un obiect al clasei. Metoda este util pentru a face ini ializarea dorit pentru obiectul respectiv. Observa i c numele este ncadrat cu dublu underscore. Exemplu:

#!/usr/bin/python # Fi ier: class_init.py

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

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

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


Rezultat:

$ python class_init.py Salut, numele meu este Swaroop


Cum func ioneaz : Definim metoda __init__ s ia un parametru nume (pe lng obi nuitul self). n acest caz cre m doar un cmp numit nume. Observa i c de i ambele sunt numite 'nume', cele dou sunt obiecte diferite. Nota ia cu punct ne permite s le deosebim. Cel mai important, observa i c nu apel m explicit metoda __init__ ci i transmitem argumentele n parantez dup numele clasei n momentul cre rii obiectului/instan a a clasei. Aceasta este semnifica ia acestei metode. Acum putem s folosim cmpul self.name n metodele noastre, ceea ce este ar tat n metoda

ziSalut.

Variabile de clas , variabile de instan


Am discutat deja partea de func ionalitate a claselor i obiectelor (adic metodele), acum s nv ceva despre partea de date. Partea de date, a a-numitele cmpuri, nu sunt altceva dect variabile obi nuite care sunt legate de spa iile de nume ale claselor i obiectelor. Asta nseamn c aceste nume m

sunt valabile numai n contextul claselor i obiectelor respective. Din acest motiv acestea sunt numite spa ii de nume (engl. name spaces). Exist dou feluri de cmpuri - variabile de clasa i variabile de obiect/instan , care sunt clasificate n func ie de proprietarul variabilei. Variabilele de clas sunt partajate - ele pot fi accesate de toate instan ele acelei clase. Exist doar un exemplar al variabilei de clas imediat de celelalte instan e. Variabilele de instan sunt proprietatea fiec rei instan e a clasei. n acest caz, fiecare obiect are propriul i cnd o instan i modific valoarea, aceast modificare este v zut

exemplar al acelui cmp adic ele nu sunt rela ionate n nici un fel cu cmpurile avnd acela i nume n alte ins ante. Un exemplu va ajuta la n elegerea situa iei:

#!/usr/bin/python # Fi ier: objvar.py

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

# O variabil popula ie = 0

de clas , num r torul popula iei de robo i

def __init__(self, nume): '''Ini ializeaz self.nume = nume print('(Ini ializez robotul {0})'.format(self.nume)) datele.'''

# Cnd aceast # adaug

instan

este creat , robotul se

la popula ie

Robot.popula ie += 1

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

Robot.popula ie -= 1

if Robot.popula ie == 0: print('{0} a fost ultimul.'.format(self.nume)) else:

print('Mai exist {0:d} robo i ap i de lucru.'.format(Robot.popula ie))

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

Da, pot s

fac

i asta.'''

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

def c i(): '''Tip re te popula ia curent .''' print('Avem {0:d} robo i.'.format(Robot.popula ie)) c i = staticmethod(c i)

droid1 = Robot('R2-D2') droid1.ziSalut() Robot.c i()

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

print("\nRobo ii pot s

fac

ni te treab

aici.\n")

print("Robo ii au terminat treaba. Deci s -i distrugem.") del droid1 del droid2

Robot.c i()
Rezultat:

(Ini ializez robotul R2-D2) Salut. St pnii mei mi zic R2-D2. Avem 1 robo i. (Ini ializez robotul C-3PO)

Salut. St pnii mei mi zic C-3PO. Avem 2 robo i.

Robo ii pot s

fac

ni te treab

aici.

Robo ii au terminat treaba. Deci s -i distrugem. R2-D2 este dezmembrat! Mai exist 1 robo i ap i de lucru.

C-3PO este dezmembrat! C-3PO a fost ultimul. Avem 0 robo i.


Cum func ioneaz : Este un exemplu lung, dar ajut la eviden ierea naturii variabilelor de clas i de instan . Aici cmpul

popula ie apar ine clasei Robot i este deci o variabil de clas . Variabila nume apar ine obiectului (i
este atribuit folosind self.) deci este o variabil de obiect/instan . Asadar ne referim la variabila de clas popula ie cu nota ia Robot.popula ie i nu cu

self.popula ie. Ne referim la variabila de instan


obiect. Aminti i-v aceast diferen

nume cu nota ia self.nume n metodele acelui


i de instan . Mai observa i i c o de metodele

simpl ntre variabilele de clas

variabil de obiect cu acela i nume ca o variabil de clas , va ascunde variabila de clas fa clasei!

Metoda c i este n fapt o metod a clasei i nu a instan ei. Asta nseamn c trebuie s o definim cu declara ia classmethod sau staticmethod Dac vrem s tim c rui spa iu de nume i apar ine.

ntruct nu vrem aceasta informa ie, o vom defini cu staticmethod. Am fi putut ob ine acela i lucru folosind decoratori:

@staticmethod def c i(): '''Tip re te popula ia curent .''' print('Avem {0:d} roboti.'.format(Robot.popula ie))
Decoratorii pot fi concepu i ca scurt turi pentru apelarea unor declara ii explicite, a a cum am v zut n acest exemplu. Observa i c metoda __init__ este folosit pentru a ini ializa cu un nume instan a clasei Robot. n aceast metod , m rim popula ie cu 1 intruct a fost creat nc un robot. Mai observa i i c valoarea

self.nume este specific fiec rui obiect, ceea ce indic natura de variabil de instan

a variabilei.

Re ine i c trebuie s v referi i la variabilele i metodele aceluia i obiect numai cu self. Acest mod de indicare se nume te referin la atribut.

n acest program mai vedem i docstrings pentru clase i metode. Putem accesa docstringul clasei n runtime (rom. timpul execu iei) folosind nota ia Robot.__doc__ i docstring-ul metodei ziSalut cu nota ia Robot.ziSalut.__doc__

Exact ca i metoda __init__, mai exist o metod special , __del__, care este apelat atunci cnd un obiect trebuie distrus, adic nu va mai fi folosit, iar resursele lui sunt returnate sistemului. n aceast metod reducem i num rul Robot.popula ie cu 1. Metoda __del__ este executat dac obiectul nu mai este n folosin i nu exist o garan ie c metoda

va mai fi rulat . Dac vre i s o vede i explicit n ac iune, va trebui s folosi i declara ia del cum am f cut noi aici. Not pentru programatorii n C++/Java/C# To i membrii unei clase (inclusiv membrii date) sunt publici i toate metodele sunt virtual n Python. O excep ie: Dac folosi i membrii date cu nume care ncep cu dublu underscore precum __var_privat , Python exploateaz acest aspect i chiar va face variabila s fie privat . A adar, conven ia este c orice variabil care vrem s fie folosit numai n contextul clasei sau obiectului, ar trebui s fie numit cu primul caracter underscore, iar toate celelalte nume sunt publice i pot fi folosite de alte clase/instan e. Re ine i c aceasta este doar o conven ie i nu este impus de Python (exceptnd prefixul dublu underscore).

Mo tenire
Un beneficiu major al program rii orientate pe obiecte este refolosirea codului i o cale de a ob ine asta este mecanismul de mo tenire. Mo tenirea poate fi descris cel mai bine ca i cum ar implementa o rela ie ntre un tip i un subtip ntre clase. S zicem c scrie i un program n care trebuie s ine i eviden a profesorilor i studen ilor

ntr-un colegiu. Ei au unele caracteristici comune, precum nume, adres , vrst . Ei au i caracteristici specifice, cum ar fi salariul, cursurile i perioadele de absen , pentru profesori, respectiv notele i taxele pentru studen i. Pute i crea dou clase independente pentru fiecare tip i procesa aceste clase prin ad ugarea de caracteristici noi. A a programul devine repede un h is necontrolabil. O cale mai bun ar fi s crea i o clas comun numit MembruAl colii i s face i clasele student i profesor s mo teneasc de la aceast clas , devenind astfel subclase ale acesteia, i apoi s ad uga i caracteristici la aceste subtipuri. Aceast abordare are multe avantaje. Dac facem vreo schimbare la func ionalitatea clasei

MembruAl colii, ea este automat reflectat

i n subtipuri. De exemplu, pute i ad uga un

nou cmp card ID i pentru studen i i pentru profesori prin simpla ad ugare a acestuia la clasa MembruAl colii. Totu i, schimb rile din subtipuri nu afecteaz alte subtipuri. Alt avantaj este c pute i face referire la un profesor sau student ca obiect MembruAl colii object, ceea ce poate fi util n anumite situa ii precum calculul num rului de membri ai colii. Acest comportament este numit polimorfism, n care un subtip poate fi folosit n orice situatie n care se a teapt folosirea unui tip p rinte adic obiectul poate fi tratat drept instan tipului p rinte. Observa i i c refolosim codul clasei p rinte i nu e nevoie s -l repet m n subclase cum am fi fost nevoi i dac am fi creat clase independente. Clasa MembruAl colii n aceast situa ie este numit clasa baz sau superclasa. Clasele a

profesor i student sunt numite clase derivate sau subclase.

Vom vedea acest exemplu pe un program.

#!/usr/bin/python # Fi ier: inherit.py

class MembruAl colii: '''Reprezint orice membru al colii.'''

def __init__(self, nume, vrst ): self.nume = nume self.varsta = vrst print('(Ini ializez MembruAl colii: {0})'.format(self.nume))

def descrie(self): '''Afi eaz end=" ") detaliile mele.'''

print('Nume:"{0}" Vrst :"{1}"'.format(self.nume, self.vrst ),

class profesor(MembruAl colii): '''Reprezint un profesor.'''

def __init__(self, nume, vrst , salariu): MembruAl colii.__init__(self, nume, vrst ) self.salariu = salariu print('(Ini ializez Profesor: {0})'.format(self.nume))

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

class student(MembruAl colii): '''Reprezint un student.'''

def __init__(self, nume, vrst , note): MembruAl colii.__init__(self, nume, vrst ) self.note = note print('(Ini ializez student: {0})'.format(self.nume))

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

p = profesor('D-na. Shrividya', 40, 30000) s = student('Swaroop', 25, 75)

print() # Afi eaz

o linie goal

membri = [p, s] for membru in membri: membru.descrie() # Func ioneaz student


Rezultat:

i pentru profesor

i pentru

$ python inherit.py (Ini ializez MembruAl colii: Mrs. Shrividya) (Ini ializez profesor: D-na. Shrividya) (Ini ializez MembruAl colii: Swaroop) (Ini ializez student: Swaroop)

Nume:"D-na. Shrividya" Vrst :"40" Salariu: "30000" Nume:"Swaroop" Vrst :"25" Note: "75"
Cum func ioneaz : Pentru a folosi mo tenirea, specific m clasele baz ntrun tuplu care urmeaz numele n defini ia clasei. Apoi observ m c metoda __init__ a clasei baz este apelat explicit folosind variabila self ca s putem ini ializa partea din obiect care provine din clasa baz . Este foarte important de re inut - Python nu apeleaza automat constructorul clasei baz , trebuie s face i asta explicit. Mai observ m c apelurile c tre clasa baz se fac prefixind numele clasei apelului metodelor i punnd variabila self mpreun cu celelalte argumente. Se confirm c folosim instan ele claselor profesor i student ca i cum ar fi instan e ale clasei MembruAl colii cnd folosim metoda descrie a clasei MembruAl colii. n plus, observa i c este apelat metoda descrie a subtipului nu metoda descrie a clasei

MembruAl colii. O cale de a ntelege asta este c Python ncepe ntotdeauna c utarea
metodelor n tipul curent, ceea ce face n acest caz. Dac nu ar fi g sit metoda, ar fi c utat n clasele p rinte, una cte una, n ordinea specificat n tuplul din defini ia clasei. O not asupra terminologiei - daca n tuplul de mo tenire este listat mai mult de o clas , acest caz este de mo tenire multipl .

Rezumat

Am explorat diverse aspecte ale claselor i obiectelor precum i diferite terminologii asociate cu acestea. Am v zut de asemenea beneficiile i punctele slabe ale program rii orientate pe obiecte. Python este puternic orientat pe obiecte i n elegerea acestor concepte v va ajuta enorm n cariera de programator. Mai departe vom nv a s trat m cu intr rile i ie irile i cum s accesam fi iere n Python.

Python ro:Intr ri/ie iri

Contents

1 Introducere 2 Intr ri de la utilizator 3 Fi iere 4 Conservarea 5 Rezumat

Introducere
Exist situa ii n care programul la care lucra i trebuie s interac ioneze cu utilizatorul. De exemplu, vre i s prelua i date de la utilizator i s tip ri i ni te rezultate. Putem folosi func iile input() i print(). Pentru ie ire, putem folosi i diverse metode ale clasei str (string). De exemplu, putem folosi metoda rjust pentru a alinia judicios la dreapta pe o anumit lungime. A se vedea help(str) pentru detalii suplimentare. Alt tip obi nuit de intrare/ie ire este lucrul cu fi iere. Capacitatea de a crea, citi i scrie fi iere este esen ial pentru programele pe care le vom scrie n acest capitol.

Intr ri de la utilizator
#!/usr/bin/python # FI ier: user_input.py

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

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

ceva = input('Introduce i textul: ') if (is_palindrome(ceva)): print("Da, este un palindrom") else:

print("Nu, nu este un palindrom")


Rezultat:

$ python user_input.py Introduce i textul: ir

Nu, nu este un palindrom

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

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


Cum func ioneaz : Folosim facilitatea de feliere pentru a inversa textul. Am nv at deja cum s facem felii din secven e ntre pozi iile a i

b folosind formula seq[a:b]. Putem da i un al treilea argument care determin pasul felierii. Pasul implicit este 1
motiv pentru care va rezulta o por iune continu din text. Cu un pas negativ, de exemplu -1 textul va fi inversat. Func ia input() ia ca argument un ir i l afi eaz utilizatorului. Apoi asteapt utilizatorul s introduc ceva i s apese tasta ENTER. n acel moment func ia input() va ntoarce n program textul introdus. Lu m acel text i l invers m. Dac originalul i textul inversat sunt identice, textul este un palindrom (defini ia pentru limba engleza). Tema pentru acas : Verificarea calit ii de palindrom ar trebui s ignore punctua ia, spa iile i cazul caracterelor. De exemplu "Ele fac cafele." este de asemenea palindrom, dar programul nostru spune c nu. Pute i mbun t i acest program ca s recunoasc acest palindrom?

Fi iere
Pute i deschide fi iere pentru scriere sau citire prin crearea unui obiect din clasa file (rom. fi ier) i folosind metodele sale read, readline sau write dup caz. Capacitatea de a citi sau scrie ntrun fi ier depinde de modul n care a i specificat fi ierul n declara ia de deschidere. n final, cnd a i terminat lucrul cu fi ierul, pute i apela metoda

close pentru a-i indica lui Python s -l nchid .


Exemplu:

#!/usr/bin/python # Fi ier: using_file.py from __future__ import print_function

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

f = open('poem.txt', 'w') # Deschidere pentru scriere # 'w' vine de la 'writing' (rom. scriere) f.write(poem) # scriem textul n fi ier f.close() # nchidem fi ierul f = open('poem.txt') # Dac 'read' (rom. citire) while True: linie = f.readline() if len(linie) == 0: # Lungime 0 indic break print(linie, end='') f.close() # nchidem fi ierul
Rezultat:

nu este specificat modul, se presupune citire, 'r' vine de la

EOF - sfr itul fi ierului (engl. End Of File)

$ python using_file.py Programming is fun When the work is done if you wanna make your work also fun: use Python!
Cum func ioneaz : nti deschidem un fi ier folosind func ia predefinit open i specificnd numele fi ierului i modul n care vrem s fie deschis fi ierul. Modul poate fi 'mod citire' ('r'), mod 'scriere' ('w') sau mod 'ad ugare la sfr it' ('a') (engl. append). Putem folosi i ('t') pentru fi iere text sau ('b') pentru fi iere binare. n realitate exist multe moduri posibile, pe care le pute i afla lansnd help(open). Implicit, open() consider fi ierul 't'ext i l deschide n mod 'r' (citire). n exemplul nostru deschidem fi ierul n mod scriere i folosim metoda write a obiectului fi ier pentru a scrie n fi ier i apoi l nchidem cu func ia close. n continuare deschidem acela i fi ier din nou, n mod citire. Nu avem nevoie s specific m modul deoarece este cel implicit. Citim fiecare linie folosind func ia readline ntro bucl . Aceast metoda ntoarce un rnd complet, inclusiv caracterul 'linie nou ' (engl. newline) de la sfr itul liniei. Dac este returnat un ir gol (engl. empty), nseamn c sa ajuns la sfr itul fi ierului i ie im din bucl cu declara ia 'break'.

Implicit, func ia print() tip reste textul i un caracter newline n mod automat pe ecran. Suprim m caracterul newline automat specificnd end='' deoarece linia citit are deja un caracter newline la sfr it. La final nchidem fi ierul cu close. Acum verifica i con inutul fi ierului poem.txt pentru a confirma c programul a scris ntradev r n fi ier i a citit din acesta.

Conservarea
Python ofer un modul standard numit pickle (rom. a conserva, a mura) cu ajutorul c ruia pute i depozita orice obiect Python ntrun fi ier pentru a-l reactiva mai trziu. Acest fapt se nume te stocare persistent . Exemplu:

#!/usr/bin/python # Fi ier: pickling.py

import pickle

# Numele fi ierului n care stoc m obiectul shoplistfile = 'shoplist.data' # lista de cump r turi shoplist = ['mere', 'mango', 'morcovi']

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

del shoplist # distrugem variabila shoplist

# Refacem din depozit f = open(shoplistfile, 'rb') storedlist = pickle.load(f) # nc rc m obiectul din fi ier print(storedlist)
Rezultat:

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


Cum func ioneaz :

Pentru a stoca un obiect ntrun fi ier, trebuie s deschidem fi ierul n mod scriere binar ('w' i 'b') cu func ia open i s apel m func ia dump a modulului pickle. Acest proces se nume te pickling (rom. conservare, figurativ:punere la murat). Apoi refacem obiectul folosind func ia load a modulului pickle, care ntoarce obiectul. Acest proces se nume te unpickling (rom. deconservare, figurativ: scoatere de la murat).

Rezumat
Am discutat variate tipuri de intr ri/ie iri i manipularea fi ierelor folosind modulul pickle. Acum vom studia conceptul de excep ie.

Python ro:Excep ii

Contents

1 Introducere 2 Erori 3 Excep ii 4 Tratarea excep iilor 5 Ridicarea excep iilor 6 try .. finally 7 Declara ia with 8 Rezumat

Introducere
Excep iile pot ap rea atunci cnd apar anumite situa ii excep ionale n program. De exemplu, dac trebuie s citi i un fi ier, dar acesta nu exist ? Sau dac l-a i ters accidental n timpul rul rii programului? Astfel de situa ii sunt tratate folosind excep ii. Similar, daca n program erau cteva declara ii invalide? Aceste situa ii sunt tratate de Python care ridic v spune ca exist o eroare. minile i

Erori
Iat un exemplu simplu de apel al func iei print. daca a i scris gre it Print n loc de print? Observa i majuscula. n acest caz, Python ridic o eroare de sintax .

>>> 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
Observa i c a fost ridicat o eroare NameError i a fost indicat pozi ia unde a fost detectat eroarea. Asta este ac iunea unei rutine pentru tratarea erorii (engl. error handler).

Excep ii
Vom ncerca (engl. try) s prelu m date de la utilizator. Da i ctrl-d i vede i ce se ntmpl .

>>> s = input('Introduce i ceva --> ') Introduce i ceva --> Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> s = input('Introduce i ceva --> ') EOFError: EOF when reading a line
Python ridic o eroare numit EOFError ceea ce nseamn n esen reprezinta prin ctrl-d) ntrun moment n care nu era posibil. c a g sit simbolul end of file (care se

Tratarea excep iilor


Putem trata excep iile folosind declara ia try..except. Pe scurt, punem declara iile uzuale n blocul try i toate tratamentele de erori n blocul except.

#!/usr/bin/python # Fi ier: try_except.py

try: text = input('Introduce i ceva --> ') except EOFError: print('De ce mi dai EOF?') except KeyboardInterrupt: print('A i anulat opera ia.') else: print('A i introdus {0}'.format(text))
Rezultat:

$ python try_except.py Introduce i ceva --> De ce mi dai EOF? # Da i ctrl-d

$ python try_except.py Introduce i ceva --> # Da i ctrl-c

A i anulat opera ia.

$ python try_except.py Introduce i ceva --> # f r A i introdus f r


Cum func ioneaz : Punem toate declara iile care ar putea ridica excep ii/erori n blocul try i apoi punem rutine de tratare pentru erorile/excep iile respective n blocul except. Clauza except poate trata o singur eroare sau excep ie specificat , sau o list n paranteze a excep iilor/erorilor. Dac nu sunt date nume de erori/excep ii, sunt tratate toate erorile i excep iile. Re ine i c trebuie s existe m car o clauz except asociat cu fiecare clauz try. n caz contrar ce nteles are un bloc try? Dac o eroare sau excep ie nu este tratat , este apelat rutina implicit de tratare a limbajului Python care pur i simplu opre te execu ia programului i tip reste pe ecran un mesaj de eroare. Am v zut deja asta. Mai poate exista i o clauz else asociat cu un bloc try..except. Clauza else este executat dac nu apare nici o excep ie/eroare. n urm torul exemplu vom vedea cum s ob inem obiectul excep ie, pentru a-i extrage informa ii suplimentare.

excep ii, acum

excep ii, acum

Ridicarea excep iilor


Puteti ridica excep ii folosind declara ia raise i furniznd numele erorii/excep iei i obiectul care urmeaz a fi aruncat (engl. thrown). Eroarea sau excep ia pe care o ridica i trebuie s fie o clas derivat direct sau indirect din clasa Exception.

#!/usr/bin/python # Fi ier: raising.py

class ShortInputException(Excep ie): '''O clasa de excep ii definit de utilizator.'''

def __init__(self, lungime, minim): Excep ie.__init__(self) self.lungime = lungime self.minim = minim

try: text = input('Introduce i ceva --> ') if len(text) < 3: raise ShortInputException(len(text), 3) # Alte prelucr ri pot continua aici ca nainte

except EOFError: print('De ce mi dai EOF?') except ShortInputException as ex: print('ShortInputException: A i introdus un text de lungime {0}, era necesar minim {1}'\ .format(ex.lungime, ex.minim)) else: print('Nu a fost ridicat
Rezultat:

nici o excep ie.')

$ python raising.py Introduce i ceva --> a ShortInputException: A i introdus un text de lungime 1, era necesar minim 3

$ python raising.py Introduce i ceva --> abc Nu a fost ridicat


Cum func ioneaz : Aici cre m un tip propriu de excep ie. Acest tip nou de excep ie este numit ShortInputException. Are dou cmpuri - lungime care este lungimea introducerii i minim care este lungimea minim acceptat de program. n clauza except men ion m clasa de erori care va fi stocat sub numele (engl. as) variabilei care va p stra obiectul excep ie. Asta este analog parametrilor i argumentelor n apelul func iei. Anume n aceast clauz except folosim cmpurile lungime i minim ale obiectului excep ie pentru a tip ri un mesaj adecvat c tre utilizator.

nici o excep ie.

try .. finally
S presupunem c vre i s citi i un fi ier ntrun program. Cum v asigura i c fi ierul a fost nchis corect indiferent dac a ap rut sau nu o eroare? Asta se poate face folosind blocul finally. Observa i c pute i folosi o clauz

except mpreun cu clauza finally pentru acela i bloc try. Va trebui s le imbrica i dac le vre i pe amndou . #!/usr/bin/python # Fi ier: finally.py

import time

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

break print(line, end='') time.sleep(2) # Ca s except KeyboardInterrupt: print('!! A i anulat citirea din fi ier.') finally: f.close() print('(Cur
Rezultat:

ne asigur m c

func ioneaz

un timp

enie: Am nchis fi ierul)')

$ python finally.py Programming is fun When the work is done if you wanna make your work also fun: !! A i anulat citirea din fi ier. (Cur enie: Am nchis fi ierul)

Cum func ioneaz : Facem treburile curente la citirea fi ierelor, dar avem o a teptare de dou secunde introdus arbitrar dup tip rirea fiecarei linii folosind func ia time.sleep ca s ruleze mai lent (Python este foarte rapid prin natura lui). Cnd programul nc ruleaz apasa i ctrl-c pentru a ntrerupe programul. Observa i c este aruncat excep ia KeyboardInterrupt i programul se ncheie. Totu i, nainte ca programul s se ncheie, clauza finally se execut i obiectul fi ier este ntotdeauna nchis.

Declara ia with
Achizi ia unei resurse n blocul try i eliberarea ei n blocul finally este o schem obi nuit . Din acest motiv exist i o declara ie with care permite ca aceast utilizare a resursei s se fac ntr-o manier mai clar :

#!/usr/bin/python # Fi ier: using_with.py

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


Cum func ioneaz : Rezultatul trebuie s fie la fel ca n exemplul precedent, diferen a este c acum folosim func ia open cu declara ia

with - l s m nchiderea fi ierului s fie f cut automat de declara ia with open ....
Ce se ntmpl n culise este un protocol utilizat de declara ia with. Ea extrage obiectul ntors de func ia open, s -i zicem "fi ierul" n acest caz.

Ea apeleaz ntotdeauna func ia fi ierul.__enter__ nainte de a ncepe blocul de declara ii pe care l include i func ia fi ierul.__exit__ dup ncheierea blocului de declara ii. Astfel codul care ar fi trebuit s fie scris n blocul finally este nlocuit automat de metoda __exit__. Astfel suntem ajuta i s evit m utilizarea explicit a declara iilor try..finally n mod repetat. Discu ia mai aprofundat a acestui subiect este dincolo de obiectivul acestei c rti, deci v rog s citi i PEP 343 pentru o explica ie complet .

Rezumat
Am discutat utilizarea declara iilor try..except i try..finally. Am v zut cum putem crea propriul tip de excep ie i cum s ridic m excep ii. Vom explora n continuare biblioteca Python standard.

Python ro:Biblioteca Python standard

Contents

1 Introducere 2 Modulul sys 3 Modulul logging 4 Modulele urllib i json 5 Seria Modulul s pt mnii 6 Rezumat

Introducere
Biblioteca Python standard con ine un num r uria de module utile i este parte a oric rei instal ri standard Python. Este important s v familiariza i cu biblioteca standard ntruct multe probleme pot fi rezolvate rapid dac cunoa te i plaja de lucruri pe care aceste module le pot face. Vom explora cteva module utilizate mai frecvent din aceast bibliotec . Detaliile complete (n limba englez ) despre biblioteca Python standard pot fi g site n capitolul 'Library Reference' din documenta ia care vine cu instalarea Python. S explor m cateva module utile. Not Dac aceste subiecte vi se par prea avansate pute i trece peste acest capitol. Totu i, v recomand c lduros s reveni i atunci cnd ve i fi mai familiariza i cu folosirea limbajului Python.

Modulul sys
Modulul sys con ine func ionalitate specific sistemului de operare. Am aflat deja c lista sys.argv con ine argumentele liniei de comand . S zicem c vre i s verifica i versiunea comenzii Python utilizate, s zicem pentru a v asigura c este cel pu in versiunea 3. Modulul sys d o astfel de func ionalitate.

>>> import sys >>> sys.version_info (3, 0, 0, 'beta', 2) >>> sys.version_info[0] >= 3 True
Cum func ioneaz : Modulul sys are un tuplu version_info care da informa ia despre versiune. Primul element d versiunea major . Noi o putem testa pentru a ne asigura c programul ruleaz sub versiunea minim 3.0:

#!/usr/bin/python # Fi ier: versioncheck.py import sys, warnings if sys.version_info[0] < 3: warnings.warn("E nevoie de Python 3.0 sau ulterior pentru a rula acest program", RuntimeWarning) else: print('Continu m normal')
Rezultat:

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

$ python3 versioncheck.py Continu m normal


Cum func ioneaz : Folosim alt modul din biblioteca standard, numit warnings (rom. avertiz ri) folosit pentru a afi a utilizatorului avertismente pe ecran. Dac versiunea Python nu este cel pu in 3, afi m un avertisment corespunz tor.

Modulul logging
Ce e de f cut dac vre i s stoca i undeva mesaje importante sau de depanare, astfel nct s le verifica i mai trziu ca s analiza i mersul programului? Cum stoca i undeva aceste mesaje? Acest obiectiv pate fi atins folosind modulul logging (rom. jurnalizare).

#!/usr/bin/python # Fi ier: use_logging.py import os, platform, logging

if platform.platform().startswith('Windows'):

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

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

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


Rezultat:

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


Dac verific m con inutul fi ierului test.log, vom g si cam a a:

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
Cum func ioneaz : Folosim trei module din biblioteza standard - modulul os pentru interac iunea cu sistemul de operare, modulul

platform pentru informa ii despre platform adic sistemul de operare i modulul logging pentru a jurnaliza
informa ii. La nceput verific m ce versiune de sistem de operare folosim prin analiza irului ntors de func ia

platform.platform() (pentru informa ii suplimentare a se vedea import platform; help(platform)).


Dac este Windows, determin m drive-ul pe care se afl directoarele utilizatorului, directorul n care se g sesc acestea i numele fi ierului n care vom stoca informa ia. Combinnd aceste trei p r i putem stabili calea ntreag a fi ierului. Pentru alte platforme ne trebuie doar directorul utilizatorului i avem calea complet a fi ierului. Folosim func ia os.path.join() pentru a reuni aceste trei p r i ale c ii. Motivul pentru care folosim o func ie special n loc de simpla concatenare este garan ia c rezultatul va fi conform a tept rilor sistemului de operare. Configur m modulul logging s scrie toate mesajele ntrun format anume, n fi ierul specificat.

n final, putem stoca mesaje pentru debugging, urm rire, avertizare sau chiar mesaje critice. Odat ce programul a fost lansat, putem vedea ce s-a ntmplat n program, chiar dac nu a fost afi at nimic pe ecran utilizatorului care a lansat programul.

Modulele urllib i json


Ct de distractiv ar fi dac a i putea scrie programe care s dea rezultatul unor c ut ri pe Internet? Ia s vedem. Putem face asta folosind cteva module. nti modulul urllib pe care l folosim ca s aduc o pagin de pe Internet. Vom folosi motorul de c utare Yahoo! pentru a ob ine rezultatele c ut rii i din fericire el ne va da rezultatele c ut rii n format JSON ceea ce e u or de procesat pentru noi datorit modulului json din biblioteca standard. TODO Acest program nu func ioneaz nc ceea ce pare a fi o eroare (engl. bug) n Python 3.0 beta 2.

#!/usr/bin/python # Fi ier: yahoo_search.py

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

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

# V

pute i lua APP ID la http://developer.yahoo.com/wsregapp/

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

class YahooSearchError(Excep ie): pass

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

result = json.load(urllib.request.urlopen(url)) if 'Error' in result: raise YahooSearchError(result['Error']) return result['ResultSet']

query = input('Ce dori i s

c uta i? ')

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


Rezultat: TODO Cum func ioneaz : Putem ob ine rezultatul c ut rii de la un anumit website dnd irul dup care c ut m, ntrun anumit format. Trebuie s specific m mai multe op iuni pe care le combin m folosind formatul

cheie1=valoare1&cheie2=valoare2 care este procesat de func ia urllib.parse.urlencode().


De exemplu, deschide i acest link n browserul web (Internet Explorer sau similar) i ve i vedea 20 de rezultate, ncepnd cu primul, dup cuvintele "byte of python", i cu rezultatul n format JSON. Facem o conexiune la acest URL folosind func ia urllib.request.urlopen() i transmitem acea referin func iei json.load() care va citi con inutul paginii i va converti fiecare rezultat ntrun obiect Python. Apoi cicl m prin aceste obiecte i le afi m utilizatorului.

Seria Modulul s pt mnii


Sunt multe de explorat n biblioteca standard cum ar fi depanarea, gestiunea op iunilor liniei de comand , expresiile regulare s.a.m.d. Cea mai bun cale de a continua explorarea bibliotecii standard este citirea excelentei serii Modulul Python al s pt mnii a lui Doug Hellmann.

Rezumat
Am explorat o parte din func ionalitatea multor module din biblioteca Python standard. Este recomandat s parcurge i documenta ia bibliotecii Python standard pentru a v face o idee asupra modulelor disponibile. n continuare vom acoperi diverse aspecte care pot face Python mai complet.

Python ro:Plus

Contents

1 Introducere 2 Transmiterea tuplurilor 3 Metode speciale

4 Blocuri cu o singur declara ie 5 Formule lambda 6 Includeri de liste 7 Primirea tuplurilor i listelor n func ii 8 Func iile exec i eval 9 Declara ia assert 10 Func ia repr 11 Rezumat

Introducere
Am acoperit pn acum majoritatea aspectelor din Python pe care le ve i utiliza. n acest capitol vom mai acoperi cteva aspecte care vor 'rotunji' cuno tin ele voastre despre Python.

Transmiterea tuplurilor
V-a i dorit vreodat s returna i mai multe r spunsuri dintro func ie? Pute i. Nu trebuie dect s folosi i un tuplu.

>>> def get_error_details(): ... ... >>> errnum, errstr = get_error_details() >>> errnum 2 >>> errstr 'detalii eroarea 2'
Observa i folosirea formulei a, b = <o expresie> care interpreteaz rezultatul unei expresii ca fiind un tuplu cu dou valori. Dac vre i s interpreta i rezultatul ca (a, <orice altceva>), trebuie s folosi i asteriscul, ca la parametrii func iilor:

return (2, 'detalii eroarea 2')

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


Asta nseamn c cea mai rapida cale de a interschimba dou variabile n Python este:

>>> a = 5; b = 8 >>> a, b = b, a >>> a, b

(8, 5)

Metode speciale
Exist anumite metode, precum __init__ i __del__ care au semnifica ie special n clase. Metodele speciale sunt folosite pentru a imita anumite comportamente ale tipurilor predefinite. De exemplu, dac vre i s folosi i opera ia de indexare x[cheie] pentru o clas (a a cum a i folosi-o pentru liste sau tupluri), atunci nu trebuie dect s implementa i metoda __getitem__() i treaba este f cut . Dac v gndi i, asta face Python pentru ns i clasa list!

Cteva metode speciale folositoare sunt listate n tabelul urm tor. Dac vre i s studia i toate metodele speciale consulta i manualul.

Metode Speciale
Nume __init__(self, ...) __del__(self) __str__(self) Explica ie Metoda este apelat imediat nainte de returnarea obiectului nou creat. Apelat chiar nainte de distrugerea obiectului Apelat premerg tor execut rii func iei print sau str(). Apelat cnd se folose te operatorul mai mic dect (<). Similar, exist metode speciale pentru to i operatorii(+, >, etc.)

__lt__(self, altceva)

__getitem__(self, cheie) __len__(self)

Apelat cnd se folose te opera ia de indexare x[cheie].

Apelat cnd se folose te func ia predefinit len() pentru un obiect secven .

Blocuri cu o singur declara ie


Am v zut c fiecare bloc de declara ii este separat de celelalte blocuri prin nivelul de indentare. Ei bine, acesta este un punct riscant. Dac blocul de declara ii con ine o singur declaratie, atunci o pute i specifica pe aceea i linie cu declara ia condi ional sau declara ia de ciclare. Exemplul urm tor va ajuta la clarificarea problemei:

>>> indicator = True >>> if indicator: print 'Da' ... Da

Observa i c declara ia unic este folosit pe loc nu ntrun bloc separat. Cu toate c pute i folosi asta pentru a ob ine programe mai mici, Eu v recomand cu t rie s nu folosi i aceast scurt tura, cu excep ia cazului cnd verifica i erorile, n special pentru c va fi mult mai u or s adaugi o declara ie n plus dac folose ti indentarea.

Formule lambda
O declara ie lambda se folose te pentru a crea obiecte-func ie n runtime.

#!/usr/bin/python # Fi ier: lambda.py

def repetor(n): return lambda s: s * n

dublu = repetor(2)

print(dublu('cuvnt')) print(dublu(5))
Rezultat:

$ python lambda.py cuvntcuvnt 10


Cum func ioneaz : Folosim o formul lambda numit repetor pentru a crea func ii obiect n runtime i a le returna n program. n esen , formula lambda prime te un parametru urmat de o expresie unic ce devine corpul func iei obiect i valoarea acestei func ii este returnat de noua func ie. Re ine i c ntro formul lambda nu poate fi utilizat nici m car o declara ie print, ci numai expresii. TODO Putem executa o func ie list.sort() furniz nd o func ie de comparare generat cu o declara ie lambda?

puncte = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ] # puncte.sort(lambda a, b : cmp(a['x'], b['x']))

Includeri de liste
Includerile de liste sunt folosite pentru a deriva o list nou dintro list existent . S zicem c avem o list de numere i vrem s ob inem o list a numerelor nmul ite cu 2 dar numai dac num rul este mai mare dect 2. Includerile de liste sunt ideale pentru a a ceva.

#!/usr/bin/python # Fi ier: 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]


Cum func ioneaz : n acest exemplu deriv m noua list specificnd procesarea necesar (2*i) cnd condi ia este satisf cut (if i

> 2). Observa i c originalul r mne neschimbat.


Avantajul folosirii includerilor de liste este c reduce volumul de declara ii necesare la ciclarea prin elementele listei i stocarea n alt list a rezultatelor.

Primirea tuplurilor i listelor n func ii


Exist o cale special de a primi parametri ntro func ie sub form de tuplu sau dic ionar folosind prefixul *, respectiv **. Aceasta este util atunci cnd se prime te un num r variabil de argumente n func ie.

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

>>> sumadeputeri(2, 10) 100


Deoarece avem prefixul * la variabila argumente, toate argumentele transmise func iei sunt stocate n

argumente ca tuplu. Dac am fi folosit prefixul **, parametrii suplimentari ar fi fost considera i perechi
cheie/valoare ntrun dic ionar.

Func iile exec i eval


Func ia exec se folose te pentru a executa declara ii Python stocate ntrun ir sau fi ier, nu n programul nsu i. De exemplu putem genera n runtime un ir con innd cod Python i s l execut m folosind declara ia exec:

>>> exec('print("Hello World")') Hello World


Similar, func ia eval este folosit ca s evalueze expresii Python valide stocate ntrun ir. Iat un exemplu simplu.

>>> eval('2*3') 6

Declara ia assert
Declara ia assert este folosit pentru a afirma ceva. De exemplu dac sunte i foarte siguri c ave i cel pu in un element n lista pe care o folosi i i vre i s verifica i asta prin ridicarea unei erori dac nu e a a declara ia

assert este ideal n aceasta situa ie. Dac declara ia assert d False, este ridicat o excep ie AssertionError. >>> list= ['item'] >>> assert len(lista) >= 1 >>> lista.pop() 'item' >>> lista [] >>> assert len(lista) >= 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
Declara ia assert trebuie folosit judicios. De cele mai multe ori este mai bine s prinzi excep ii fie c tratezi problema fie c afi ezi un mesaj de eroare i nchizi programul.

Func ia repr
Func ia repr se folose te pentru a ob ine o reprezentare canonic a obiectului sub form de ir. Partea interesant este c ve i avea eval(repr(obiect)) == obiect aproape tot timpul.

>>> i = [] >>> i.append('item') >>> repr(i) "['item']" >>> eval(repr(i)) ['item'] >>> eval(repr(i)) == i True
n esen , func ia repr se folose te pentru a ob ine o reprezentare tip ribil a obiectului. Pute i controla ce returneaz o clas pe care o scrie i la executarea func iei repr definind metoda __repr__ n acea clas .

Rezumat
Am mai acoperit cteva facilit i ale limbajului Python n acest capitol dar nc nu le-am acoperit pe toate. Totu i, la acest nivel am acoperit mare parte din ceea ce ve i folosi vreodat n practic . Asta este suficient pentru pornire n orice program dori i s crea i. Mai departe vom discuta cum s continu m explorarea limbajului Python.

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