Introducere in Limbajul Python
Introducere in Limbajul Python
1/19
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/
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/
2016/02/23 22:38
3/19
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.
$ 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/
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/
2016/02/23 22:38
5/19
[...]
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.
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
i = "Hello"
asc:lab1:index
http://cs.curs.pub.ro/wiki/asc/asc:lab1:index
# i va fi de tip String
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/
2016/02/23 22:38
7/19
lab1_string_example.py
s = "string"
print s[0:2]
print s[:3]
print s[3:]
s2 = "one"
# st
# str
# ing
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: 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.
2016/02/23 22:38
9/19
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: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"
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()
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/
2016/02/23 22:38
11/19
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/
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
http://cs.curs.pub.ro/wiki/asc/
2016/02/23 22:38
print fractie(6, 4)
print fractie(6)
13/19
# 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)
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/
asc:lab1:index
http://cs.curs.pub.ro/wiki/asc/asc:lab1:index
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:
http://cs.curs.pub.ro/wiki/asc/
2016/02/23 22:38
15/19
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:
import io
f = open('input.txt','w')
f.write("hello")
f.close()
ASC Wiki - http://cs.curs.pub.ro/wiki/asc/
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/
2016/02/23 22:38
17/19
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.
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/
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'
Resurse
http://cs.curs.pub.ro/wiki/asc/
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