Curs 2
Limbajul PYTHON
Tipuri de date/Variabile
Expresii/Operatii
Programe Iterative
Important!
• Totul in Python este un Obiect !
• Orice entitate se creaza e un Obiect
• Principiul: Read Eval Print Loop
Valori si tipuri de date
Valorile(datele) sunt entitățile fundamentale (scalare sau non-scalare) pe
care programele/scripturile le manipulează:
Valori scalare (numerice)
Intregi (întregi cu semn ) - C precizie lungă – 4 bytes
Float (reale de virgulă mobilă) - C dublă precizie – 8 bytes
Complex (numere complexe) - C dublă precizie – 8 bytes
Valori non-scalare (sting-uri =siruri de caractere)
Valorile sunt clasificate în Tipuri de date (sunt asociate cu valorile):
type() - funcția built-in Python, întoarce tipul de date
Valori si tipuri de date
Datele stocate în memorie pot fi de mai multe tipuri.
Exemplu: vârsta persoanelor este stocată ca valoare numerică și adresa
este stocata ca string – șir de caractere.
• Python are tipuri de date standard, care sunt folosite pentru a defini
operațiile posibile pe ele și metodele pentru fiecare dintre ele.
• Python are cinci tipuri de date standard:
- Număr
- String
- Lista (date introduse între [], disponibile metode de liste )
- Tuple (valori separate de virgulă, acceptă tipuri de date diferite)
- Dicționar (secvențe neordonate cheie: valoare introduse între [])
Valori Numerice
Interpretor = evalueaza și printeaza
In[]: 4
In[]: 4 4 # eroare
In[]: 3.2 # pentru a reprezenta numere float nu se foloseste , ci .
In[]:type(3.2)
In[]:2 +6.5
In[]:complex(2,5)
Intr-o expresie care conține tipuri mixte de date Python convertește
numerele intern la un tip comun de evaluare.
Cateodata, va trebui să convertiți un număr în mod explicit de la un tip la
altul pentru a satisface cerințele unui parametru de funcție sau operator.
- int (x) pentru a converti x la un număr întreg simplu
- float (x) pentru a converti x la un număr în virgulă mobilă.
- complex(x, y) pentru a converti x și y la un număr complex
cu o parte x reală și imaginară partea y.
Built in Funcții Numerice
Python built in funcții numerice:
[Link]
long-complex
Unele funcții trebuiesc adaugate prin declarațiile de import:
[Link]
Exemplu:
In[]:import math
In[]:x=[1,2,3,4,5]
In[]:[Link](x)
In[]:15.0
String- uri
Interpretor = evalueaza și printeaza
String-urile =colecție ordonată de caractere identificate ca un set
continuu de caractere scrise între ghilimele.
String-urile pot fi introduse între ghilimele: simple (') sau duble ("), sau
triple (asa ''' sau asa """)
String-urile sunt IMUTABILE ( nu se schimbă ordinea caracterelor)
In[]: type(‘3.2’)
In[]: print('''"Oh no", she exclaimed, "Ben's bike is broken!"''')
String-urile cu ghilimele triple se pot extinde pe mai multe linii:
In[]: print("""Acest mesaj
... se intinde pe mai
... multe linii"""
Built in Funcții pe String- uri
Datele de tip string sunt str și nu char ca în alte limbaje
Python include built in funcții pe string-uri:
[Link]
Sau le putem vizualiza :
In[]: help(str)
Exemplu:
In[]: "George Georgescu".upper()
In[]: ‘GEORGE GEORGESCU’
Expresii
Trebuie să manipulăm date cât mai complexe, deci trebuie să
combinăm aceste tipuri de date și să creeam expresii:
Expresie – operand(obiect) operator operand (obiect)
>>4+5 #4 și 5 sunt operanzi și + se numește operatorul.
Python acceptă următoarele tipuri de operatori:
- Aritmetici
- Comparație
- Logici (sau relaționali)
- Atribuire
- Condiționare
Operatori Aritmetici
+ Adunare - adună valorile de pe fiecare parte a operatorului: a + b
- Scadere - scade valorile de pe fiecare parte a operatorului :a - b
* Multiplicare - înmulțește valorile din ambele părți : a * b
/ Diviziunea (float) - împarte valorile: a/b – rezultatul fiind float
In[]: 9/2 # rezultatul este 4 .5
// Diviziunea (întreg) - împarte valorile: a//b - rezultatul fiind întreg
In[]:9//2 # rezultatul este 4
In[]: 9.0//2.0 # rezultatul este 4
% Modulus - întoarce restul împarțirii lui b la a
In[]: 9%2 # rezultatul este 1
** Exponentul – ridicarea la putere calcul a ** b
In[]: 2**3 # rezultatul este 8
Operatori Aritmetici
Operator overloaded – depinde de tipul operanzilor (obiectelor) din expresie :
- numeric și string
In[]: 3*’abc’ # rezultatul va fi ‘abcabcabc’
- string+ string = concatenare
In[]: ‘a’ + ‘bcd’ # rezultatul va fi ‘abcd’
Care va fi valoarea acestei expresii?
In[]: 3+’abc’
Rețineți: Python face type checking! Trebuie să faceți conversie de tipuri!
In[]: str(3) + ‘abc’
Rețineți pentru stringuri : operatorul ( + ) este concatenare,
operatorul ( * ) este repetiție
Operatori de Comparație
== în cazul în care valorile celor doi operanzi sunt egale, atunci condiție
devine adevărată
! = dacă valorile celor doi operanzi nu sunt egale, atunci condiția devine
adevărată
> în cazul în care valoarea operandului stâng este mai mare decât
valoarea operandului din dreapta, atunci condiția devine adevărată
> = în cazul în care valoarea operandului stâng este mai mare sau egală
cu valoarea operandului din dreapta, atunci condiția devine adevărată.
< în cazul în care valoarea operandului din stânga este mai mică decât
valoarea din dreapta, atunci condiția devine adevărată.
<= în cazul în care valoarea operandului stâng este mai mică sau egală
cu cea a operandului din dreapta, atunci condiția devine adevărată
Reprezentarea Float point
Standardul IEEE 754 specifică modul științific de a reprezenta numerele
float point în calculator
Numerele float point nu sunt același lucru cu numerele reale!
Numerele float point sunt reprezentate ca o pereche : (mantisa,exponent)
1<= mantisa < 2
-1022 < exponent < 1023
64 biti = 1 bit semn, 11 exponent, 52 mantisa de unde rezultă că avem
17 digiti de precizie când reprezentăm numerele zecimale
Numerele raționale (fracțiile) și cele iraționale (radical) nu pot fi
reprezentate exact pe float
Reprezentarea Float point
1/8 = 0.125
baza 10 =1*10-3+ 2*10-2+5*10-1
baza 2 =1.0*2-3 adică reprezentarea 0.001
1/10
baza 10=1*10-1
baza2 = ? nu există un nr binar care să reprezinte aceasta fracție.
Dacă încercăm, ceea ce obținem este o serie ce se repetă la infinit
0011001100110011001100110011…
Dacă luăm arbitrar un nr de biti o să obținem doar o aproximare a nr
1/10
În Python există funcția built-in repr() - convertește reprezentarea
numerică în sting ăi o afișează. Ptr float se rotunjește la 17 digiti
Implicații ptr reprezentarea inexacta cand facem calcule complexe .
Reprezentarea Float point
In[]: s=0.0
In[]:for i in range(11):
In[]:… s+=0.1
In[]: s
In[]:1.099999999999 # erorile se acumulează
Atentie! Ce inseamna == pe floats
In[]: import math
In[]: a= [Link](2)
In[]: a*a == 2
In[]: False # ceea ce am stocat in a e doar o aproximare a sqrt()
In[]: a*a
In[]: 2.0000000000004
Niciodată nu testam ptr egalitate pe floats, ci testam dacă sunt aproape
egale : abs(a*a-2.0) < epsilon ?
# Epsilon o valoare ffff mica proprie fiecărei aplicații
Operatori Logici
AND – dacă ambii operanzi sunt adevărați atunci condiția devine
adevărată.
In[]: True and True # True
In[]: True and False #False
In[]: False and True #False
In[]: False and False #False
OR - În cazul în care oricare dintre cei doi operanzi sunt non zero,
atunci condiția devine adevărată.
In[]: True or True # True
In[]: True or False # True
In[]: False or True # True
In[]: False or False #False
NOT -se utilizează pentru a inversarea logică a stării operandului. În
cazul în care o condiție este adevărată, atunci NOT o va face falsă și
viceversa
Operatori Logici
Orice variabilă evaluată la 0 sau la nimic ‘ ‘ are valoarea FALSE
Orice variabilă evaluată la ‘ceva ‘ are valoarea TRUE
Operatorii de comparație întotdeauna întorc TRUE sau FALSE
In[]: ‘a’< 3 – ce se va intampla? Care va fi raspunsul ?
In[]:False – deoarece se face comparația între codurile ASCII
( numerele sunt înaintea literelor)
Trebuie să vă faceți o regulă în a verifica tipurile de date astfel încât
operațiile pe care le faceți să fie corecte.
Există o ordine lexicografică cand combinam tipuri diferite (“o ordine a
simbolurilor “)
In[]: 4 <’3’ True
In[]: ‘4’ <3 dar acum ? False
Operatorii logici pot întoarce orice !
In[]: True and 50 50
In[]: False and 33 False
Ordinea operațiilor
Când avem mai mulți operatori într-o expresie folosim ordinea operațiilor :
PEMDAS
P (paranteze)E (exponent)MD(multiplicare,diviziune)AS(adunare scadere)
()
**
NOT , AND , OR
* ,/ , // , %
+, -
Exemplu: Care va fi rezultatul
len(‘Rezultat?’)*2**3/4
Ordinea operațiilor
Exemplu: Care va fi rezultatul expresiei :
len(‘Rezultat?’)*2**3/4
len(‘Rezultat?’) - functia len returneaza lungimea stringului ‘Rezultat’ = 9
Expresia devine 9*2**3/4
Se executa intai ridicarea la putere (2**3 =8) apoi inmultirile si impartirile
9*8 /4
Rezultatul final 18
Variabile
Variabilele sunt nume ptr obiecte, “care se referă la valori”
Folosim variabile ori de cate ori vrem să stocăm informația
Variabilele în Python nu trebuie să fie explicit declarate, ca să se rezerve
spațiu în memorie. Declararea se face automat când se asignează o
valoare variabilei, folosind semnul (=)
n = 100 # asignăm un număr întreg
pi = 3.14159265358979 # asignăm un număr float point
mesaj = "In curând placăm acasă" # asignăm un șir de caractere
Alegeți numele variabilelelor să aibă sens:
- pot conține litere și cifre, dar niciodată nu încep cu cifre
- pot fi oricat de lungi
- semnul “underscore” _ poate sa apară în numele variabilelor
- Python este case sensitive
Dacă dați unei variabile un nume ilegal o să aveți eroare de sintaxă
Nume de variabile
Python3 are 33 de cuvinte rezervate ce nu pot fi folosite ca nume de
variabile.
Interpretorul folosește aceste cuvinte cheie să recunoască structura
programelor
Aceste cuvinte cheie sunt scrise în culori diferite în IDE-uri.
False None True and as assert break class
continue def del elif else except finally for
from global if import is in lambda nonlocal not or
pass raise return try while with yield
Variabile
In[]: x=3**2 # numele variabilelei x creeaza o legatura (un link =
un pointer) cu valoarea expresiei 9
In[]: y=9 # se creaza o legatura (un pointer) către aceeași valoare 9
In[]: z=x #variabile z va pointa catre aceeasi valoare 9, nu catre x
Este o singură locație în memorie 9 și către ea pointează toate aceste
variabile
Tipul variabilei este acela pe care o are valoarea variabilei = tipul se
moștenește din valoare
Tipul variabilelor este dinamic, se schimbă cu valoarea asociata!
In[]: x=5
In[]: x=’abc’
Operatori de Asignare
= asignare simplă; asignează valoarea din partea dreaptă, valorii din
stanga operandului: c = a + b se va asigna valoarea a + b în c
+= adunare AND; aduna operandul din dreapta la cel din stânga și
asignează rezultatul operandului din stânga: c += a este echivalent cu
c=c+a
-= scade AND; scade operandul din dreapta din cel din stânga și
asignează rezultatul operandului din stânga: c -= a este echivalent cu
c=c–a
*= multiplică AND ; multiplică operandul din dreapta cu cel din stânga
și asignează rezultatul operandului din stânga: c *= a este echivalent
cu c = c * a
Tot asa si pentru : /= ( c/=a echivalent cu c=c/a),
//= ( c//=a echivalent cu c=c//a)
%= ( c%=a echivalent cu c=c%a)
**= ( c**=a echivalent cu c=c**a)
Operatori de Asignare
X= 5 asignare simplă
X =Y =5 asignare multiplă
X, Y = 3,4 asignare multiplă în pachet X=3 Y=4
X+=7 asignare multiplă cu operator X=X+7
Exemplu:
In[]:X=10
In[]: X,Y= 20,X
In[]: print(X,Y)
20 10
Statements (declarații)
Statements comenzi pe care Python le interpretează și execută
Au efect imediat cum ar fi crearea de variabile, afișarea unor valori
Straight line programming = se execută o secvență de instructiuni
una cate una
Creez un script = scriu secvența de instrucțiuni într-un editor, salvez cu
extensia *.py și rulez scriptul:
x=3
x=x*x
print (x)
n=input(‘Introduceti un nr=’)
print(n)
Atentie! Fct input interpreteaza ceea ce introduceți ca string. Dacă în
loc de val numerică introduceti ‘abc’, va printa exact cu ghilimele
‘abc’.Trebuie să scrieți int(input(‘n=’) - daca vreți un scalar
Python are doua moduri de funcționare : interactiv și script
In modul script expresiile sunt evaluate, dar nu au efect vizibil până
Condiționare – If, Else, Elif
Branching programming - schimbă ordinea instrucțiunilor pe baza
unor teste (de obicei valoarea unor variabile)
Declarația if – la fel ca în toate limbajele
Declarația if conține o expresie logică și decizia este facută pe baza
rezultatului comparației:
Sintaxa declarației if este:
if expresie:
declarații
Declarații
În Python toate declarațiile indentate cu același numar de spații sunt
considerate ca fiind parte din același bloc de code.
Python folosește indentarea ca metodă de grupare a declarațiilor.
Condiționare – If, Else, Elif
O singură declarație else poate fi combinată cu o declarație if, declarația
else este opțională.
O declarație else conține un bloc de cod care se execută dacă expresia
din declarația if este False (se evaluează la valoarea 0)
Declarația elif permite să se verifice expresii multiple și se execută un
bloc de cod atât timp cât valoarea expresiei are valoare True
Declarația elif este opțională și pot fi mai multe declarații elif în
interiorul declarației if.
if expresie1:
declarații
declarații
elif expresie2:
declarații
elif expresie3:
declarații
else:
declarații
Condiționare – If, Else
Se poate scrie un bloc de instrucțiuni în interiorul condiției else, nu doar
o singură declarație:
x=15 x=int(input(‘x=’))
if ( x/2 )*2 == x : if x%2 == 0:
print(“par”) print(“par”)
else : else :
print(“impar”) print(“impar”)
if x%3 !=0:
print(“nu e divizibil cu 3”)
Condiționare – If, Else
Ce text va fi scris ?
Exemplu1: Exemplu2:
z=’b’ z=’b’
if ‘x’ < z: if ‘x’ < z:
print(“Buna”) print(“Buna”)
print(“Mama”) print(“Mama”)
Condiționare – If, Else
Ce text va fi scris ?
x=15
y=13
z=11
print(‘x=’,x,’y=’, y, ‘z=’,z)
if x< y:
if x<z:
print(“x e cel mai mic număr”)
else:
print(“z e cel mai mic număr”)
else:
print(“y e cel mai mic număr”)
Operatorii logici se folosesc pentru a simplifica condițiile if imbricate
Condiționare – If, Else, Elif
Trebuie să scriu codul corect, sa testez pentru toate valorile posibile:
x=15
y=13
z=11
print(‘x=’,x,’y=’, y, ‘z=’,z)
if x< y and x<z:
print(“x e mai mic”)
elif:
print(“y e mai mic”)
else:
print(“z e mai mic”)
Bucla While
O expresie logică trebuie să întoarcă una din valorile True sau False
Bucla while continuă până când expresia devine False.
Sintaxa buclei while este:
while expresie :
declarații
declarații
Exemplu:
nr = 0
while nr < 9 :
print (' Numărul este:', nr)
nr = nr + 1
print (‘Gata, am terminat!’)
Bucla WHILE infinită / break
Următorul cod va contina pâna când veți tasta CNTL+c :
var=1
while var == 1 : # bucla infinită
nr = input("Introduceti un număr =")
print ("Ati introdus: ", nr)
Declarația break termină execuția buclei curente și predă controlul să
se execute următoarea declarație:
while True : # bucla infinită
nr = input("Introduceti un număr =")
print ("Ati introdus: ", nr)
if nr == “100”:
break # termină execuția buclei
print ("Ne-am oprit, ați introdus: ", nr )
Reguli de bază când scriem scripturi iterative
Care va fi rezultatul afișat în următorul exemplu ?
y=0
x=3
it=x
while(it >0):
y=y+x
it=it-1
print(y)
Reguli de bază când scriem scripturi iterative:
1. alegem variabilele (ceea ce se schimbă, ceea ce se “numără”)
2. inițializam variabile în afara buclelor
3. setez condiția de end test – cum ies din bucle
4. scriu setul de intrucțiuni din buclă, ceea ce se va repeta/schimba
de un nr de ori, schimb variabile
5. ce voi face cu rezultatul când se termină bucla ?
Întrebări de bază când scriem scripturi iterative
Exemplu: scriem un număr și aflăm dacă e pătrat perfect
x= int(input(‘Introduceti un nr =’))
ans =0 # initializez variabilele în afara buclei
while ans*ans < = x: # setez condiția de ieșire din buclă
ans=ans+1 # scriu setul de instrucțiuni
print (ans) # ce se va întampla dupa ce ies din buclă
Tot timpul îmi pun întrebările:
Face codul ce trebuie ?
Îmi dă răspunsul corect?
Am testat toate posibilitățile?
Se termină codul?
Rescriem codul
Scriem codul mai bine:
x = int(input('Introduceti un număr: '))
ans = 0
if x>0:
while ans*ans < x:
ans = ans + 1
#print (‘ans =’, ans)
if ans*ans != x:
print ('nu e pătrat perfect', x)
else:
print(ans)
else:
print ('e număr negativ’, x)
# nu mai e nevoie de if x>0 daca pun conditia < abs(x) in while
Cod Iterativ
Codul scris în structuri ramificate (condiționale : if/elif/else) permite
pe baza unui test, să sărim la diferite alte zone de cod
programele au un timp constant
Codul scris în structuri de loop (while) permite să repetăm bucăți de
cod, până când o condiție este îndeplinită
programele au timp, care depinde de valorile variabilelor, precum și
de lungimea programului
Bucla For
Bucla for are abilitatea de a itera peste elementele oricărei secvențe
(inclusiv stringuri, liste, tuple)
Sintaxa buclei for este:
for var_iterare in secvența :
declarații
declarații
Cand vrem sa facem o buclă for în stilul convențional (la fel ca în C for
(i=1; i =<10; i++) folosim sintaxa:
for i in range(1,n) :
declarații
declarații
NOTĂ:funcția range(start, stop,step) genereaza numerele intregi, de la
start inclusiv pâna la stop exclusiv. Adică range(1,n) generează numerele
intregi de la 1 la n-1 (step e setat la 1, daca nu se specifică altă )
Bucla For
Exemplu: aflăm divizorii unui număr cu bucla while și cu bucla for:
x=10 x=10
i=1 for i in range(1, x+1)
while i < x: if x%i==0:
if x%i==0: print(‘divizor’,i)
print(‘divizor’,i)
i=i+1
Avantajul buclei for este acela al variabilelor care se updateaza automat
Bucla For
Exemplu for pe string:
for litera in 'Python':
print( 'Litera curentă :', litera)
Exemplu for pe liste:
fructe = ['banane', 'mere', 'mango']
for fr in fructe:
print ('Fructul curent :', fr)
Exemplu for pe tuple:
fructe = ('banana', 'apple', 'mango')
for index in range(len(fructe)):
print ('Fructul curent :', fructe[index])
NOTĂ: Funcția built-in len() furnizează numărul total de elemente din
tuplă
For vs While
bucla for bucla while
se știe numărul de iterații nu se știe numărul de iterații
se poate termina mai repede se poate termina mai repede
via break via break
folosește o variabilă de folosește o variabilă de
incrementare automată incrementare ce trebuie ințializată
înaintea buclei și trebuie
incrementată în buclă
se poate rescrie bucla for nu se poate rescrie bucla while
folosind o buclă while folosind o buclă for
DE CITIT!
Allen Downey :Think Python - How to Think Like a Computer
Scientist, 2nd Edition, Version 2.2.18 Green Tea Press
Capitolul 1, Capitolul 2 , Capitolul 5 pana la Recursivitate, 5.8
Capitolul 7 până la Square root, 7.5
TEMA
Scrieți codul Python pentru a afla dacă un număr este pătrat perfect
apoi modificați acest cod Python pentru a afla dacă un număr
(poate să fie și un nr negativ) este cub perfect.
Folosiți aceasta sintaxa pentru functia print:
print(‘cubul lui’ + str(x) + ‘este’ + str(ans))
Bibliografie
Python: [Link]
Python Documentations: [Link]
Python Tutorial [Link]
IPython: [Link]
Jupyter noNebook: [Link]
NumPy: [Link]
SciPy: [Link]
Pandas: [Link]
Matplotlib -2D: [Link]
Mayavi - 3D:[Link]
Bibliografie
Eric Grimson, and John Guttag. 6.00 Introduction to Computer
Science and Programming. Fall 2008. Massachusetts Institute of
Technology: MIT OpenCourseWare, [Link] License:
Creative Commons BY-NC-SA.