Sunteți pe pagina 1din 45

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:

https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-
long-complex

Unele funcții trebuiesc adaugate prin declarațiile de import:

https://docs.python.org/3/library/math.html

Exemplu:
In[]:import math
In[]:x=[1,2,3,4,5]
In[]:math.fsum(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:

https://docs.python.org/3/library/stdtypes.html#string-methods

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= math.sqrt(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: http://www.python.org/
Python Documentations: https://docs.python.org/3/
Python Tutorial https://docs.python.org/3/tutorial/
IPython: http://ipython.org/
Jupyter noNebook: https://jupyter.org/
NumPy: http://www.numpy.org/
SciPy: https://www.scipy.org/
Pandas: http://pandas.pydata.org/
Matplotlib -2D: http://matplotlib.org/
Mayavi - 3D:http://code.enthought.com/projects/mayavi/
Bibliografie

Eric Grimson, and John Guttag. 6.00 Introduction to Computer


Science and Programming. Fall 2008. Massachusetts Institute of
Technology: MIT OpenCourseWare, https://ocw.mit.edu. License:
Creative Commons BY-NC-SA.