Documente Academic
Documente Profesional
Documente Cultură
Cuprins
..................................................................................................................................
1
Argument
De
ce
s
te
apuci
de
programare?
.........................................................
3
Cu
ce
limbaj
ar
trebui
s
ncep?
.............................................................................................
4
De
ce
Python?
...............................................................................................................................
6
Capitolul
I
Instalarea
Python
3.
Noiuni
fundamentale
........................................
8
Instalarea
Python3
....................................................................................................................
8
1.1.
Primul
program
................................................................................................................
10
1.2.
Noiuni
fundamentale
.....................................................................................................
11
1.3.
Variabile
..............................................................................................................................
14
1.4.
Calcule
..................................................................................................................................
18
1.5.
Formatarea
numerelor
(Important!!!!!)
..................................................................
21
Capitolul
II
FUNCII
.....................................................................................................
24
Indentarea
(Important!!!!!)
..................................................................................................
26
2.1.
Variabile
locale
.................................................................................................................
27
2.2.
Constante
i
variabile
globale
......................................................................................
30
Capitolul
III
STRUCTURI
DE
DECIZIE
.......................................................................
30
3.1.
Declaratia
if
........................................................................................................................
30
3.2
Declaraia
if-else
................................................................................................................
31
3.3
Operatori
logici
..................................................................................................................
33
3.4
Variabile
booleene
............................................................................................................
33
3.5.Structuri
de
repetiie
.......................................................................................................
34
3.6.Bucla
for
................................................................................................................................
35
Capitolul
IV
Funcii
care
returneaz
valori
...........................................................
41
4.1.Generarea
de
numere
aleatoare
..................................................................................
41
4.2.Biblioteci
de
funcii
standard
i
declaraia
import
...............................................
41
4.3.Generarea
numerelor
aleatoare
..................................................................................
42
4.4.Funciile
randrange,
random
i
uniform
...................................................................
44
4.5.Scrierea
propriei
funcii
care
returneaz
o
valoare
.............................................
44
4.6.Modulul
matematic
...........................................................................................................
47
4.7.Stocarea
funciilor
n
module
.......................................................................................
49
Capitolul
V
Fiiere
i
excepii
................................................................................
52
5.1.Tipuri
de
fiiere
.................................................................................................................
52
5.2.Metode
de
acces
a
fiierelor
..........................................................................................
53
5.3.Deschiderea
unui
fiier
n
Python
...............................................................................
53
5.4.Scrierea
datelor
ntr-un
fiier
.......................................................................................
54
5.5.Citirea
datelor
dintr-un
fiier
.......................................................................................
56
5.6.Adugarea
datelor
ntr-un
fiier
existent
.................................................................
58
5.7.Scrierea
i
citirea
datelor
numerice
...........................................................................
59
5.8.Excepii
.................................................................................................................................
60
Capitolul
VI
Liste,
tupluri,
dicionare
i
seturi.
Serializarea
obiectelor
(pickling)
...........................................................................................................................
62
6.1.
Liste
.......................................................................................................................................
62
6.2.
Tupluri
.................................................................................................................................
76
6.3.
Dicionare
...........................................................................................................................
78
6.4.
Seturi
....................................................................................................................................
85
6.5.
Serializarea
obiectelor
(pickling)
...............................................................................
87
Argument
De
ce
s
te
apuci
de
programare?
Pentru c:
1. i ine mintea treaz
2. e fun
3. e o activitate care i aduce prestigiu
4. poi catiga bani (muli!)
Pn la 45 de ani nu m interesa mai deloc IT-ul. Mi se prea un univers
inaccesibil. Foloseam calculatorul ca orice user de rnd: scriam texte pe care abia
dac reueam s le tehnoredactez, citeam sau trimiteam mail-uri i uneori lecturam
ziare sau publicaii online. Dup aceea s-a produs declicul. Pcat c am descoperit
acest minunat domeniu cam trziu, cnd creierul nu mai funcioneaz ca odinioar.
Toat viaa am crezut c programarea nseamn inainte de toate s fii tob de
matematic. E o exagerare. Dup ce am studiat limbaje de programare vreme de trei
ani, am ajuns la concluzia c nu trebuie s tii mai mult de operaiile matematice
fundamentale la care se adaug i cunoaterea ordinii lor. Astea se nva din cte mi
amintesc prin clasa a asea sau a aptea, atunci cnd deslueti tainele algebrei 1.
Cel mai important lucru n asimilarea unui limbaj de programare este n opinia mea
sintaxa, adic regulile dup care sunt puse semnele, numerele sau declaraiile dintr-un
program. Din necunoaterea lor n profunzime vin i cele mai multe erori n scrierea
unui program. Cnd am nceput s nv PHP uitam mai mereu s nchei linia de
program cu punct i virgul aa cum e regula. Asta genera permanent erori pe care
apoi, cu ct programul devine mai lbrat, le dibuieti greu, cam ca pe acul din carul
cu fn.
Ce i este necesar ca s scrii un program (pe lng ceva cunotine de mate i
stpnirea sintaxei)? Druire, atenie iscrierea de programe. Fiecare carte care
afirma ca te nva un limbaj de programare are n general la sfritul capitolelor o
seciune de exerciii i probleme. E partea cea mai important (i captivant)! Citii
bine teoria, scriei programele date n carte n propriul editor de text (nu descrcai
codul aferent crii de pe site-ul editurilor), analizai-le i apoi procedai la rezolvarea
exerciiilor. Numai aa nvei!
1
Asta desigur e valabil pentru un anumit nivel (mai lipsit de pretentii) in programare.
Atunci cnd cutai materiale tiprite sau online, tutoriale, cri, exemple etc pentru
nvat, evitai titluri de genul : nva Java n 24 de ore! Sunt minciuni ordinare!
Java, Python, C++ (chiar i Basic) nu se nva nici ntr-o luna, nici mcar ntr-un an,
daramite ntr-o zi! Opinia mea pe care o mprtesc cu sinceritate, e c un limbaj
de programare se asimileaza n ani de zile. i nici atunci, dup o perioad lung de
timp, nu cred c poi s pretinzi c eti masterDup unele voci autorizate3,
perioada optim de timp necesar deprinderii unui limbaj de programare este de zece
ani!
Alegei-v un limbaj de programare pe care-l putei iniia imediat i fr bti
de cap la compilare. Cel mai indicat e desigur Python. l descarci ntr-o clipa de pe
Internet, i configurezi variabilele de mediu (n Windows) i dai drumul la lucru. Alta
e treaba cu Java, C++ sau C. Ele necesit mai mult munc i pentru un nceptor
(care nu prea are pe cine s ntrebe n afar de Google) nu e chiar uor.
Marele noroc n desluirea unui limbaj de programare este c pe Internet se gsesc o
mulime de tutoriale i forumuri (locuri unde ntotdeauna afli rspunsuri la ntrebri
pentru c alii s-au lovit inaintea voastr de aceleai probleme.).
Uitasem un lucru esenial: limba englez. Din observaiile pe care le tot fac de
vreo civa ani, am observat c exist cteva naii care exceleaz n IT. Printre ele, la
loc de cinste, indienii, chinezii i nordicii. Am gsit i explicaii. La indieni e vorba
despre numrul uria al populaiei. V imaginai c din peste un milliard de oameni ai
de unde alege cteva sute sau mii de cpni luminate. Acetia au avut poate norocul
educaiei i pe cale de consecin, a ieirii din foame. ntr-o ar n care sperana de
via e de 40 de ani, a fi instruit e o ans uria! Programarea i-a scos pur i simplu
din srcie, i-a adus n America i i-a angajat la companii de vrf precum Windows,
Oracle, IBM, Apple. Cutai informaii despre diverse companii de top i nu se poate
s nu gsii n poziii de frunte indieni sau chinezi. Numrul foarte mare i srcia pe
msur este explicaia succesului (multora dintre ei) n IT.
Ceilali sunt nordicii. Cteva exemple edificatoare: cel care a proiectat Linuxul este finlandez cu rdcini suedeze; cel care a fcut iniial PHP-ul este danez, cel
care a fcut C++ este danez, cel care a proiectat Python-ul este olandez. i exemplele
pot continua. Ei, contrar indienilor ori chinezilor, provin din ri foarte dezvoltate
economic dar paradoxal, cu populaie deficitar. i atunci de unde formidabilul succes
3
http://norvig.com/romanian21-days.html
n IT? Am gsit i aici o explicaie: condiiile meteo. Cnd ai jumtate sau mai bine
din an temperaturi negative, cnd plou sau ninge nentrerupt zile intregi eti nevoit s
stai n cas, eventual n faa computerului. Cu el i omori timpul, cu el comunici cu
alii i tot el te poate aduce pe culmile gloriei.
i totui, cei care au inventat calculatorul, limbajele iniale de programare i
tot ce ine de IT au fost americanii, adic un popor care vorbete limba englez, limb
n care logic, au scris i limbajele de programare, apropiate ca vocabular limbii
engleze. De aici rezult importana fundamental a limbii engleze n nvarea
limbajelor de programare. Totusi, nu vreau sa va sperii. Nu trebuie sa stiti engleza la
nivel de excelenta insa un bagaj minim de cuvinte este strict necesar sa-l posedai.
Mai trebuie s tii fie doar pentru cultura general c la baza industriei IT de
astzi au stau odinioar proiecte militare americane (realizate in colaborare cu mediul
academic), care dateaz nc ht, din timpul Rzboiului Rece. Apoi a venit mediul de
afaceri ce a avut nevoie de aplicaii care s uureze munca, s mreasc
productivitatea i implicit profitul. Ca o concluzie, IT-ul are origini militare,
academice i financiare. Doar cei care puteau susine financiar cercetarea n domeniile
de vrf puteau obine rezultate, nu? Timpul a dovedit c au reuit dar mai ales,
aplicaiile bazate 100% pe limbaje de programare si care odat, de mult, erau
accesibile doar unei mini de oameni, au devenit astzi un lucru banal i ct se poate
de comun. Pentru asta trebuie doar s jonglai puin cu un telefon mobil inteligent care
este nesat cu ele.
De
ce
Python?
Pentru c n primul rnd este un limbaj curat ca sintax i foarte uor de
implementat pe orice calculator. Legenda spune c Guido van Rosssum creatorul
Python, a pus bazele limbajului ntr-un week-end de Crciun cnd se plictisea i nu
prea avea cu ce s-i omoare timpul. Cert este c olandezul, care a lucrat muli ani
dup aceea la Google, a reuit s ofere lumii un limbaj cu o sintax simpl i supl, cu
reguli clare i de netrecut i care se folosete astzi pe scar larg n mediul academic
(tocmai pentru nvarea limbajelor de programare), n afaceri dar i n proiectarea
unor aplicaii de mare succes. Youtube spre exemplu este scris n Python. i Google
folosete ca liant Python. Asemenea lui Yahoo!. Renumitul ziar Washington Post
folosete n varianta lui online limbajul Python. Cutai pe Internet i vei gsi alte
numeroase domenii n care Python are un cuvnt important de spus.
Un alt motiv pentru care este indicat s ncepei cu Python este dat de numrul de
entuziati aflat ntr-o cretere constant i care se ocup de Python. Internetul este plin
de informaii despre el, de tutoriale, de cri i forumuri. Este tiut c ntr-un fel,
Python nu poate s fac ceea ce face C++ spre exemplu. Totui, curba de nvare a
celor dou limbaje este radical diferit. Cred sincer c un programator Python valoros
se poate forma n circa doi ani. Nu acelai lucru se poate afirma despre C++
Altfel dect PHP un alt limbaj relativ uor de nvat, cu Python se pot realiza
proiecte web dar / sau mai ales, aplicaii desktop de sine stttoare.
Un alt motiv pentru care este bine s nvai Python e numrul relativ redus
(pe plan mondial, n Romnia ce s mai vorbim) de programatori n acest limbaj.
tiu, vei spune c site-urile de joburi sunt pline de oferte de munc pentru
programatori Java, C++, C# , PHP sau Objective C i mai puin Python. Aa este,
numai c numrul programatorilor Java sau PHP este covritor n vreme ce al celor
care se ocup de Python cu toata creterea lui - nu. De aici vine i confuzia care se
creeaz cu privire la gsirea unui job legat de Python. Dai un banal search pe Google
cu cuvintele cheie python jobs(s) i vei avea afiate istantaneu n faa ochilor un
noian de rezultate care mai de care mai interesante. Sunt oferte peste oferte, ce-i drept,
majoritatea de peste Ocean. Asta nu nseamn c nu avei anse. Nu trebuie neaprat
s lucrai full time la sediul din Chicago sau din Silicon Valey al unei firme, ci n
intimitatea propriului cmin. Restul l face Internetul, Skype, Messenger si/sau
PayPal. Internetul a anulat distanele, a fcut ca proiectele i ideile s circule
nestingherite cu viteze uluitoare iar banii s intre (sau s ias) din conturi la fel.
Ultimul motiv i poate cel mai important este prestigiul. Stpnirea Python
(sau a oricrui alt limbaj de programare) face diferena n ochii cunosctorilor, a
prietenilor sau rudelor dar mai ales n ochii votri. A ti s programezi i ine mintea
activ, te face s fii mandru de tine, s te simi tnr i cine tie, cu mult munc i
ceva ans, i poate aduce i venituri substaniale.
Succes!
n interpretorul Python
n modul script
S vedem mai nti, pentru a v convinge c Python este un limbaj grozav, care este
diferena ntre scrierea unui program n C++ i unul n Python. n C++:
// my first program in C++
#include <iostream>
using namespace std;
int main ()
{
cout << "Hello World!";
return 0;
}
i acuma n Python:
>>> print (Hello World!)
Deci ceea ce n C++ se afieaz cu ajutorul a apte linii, n Python se face cu una
singur!
10
Salvm programul sub numele popescu.py (eu l-am salvat pe desktop) i apoi l rulm
din linia de comand cu comanda python popescu.py:
11
12
Comentariile
Sunt folosite ntr-un program ca s ari ce ai vrut s faci acolo. Dac peste ctva timp
vei redeschide programul, comentariile i vor reaminti de ceea ce ai vrut s faci cu
linia de cod respectiv din program. Ele sunt ignorate de interpretorul Python dar nu
trebuiesc ignorate de tine!
n Python, comentariile ncep cu semnul diez #.
Ex:
13
1.3.
Variabile
O variabil este un nume (cuvnt) care reprezint o valoare stocat n memoria
calculatorului. Numele (variabila) se scrie ntotdeauna n partea stng:
age = 49
i nu
49 age
Semnul = nu nseamna egal ca n matematic ci reprezint atribuirea.
n exemplul de mai sus :
(lui) age = (i-am atribuit valoarea) 49
Cnd treci o variabil ca argument al funciei print nu mai ai nevoie de ghilimele.
Ex:
print( )
argument
funcia print
>>>latime = 10 (Enter)
>>>print(latime)
latime
>>> print(latime) (Enter)
10
>>>
Exemplu de program care demonstreaz o variabil:
(variabila.py)
#Acest program demonstreaza o variabila
camera = 123
print(Stau in camera numarul: )
print(camera)
14
Fig.1.3 Variabila ir
Ai sesizat diferena?
Exemplu de program cu dou variabile:
(variabila2.py)
#Creeaza doua variabile numite viteza si distanta
viteza = 160
distanta = 300
#Afiseaza valoarea referita de variabile
print (Viteza este: )
print (viteza)
print (Distanta parcursa este: )
print (distanta)
Este indicat ca numele variabilei s nceap cu liter mic. Variabilele sunt sensibile
la litere mici sau mari (case sensitive) aa c de exemplu python Python..
Numele variabilelor nu au voie s conin cuvintele cheie din Python (vezi Anexa 1).
Variabilele nu trebuie s conin spaii dar au voie s conin (i s nceap) cu
semnul underscore ( _ ). De asemenea, variabilele nu trebuie s nceap cu un numr
15
(enter)
>>> print(x)
(enter)
99
dar i :
>>> x = Sa mergem la masa (enter) #aici avem o variabile str (ir)
>>> print(x) [enter]
Sa mergem la masa
>>>
n Python exist trei tipuri de variabile:
16
int (ntregi)
str (iruri)
tastatur
datele ir
Spaiul dintre semnul ntrebrii din irul Care este numele tu? i ultima ghilimea
este necesar pentru ca dup rspuns, ntrebarea i rspunsul s nu fie lipite (de ex:
Care este numele tu?Vasile Popescu n loc de Care este numele tau? Vasile
Popescu).
Exemplu de program cu dou iruri la introducerea de la tastatur:
#Ia prenumele userului
first_name = input(Introdu prenumele: )
#Ia numele de familie
last_name = input(Introdu numele de familie: )
#Afiseaza numele userului
print (Salut, first_name, last_name)
17
18
bonus = 1200.0
#Calculeaza venitul total si
#atribuie valoarea variabilei plata
plata = salariu + bonus
#Afiseaza plata
print(Plata ta este: , plata)
Calcularea unui procent
Algoritmul este urmtorul:
-
afieaz preul
19
#(enter)
UnuDoiTrei
>>>
Caracterul escape
Caracterul escape este unul special care e precedat de un backslash \ ce apare
20
21
Invocm funcia format. Cnd invoci funcia format, i treci dou argumente:
-
o valoare numeric
un specificator de format
22
1.23e + 04
>>>
Inserarea separatorului virgul
>>> print(format(123456789.456, ,.2f))
123,456,789.46
separatorul virgul
>>>
Programul urmtor demonstreaz cum separatorul virgul i o precizie de dou
zecimale pot fi folosite la formatarea unui numr mare:
#Acest program demonstreaza formatarea
#numerelor mari
monthly_pay = 5000.0
annual_pay = monthly_pay * 12
print(Plata ta anuala este $,\
format(annual_pay, ,.2f), \
sep=)
Ieirea programului este:
Plata ta anuala este $60,000.00
S notm c n ultima linie a codului am trecut sep= ca argument al funciei print.
Acesta specific faptul c nu trebuie afiat niciun spaiu ntre itemii care urmeaz s
fie afiai. Dac nu facem acest lucru, va aprea un spaiu ntre $ i sum.
Specificarea unei limi minime de spaiu
Urmtorul exemplu afieaz un numr n cmpul care este de laime 12:
>>> print(Numarul este, format(12345.6789, 12,.2f))
Numarul este 12,345.68
>>>
23
foloseti d n loc de f
Ex:
>>> print(format(123456, d))
123456
Acuma, acelai exemplu dar cu separatorul virgul:
>>> print(format(123456, ,d))
123,456
Capitolul
II
FUNCII
O funcie reprezint un grup de declaraii care exist ntr-un program pentru a
realiza o anumit sarcin. Am vazut in primul capitol comportamentul functiei
prestabilite print.
Majoritatea programelor realizeaz sarcini care sunt ndeajuns de mari ca s poat fi
sparte n cteva subsarcini. Din acest motiv programatorii sparg programele n
buci mai mici cunoscute sub numele de funcii.
Astfel, n loc s scriem largi secvene de declaratii, scriem cteva funcii mai mici,
fiecare realiznd o parte specific din sarcin.
24
Aceste mici funcii pot fi executate n ordinea dorit pentru ca n final s realizeze
soluia la ntreaga problem.
Definirea i invocarea unei funcii
Codul unei funcii este (i) definiia unei funcii. Ca s execui o funcie scrii pur si
simplu declaraia care o invoc (numele funciei).
Numele funciilor
Numele unei funcii trebuie s fie apropiat de ceea ce ea face. n Python, cnd
denumim o funcie urmm aceleai reguli ca la botezarea variabilelor adic:
-
Pentru c funciile realizeaz aciuni, e indicat s folosim verbe atunci cnd le alegem
numele.
De exemplu, o funcie care calculeaz venitul (gross_pay) poate fi denumit
calculate_gross_pay.
Definirea i invocarea unei funcii
Formatul general este:
def nume_functie() :
declaratie
declaratie
Ex:
def mesaj ():
print(Sunt Gigel,)
print(cel fara de creier!)
Codul de mai sus definete o funcie numit mesaj. Functia mesaj conine un bloc cu
dou declaraii.
Invocarea unei funcii
Definiia unei funcii specific ce face funcia dar nu o execut. Ca s execui o
funcie trebuie s o invoci (s o chemi).
25
def mesaj():
print(Sunt Mircea,)
mesaj()
Indentarea
(Important!!!!!)
ntr-un bloc indentarea se face cu acelai numr de linii. De obicei se folosete
tab-ul sau patru spaii. Dac n acelai program folosim odat patru spaii ,
altdat tabul sau trei, cinci ori n spaii, programul va da eroare de
26
indentare:
27
28
main()
29
30
31
Compararea irurilor
Python permite s compari iruri. Acest lucru i d voie s creezi structuri de decizie
care testeaz valoarea unui ir.
Ex:
nume1 = Marcel
nume2 = Marius
if nume1 = nume2:
print(Numele sunt la fel)
else:
print(Numele sunt diferite)
Structuri de decizie imbricate i declaraia if-elif-else
Ca s testeze mai mult de o condiie, o structur de decizie poate fi imbricat nuntrul
altei structuri de decizie.
Ex (fragment de program):
if salariu > = MIN_SALARIU:
if ani_la_serviciu >= MIN_ANI:
print(Te califici pentru imprumut)
else:
print(Nu te califici)
else:
print(Trebuie sa ai minim..)
Forma general a declaraiei if-elif-else:
if conditie_1 :
32
declaratie
declaratie
etc
elif conditie_2:
declaratie
declaratie
etc
(Introduci oricate clause elif vrei)
else:
declaratie
declaratie
etc
3.3
Operatori
logici
Sunt: and, or, not.
Exemplu and:
if temperatura < 20 and minute > 12:
print(Temperatura e periculoasa)
Exemplu or:
if temperatura < 20 or temperatura > 100:
print(Temperatura este extrema)
Exemplu not:
if not(temperatura > 100):
print(Aceasta e aproape temperatura maxima)
33
if sales_quota >=5000.0:
sales_quota_met = True
else:
sales_quota_met = False
3.5.Structuri
de
repetiie
O structur de repetiie face ca o declaraie sau un set de declaraii s se repete.
Bucla while o bucl controlat
O condiie controlat face ca o declaraie sau un bloc de declaraii s se repete atta
timp ct o condiie e adevrat. Python folosete declaraia (bucla) while ca s scrie o
astfel de condiie.
Formatul general al buclei while este:
while conditie:
declaratie
declaratie
etc
Ex:
while valoare == y:
Exemplu:
34
3.6.Bucla
for
Bucla for itereaz de un numr specific de ori.
Format general:
for variable in [value1, value2, etc] :
declaratie
declaratie
etc
Ex:
#Acest program demonstreaza o bucla for
#care utilizeaza o lista de numere
def main():
print(Voi afisa numerele de la 1 la 5)
for num in [1, 2, 3, 4, 5]:
print(num)
#Cheama functia principala
main()
35
Ex:
#Acest program demonstreaza cum functia range
#poate fi folosita cu bucla for
def main():
#Afiseaza un mesaj de 5 ori
for x in range(5):
print(Salut, sa te fut!)
#Cheama functia principala
main()
36
S vedem ce se ntampl dac o lum de la sfrit spre nceput iar valoarea pasului
devine negativ:
Fig.3Inversarea secvenei
Acumulatori
Un total de funcionare (running total) este o sum de numere care acumuleaz
fiecare iterare (trecere, execuie) a unei bucle. Variabila folosit ca s nmagazineze
totalul se cheam acumulator.
Multe programe cer s calculezi totalul unei serii de numere. De exemplu, se
presupune c scrii un program care calculeaz totalul vnzrilor pentru o sptmn.
Programul citete vnzrile din fiecare zi i calculeaz totalul acelor numere.
Acest tip de programe folosete de obicei dou elemente:
1. o bucl care citete fiecare numr al seriei
2. o variabil care acumuleaz totalul numerelor citite
37
Def main():
#Initializeaza variabila acumulator
total = 0.0
38
39
Bucle imbricate
O bucl aflat nuntrul altei bucle se cheam imbricat.
Ceasul este cel mai bun exemplu de bucle imbricate. Secundele, minutele i orele se
rotesc pe un ecran de ceas. O or se rotete complet n 12 ore ale ecranului. Unui
minut i trebuiesc 60 de rotiri. Pentru a demonstra funcionarea ceasului folosim o
bucl for:
for seconds in range(60):
print (seconds)
sau
for minutes in range(60):
for seconds in range(60):
40
print(minutes, :, seconds)
Buclele complete ale ceasului arat aa:
for hours in range(24):
for minutes in range(60):
for seconds in range(60):
print(hours, :, minutes, :, seconds)
Bucla cea mai din interior itereaz de 60 de ori pentru fiecare iteraie a buclei din
mijloc. Bucla din mijloc itereaza de 60 de ori la fiecare iteraie a buclei din exterior.
Cnd bucla din exterior itereaz de 24 de ori, bucla din mijloc itereaz de 1440 de ori
iar cea din interior de 86.400 de ori.
41
aceasta:
import math
Aceast declaraie face ca interpretorul s ncarce coninutul modulului math n
memorie i s-l fac disponibil.
4.3.Generarea
numerelor
aleatoare
Python ofer cteva biblioteci de funcii care lucreaz cu numere aleatoare
(ntmpltoare). Acestea sunt stocate ntr-un modul numit random. Ca s generm
numere aleatoare vom importa modulul random prin declaraia:
import random
Prima funcie aleatoare generat se numeste randint.
Pentru c funcia randint se gsete n modulul random, avem nevoie s folosim
notaia cu punct ca s ne referim la ea. n notaia cu punct numele funciei este
modul
random.randint
funcie
n partea stng a punctului este numele modulului iar dup el numele funciei.
Deci:
Punctul leag modulul de funcie.
random este modulul.
randint este funcia.
Ex:
number = random.randint(1, 100)
Argumentul (1, 100) spune funciei randint s afieze un ntreg aleator situat ntre 1
i 100.
Exemplu de program:
#Acest program afiseaza un numar aleator
#situat in marja 1 pana la 100
import random
def main():
42
43
44
return rezultat
#Cheama main
45
main()
Modularea cu funcii
(exemplu de aplicaie)
Andrei are o afacere numit F-i propria muzic prin intermediul creia vinde
instrumente muzicale. Andrei i pltete angajaii cu comision. Comisionul este n
funcie de vnzri astfel:
-
Pentru c agenii de vnzri sunt pltii lunar, Andrei permite fiecruia dintre ei s ia
n avans cte 2000 de lei. Cnd comisionul este calculat, suma pe care fiecare angajat
a luat-o n avans este sczut din comision. Dac comisionul este mai mic dect suma
luat n avans, ei trebuie s-i ramburseze lui Andrei diferena. Ca s calculeze plata
lunar a fiecrui angajat, Andrei folosete urmtoarea formul:
plata = vanzari * comision avans
Andrei te roag s-i scrii o aplicaie care s fac toate calculele pentru el.
Algoritmul aplicaiei este urmtorul:
1. Ia vnzrile lunare ale fiecrui agent de vnzri
2. Ia suma de bani luat n avans de fiecare dintre ei
3. Folosete valoarea vnzrilor lunare ca s afli comisionul
4. Calculeaz plata fiecrui angajat folosind formula de mai sus. Dac valoarea e
negativ, angajatul trebuie s restituie banii.
Programul:
#Acest program calculeaza salariul
#unei persoane de vanzari
def main():
#Ia suma vanzarilor
vanzari = ia_vanzarile()
#Ia valoarea luata in avans
46
avans = ia_avansul()
#Determina comisionul
comision = determina_comision(vanzari)
#Calculeaza plata
plata = vanzari*comision avans
#Afiseaza valoarea platii
print (Plata este lei, format(plata, .2f))
#Afla daca plata e negativa
if plata < 0:
print(Plata trebuie rambursata)
else:
print(Plata nu trebuie rambursata)
#Cheama functia principala
main()
4.6.Modulul
matematic
Modulul math conine numeroase funcii care pot fi folosite n calcule matematice
Ex:
result = math.sqrt(16)
Funcia sqrt accept un argument 16 i returneaz rdcina ptrat a
argumentului (care e 4).
Mai nti trebuie s importam modulul math pentru a scrie un program care l
folosete.
Ex de program:
#Acest program demonstreaza functia sqrt
import math
def main():
#Ia un numar
numar = float(input(Introdu un numar: ))
47
48
Exist dou categorii de calcule necesare n program: una legat de cercuri i alta de
dreptunghiuri. Poi s scrii funciile legate de cerc ntr-un modul i pe cele de
dreptunghi n altul.
Modulul cerc (circle.py)
#Modulul cerc are functii care calculeaza
#suprafata si circumferinta cercului
import math
#Functia area accepta raza cercului ca
#argument si returneaza suprafata cercului
def area(radius):
return math.pi*radius**2
#Functia circumference accepta raza cercului
#ca parametru si returneaza circumferinta lui
def circumference(radius):
return 2*math.pi*radius
49
50
QUIT_CHOICE=5
#Functia principala
def main():
#Variabila choice controleaza bucla
#si ofera userului alegerea din meniu
choice = 0
while choice !4=QUIT_CHOICE:
#afiseaza meniul
display_menu()
#Preia alegerea utilizatorului
choice = int(input(Alege: ))
#Realizeaza alegerea selectata
if choice == AREA_CIRCLE_CHOICE:
radius=float(input(Introdu raza cercului: ))
print(Suprafata este, circle.area(radius))
elif choice == CIRCUMFERENCE_CHOICE:
radius = float(input(Introdu raza cercului: ))
print(Circumferinta este, \
circle.circumference(radius))
elif choice == AREA_RECTANGLE_CHOICE:
width = float(input(Introdu latimea dreptunghiului: ))
length = float(input(Introdu lungimea dreptunghiului:
))
print(Suprafata este, rectangle.area(width, length))
elif choice == PERIMETER_RECTANGLE_CHOICE:
width = float(input(Introdu latimea dreptunghiului: ))
length = float(input(Introdu lungimea dreptunghiului:
))
print(Perimetrul este, \
rectangle.perimeter(width, length))
elif choice == QUIT_CHOICE:
print(Iesirea din program)
else:
print(Eroare: selectare invalida.)
#Functia display_menu afiseaza meniul
def display_menu():
print(
MENU)
print(1) Suprafata unui cerc)
print(2) Circumferinta unui cerc)
print(3) Suprafata unui dreptunghi)
4
51
procesoare word
editoare de imagine
tabele de date
jocuri de calculator
Cnd o bucic de date este scris ntr-un fiier, ea e copiat dintr-o variabil din
RAM n fiierul de pe disc.
Procesul de retrimitere a datelor dintr-un fiier este cunoscut ca citirea din
fiiere. Procesul acesta este invers scrierii n fiiere: cnd o poriune de date este citit
din fiierul de pe HDD, este copiat n RAM i referit de o variabil.
Procesul implic trei pai:
1. Deschiderea fiierului creeaz o conexiune ntre fiier i program.
Deschiderea unui fiier din input permite programului s citeasc date din el.
2. Procesarea fiierului datele sunt scrise n fiier (fiier output) sau citite (fiier
input)
3. nchiderea fiierului cnd programul termin cu fiierul, el trebuie nchis.
4.
5.1.Tipuri
de
fiiere
Sunt dou tipuri de fiiere: text i binare.
Un fiier text conine date care au fost codificate n text folosind scheme ca ASCII sau
52
Unicode. Chiar dac fiierele conin numere, ele sunt stocate ca o serie de caractere.
Drept rezultat, fiierul poate fi deschis i vzut ntr-un editor de text precum Notepad.
Un fiier binar conine date care sunt convertite n text. Ca urmare, nu le poi citi cu
un editor de text.
5.2.Metode
de
acces
a
fiierelor
Majoritatea limbajelor de programare ofer dou ci de acces la datele stocate n
fiiere:
a) acces secvenial
b) acces direct
Cnd lucrezi cu accesul secvenial, accesezi date de la nceput spre sfrit. Deci dac
vrei s citeti date situate spre sfritul fiierului eti nevoit s parcurgi tot fiierul
nu poi sri la ceea ce te intereseaz. Este ca la casetofon: nu poi pune direct
cntecul dorit.
Cnd ns foloseti accesul direct (random access file), poi sri direct la orice date
din fiier. Este ca la CD sau ca la pick-up: poi pune direct orice cntec vrei.
Noi vom lucra cu accesul secvenial.
Numele fiierului i obiectele fiier (Filenames and File Objects)
Fiierele sunt identificate printr-un nume. Asta se ntmpl cnd le salvm. De
exemplu: cat.jpg ; nota.txt ; scrisoare.doc etc.
n msura n care un program lucreaz cu un fiier de pe computer, programul trebuie
s creeze un fiier obiect n memorie ca s-l poat accesa. Un fiier obiect (file
object) este un obiect asociat cu un fiier specific i ofer o cale programului de a
lucra cu acel fiier.
n program, o variabil refer obiectul fiier. Acea variabil se ngrijete de toate
operaiile fcute n fiier.
5.3.Deschiderea
unui
fiier
n
Python
Ca s deschidem un fiier folosim funcia open. Funcia open creeaz un fiier obiect
pe care l asociaz cu fiierul dorit de pe discul computerului:
Formatul general al funciei open este:
file_variable = open(filename, mode)
unde:
53
mode este un ir care specific modul (scris, citit, etc) n care fiierul va fi
deschis.
54
scris cu modul w. Iat cum vom scrie de exemplu irul Traian Basescu ntr-un
fiier:
customer_file.write(Traian Basescu)
Urmtorul fragment de cod arat un alt exemplu:
nume = Traian Basescu
customer_file.write(nume)
Odat ce am terminat cu un fiier, el trebuie nchis cu cuvntul close. Ex.:
customer_file.close()
Exemplu complet de program (scriere_fisier.py)
#Acest program scrie trei linii de date
#intr-un fisier
def main():
#Deschide un fisier numit tenori.txt
outfile = open(tenori.txt, w)
#in fisier
outfile.write(Luciano Pavarotti\n)
outfile.write(Placido Domingo\n)
outfile.write(Jose Carreras\n)
10
#Inchide fisierul
outfile.close()
12
Fig.5.1 tenori.txt
55
(Nota: Numerele din partea dreapt reprezint rndurile programului). Cum lucreaz
nsa acest program? Linia 5 deschide fiierul tenori.txt folosind modul w. Acesta face
ca fiierul s fie creat i bun pentru scris n el. De asemenea, aceeai declaraie
creeaz un obiect n memorie pe care il atribuie variabilei outfile. Declaraiile din
liniile 8, 9 i 10 scriu pur i simplu irurile din fisier. Linia 12 nchide fiierul. Dup
ce programul este rulat, numele celor trei personaje este scris n fiierul tenori.txt. S
mai observm c fiecare ir se termin cu \n adic urmtorul este aezat pe o linie
nou.
5.5.Citirea
datelor
dintr-un
fiier
Dac un fiier este deschis pentru citire (folosind modul r), putem folosi metoda
obiect read ca s-i citim ntregul coninut. Cnd este invocat metoda read, ea
returneaz coninutul fiierului ca pe un ir. S vedem n exemplul urmtor cum
folosim metoda read ca s citim coninutul textului tenori.txt pe care l-am creat
anterior:
(citire_fisier.py)
#Acest program citeste si afiseaza continutul
#fisierului tenori.txt
def main():
#deschidem fisierul numit tenori.txt
infile = open(tenori.txt, r)
#Inchidem continutul
infile.close()
#Afisam datele citite
print(file_content)
56
57
cnd datele sunt scrise n fiier, ele vor fi adugate la sfritul datelor existente.
58
myfile.write(Stanel\n)
myfile.close()
Dup aceasta vom avea numele anterior scrise (Costel, Mirel, Florel) la care se
adaug cele de mai sus. Fiierul va arta n final aa:
Costel
Mirel
Florel
Gigel
Fanel
Stanel
5.7.Scrierea
i
citirea
datelor
numerice
irurile pot fi scrise direct cu metoda write dar numerele trebuiesc convertite n iruri
nainte de a fi scrise.
Python are o funcie preconstruit numit str care convertete o valoare ntr-un ir.
S spunem de pild c variabilei num i este atribuit valoarea 99. Expresia str(num)
va returna irul 99.
Ex: scrie_numere2.py
#Programul demonstreaza cum numerele
#trebuiesc convertite in siruri inainte de a fi
#scrise in fisiere text
def main():
#Deschide un fisier pentru scris
outfile=open(numere.txt, w)
#Ia trei numere de la user
num1=int(input(Introdu un numar: ))
num2=int(input(Introdu alt numar: ))
num3=int(input(Mai baga unul: ))
#Scrie cele trei numere in fisier
59
outfile.write(str(num1) + \n)
outfile.write(str(num2) + \n)
outfile.write(str(num3) + \n)
#Inchide fisierul
outfile.close()
print(Date scrise in numere.txt)
#Cheama functia principala
main()
La ieire, programul va afia cele trei numere introduse de utilizator i mesajul Date
scrise in numere.txt.
Expresia str(num1) + \n convertete valoarea referit de variabila num1 ntr-un ir
i o concateneaz cu \n irului. Cnd userul introduce s zicem valoare 50, expresia
va produce irul 50\n. Drept rezultat, irul 50\n este scris n fiier.
5.8.Excepii
O excepie este o eroare care apare atunci cnd un program ruleaz i care are drept
consecin oprirea lui brutal. Pentru mnuirea excepiilor se folosete declaraia
try/except .
Programul de mai jos (imparte.py) ofer un exemplu.
#Programul imparte un numar la altul
def main():
#Ia doua numere
num1=int(input(ia un numar: ))
num2=int(input(ia al doilea numar: ))
#Imparte-le unul la celalalt si afiseaza rezultatul
result=num1 / num2
print(num1, impartit la, num2, este, result)
#Cheama main
main()
60
El mparte dou numere. Atunci cnd userul vrea s mpart un numr la zero, apare o
excepie sau o eroare numit traceback. Ea d informaii cu privire la numrul liniei
(liniilor) care cauzeaz excepia. Cnd se ntmpl s avem de a face cu o excepie,
spunem c programul a ridicat o excepie. Ele pot fi prevenite scriind codul cu
atenie.
S rescriem codul de mai sus (impartire2.py) astfel nct excepia s nu mai apar:
#Programul imparte un numar al altul
def main():
#Ia doua numere
num1=int(input(ia un numar: ))
num2=int(input(ia al doilea numar: ))
#Daca num2 nu este 0, imparte num1 la num2
#si afiseaza rezultatul
If num2 != 0:
result=num1 / num2
print(num1, impartit la, num2, este, result)
else:
print(Impartirea la zero este imposibila.)
#Cheama main
main()
61
Dup cum poate v-ai dat seama, excepiile trebuiesc pur i simplu ghicite atunci cnd
programatorul scrie programul. El trebuie s-i puna mereu ntrebarea Ce s-ar
ntmpla dac? (n cazul de mai sus, Ce s-ar ntampla dac userul introduce valoarea
celui de-al doilea numr ca fiind zero?).
6.1.
Liste
O list este un obiect care conine itemi multipli. Este similar matricei din
alte limbaje de programare. Listele sunt mutabile ceea ce nseamn c coninutul lor
poate fi schimbat pe timpul execuiei programului. Listele sunt structuri dinamice de
date adic itemii lor pot fi adugai sau teri. Pentru aceasta se poate folosi
indexarea, felierea (slicing) dar i alte metode de lucru cu liste.
Fiecare item dintr-o list se cheam element al listei.
Iat cum arat o declaraie de creare a unei liste de ntregi (ex):
numere_impare=[1, 3, 5, 7, 9]
Elementele listei sunt incluse ntre paranteze drepte i sunt desprite ntre ele prin
virgul.
S luam un exemplu de list cu iruri:
nume= [Mircea, Dana, Marcel, Stanel]
O list poate s conin tipuri diferite de valori:
lista = [Stanel, 51, 4.157]
62
iterabilul este trecut ca argument funciei list( ); funcia list( ) returneaz lista
[0, 1, 2, 3, 4].
Operatorul de repetiie
Operatorul de repetiie face copii multiple unei liste i le pune laolalt. Forma
general este:
lista * n
Un exemplu n care este multiplicat o list de ntregi dar i una cu valoare ir:
63
64
Dac folosim indeci negativi, vom identifica poziia elementelor relative la sfritul
listei. Aa se face c indexul -1 identific ultimul element al listei, -2 pe penultimul i
tot aa. Indexul 0 este acelai cu indexul -4. Ce se ntmpl ns dac vrem s aflm
elementul care numrat de la coada listei, are indexul -5 ?
Va aprea o eroare Traceback pentru c lista nu are cinci indecsi:
Funcia len
Cu ajutorul funciei len putem afla lungimea unei liste.
S lum urmtorul cod:
lista = [1, 2, 3, 4, 5]
lungime = len(lista)
Funcia len poate fi folosit ca s previn o excepie IndexError atunci cnd iterm
peste o list cu o bucl:
lista = [1, 2, 3, 4, 5]
index = 0
while index < len(lista):
print(lista[index])
65
index +=1
Listele sunt mutabile
Aa cum scriam la nceputul capitolului, listele n Python sunt mutabile ceea ce
nseamn c elementele ei pot fi schimbate.
S vedem un exemplu:
lista = [1, 2, 3,4, 5]
print(lista)
lista[0] = 50
print(lista)
Cum funcioneaz:
Pe rndul 1 crem lista lista iar apoi o afim pe rndul 2. Pe rndul 3, elementului
0 din list care este 1 i reatribuim valoarea 50. Cu linia 4 afim noua
componen modificat a listei:
Lista de mai sus are cinci elemente dar care au indecii de la 0 la 4. Cum nu exist
index-ul 7, ncercarea de modificare va eua aprnd o eroare Traceback.
S luam un exemplu cu bucla while:
66
67
S reinem c putem combina doar liste cu liste. Dac ncercm s combinm o list
cu o alt entitate va aprea o excepie.
Felierea (slicing) listelor
Uneori ai nevoie s selectezi mai multe elemente dintr-o secven dar nu pe toate.
Atunci foloseti felierea (slice). Ca s iei o poriune dintr-o list trebuie s scrii o
expresie de forma:
lista[start : end]
unde start este indexul primului element din poriune i end este indexul ultimului
element din poriune.
S presupunem c avem urmtoarea list:
68
Fig.6.13 Slicing
Dac lsm gol locul unuia dintre indeci, Python va folosi automat 0 ca index de
nceput.
sau invers:
Ce se ntmpl dac lai goale spaiile indecilor? Python va face o copie a ntregii
69
liste:
Expresiile partajate pot avea i un pas (step value) ca n exemplul de mai jos:
Pasul partajarii este 2 ceea ce face ca poriunea afiat s cuprind fiecare al doilea
numr din list.
Gsirea itemilor dintr-o list cu operatorul in
Forma general este:
item in lista
S lum un exemplu (in_lista.py)
#demonstrarea operatorului in
def main():
#creeaza o lista a numerelor produselor
prod_num = ['V476', 'F890', 'Q143', 'R688']
#Ia numarul unui produs pe care-l cauti
search = input('Introdu numarul produsului: ')
#afla daca numarul se gaseste in lista
if search in prod_num:
print(search, 'a fost gasit in lista.')
else:
print(search, 'nu a fost gasit in lista.')
#cheama functia principala
main()
70
71
Metoda index
Uneori dorim s tim unde se afl un item dintr-o list. Pentru aceasta folosim metoda
index. Trecem un argument metodei index i ea returneaz index-ul primului element
din list care conine acel item. Dac itemul nu este gsit, programul va ridica o
excepie ValueError.
Ex. index_list_py
#programul demonstreaza cum luam un index al unui item
#dintr-o lista si apoi il inlocuim cu un alt item
def main():
#cream o lista
food = ['Pizza', 'Hamburg', 'Cipsuri']
#afisam lista
print(food)
#luam itemul pe care il vrem inlocuit
item = input('Ce item vrei sa schimbi? ')
try:
#ia indexul itemului din lista
item_index = food.index(item)
#ia valoarea de inlocuire
new_item = input('Introdu noua valoare: ')
#inlocuieste vechiul item cu noul item
food[item_index] = new_item
#afiseaza lista
print('Aici este noua lista.')
print(food)
except ValueVallor:
print('Itemul nu a fost gasit in lista.')
#cheama main
72
main()
Metoda insert
Aceast metod permite s adaugi un item ntr-o list pe o poziie specific. Ca s faci
asta trebuie s treci dou argumente metodei insert: un index care specific locul unde
itemul ar trebui s fie inserat i itemul pe care doreti s-l inserezi.
Ex.(insert_list.py)
def main():
#creeaza o lista cu cativa itemi
nume = ['Mircea', 'Dana', 'Auras']
#afiseaza lista
print('Lista inainte de inserare: ')
print(nume)
#insereaza un nume nou ca element 0 al listei
nume.insert(0, 'Gigel')
#afiseaza din nou lista
print('Noua lista arata asa: ')
print(nume)
#cheama functia main
main()
Metoda sort
Metoda sort rearanjeaz elementele unei liste aa nct ele s apar n ordine
ascendent.
Ex:
lista = [1,2 ,8,9,4,6,0]
print('Ordinea originala este:', lista)
lista.sort()
print('Lista sortata:', lista )
Metoda remove
Ex in IDLE:
73
Metoda reverse
Dup cum i spune numele, metoda reverse inverseaz ordinea itemilor din list.
Ex:
lista = [1,2,3,4,5]
lista.reverse()
print(lista)
Declaratia del
Cu aceast declaraie tergem un element din list:
74
75
Prima declaraie creeaz un tuplu numit tuplu care conine elementele 1,2,3,4,5. A
doua declaraie afieaz elementele tuplului.
S vedem acuma cum o bucla for itereaz peste elementele unui tuplu:
76
De fapt, tuplurile suport aceleai operaii ca listele cu excepia celor care schimb
coninutul. Tuplurile suport urmtoarele operaii:
-
Subscrierea indecsilor
Metode ca index
Operatorul in
Operatorii + si *
Motivul pentru care tuplurile exist este acela c tuplurile sunt mai rapide ca listele.
Aceasta nseamn c tuplurile sunt o bun alegere atunci cnd se proceseaz date
foarte multe care nu urmeaz a fi modificate. Un alt motiv este acela c tuplurile sunt
sigure. Pentru c nu li se pot modifica elementele, nimeni nu poate s le manipuleze
accidental.
Exist dou functii care pot converti tuplurile n liste i invers. Acestea sunt: list( ) i
tuple( ) :
77
6.3.
Dicionare
Un dicionar e un obiect care stocheaz o colecie de date. Fiecare element
dintr-un dicionar are dou pri: o cheie i o valoare. Folosim cheia ca s localizm
valoarea.
ntr-un dicionar clasic ca de exemplu DEX, cheia este cuvntul pe care-l
cutm n dicionar ca s aflm ce semnificaie are. Spre exemplu, s lum cuvntul
enoria . Conform DEX el nseamn (are valoarea) persoan credincioas care
ine de o parohie.
Deci cheia este enoria iar valoarea este persoan credincioas care ine de o
parohie.
sau:
enoria = persoan credincioas care ine de o parohie
Un alt exemplu este cartea de telefon n care cheia este numele persoanei pe al crui
numr de telefon dorim s-l aflam iar numrul de telefon este valoarea.
Perechea cheie-valoare mai este referit i de expresia cartografiere.
S crem un dicionar:
carte_telefon = {Mircea : 072256666, Gigel : 0766666111, Minel :
0744234567}
Observm c la crearea dicionarului carte_telefon folosim o pereche de acolade n
interiorul crora introducem cheia care este numele persoanei i numrul de
telefon care este valoarea. Elementele dicionarului sunt fiecare cuprinse ntre
ghilimele iar perechile sunt desprite de virgule. Mai observm c fiecare pereche i
refer elementele prin semnul dou puncte (:).
Primul element al dicionarului este Mircea : 072256666;
Al doilea element este: Gigel : 0766666111;
Al treilea element este: Minel : 0744234567.
78
n acest exemplu cheile i valorile sunt iruri. Totui, elementele unui dicionar pot fi
de orice tip numai c spre deosebire de liste, cheile sunt imutabile. Cheile pot fi
iruri, ntregi, n virgul mobila sau tupluri. Cheile nu pot fi nsa liste (am nvat deja
c listele au elemente mutabile).
Extragerea unei valori din dicionar
Trebuie s reinem amnuntul c elementele dintr-un dicionar nu sunt stocate
ntr-o ordine anume. Aceasta nseamn c dicionarele nu sunt secvene ordonate de
date precum listele, tuplurile sau irurile. Prin urmare nu putem folosi indexuri
numerice ca s extragem valori. n loc de asta putem folosi cheile valorilor, nu ns
nainte de a pune naintea lor numele dicionarului (n cazul de fa carte_telefon):
79
S reinem c irurile care se compar cu ajutorul lui in i not in sunt case sensitive.
Adugarea unor elemente dicionarului
Dicionarele sunt obiecte mutabile. Putem s le adugam noi perechi de elemente cu o
declaraie de urmtoarea form:
nume_dictionar[cheie] = valoare
80
Dac privim atent exemplul de mai sus observm c atunci cnd cheia pe care dorim
s-o excludem nu exist n dicionar apare o eroare numit KeyError. In cazul de mai
sus e vorba de cheia Cornelia care nu exist n dicionar.
Aflarea numerelor de elemente dintr-un dicionar
Pentru aceasta folosim funcia len:
sau:
Dicionar gol
Un dicionar gol se creeaz printr-o simpl declaraie de forma general:
>>>dictionar = { }
sau n cazul nostru
>>>carte_telefon = { }
Dup aceea putem s-i adugm elemente:
81
>>>carte_telefon[Ion] = 0245345789
>>>carte_telefon[Costel] = 0743123098
>>>carte_telefon[Florina] = 0250445566
Pentru crearea unui dicionar gol se mai poate folosi i funcia preconstruit dict( ).
Ex:
carte_telefon = dict( )
Folosirea buclei for pentru iterarea peste elementele unui dicionar
82
dictionary.clear( )
Ex:
Metoda get
Forma general este:
dictionar.get(cheie, default)
n care dictionar e numele dicionarului, cheie este cheia pe care o cutm n dicionar
iar default este valoarea default pe care o returneaz declaraia n cazul n care cheia
nu e gsit (n cazul de mai jos Valoarea n-a fost gasita).
Ex.:
Metoda items
Aceast metod returneaz toate cheile dicionarului i valorile asociate lor. Ea
returneaz valorile ntr-un tip special de secven numit vedere. Fiecare element din
dicionar este un tuplu i fiecare tuplu conine o cheie cu valoarea ei asociat.
Ex:
Metoda keys
Aceast metod retuneaz toate cheile dicionarului.
Ex:
83
Metoda pop
Metoda pop returneaz valorile asociate cu o cheie specific i terge acele valori. n
cazul n care nu gsete perechea solicitat cheie/valoare, afieaz valoarea default.
Ex.:
Metoda popitem
Metoda popitem returneaz o pereche ntmpltoare de chei/valori i terge acea
pereche din dicionar.
Ex.:
Metoda values
Aceast metod returneaz toate valorile dicionarului (fr cheiele lor) ca pe un
dicionar.
Ex.:
84
6.4.
Seturi
Un set este un obiect care stocheaz o colecie de date. Un set are cteva
caracteristici:
-
Toate elementele setului sunt unice, adic doua elemente nu pot avea aceeai
valoare
Seturile sunt structuri neordonate, ceea ce nseamn c elementele lui pot sta n
orice ordine
Dac scriem ns
setul_meu = set(a, b, c)
vom avea o eroare:
Aflarea numrului elementelor unui set se face prin intermediul funciei len:
setul_meu = set([1,2,3,4,5])
len(setul_meu)
85
Pentru tergerea elementelor unui set se pot folosi metodele remove sau discard.
Itemul pe care-l vrem ters din set l trecem drept argument al uneia dintre aceste
metode. Spre exemplu, mai jos renunm la elementul 2 al setului
Sau discard:
86
Uniunea doua seturi contine elementele celor doua seturi si se realizeaza cu metoda
union:
nchidem fisierul
87
fiier este o variabil care face referin la obiectul fiier. Dup ce funcia este
executat obiectul referit de obiectul fiier este serializat i scris n fiier. Trebuie spus
c se poate folosi modulul pickle pentru orice fel de obiecte: liste, tupluri, dicionare,
seturi, iruri, ntregi i numere n virgul mobil.
ntr-un fiier putem salva oricte obiecte serializate dorim. Cnd am terminat invocm
metoda close pentru nchiderea fiierului.
S lum exemplul urmtor dintr-o sesiune interactiv:
Invocm funcia load din modulul pickle ca s recuperm un obiect din fiier
88
Rezultatul l atribuim variabilei ct (de la carte de telefon, voi putei s-i spunei cum
vrei).
Apoi afim cu comanda ct coninutul crii de telefon. Ultima linie de cod nchide
fiierul carte_telefon.dat.
89
Procedurile prin care un obiect performeaz sunt cunoscute ca metode. Metoda unui
obiect este funcia care realizeaz operaii prin intermediul datelor obiectului.
Conceptual, obiectul este o unitate autoconinut care const n atributele datelor i
metodele ce le opereaz. OOP realizeaz separarea codului i datelor cu ajutorul
encapsulrii i ascunderii datelor.
ncapsularea se refer la combinarea datelor i codului ntr-un singur obiect.
Ascunderea datelor se refer la abilitatea unui obiect de a ascunde atributele datelor
de codul aflat n afara obiectului. Doar metodele obiectului pot accesa direct i pot
face schimbri asupra atributelor datelor obiectului.
De obicei, un obiect ascunde datele dar permite codului exterior s-i acceseze
metodele. Cum vom vedea mai trziu, metodele obiectului ofer declaraii din afara
obiectului cu acces indirect asupra atributelor datelor.
OBIECT
Date
--//-
--//--
--//--
--//--
--//--
METODE
Cod din
afara
obiectului
Cnd atributele datelor obiectului sunt ascunse codului extern i accesul atributelor
datelor este restricionat de metodele obiectului, atributele sunt protejate de ntreruperi
sau defeciuni accidentale. n plus, codul din afara obiectului nu trebuie s tie nimic
despre structura i formatul intern al datelor obiectului. Codul are nevoie s
interacioneze doar cu metodele obiectului. Acesta este motivul pentru care datele din
obiect rmn neschimbate.
Un exemplu din viaa de zi cu zi de obiect este ceasul cu alarm pe care ns s ni-l
imaginm ca pe un obiect software. El are urmtoarele atribute:
minut_curent ( -- // --)
Dup cum se poate vedea, atributele datelor sunt valori care definesc starea atunci
cnd alarma ceasului e fixat. Tu, utilizatorul obiectului ceas cu alarm nu poi
manipula direct aceste date pentru c ele sunt private. Ca s schimbi valoarea datelor
atribut trebuie s foloseti una din metodele obiectului.
Iat mai jos cteva din metodele obiectului ceas cu alarm:
-
setare_timp
setare_timp_alarma
setare_alarma_on
setare_alarma_off
Fiecare metod manipulez unul sau mai multe atribute ale datelor. De exemplu,
setare_timp i permite s fixezi timpul alarmei ceasului. Activezi metoda prin
apsarea butonului din capul ceasului. Folosind alt buton (cheia) poi activa metoda
setare_timp_alarma. n plus, un alt buton i permite s execui metodele
setare_alarma_on i setare_alarma_off.
Trebuie s ii minte c aceste metode sunt activate de tine din afara ceasului cu
alarm. Metodele care pot fi accesate de entiti din afara obiectului sunt cunoscute ca
metode publice.
Ceasul cu alarm are de asemenea metode private care sunt pri private ale
obiectului i care funcioneaz intern. Entitile exterioare (ca tine, de exemplu), nu au
acces direct la metodele interne ale ceasului cu alarm. Obiectul este proiectat s
execute aceste metode automat i s ascund detaliile de tine.
Metodele private ale obiectului ceas cu alarm sunt:
-
incrementare_secunda_curenta
incrementare_minut_curent
incrementare_ora_curenta
sunet_alarma
91
92
Obiectul
musc
Obiectul
nar
93
94
7.3.Adugarea
atributelor
n exemplul nostru avem deci o clas de baz dar total inutil. Ea nu conine nicio
dat i mai ales, nu face nimic. Ce se ntmpl daca dm un atribut unui obiect dat?
Putem s setm un atribut arbitrar unui obiect instaniat folosind notaia cu punct (dot
notation):
class Point:
pass
p1 = Point()
p2 = Point()
p1.x = 5
p1.y = 4
p2.x = 3
p2.y = 6
print(p1.x, p1.y)
print(p2.x, p2.y)
Dac rulm acest cod, cele dou declaraii de afiare de la sfrit, ne dau noile valori
ale atributelor celor doua obiecte:
54
36
Ce face totui acest cod? El creeaz o clas goal numit Point care nu are date i nici
comportamente. Apoi, el creeaz dou instane ale clasei i atribuie fiecreia
coordonatele x i y care identific un punct bidimensional. Tot ceea ce avem de
fcut este s atribuim o valoare atributului obiectului folosind sintaxa general:
<obiect>.<atribut> = <valoare>
Aceasta este uneori denumit notaia cu punct (dot notation). Valoarea poate fi orice:
o primitiv Python, a data preconstruit etc. Poate fi chiar o funcie sau un alt obiect!
95
96
7.5.Argumentul
self
Singura diferen dintre metode i funciile normale este aceea c fiecare metod
necesit un argument. Acest argument este convenional numit self.
Argumentul self dintr-o metod este o simpla referin la un obiect a crui metoda a
fost invocat. Putem accesa atribute i metode ale acelui obiect. Aceasta este exact
ceea ce facem nuntrul metodei reset atunci cnd setm atributele x i y obiectului
self.
S notm c atunci cnd invocm metoda p.reset(), nu trebuie s trecem argumentul
self n ea. Python are automat grij s fac acest lucru pentru noi. El tie cnd
invocm o metod a obiectului p, deci el trece automat acel obiect metodei.
Oricum, o metod chiar este cu adevrat doar o funcie care se ntmpl s fie ntr-o
clas.
n loc s invocm metoda pe un obiect, putem invoca funcia clasei, trecnd explicit
obiectul ca argumentul self:
p = Point()
Point.reset(p)
print(p.x, p.y)
Ieirea este aceeai ca la exemplul anterior, pentru c se petrece acelai proces.
Sa adaugam o noua metoda care permite sa muti un punct intr-o pozitie arbitrara , nu
doar la origine. Putem sa includem un alt obiect Point ca input si apoi sa returnam
distanta dintre ele:
import math
class Point:
def move(self, x, y):
self.x=x
self.y=y
def reset(self):
self.move(0, 0)
def calculeaza_distanta(self, other_point):
return math.sqrt(
97
(self.x alt_punct.x)**2 +
(self.y alt_punct.y)**2)
#cum folosim programul:
point1 = Point()
point2 = Point()
point1.reset()
point2.move(5, 0)
print(point2.calculeaza_distanta(point1))
assert (point2.calculeaza_distanta(point1) ==
point1.calculeaza_distanta(point2))
point1.move(3, 4)
print(point1.calculeaza_distanta(point2))
print(point1.calculeaza_distanta(point1))
7.6.
Definirea
unei
clase
o
alt
abordare
Ca s creezi o clas trebuie s scrii definiia ei. Definiia clasei este un set de
declaraii care definete metodele i atributele datelor obiectului.
S luam un exemplu simplu. S presupunem c scriem un program care simuleaz
ntoarcerea unei monede. Avem nevoie s repetm ntoarcerea monedei ca s
determinm de fiecare dat dac e cap sau pajur.
Folosind OOP vom scrie o clas numita Coin (moned) care descrie comportamentul
unei monede.
Iat mai jos programul (incomplet) moneda.py:
import random
98
def __init__(self):
self.sideup = Heads
12
def toss(self):
13
if random.randint(0, 1) = = 0:
self.sideup = Heads
else:
14
15
16
self.sideup = Tails
17
19
def get_sideup(self):
20
return self.sideup
Ce se ntmpl? n linia 1 importm modulul random, cci nu-i aa, dm cu banul,
adic urmeaz o valoarea ntmpltoare. El este necesar pentru c folosim funcia
randint inclus n modulul random ca s generm un numr aleator.
Linia 4 reprezint nceputul definiiei clasei. Ea ncepe cu cuvntul cheie class urmat
de numele clasei (care este Coin), urmat la rndul lui de dou puncte. Aceleai reguli
care se aplic la numele unei variabile, sunt valabile i aici. S notm totui c numele
clasei ncepe cu majuscul: Coin. Nu este obligatoriu dar este o convenie general
utilizat de programatori. Ea ajut s facem distincia ntre numele claselor i numele
variabilelor atunci cnd citim codul.
Clasa Coin conine trei metode:
1. metoda __init__ care apare n liniile 6 i 7
2. metoda toss care ocup liniile 12-16
99
Linia 12
Linia 20
def get_sideup(self):
Parametrul self este obligatoriu n fiecare metod a unei clase. Cnd o metod este
executat ea trebuie s aib o cale ca s tie asupra crui atribut al datelor obiectului
trebuie s opereze. Aici este momentul n care parametrul self intr n rol. Cnd o
metod este invocat, Python face ca parametrul self s refere un obiect specific
asupra cruia se presupune c metoda opereaz.
S privim mai atent fiecare dintre metode. Prima metod numit __init__ este
definit n liniile 6 i 7:
def __init__ (self):
self.sideup = Heads
Majoritatea claselor n Python au o metod special numit __init__ care este
executat automat atunci cnd o instan a clasei este creat n memorie. Metoda
__init__ este mai cunoscut sub numele de metoda de inializare pentru c
iniializeaz atributele datelor obiectului. Numele metodei ncepe cu dou liniue
joase urmate de cuvntul init i apoi de nc dou liniue joase.
Imediat dup ce un obiect este creat n memorie, metoda __init__ este executat i
parametrul self este automat atribuit obiectului ce tocmai a fost creat.
Avem apoi declaraia din linia 14 care este executat:
self.sideup = Heads
Aceast declaraie atribuie irul Heads atributului sideup care aparine obiectului ce
tocmai a fost creat. Drept rezultat al metodei __init__ fiecare obiect pe care-l crem
din clasa Coin va avea un atribut sideup care e setat pe Heads.
Nota: Metoda __init__ este de obicei prima metoda nuntrul definiiei clasei.
Metoda toss apare n liniile 12 16:
100
def toss(self):
if random.randint(0, 1) = = 0:
self.sideup = Heads
else:
self.sideup = Tails
i aceast metod necesit variabila parametru self. Cnd metoda toss este invocat,
self refer automat obiectul asupra cruia metoda opereaz. Metoda toss simuleaz
ntoarcerea unei monede. Cnd metoda este invocat, declaraia if cheam funcia
random.randint ca s dea un ntreg situat ntre 0 i 1. Dac numrul este 0 atunci
declaraia urmtoare atribuie Heads lui self.sideup. Altfel, declaraia atribuie
Tails lui self.sideup.
Metoda get_sideup apare n liniile 19 i 20:
def get_sideup(self):
return self.sideup
nc odat, metoda necesit parametrul self. Aceast metod returneaz valoarea lui
self.sideup. Chemm aceast metod ori de cte ori vrem s tim care fa a
monedei este n sus.
Programul ntreg moneda.py n IDLE:
101
i rezultatul:
Clasa BankAccount
Programul urmtor ne arat clasa BankAccount stocat ntr-un modul numit
bankaccount. Obiectele create de aceast clas simuleaz un cont bancar, permind
s faci o balan, depozite, extrageri de bani pentru ca mai apoi s returneze balana
curent.
S observm c metoda __init__ are doi parametric: self i bal. Parametrul bal
accept nceperea unei balane ca argument. n linia 6 parametrul bal este atribuit lui
__balance.
Metoda deposit se afl n liniile 10 i 11. Ea are doi parametri: self i amount.
Cnd metoda este invocat, suma (amount) depozitat n account (cont) este trecut n
parametrul amount. Valoarea parametrului este apoi adaugat atributului __balance
102
n linia 11.
Metoda withdraw se gsete n liniile 15 19. Aceasta are doi parametri: self i
amount. Cnd metoda este invocat, suma (amount) care este scoas din cont este
trecut n parametrul amount. Declaraia if determin dac sunt destui bani n cont ca
s poat fi fcut o extragere de bani. Daca e aa, suma este scoas din __balance n
linia 17. Altfel, dac nu sunt bani suficieni, programul afieaza un mesaj de eroare:
Eroare: fonduri insuficiente.
Ultima metod get_balance returneaz valoarea atributului __balance.
Dac rulm acest program n linia de comand, observm c nu se ntmpl nimic:
103
104
105
Fiierul are peste 1800 de linii de cod. Acuma s lum fiierul (copil) care motenete
6
motenire
106
Acest cod are doar ceva mai mult de 200 de linii de cod. Am reuit astfel s scpm
de scrierea a peste 1500 de linii de cod printr-o singur declaraie pe care o vedei
marcat n fotografia de mai sus!
De altfel, dac suntei interesat de aplicaia OpenERP, putei gsi pe Internet destul
(nu ndeajuns totui...) material bibliografic.
Motenirea obiectelor n OpenERP funcioneaz astfel:
Obiectele pot fi motenite n module specifice customizate. Este mai bine s
moteneti un obiect adugnd/modificnd unele campuri.
Aceasta se face astfel:
inherit=object.name
7.8.
Extensia
unui
obiect
Exist dou posibiliti ca s faci o astfel de motenire. Ambele au ca rezultat o nou
clas de date, care pstreaz cmpurile i comportamentul clasei printe la fel de bine
ca i cmpurile adiionale, dar ele difer dramatic din punct de vedere al programrii.
n vreme ce Exemplul 1 creeaz o nou subclas custom_material care poate fi
vzut sau folosit de oricine, nu la fel se ntmpl cu Exemplul 2.
107
108
109
Milioane
de
posibiliti...
Cum bine spunea unul dintre Prinii Fondatori ai Statelor Unite, cea mai bun
metod ca s nvei un lucru este s scrii o carte despre el. Pot spune c i eu am
procedat la fel n cazul de fa. Putei afirma c nu e prea bine ca un individ care abia
desluete tainele unui limbaj de programare s se apuce s i scrie despre el. Munca
mea la acest mic manual mi-a dovedit c nu este aa, pentru c mereu eti nevoit s
caui i s aduni informaii de prin tot felul de cri n limba engleza descrcate de pe
Internet.
Din cri se nasc alte cri i aceast maxim e valabila i n privina paginilor
de fa. Mi-au fost de un real ajutor astfel, volumele scrise de Tony Gaddis (din care
m-am inspirat foarte mult) i Paul Barry & David Griffiths. Nu-i pot lsa deoparte pe
Dusty Phillips, pe Al Sweigart, ori pe Fabien Pinkaert, creatorul OpenERP.
Motivul pentru care m-am aplecat asupra acestui subiect este plcerea de a
scrie i rula programe in Python. Motivul cu adevrat important este c n limba
romn nu exist pn acuma dup tiina mea - o carte ct de nensemnat despre
acest din ce n ce mai important limbaj modern de programare. Nu am pretenia ca
paginile mele s umple acest gol. Sunt convins c n Romnia exist destui oameni
extrem de talentai n mnuirea liniilor de cod Python cu siguran autodidaci care ar putea s-o fac mult mai bine i cu mai mult talent ca mine. Sunt ns sigur c
paginile pe care le-ai avut n fa au reuit ct de ct s v dumireasc asupra unui
minunat dar puin cunoscut pe aceste meleaguri limbaj de programare.
Daca v-am trezit curiozitatea, v stau la dispoziie pe Internet o droaie de cri,
forumuri de discuii sau tutoriale dintre cele mai simple ori mai complexe. Dai doar
un search pe motorul de cautare preferat i n fa vi se vor deschide milioane de
posibiliti...
110
Bibliografie
1. Barry, Paul, Griffiths, David, Head First Programming,
OReilly Media, Sebastopol, CA, 2009
2. Barry, Paul, Head First Python, OReilly Media,
Sebastopol, CA, 2011
3. Gaddis, Tony, Starting out with Python (second
edition), Pearson Education, Boston,2012
4. Harrington, Andrew, Hands-On Python. A tutorial
introduction for beginners (Python 3.1. version),
creativecommons.org
5. Phillips, David, Python3 Object Oriented
Programming, Packt Publishing, London, 2010
6. Pinckaers Fabien, Van Vossel, Els, Streamline your
Menufacturing Processes with OpenERP, Open Object
Press, 2012
7. Swaroop, CH, A byte of Python (second edition)
8. Sweigart, Al, Invent Your Own Computer Games With
Python (second edition), Creative Commons Licence
111