Documente Academic
Documente Profesional
Documente Cultură
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.
Programs
Python
3.0
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
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.
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 .
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]
File
Save.
print('Hello World')
Rula i programul deschiznd un shell
[3]
Daca folosi i IDLE, deschide i meniul Run Rezultatul este afi at astfel:
'Hello World', ceea ce se poate numi string - fi i f r grij , vom explora mai trziu terminologia
aceasta n detaliu.
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.
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!
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
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]
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,
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
de caractere.
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]
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
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
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]
\n".
Concatenarea literalilor ir
Dac se al tura doi literali, ei sunt concatena i de Python automat. De exemplu 'What\'s ' 'your
r'\1'.
Metoda format
Uneori vrem s construim iruri din alte informa ii. Aici este folositoare metoda format().
vrst
= 25
nume = 'Swaroop'
print('De ce se joac
Rezultat:
{0} cu python-ul
la?'.format(nume))
Swaroop cu python-ul
la?
Observa i c puteam ob ine acela i lucru prin concatenare: nume + ' are ' +
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.
i = 5 print(i) i = i + 1 print(i)
s = '''Acesta este un
ir multi-linie.
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.
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.
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
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.
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:
3 + 5 fac 8
Minus
Inmul ire
**
Putere
d x la puterea y
mparte x la y
//
4 // 3 fac 1.
Modulo
d restul mp r irii
<<
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
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.
& | ^
I binar ntre numere SAU binar ntre numere SAU exclusiv binar ntre numere
<
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
>
<=
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.
>=
x = 4; y = 3; x >= 3 da True.
x = 2; y = 2; x == y d True.
== Egal (cu) Verific dac dou numere sunt egale
!=
Diferit (de)
x = 2; y = 3; x != y d True.
not
NU logic
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
or
SAU logic
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, ...}
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
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:
lungime = 5 l ime = 2
aria = lungime * l
ime
ime))
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.
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:
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
ntotdeauna, dup
declara ia if
$ 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
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:
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:
num r = 23
ciclu = True
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
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,
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:
Introduce i ceva: Cnd treaba e facut Lungimea irului introdus este 20 vrei s te i distrezi:
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.
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:
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:
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:
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:
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')
x = 5 y = 7
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:
x = 50
x = 50
def func():
global x
func_outer()
Rezultat:
say('Hello') say('World', 5)
Rezultat:
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 .
def func(a, b=5, c=10): print('a este', a, ' i b este', b, ' i c este', c)
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:
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
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
o eroare pentru c
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:
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:
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:
def printMax(x, y): '''Tip re te pe ecran cel mai mare din dou numere.
Cele dou
numere trebuie s
y = int(y)
print(printMax.__doc__) printMax(3, 5)
Rezultat:
$ python func_doc.py Tip re te pe ecran cel mai mare din dou numere.
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:
import sys
sunt:')
$ 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
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
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.
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.
if __name__ == '__main__': print('Acest program ruleaz else: print('Acest program a fost importat din alt modul')
Rezultat:
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.
__versiune__ = '0.1'
import meu
meu.zisalut()
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:
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'
>>> del a #
>>>
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'.
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:
print('Acestea sunt:', end=' ') for item in shoplist: print(item, end=' ')
print('\nTrebuie s
cump r
i orez.')
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:
zoo = ('piton', 'elefant', 'pinguin') # re ine i c print('Num rul animalelor n zoo este', len(zoo))
zoo_nou = ('maimu
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:
ab = {
'Swaroop' 'Larry'
: 'swaroop@swaroopch.com', : 'larry@wall.org',
del ab['Spammer']
print('\nExist
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
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
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:
# 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
$ 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
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')
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:
print('Atribuire simpl ') lista_ini ial = ['mere', 'mango', 'morcovi', 'banane'] # lista_mea este doar un alt nume al aceluia i
print('lista initial
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
$ 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']
ir
$ 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
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
Solu ia
ntruct designul programului nostru este relativ stabil, putem scrie codul care implementeaz solu ia noastr .
# 1. Fi ierele
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
zip.
i ora curent
n ', target)
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
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
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).
# 1. Fi ierele
# Observa i c au fost necesare ghilimele duble pentru a proteja spa iile din interiorul numelor.
# 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')
nu exista nainte
# 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)
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.
# 1. Fi ierele
source = ['"C:\\My Documents"', 'C:\\Code'] # Observa i c a fost nevoie de ghilimele duble pentru a proteja spa iile din interiorul numelor.
target_dir = 'E:\\Backup' # Nu uita i s # 3. Fi ierele sunt salvate ntro arhiv # 4. Data curent
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
nu exist
deja
# 5. Folosim comanda zip pentru a colecta fi ierele n arhiva zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))
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
# 1. Fi ierele de salvat sunt specificate ntro list . source = ['"C:\\My Documents"', 'C:\\Code']
# 4. Ziua curent
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
nu exista deja
zip
# 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
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?
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.
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.
p = Persoana()
print(p)
Rezultat:
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
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.
p = Persoana() p.ziSalut()
i ca Persoana().ziSalut()
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:
class Persoana: def __init__(self, nume): self.nume = nume def ziSalut(self): print('Salut, numele meu este ', self.nume)
p = Persoana('Swaroop') p.ziSalut()
ziSalut.
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:
# O variabil popula ie = 0
def __init__(self, nume): '''Ini ializeaz self.nume = nume print('(Ini ializez robotul {0})'.format(self.nume)) datele.'''
instan
la popula ie
Robot.popula ie += 1
Robot.popula ie -= 1
Da, pot s
fac
i asta.'''
def c i(): '''Tip re te popula ia curent .''' print('Avem {0:d} robo i.'.format(Robot.popula ie)) c i = staticmethod(c i)
print("\nRobo ii pot s
fac
ni te treab
aici.\n")
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)
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.
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
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
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
def __init__(self, nume, vrst ): self.nume = nume self.varsta = vrst print('(Ini ializez MembruAl colii: {0})'.format(self.nume))
def __init__(self, nume, vrst , salariu): MembruAl colii.__init__(self, nume, vrst ) self.salariu = salariu print('(Ini ializez Profesor: {0})'.format(self.nume))
def __init__(self, nume, vrst , note): MembruAl colii.__init__(self, nume, vrst ) self.note = note print('(Ini ializez student: {0})'.format(self.nume))
o linie goal
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.
Contents
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
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
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:
$ 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:
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()
# Refacem din depozit f = open(shoplistfile, 'rb') storedlist = pickle.load(f) # nc rc m obiectul din fi ier print(storedlist)
Rezultat:
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
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:
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:
$ python raising.py Introduce i ceva --> a ShortInputException: A i introdus un text de lungime 1, era necesar minim 3
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
$ 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 :
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.
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
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).
if platform.platform().startswith('Windows'):
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
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.
import sys if sys.version_info[0] != 3: sys.exit('Acest program necesit Python 3.0 sau ulterior')
# V
# 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)
c uta i? ')
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
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:
(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)
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.
dublu = repetor(2)
print(dublu('cuvnt')) print(dublu(5))
Rezultat:
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.
>>> 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
argumente ca tuplu. Dac am fi folosit prefixul **, parametrii suplimentari ar fi fost considera i perechi
cheie/valoare ntrun dic ionar.
>>> 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.