Sunteți pe pagina 1din 19

2016/02/23 22:38

1/19

Introducere n limbajul Python

Introducere n limbajul Python


Obiective
Scopul primelor trei laboratoare de Arhitectura Sistemelor de Calcul l reprezint familiarizarea cu
probleme de multi-threading, concuren i sincronizare. Pentru a aplica mai uor i mai rapid aceste
noiuni, vom folosi limbajul Python. n cadrul primului laborator vom prezenta principalele
caracteristici ale limbajului Python, urmnd ca n laboratoarele 2 i 3 i la tema 1 s lucrm cu
thread-uri pentru a implementa aplicaii concurente.

Ce este Python?
Python este un limbaj de programare foarte popular (statistici), oferind posibilitatea programrii
structurate dar i orientate pe obiect i incluznd i elemente din paradigma funcional. Este un
limbaj de scripting, ceea ce nseamn c este interpretat i nu compilat, economisind mult timp n
procesul de dezvoltare i debugging.
Limbajul combin o putere remarcabil cu o sintax foarte clar. Are module, clase, excepii, tipuri
dinamice i garbage collection. API-ul Python ofer module pentru o gam foarte mare de
funcionaliti, de la cele de baz pentru lucrul cu iruri i fiiere, pn la cele pentru lucrul cu procese,
threaduri, sockets, serializare etc. Multe dintre aceste module ofer o interfa foarte similar
programrii la nivel de sistem din C (ceea ce se studiaz la SO), astfel nct funciile Python au acelai
nume si aproximativ aceiai parametrii ca cei pentru funciile din C pentru apeluri de sistem. Exist o
varietate de API-uri i pentru aplicaii GUI, cum ar fi PyQT , PyGTK, wxWidgets (lista complet). Pentru
calcul numeric i grafice exist bibliotecile NumPy, SciPy i Matplotlib.
Implementarea principal a Python, CPython (scris n C) a fost conceput pentru a fi portabil:
funcioneaz pe Linux, Unix, Windows, Mac OS X. Pe platformele mobile actuale exist implementri
pentru iOS, iar Android ofer SL4A, o platform pentru limbaje de scripting cu suport i pentru Python,
folosit de engine-uri precum QPython.
Programele pot fi executate, de asemenea, i pe maina virtual Java prin folosirea compilatorului
Jython, care le transform n bytecode Java i permite folosirea de clase Java n cadrul acestora.
Similar, exist IronPython pentru .NET.

De ce Python?
Python este un limbaj ce ofer foarte multe funcionaliti i are o curb de nvare rapid att
pentru programatorii ce cunosc deja limbaje precum C i Java, ct i pentru nceptori. Dei este un
limbaj interpretat, acest lucru nu a stat n calea popularitii sale i folosirii n numeroase proiecte.
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

Pentru proiecte open-source putei consulta statistici pe site-ul ohloh, i compara evoluia
contribuiilor n proiecte cu cod Python fa de proiecte n alte limbaje de programare, ca exemplul de
pe acest link.
Putei utiliza Python att pentru scripturi, dezvoltarea unor infrastructuri de testare, ct i pentru
aplicaii web folosind framework-uri cum ar fi Django. Exist aplicaii desktop variind de la clieni
BitTorrent pn la unele jocuri video, iar multe produse software conin i componente scrise n
Python, aa cum este cazul Instagram ( detalii aici). Statistici legate de site-uri ce folosesc Python
gsii aici, iar o list a aplicaiilor ce folosesc Python gsii aici.
De ce Python la ASC?
n cadrul laboratoarelor dorim s ne axm pe scrierea de programe multi-threaded corecte, nu pe
particularitile vreunui limbaj. Din acest punct de vedere Python este de preferat datorit interfeei
simple pentru lucrul cu thread-urile i pentru modul de lucru mai rapid si numrul de linii de cod mult
mai mic n comparaie cu Java sau C. Avantajul este cel al simplitii i asemnarea API-ului pentru
thread-uri cu cel din C-pthreads, ns are i un dezavantaj oferit de un mecanism din interpretor, pe
care l vom discuta n laboratorul 2.

Instalare

n cadrul laboratoarelor vom lucra doar cu Python 2.6 sau 2.7, nu i cu versiunile >= 3. Python nu
ofer backwards compatibility astfel nct programe scrise pentru o versiune pot s genereze erori de
interpretare pe o alt versiune (de exemplu tratarea excepiilor n versiuni >= 2.6 are alt sintax
dect n 2.4). De asemenea, Python3 este n mod intenionat incompatibil cu versiunile 2.x, explicaii
asupra acestui lucru putei citi i n articolul lui Guido van Rossum, autorul Python-ului.
Python se poate descrca de pe site-ul oficial, seciunea Download.
Pe un sistem Linux, este foarte probabil s fie deja instalat. Verificai acest lucru dintr-o consol:
$ python
Python 2.6.6 (r266:84292, Jan 22 2014, 05:06:49)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Dac nu l avei instalat, pasul urmtor ar fi s-l cutai n repository-urile distribuiei cu care lucrai.
Exemplele urmtoare prezint instalarea pe o distribuie bazat pe Debian i pe una bazat pe Red
Hat.
$ sudo apt-get install python
$ sudo yum install python
Pe un system Windows se poate descrca versiunea curent 2.7.11. Dup instalare se poate aduga
calea ctre executabilul Python n global PATH, pentru a putea fi gsit de oriunde.
http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

3/19

Introducere n limbajul Python

Tools
Dac dorii s folosii un IDE pentru Python v recomandm versiunea community a PyCharm.
Pentru a verifica respectarea code-style-ului recomandat de Python v recomandm PEP8 online.
Pentru verificarea code-style-ului, detectarea erorilor i alte lucruri utile, putei folosi Pylint. Aceste
este instalat i pe calculatoarele din laborator, la fel ca i PyCharm.

Cum se execut un program Python


n Windows, dac extensia .py este deja nregistrat, un dublu-click pe numele scriptului este
suficient. Se poate edita programul folosind GUI-uri ca IDLE (Python GUI) i Eclipse sau editat n
notepad++ i executat din consol (StartRuncmd).
Dac folosii Linux, exist mai multe posibiliti:

fie se lanseaz interpretorul cu numele scriptului:

$ cat hello.py
print 'Hello World!'
$ python hello.py
Hello World!

fie prima linie din program este de forma #!/calea/catre/interpretor iar scriptul se face executabil:

$ cat hello.py
#!/usr/bin/python
print 'Hello World!'
$ chmod +x hello.py
$ ./hello.py
Hello World!
Pentru a testa anumite funcionaliti sau a verifica o anumit sintax nici nu este nevoie s scriei un
script, putei folosi direct consola Python. Din ea se iese scriind quit() sau apsnd Ctrl-D.
Din consol putei obine documentaia despre anumite module, clase, metode folosind help(nume),
inclusiv despre modulele i metodele scrise de voi dac includei n cod comentarii docstring (similare
javadoc-ului din Java). Alternativ, dac dorii s vedei metodele disponibile pentru un anumit obiect
putei folosi funcia dir(obiect), ca n exemplele de aici.
>>> import io
>>> help(open)

Unul din avantajele Python este c putei folosi consola atunci cnd vrei s testai o anumit
funcionalitate sau cnd nu suntei siguri ce se ntmpl cnd folosii anumite funcii/construcii. De
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

exemplu putei ncerca diverse metode de parsare string-uri nainte de a le ncorpora n programul
vostru, sau poate pur i simplu v punei ntrebri de genul Pot pune ntr-un dicionar chei de tipuri
diferite, unele integer unele string? > creai un astfel de dicionar n consol i observai dac
merge.

Pentru a folosi ntr-un program Python argumente date din linia de comand trebuie inclus modulul
sys i folosit lista argv, care conine toate argumentele, pe prima poziie fiind numele scriptului.
import sys
if len(sys.argv) < 2:
print "Usage:...."
exit(0)

Particulariti de sintax
Indentarea

Indentarea n Python este mai mult dect parte a stilului de programare, este chiar parte din sintax
O linie nou termin o declaraie, pentru a continua o declaraie pe mai multe linii, se foloseste
caracterul \.
Un bloc de cod are toate liniile indentate cu acelai numr de spaii (nu exist begin i end sau {}
). Instruciunile dintr-un bloc de cod vor fi grupate unele sub altele, pe acelai nivel de indentare.
Definiiile neindentate ntr-un program Python vor fi de obicei variabile globale, definiii de clase,
proceduri, funcii sau pri ale main-ului.
Dup instruciuni nu este obligatoriu s punei simbolul ';' precum n alte limbaje de programare,
indentarea corespunzatoare fiind suficient.
Este foarte important sa nu uitai simbolul ':' care precede o indentare

Structurile de control, definirea de rutine, clase, toate necesit o mai mare grij n scrierea codului.
Exemplu de folosire a indentrii pentru a delimita blocurile de cod:
a = 1
# Afisam numerele de la 1 la 10
while a <= 10:
print a,
a += 1
print "Am terminat"

Comentarii
http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

5/19

Introducere n limbajul Python

O singur linie se poate comenta n Python folosind simbolul #.


Pentru comentarii multi-line se folosesc trei ghilimele succesive """ sau ''' la inceputul i
respectiv la sfritul zonei de comentat.
Comentariile cu ghilimele succesive din interiorul unui bloc de cod trebuie s fie pe acelai nivel de
indentare cu acesta, altfel vei avea IndentationError la execuie. Comentariile cu # nu au
aceast restricie.

[...]
if b > 3:
""" Silly comment """
a = b
$python comments.py
File "comments.py", line 4
""" Silly comment """
^
IndentationError: expected an indented block
Corect este:
if b > 3:
""" Silly comment """
a = b

Code style

Pe site-ul oficial gsii recomandrile de code style, scrise chiar de creatorul limbajului, Guido van
Rossum.
statistici cu folosirea diverselor convenii de stil n proiectele Python de pe GitHub.

Tipuri de date i variabile


Python ofer tipuri de date numerice, booleene, iruri (string, liste etc), dicionare, fiiere, clase,
instane i excepii.

Din punct de vedere al tiprii Python folosete tipuri pentru obiecte, ns la definirea variabilelor nu
trebuie precizat tipul acestora. Constrngerile de tip sunt verificate la execuie (late binding), astfel
nct pot aprea erori i excepii generate de folosirea unui tip necorespunztor n atribuiri i excepii.
Python asociaz numele unei variabile cu un obiect, care poate fi numr, ir de caractere sau ceva
mai complex. Cnd este folosit o variabil, tipul acesteia este tipul obiectului cu care este asociat.
Este greit folosirea ntr-o expresie a unei variabile care nu a fost asociat cu un obiect.
i = 5

# i va fi de tip Integer

ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

i = "Hello"

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

# i va fi de tip String

Alocarea i dezalocarea de memorie se face automat de ctre Python, existnd un mecanism de


garbage collection.
n Python se poate face atribuirea de valori unor mai multe variabile simultan:
x, y = 2, 3
Datorit faptului c partea dreapt a unei expresii este evaluat nainte de a se face atribuirea,
valorile a dou variabile pot fi foarte uor interschimbate, far a avea nevoie de o a treia variabil:
x, y = y, x

Python este un limbaj dynamically typed, dup cum am artat i mai sus, dar i strongly typed,
nepermind tipului unei variabile s se schimbe atunci cnd este folosit n operaii, dect printr-o
conversie explicit. De exemplu: '12' + 10 va da excepie la execuie, trebuie folosit int('12')
+ 10.

Stringuri
Pentru lucrul cu iruri de caractere, Python ofer tipul String i o serie de operaii de baz pe acesta,
descrise n documentaie.
Stringurile sunt incluse ntre ghilimele " sau '. Stringurile ce conin mai multe linii sunt nconjurate de
trei ghilimele succesive """ sau '''.
s = "string pe o linie"
linie = """string
pe mai multe linii"""
Stringurile sunt tratate ca nite liste, cuvant[i] fiind caracterul din ir ce are indexul i, unde i ia
valori n intervalul [-length,length). Folosirea unei valori n afara acestui interval va genera o
eroare: IndexError: string index out of range. Python permite i folosirea unor indici
negativi, care indexeaz elementele pornind de la sfritul irului, precum n exemplul de mai jos
stringul:
index:
index negativ:

s
0
-6

t
1
-5

r
2
-4

i
3
-3

n
4
-2

g
5
-1

Nu exist un tip de date special pentru caractere, acestea sunt vzute drept iruri de lungime 1.
Lungimea unui ir se poate afla cu ajutorul funciei: len(some_string).
Caracterul : specific un subir al unui ir folosind sintaxa: some_string[x:y]. Subirul obinut
conine toate caracterele din irul iniial (some_string) ntre poziiile x si y-1 (inclusiv). Dac nu se
http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

7/19

Introducere n limbajul Python

specific x sau y, acestea au implicit valorile 0, respectiv lungimea irului.

String-urile sunt immutable. O dat create ele nu mai pot fi modificate.


>>> s="abcdef"
>>> s[0]="g"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

Particulariti de lucru cu irurile de caractere:

pot fi concatenate folosind simbolul +


pot fi multiplicate folosind caracterul *
se poate folosi operatorul % pentru formatarea irurilor similar printf-ului din C
modulul string ofer iruri predefinite i metoda format pentru crearea irurilor (util n special
cnd vrem s incorporm n ir mai multe variabile). Att la folosirea acestei metode, ct i a
operatorului % nu este nevoie de conversia explicit la string a variabilelor.
modulul str ofer metode de lucru cu irurile precum index, replace, split, isdigit, format
(similar format-ului din modulul string)
modulul re - regular expressions este util pentru cutarea sau separarea unor substringuri folosind
expresii regulate.

lab1_string_example.py
s = "string"
print s[0:2]
print s[:3]
print s[3:]
s2 = "one"

# st
# str
# ing

print "Write " + 2*s2 + " " + s


print "hello %s, lab %d !" % ("students",1)
!
import string
print "hello {}, lab {}".format("world",1)
print "hello {0}, lab {1}".format("world",1)

Tipuri de date numerice

ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

# Write oneone string


# hello students, lab 1

# hello world, lab 1


# incepand cu python 2.6

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

n Python se poate lucra cu numere ntregi i numere n virgul mobil. Numerele ntregi dintr-o
expresie se convertesc automat n numere n virgul mobil dac este necesar. Cele patru tipuri
numerice int, long, float i complex i operaiile acestora sunt descrise n API. n afar de operaiile
aritmetice standard (+,-,*,/), exist operatori pentru modulo % i pentru ridicarea la putere **.
Deoarece Python este strongly typed, nu se face conversie automat ntre tipurile de date dintr-o
expresie, cum ar fi operaiile ntre tipurile String i Integer. Pentru acest lucru se folosesc funciile
int(some_string) pentru transformarea din string n integer i respectiv: str(some_int) sau
repr(some_int) sau `some_int` (` - backquote) pentru transformarea din integer n string.
Atenie! n cazul transformrii din string n integer, dac stringul ce trebuie convertit conine i alte
caractere dect cifre, la execuie va aprea o eroare: Value Error: invalid literal for
int() with base 10.
lab1_num_example
print
print
print
print
print
print

"Un string:", "4" + "2"


"Un numar:", 4 % 3 + int("41")
"Un string:", "4" + str(2)
'persoana %s are %d ani' % ("X", 42)
(2.0 + 3.0j) * (2.1 -6.0j)
2 ** 3 ** 2

#
#
#
#
#
#

Un string: 42
Un numar: 42
Un string: 42
persoana X are 42 ani
(22.2-5.7j)
512

Tipurile de date numerice i irurile de caractere sunt obiecte immutable, adic starea lor (valoarea)
nu mai poate fi schimbat dup ce sunt construite (ca i n cazul String i tipurilor numerice din Java).
Mai multe detalii gsii n Python datamodel. Pentru un exemplu de mutable vs immutable putei
urmri exemplul de la seciunea Liste i tupluri.

Liste i Tupluri
Python pune la dispoziie dou tipuri de structuri pentru a reprezenta liste de elemente: tupluri i liste.
Diferena principal dintre cele dou tipuri este c tuplul nu mai poate fi modificat dup ce a fost
declarat, fiind obiect immutable.

lista se declar folosind paranteze drepte: [].


tuplul se declar folosind paranteze rotunde: ().
elementele unei liste sau ale unui tuplu pot fi de tipuri diferite.
nu exist vectori n Python, ns exist un modul array care se comport ca o list cu restricii
asupra tipului elementelor din ea.
design tip: de obicei tuplurile se folosesc pentru date heterogene, iar listele pentru date omogene
(toate de acelai tip)

lista = ["string", 10]


tuplu = ("string", 10)
Accesarea elementelor unei liste sau unui tuplu se face la fel ca n cazul irurilor de caractere, cu
indeci pozitivi, negativi sau folosind operatorul :. Spre deosebire de stringuri i tupluri, elementele
unei liste pot fi modificate cu ajutorul accesrii prin indeci.
http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

9/19

Introducere n limbajul Python

Operaii utile (lista complet este dat n documentaie):

len(lista) - ntoarce numrul de elemente din list


lista.append(x) - adaug un element la sfritul listei
lista.extend(alta_lista) - concateneaz alta_lista la lista
lista.sort() - sorteaz elementele listei
lista.reverse() - inverseaz ordinea elementelor din list
afiarea unei liste se poate face folosind un simplu print <nume_lista>.
putem referi o sublist a unei liste, ajutndu-ne de doi indeci: sublista =
lista[index1:index2]

lab1_list_example
alta_lista = [1,2,3,4]
lista = []
lista.append(5)
lista.extend(alta_lista)
del lista[0]
del lista[0:2]
print [1,2,3][2:2]
print [1,2,3][0:2]
print [1,2,3][2:5]

#
#
#
#
#
#
#

lista va
lista va
lista va
lista va
afiseaza
afiseaza
afiseaza

fi [5]
fi [5, 1 ,2, 3, 4]
fi [1, 2, 3, 4]
fi [3, 4]
[]
[1, 2]
[3]

Elementele unui tuplu nu mai pot fi modificate dup ce au fost declarate. Din acest motiv nicio funcie
prezentat mai sus ce modific elementele unei liste nu poate fi aplicat asupra tuplurilor. Exemplul
de mai jos ilustreaz faptul c listele pot fi modificate i sunt mutable, iar tuplurile immutable.
>>> a = [1,2,3]
>>> b = a
>>> b[1] = 5
>>> b
[1, 5, 3]
>>> a
[1, 5, 3]
>>> t = (1,2,3)
>>> t[1] = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

O nou list poate fi creat din alt list folosind list comprehensions: o expresie urmat de o
clauza for, apoi de 0 sau mai multe clauze for sau if.
>>> print [ elem*2 for elem in [1,2,3,4] if elem!= 3]
>>> print [(x, x**2) for x in [1,2,3,4]]
[(1, 1), (2, 4), (3, 9), (4, 16)]

ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

Dicionare
O structur dicionar este un set neordonat de chei i valori n care valoarea poate fi cautat
folosindu-se cheia. Cheile sunt obiecte hashable, ceea ce presupune c au o funcie hash ce ntoarce
ntotdeauna aceeai valore pentru obiectul respectiv. Atenie! listele, dicionarele i alte tipuri de
date mutable nu sunt hashable, deci folosirea lor drept chei nu este posibil.

dicionarele sunt declarate folosind acolade, elementele sunt de forma cheie:valoare, desprite
de virgule.
ordinea de stocare este arbitrar, iar cheile pot s fie de tipuri diferite

dict={}
dict[0] = "primul"
dict["unu"] = 2
print dict
dict2 = dict
dict2[3] = "ceva"

# {0: 'primul', 'unu': 2}

del dict2["unu"]
print dict
print len(dict)
print dict.has_key("5")
if 0 in dict:
dict["3"] = 2
print dict
print dict.keys()

# {0: 'primul', 3: 'ceva'}


# 2
# False

# {0: 'primul', '3': 2, 3: 'ceva'}


# [0, '3', 3]

Cteva operaii utile (lista complet o gsii n documentaie):

len(some_dict) - pentru a afla dimensiunea unui dicionar


del some_dict[cheie] - pentru a terge o intrare din dicionar
operatorul in - pentru a afla dac o cheie este n dicionar. Similar se poate folosi funcia
has_key(cheie)
keys() - ntoarce o list ce conine toate cheile din dicionar

Structuri condiionale
if conditie1:
instructiuni
elif conditie2:
instructiuni
else:
instructiuni

Pot exista mai multe seciuni elif sau nici una, iar seciunea else apare o dat sau niciodat.
Numarul 0, listele i tuplurile goale, string-urile vide i valoarea None sunt considerate False dac

http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

11/19

Introducere n limbajul Python

sunt folosite n evaluarea unei condiii.

Python nu ofer vreo construcie de tip switch, iar operatorul condiional nu are forma ?:, ci x if
cond else y .
>>> a = 1
>>> b=0 if a>0 else 2
>>> b
0

Structuri repetitive
Instruciunea ''for''
Instruciunea for itereaz dup elementele unei secvene, fie ea String, list sau tuple.
for elem in lista:
instructiuni
n partea de dup in din for-uri se folosesc i funcii care ntorc liste, ca de exemplu range():

range(stop) sau range(start, stop [,step]) - formeaz o list cu elemente mai mici ca
stop n progresie aritmetic, cu raia step. Primul element al listei este start. Implicit start este
0 si raia este 1.

for i in range(len(s)):
print s[i]

Instruciunea ''while''
Instruciunea while continu iteraia ct timp condiia specificat este adevarat.
while conditie:
instructiuni
Instruciunea break termin forat orice bucl while sau for, iar instruciunea continue sare la
urmtoarea iteraie.

Clauza ''else''
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

Instruciunile while i for pot avea o clauz else. Aceasta se execut cnd se termin lista dup
care se face iteraia for sau atunci cnd condiia while a devenit False. Instruciunile din clauza
else nu se execut n cazul n care bucla este terminat printr-o instruciune break.
De ce avem nevoie de aa ceva? n exemplul urmtor avem cazul clasic n care ieim din bucl cnd
se ndeplinete o condiie i vrem s tim n codul de dup bucl dac s-a ajuns la acea condiie sau
nu.
s = [1,2,3,0,3,4]
exists = False
for i in s:
if i == 0:
exists = True
break
if exists:
print "Exista"
else: print "Nu exista"
Folosind clauza else nu mai avem nevoie nici de variabila intermediar, nici de verificarea acesteia
dup bucl.
s = [1,2,3,0,3,4]
for i in s:
if i == 0:
print "Exista"
break
else:
print "Nu exista"

Funcii
Funciile sunt definite folosind cuvntul cheie def urmat de o list de argumente i apoi de :.

lista de argumente conine doar numele acestora, tipul lor fiind cel trimis la apelul funciei.
se pot specifica valori implicite pentru parametrii unei funcii, iar dac la apelare nu se include
acel parametru este luat valoarea implicit
dac nu se include return sau se execut return far argumente, atunci funcia va ntoarce None.
dac o metod vrei s o lsai fr implementare, folosii keyword-ul pass

def fractie(x, y=1):


# y are valoare implicita
if (y==0):
return
# va ntoarce None
else:
return float(x)/float( y)
def fractie2():
#TODO
pass

http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

print fractie(6, 4)
print fractie(6)

13/19

Introducere n limbajul Python

# y va fi 1

Funciile mai pot fi apelate folosind mapri de forma: nume_parametru = valoare. Pentru
exemplul de mai sus se mai poate apela funcia i astfel:
fractie(y=7, x=5)
fractie(6, y=1)

# in cazul acesta nu mai conteaza ordinea

Dac o funcie are un parametru de forma *lista, atunci la apelare acesta va conine un tuplu de
argumente, ca n exemplul urmtor:
def suma(*lista):
s=0
for i in lista:
s=s+i
return s
print suma(2,3,5)
Dac o funcie are un parametru de forma **nume, atunci la apelare acesta va conine un dicionar
de argumente, ca n exemplul urmtor:
def afisare(**nume):
for i in nume.keys():
print i,':',nume[i]
afisare(client="Alex", vanzator="Alina")
Execuia instruciunilor de mai sus va afia:
client : Alex
vanzator : Alina

Python ofer o serie de funcii predefinite (built-in functions) cum ar fi: len pentru lungimea unui
obiect de tip colecie, id care n implementarea CPython ntoarce adresa de memorie a obiectului,
funcii de conversie de tip cum ar fi str, int, float, bool, etc.

Variabile globale
Pentru a accesa variabilele globale ale programului ntr-o funcie, trebuie s folosim cuvntul cheie
global cu sintaxa: global some_var.
Nu este necesar folosirea acestui cuvnt cheie atunci cnd n funcie doar se citete variabila
respectiv. Este obligatorie folosirea global doar dac n funcie se dorete modificarea valorii
variabilei. Fr aceast declaraie s-ar crea o nou variabil local funciei, care nu ar afecta valoarea
variabilei globale.
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

Includerea de cod extern


n Python se pot include funcii, variabile i clase definite n alte fiiere. Un astfel de fiier, ce poate fi
inclus, poart denumirea de modul. Exemplu:
import random
Atunci cnd includem modulul putem s l folosim cu un alt nume, eventual, pentru a evita coliziuni de
denumiri:
import random as rand
Instruciunea import din exemplul de mai sus nu ncarc n tabela de simboluri numele funciilor
definite n modulul random, ci doar numele modulului. Folosind acest nume se pot accesa funcii
definite n interiorul modulului folosindu-se sintaxa nume_modul.nume_functie(parametri).
random.random()
Un alt mod de a include este folosind from <nume_modul> import <lista_constructii>, n
felul acesta vom avea acces doar la clasele/metodele din modul precizate n <lista_constructii>.
Aceast modalitate este indicat atunci cnd un modul are un numr foarte mare de clase. Un alt
avantaj al acestei metode este c nu se mai folosete numele modulului atunci cnd se utilizeaz
aceast construcie, ca n exemplul de mai jos:
from random import random # se include doar metoda random()
random()
# se apeleaza metoda random

Excepii
Ca i Java i alte limbaje de nivel nalt, Python ofer suport pentru excepii. Pentru prinderea
excepiilor aruncate de ctre funcii se folosete mecanismul try-except, asemnator celui
try-catch din Java.
try:
x = int(buffer)
except ValueError as e:
print "Date de intrare invalide"
finally:
# clean-up
Mecanismul funcioneaz n felul urmtor:

se execut instruciunile din blocul try


dac apare o excepie tratat de un bloc except, execuia sare la instruciunile din blocul respectiv.

http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

15/19

Introducere n limbajul Python

Dup ce excepia este tratat, execuia continu cu prima instructiune de dup blocul try
dac apare o excepie ce nu este tratat de niciun bloc except, aceasta continu s fie propagat.
instruciunile din blocul finally se execut ntotdeauna, indiferent dac a fost prins o excepie
sau nu, iar excepiile netratate se arunc dupa ce se execut blocul finally. Blocul acesta este
opional i este folosit pentru aciuni de clean-up, de exemplu nchiderea fiierelor.

O excepie poate fi aruncat folosind instruciunea raise. Aceasta poate fi folosit i far argumente
n interiorul unui bloc except pentru a re-arunca excepia prins de blocul respectiv.
if (j>100):
raise ValueError(j)
O instruciune try poate avea mai multe clauze except. Ultima clauz except poate s nu aib
specificat nicio excepie de tratat fiind astfel folosit pentru a trata toate exceptiile netratate de
celelalte clauze.

Pe lng while i for, i construciile try-except pot avea opional i o clauz else. Instruciunile
din blocul else sunt executate atunci cnd blocul try nu genereaz nicio excepie.
Python ofer un set de excepii predefinite (built-in), coninute n modulul exceptions (lista lor este
n documentaie). n afar de acestea, pentru a v defini propriile excepii este necesar s creai o
subclas a clasei Exception.
Putei folosi n loc de blocul try-except i keyword-ul with, ca n exemplul din seciunea Operaii cu
fiiere. Aceast construcie apeleaz automat o metod de clean-up a obiectului (ex: close pentru
fiiere) la apariia unei excepii. Acest construcie o vom folosi n laboratoarele urmtoare i pentru
obiectele de sincronizare.

Operaii cu fiiere
Lucrul cu fiiere este, de asemenea, simplu, iar obiectele i metodele utilizate sunt oferite n modulul
io.
Pentru a obine un obiect de tip fiier, se apeleaz funcia open, de obicei cu doi parametri:

numele (calea) fiierului


modul de acces
r - read only
w - write only i dac exist va fi suprascris
a - append
r+ - citire i scriere
rb, wb, r+b - deschide fiierul n mod binar

import io
f = open('input.txt','w')
f.write("hello")
f.close()
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

Odat obinut obiectul fiier f, se vor putea folosi funciile pentru lucrul cu fiiere: read, readline,
readlines, write, seek sau close ca metode ale clasei file (e.g. f.read()).
Spre deosebire de Java, Python nu v oblig s ncadrai codul de lucru cu fiierele ntr-un bloc
try/catch pentru a preveni eventualele excepii. Este recomandat ns s l ncadrai n try/except, sau
s folosii operatorul with introdus n Python 2.5, ca n exemplul urmtor.
with open('in.txt', 'r') as f:
for line in f:
#citire linie cu linie din fisier
print line
Pentru manipularea path-urilor, verificarea fiierelor i directoarelor i alte operaii cu acestea putei
folosi funciile din modulele os i os.path. Exemplul urmtor folosete funciile de verificare a
existenei i tipului unui path.
import os, os.path
if not os.path.exists(output_folder):
os.mkdir(output_folder)
elif not os.path.isdir(output_folder):
print "Given path is not a folder"

Main-ul
Construcia __main__ este opional n scripturile Python, i rolul su este similar funciilor main din
alte limbaje (C, Java etc).
Codul coninut ntr-un script Python este executat i fr prezena acestui mecanism, nsa
dezavantajul omiterii lui este c atunci cnd se include fiierul cu import se va executa i codul din
el, ca n exemplul urmtor:
utilities.py
def f1():
print "hello1"
f1()

mymodule.py
import utilities
utilities.f1()

$ python mymodule.py
hello1
hello1

http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

17/19

Introducere n limbajul Python

Dac n modulul utilities apelul funciei f1() se afla ntr-un __main__, aceasta nu se apela, deoarece
__name__ este numele modulului inclus i codul de dup if __name__ == "__main__": nu se va
executa.
def f1():
print __name__
print "hello1"
if __name__ == "__main__":
f1()
$ python mymodule.py
utilities
hello1
$ python utilities.py
__main__
hello1

Module utile
random
Generarea de numere pseudo-aleatoare se face la fel de uor ca i n alte limbaje.

se include modulul random (import random)


se stabilete eventual seed-ul folosind random.seed
se apeleaz metodele oferite n modul, cum ar fi random.randint(a,b), ce va ntoarce un ntreg
cuprins n intervalul nchis [a,b].

pickle
n unele cazuri, pentru a scrie obiecte Python n fiiere, a le stoca n baze de date sau a le transmite
pe sockets, acestea trebuie transformate ntr-un string, proces numit pickling n Python (iar
procesul invers: unpickling). Folosind modulul pickle cu funciile pickle.dump i pickle.load,
acest lucru poate fi realizat cu usurin, ca n urmtorul exemplu:
# Salvam un dictionar intr-un fisier folosind pickle
import pickle
culoare_favorita = { "caisa": "galbena", "portocala": "orange", "cireasa":
"rosie" }
print culoare_favorita
pickle.dump(culoare_favorita, open("save.p", "w"))
# Incarcam dictionarul inapoi din fisier folosind pickle
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Last update: 2016/02/23 21:12

asc:lab1:index

http://cs.curs.pub.ro/wiki/asc/asc:lab1:index

culoarea_mea_fav = pickle.load(open("save.p"))
print culoarea_mea_fav
# culoarea_mea_fav e acum { "caisa": "galbena", "portocala": "orange",
"cireasa": "rosie" }

Exerciii
1. (2p) Afiai data i ceasul. Urmrii cerinele i indicaiile din fiierul hello.py din scheletul de
laborator
urmrii seciunea Stringuri i documentaia modului datetime
2. (3p) Citii textul unui fiier dat i afiai informaii despre acesta. Urmrii cerinele i indicaiile din
fiierul task2.py din scheletul de laborator.
urmrii seciunile Stringuri, Main-ul i Operaii cu fiiere
3. (4p) Implementai funcii care parseaz un fiier. Urmrii cerinele i indicaiile din fiierul
task3.py din scheletul de laborator.
urmrii seciunile Funcii, Stringuri, Main-ul i Operaii cu fiiere
4. (0.5p) Includei modulul de la exerciiul anterior i folosii o funcie din el. Urmrii cerinele i
indicaiile din fiierul task4.py din scheletul de laborator.
urmrii seciunea Includerea de cod extern
5. (0.5p) Rulai pylint pentru modulul de la exerciiul 3, observai statisticile i aducei cteva
mbunatiri ale code-style-ului (dac e cazul).
n linia de comand: pylint nume_modul
6. 0p - Recomandm parcurgerea (la laborator sau acas) a taskurilor din fiierul task5.py pentru a
observa diverse concepte: mutability, generators, is vs ==.
linkuri utile: String Interning (aka pooling), Generators, articol despre folosirea 'is'

Folosii documentaia modulelor Python necesare n exerciii! n documentaie avei i exemple de


utilizare ale unor metode sau construcii de limbaj.

string - pentru lucrul cu iruri de caractere


Sequence Types - pentru liste i dictionare
io module - pentru lucrul cu fiiere

Resurse

Responsabilul acestui laborator: Adriana Drghici


PDF laborator
Schelet laborator
Soluie laborator
Exerciiile (cu soluii) de anii trecui (sunt mai multe i abordeaz concepte mai avansate, de
exemplu generatori): lab1_exercitii_2014.zip, lab1-skel-2015.zip, lab1-sol-2015.zip

http://cs.curs.pub.ro/wiki/asc/

Printed on 2016/02/23 22:38

2016/02/23 22:38

19/19

Referine

Documentaie Oficial
Google Python Class
Style Guide for Python Code
Cri
Learn Python the hard way - free online
Learning Python by Mark Lutz, O'Reilly Media, 5th Edition
Fun Stuff
Interesting Features
http://openbookproject.net/py4fun/
http://www.pythonchallenge.com/

From:
http://cs.curs.pub.ro/wiki/asc/ - ASC Wiki
Permanent link:
http://cs.curs.pub.ro/wiki/asc/asc:lab1:index
Last update: 2016/02/23 21:12

ASC Wiki - http://cs.curs.pub.ro/wiki/asc/

Introducere n limbajul Python