Python

35
Introducere in Python Cuprins 1. Primii pasi in Python 2. Ce este Python? 3. Unde se gaseste? 4. Cum se ruleaza un program Python? 5. Cateva precizari inainte de a scrie primul program 6. Tipuri de date si variabile 7. Stringuri 8. Liste si Tupluri 9. Dictionare 10. Structuri conditionale 11. Structuri repetitive 12. Functii 13. Includerea de cod extern 14. Clase si obiecte 15. Exceptii 16. Alte particularitati Python 17. Exemple de programe rezolvate 18. Exercitii propuse 19. Resurse Primii pasi in Python Python este un limbaj de scripting de nivel inalt. Vom prezenta in continuare primii pasi care trebuie facuti pentru a scrie un program Python, cateva exemple si unele ponturi care sa va ajute in depasirea problemelor de inceput. Ce este Python? Python este un limbaj de programare care castiga tot mai multa popularitate, fiind comparat uneori cu Perl. Ce este de fapt Python? Este un limbaj de scripting, ceea ce inseamna ca este interpretat si nu compilat, economisind mult timp in procesul de dezvoltare si depanare. Python este un limbaj de nivel inalt - permite scrierea de programe complexe mult mai rapid si usor decat in limbaje de genul C sau C++. Limbajul combina o putere remarcabila cu o sintaxa foarte clara. Are module, clase, exceptii si tipuri dinamice de nivel inalt. Ofera interfete la multe apeluri sistem si librarii, precum si la diverse sisteme de ferestre (X11, Motif, Tk, Mac, MFC). Implementarea Python este portabila: ruleaza pe Linux, Unix, Windows, OS/2, Mac OS X, Amiga si chiar pe unele telefoane mobile de la Nokia. Python a fost portat, de asemenea, pe masinile virtuale Java si .NET. 1

Transcript of Python

Page 1: Python

Introducere in Python

Cuprins

1. Primii pasi in Python2. Ce este Python?3. Unde se gaseste?4. Cum se ruleaza un program Python?5. Cateva precizari inainte de a scrie primul program6. Tipuri de date si variabile7. Stringuri8. Liste si Tupluri9. Dictionare10. Structuri conditionale11. Structuri repetitive12. Functii13. Includerea de cod extern14. Clase si obiecte15. Exceptii16. Alte particularitati Python17. Exemple de programe rezolvate18. Exercitii propuse19. Resurse

Primii pasi in Python

Python este un limbaj de scripting de nivel inalt. Vom prezenta in continuare primii pasi care trebuie facuti pentru a scrie un program Python, cateva exemple si unele ponturi care sa va ajute in depasirea problemelor de inceput.

Ce este Python?

Python este un limbaj de programare care castiga tot mai multa popularitate, fiind comparat uneori cu Perl. Ce este de fapt Python? Este un limbaj de scripting, ceea ce inseamna ca este interpretat si nu compilat, economisind mult timp in procesul de dezvoltare si depanare.

Python este un limbaj de nivel inalt - permite scrierea de programe complexe mult mai rapid si usor decat in limbaje de genul C sau C++.

Limbajul combina o putere remarcabila cu o sintaxa foarte clara. Are module, clase, exceptii si tipuri dinamice de nivel inalt. Ofera interfete la multe apeluri sistem si librarii, precum si la diverse sisteme de ferestre (X11, Motif, Tk, Mac, MFC).

Implementarea Python este portabila: ruleaza pe Linux, Unix, Windows, OS/2, Mac OS X, Amiga si chiar pe unele telefoane mobile de la Nokia. Python a fost portat, de asemenea, pe masinile virtuale Java si .NET.

Unde se gaseste?

Python se poate downloada de pe site-ul oficial, sectiunea Download.

Pe un system Linux, e posibil sa fie deja instalat. Verificati asta dintr-o consola:

$ pythonPython 2.3.4 (#2, Sep 24 2004, 08:39:09)[GCC 3.3.4 (Debian 1:3.3.4-12)] on linux2Type "help", "copyright", "credits" or "license" for more information.

1

Page 2: Python

>>>Daca nu il aveti instalat, pasul urmator ar fi sa-l cautati pe CD-urile distributiei de Linux cu care lucrati. O alternativa ar fi folosirea serviciului apt-get de pe o distributie Debian (sau yum pentru RedHat).

apt-get install pythonSau il puteti descarca, apoi compila si instala manual:

./configuremakemake installPe un system Windows se poate downloada de la Download fisierul Python 2.5.2 Windows installer (versiunea 2.5.2 incepand cu 22 Feb 2008). Se ruleaza fisierul: python-2.5.2.msi (apoi se urmeaza pasii de instalare). Dupa instalare se poate adauga calea catre executabilul python in global PATH, pentru a putea fi gasit de oriunde: “Control Panel” -> “System” ->[in plus pt Windows Vista: -> “Advanced System Settings” in partea superioara stanga] -> Tabul “Advanced” -> “Environment Variables” -> In zona de “System Variables” se cauta variabila “path” in lista, se da “Edit” ->se adauga la sfarsitul randului “Variable value” caracterul “;” urmat de calea catre executabilul “python.exe” (de ex, se adauga: “;c:\Python25”, fara ghilimele) -> 3xOK. Cum se ruleaza un program Python?

In Windows, daca extensia .py este deja inregistrata, un dublu-clik pe numele scriptului este suficient. Se poate edita programul folosind IDLE (Python GUI) si apasand tasta F5 pentru rulare sau se poate executa din consola (Start->Run->cmd).

Daca folositi Linux, exista mai multe posibilitati:

fie se lanseaza 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!

Cateva precizari inainte de a scrie primul program

Python este un limbaj interpretat. In Python, o linie noua termina o declaratie; pentru a continua o declaratie pe mai multe linii, se foloseste caracterul ”\”.

In Python pe langa liniile noi, indentarea este mai mult decat parte a stilului de programare, este chiar parte din sintaxa (identarea se refera la spatiile/distanta intre inceputul unui rand si primul cuvant). Un bloc de cod are toate liniile identate cu acelasi numar de spatii (nu exista begin si end sau {} ca in C). Instructiunile dintr-un bloc de cod vor fi grupate unele sub altele, pe acelasi nivel de identare. Structurile de control, definirea de rutine, clase, toate necesita o mai mare grija in scrierea codului. Exemplu de folosire a identarii pentru a delimita blocurile de cod :

a = 1

"""

2

Page 3: Python

Afisam numerele de la 1 la 10

"""

while a <= 10:

print a,

a += 1

#b = 1

b = 2

print "Am terminat"

Definitiile neindentate intr-un program Python vor fi de obicei variabile globale, definitii de clase, proceduri, functii sau parti ale "programului principal".

Dupa cum se observa si din exemplul de mai sus, dupa instructiuni nu se pune simbolul ";" precum in alte limbaje de programare, indentarea corespunzatoare fiind suficienta.

Este foarte important sa nu uitati simbolul ":" care precede de obicei o indentare, deoarece omiterea sa poate sa fie cauza multor erori, cel putin la inceput.

O singura linie se poate comenta in Python folosind simbolul "#". Pentru comentarii multiline se folosesc trei ghilimele succesive """ (sau ''') la inceputul si respectiv la sfarsitul zonei de comentat.

Tipuri de date si variabile

In Python se poate lucra cu numere intregi si numere in virgula mobila. Numerele intregi dintr-o expresie se convertesc automat in numere in virgula mobila daca este necesar.

Numele de variabile si functii sunt case-sensitive. La definirea variabilelor nu trebuie precizat tipul acestora. Python asociaza numele unei variabile cu un obiect, care poate fi numar, string sau ceva mai complex. Cand este folosita o variabila, tipul acesteia este tipul obiectului cu care este asociata. Este gresita folosirea intr-o expresie a unei variabile care nu a fost asociata cu un obiect. Astfel, daca se scrie:

i = 5i va fi de tip intreg. Daca se scrie:

i = "Hello" i va fi de tip string. Python nu face conversie automata intre tipurile string si integer. Pentru acest lucru se folosesc funtiile int(some_string) pentru transfomarea din string in integer si respectiv: str(some_int) sau repr(some_int) sau `some_int` (caracterul de pe tasta cu ~) pentru transfomarea din integer in string. Se poate folosi si scrierea formatata folosind structura '[string]%type[string] ' % (var_name). Atentie! In cazul transformarii din string in integer, daca stringul ce trebuie convertit contine si alte caractere decat cifre, la rulare va aparea o eroare: ValueError: invalid literal for int() with base 10. De exemplu, rularea instructiunilor:i = "1"j = "2"a = 1b = 2print "Un string:", i+jprint "Un numar:", int(i)+int(j)print "Un string", str(a)+str(b)print "Afisare formatata:", 'persoana %s are %d ani' % (j, a)va afisa:

3

Page 4: Python

Un string: 12Un numar: 3Un string 12Afisare formatata: persoana 2 are 1 aniAlocarea si dealocarea de memorie se face automat de catre Python.

In Python se poate lucra direct cu numere complexe, folosind sintaxa: a+bj unde a = partea reala si b = partea imaginara. De exemplu, rularea instructiunii:

print (2.0+3.0j)*(2.1-6.0j)

va afisa:

(22.2-5.7j)In Python se poate face atribuirea de valori la mai multe variabile simultan:

x, y = 2, 3Datorita faptului ca partea dreapta a unei expresii este evaluata inainte de a se face atribuirea, valorile a doua variabile pot fi foarte usor interschimbate, fara a avea nevoie de o a treia variabila:

x, y = y, xIn Python, se folosesc simbolurile aritmetice standard, cu % pentru operatia modulo.

Stringuri

Stringurile sunt incluse intre ghilimele " (sau '). Stringurile ce contin mai multe linii sunt inconjurate de trei ghilimele succesive """ (sau ''').

s = "string"linie = """textpe mai multe linii"""Stringurile sunt tratate ca vectori, cuvant[i] fiind caracterul din sir ce are indexul i; i ia valori in intervalul [-length,length). Folosirea unei valori in afara acestui interval va genera o eroare (IndexError: string index out of range). Nu exista un tip de date special pentru a defini un caracter (acesta e vazut ca un sir de lungime 1). Lungimea unui string se poate afla cu ajutorul functiei: len(some_string).

stringul: s t r i n gindex: 0 1 2 3 4 5index negativ: -6 -5 -4 -3 -2 -1Caracterul ”:” specifica un substring al unui sir folosing sintaxa: some_string[x:y]. Substringul obtinut contine toate caracterele din sirul initial (some_string) intre pozitiile x si y-1 (inclusiv). Daca nu se specifica x sau y, acestea au implicit valorile 0, respectiv lungimea sirului.

Nu se pot modifica caracterele unui sir folosind adresarea cu indici in atribuire (NU se poate face de exemplu: s[1] = "x").

Sirurile de caractere pot fi concatenate folosind simbolul ”+” si pot fi multiplicate folosind caracterul ”*”. De exemplu, rularea instructiunilor:

s = "string"print s[0:2]print s[:3]print s[3:]s2 = "one"print "Write " + 2*s2 + " " + sva afisa:

ststringWrite oneone string

4

Page 5: Python

Mai multe detalii despre metode de stringuri se pot gasi [aici].

Liste si Tupluri

Python pune la dispozitie doua tipuri de structuri pentru a grupa mai multe elemente : tupluri si liste. Diferenta principala dintre cele doua tipuri este ca tuplul nu mai poate fi modificat dupa ce a fost declarat.

Lista se declara folosind paranteze drepte.

Tuplul se declara folosind paranteze rotunde.

Elementele unei liste sau ale unui tuplu pot fi de tipuri diferite.

lista = ["string", 10]tuplu = ("string", 10) Accesarea elementelor unei liste sau unui tuplu se face la fel ca in cazul sirurilor de caractere, cu indecsi pozitivi, negativi sau folosing operatorul ”:” .

Spre deosebire de stringuri elementele unei liste pot si modificate cu ajutorul accesarii prin indecsi. Se pot adauga elemente intr-o lista folosind functia append() si se pot combina doua liste folosind functia extend().

lista.append(5)lista.extend(alta_lista)Elementele unei liste se pot sterge folosindu-se del.

del lista[2]del lista[0:2]O noua lista poate fi creata din alta lista folosind ”list comprehensions” (o expresie urmata de o clauza for, apoi de 0 sau mai multe clauze for sau if. De exemplu, rularea instructiunilor:

lista_veche = [1,2,3,4]lista = [ elem*2 for elem in lista_veche if elem!= 3]print listaprint [(x, x**2) for x in lista_veche]va afisa:

[2, 4, 8][(1, 1), (2, 4), (3, 9), (4, 16)] In expresia de mai sus, if este optional.Numarul de elemente dintr-o lista sau un tuplu se poate afla folosind functia len().

Elementele unui tuplu nu mai pot fi modificate dupa ce au fost declarate. Din acest motiv nici o functie prezentata mai sus ce modifica elementele unei liste nu poate fi aplicata asupra tuplurilor.

Dictionare

O structura dictionar este un set neordonat de chei si valori in care valoarea poate fi cautata folosindu-se cheia. Cheile sunt de obicei numere intregi sau stringuri. Ele pot sa fie in orice ordine si pot sa nu fie de acelasi tip.

dict[0] = "primul"dict["unu"] = 2Pentru a acesa un element al unui dictionar se procedeaza in felul urmator:

var = dict[0]sau

var = dict["unu"]

5

Page 6: Python

Dictionarele sunt declarate folosind acolade, elementele sunt de forma cheie:valoare despartite de virgule.

dict = {0: "primul" , "unu":2}Se poate afla dimensiunea unui dictionar folosindu-se functia len() (cu sintaxa: len(some_dict) ) si se poate sterge o intrare din dictionar folosindu-se del (cu sintaxa: del some_dict[index]).

In plus se poate verifica daca exista o valoare pentru o cheie data. Pentru o versiune Python mai veche de 2.2. se foloseste functia has_key a obiectului dictionar. O data cu versiunea 2.2. exista operatorul in care inlocuieste functia de mai sus.

if mykey in dict: [code]Functia keys() a obiectului dictionar returneaza o lista ce contine toate cheile din dictionar.

Structuri conditionale

if conditie1: instructiunielif conditie2: instructiunielse: instructiuni

Pot exista mai multe sectiuni elif sau nici una iar sectiunea else apare o data sau niciodata.

Numarul 0, liste si tupluri goale, stringuri vide si valoarea None sunt considerate false daca sunt folosite in evaluarea unei conditii.

Structuri repetitive

Instructiunea for functioneaza dupa elementele unei secvente(string, lista sau tuplu).

for el in lista: [instrutiuni] Operatorul range() construieste o lista cu elemente in progresie aritmetica. Are urmatoarea sintaxa: range(x[,y[,pas]]) - formeaza o lista cu elemente mai mici ca y in progresie aritmetica, cu ratia pas. Primul element al listei este x. Implicit x este 0 si ratia este 1.

for i in range( len(s)): print s[i] Instructiunea while continua iteratia cat timp conditia specificata este adevarata.

while conditie: [instructiuni] Instructiunea break termina fortat orice bucla while sau for, iar instructiunea continue sare la urmatoarea iteratie.

Instructiunile while si for pot avea o clauza else. Aceasta se executa cand se termina lista dupa care se face iteratia for sau atunci cand conditia while a devenit false. Instructiunile din clauza else nu se executa in cazul in care bucla este terminata printr-o instructiune break.

while conditie: [instructiuni]else:

6

Page 7: Python

[instructiuni]

Functii

Functile sunt definite folosind cuvantul def. Rularea instructiunilor:

def fractie(x,y): if (y==0): return else: return float(x)/float( y)print fractie(6,4) va afisa:

1.5 Se specifica doar numele argumentelor, tipul lor fiind cel trimis la apelarea functiei.

Pentru a accesa variabilele globale ale programului, trebuie sa folosim cuvantul-cheie "global" cu sintaxa: global some_var.

Prima instructiune din corpul unei functii poate fi un sir de caractere, acest sir fiind documentatia functiei.

Functiile care se termina fara sa foloseasca instructiunea return sau care executa return fara argumente, intorc o valoare None.

Se pot specifica valori implicite pentru parametrii unei functii.

def fractie(x, y=1): La apelare se pot specifica doua valori sau doar una. Daca functia se apeleaza cu doua valori nu se tine cont de valoarea implicita a lui y, daca se apeleaza cu o valoare (de ex fractie(4) ), x va lua valoarea 4, iar y valoarea implicita 1.

Functiile mai pot fi apelate folosind, in loc de argumente, cuvinte cheie de forma: cuvant_cheie = valoare. Pentru exemplul de mai sus se poate mai apela functia si astfel :

fractie(y=7, x=5)fractie(6,y=1) Daca o functie are un parametru de tipul *lista, atunci la apelare functia va primi o lista de argumente. Rularea instructiunilor:

def suma(*lista): s=0 for i in lista: s=s+i return s print suma(2,3,5) va afisa:

10 # adica 2+3+5 Daca o functie are un parametru de tipul **nume, atunci la apelare functia va primi o lista de cuvinte cheie de forma cuv_cheie = valoare. Rularea instructiunilor:

def afisare(**nume): for i in nume.keys(): print i,':',nume[i]va afisa:

7

Page 8: Python

client : Alexvanzator : Alina

Includerea de cod extern

In Python se pot include in alte programe functii scrise in alt fisier. Un astfel de fisier ce poate fi importat poarta denumirea de modul. Exemplu:

import random Instructiunea import din exemplul de mai sus nu incarca in tabela de simboluri numele functiilor definite in modulul random, ci doar numele modulului. Folosind acest nume se pot accesa functii definite in interiorul modulului folosindu-se sintaxa nume_modul.nume_functie(parametri).

random.random()

Clase si obiecte

Trebuie subliniat ca in Python, cuvantul "obiect" nu se refera neaparat la instantierea unei clase. Clasele in sine sunt obiecte, iar, in sens mai larg, in Python toate tipurile de date sunt obiecte. Exista tipuri de date care nu sunt clase: numerele intregi, listele, fisierele. Toate tipurile de date insa au aproximativ acelasi comportament, mai usor de explicat daca ne referim la aceste tipuri de date folosind cuvantul "obiect".

Un obiect se creaza in Python prin folosirea cuvantului cheie class:

class className [(super_class1 [, super_class2]*)]:[Suite]Creaza un obiect de tip clasa si ii da numele className. Suite poate contine definitii de metode locale si atribuiri pentru variabile locale. Clasa este derivata din super_class1 si din super_class2.

class MyClass (object): ...Creaza o clasa de tip "new-style" prin mostenire din object. Vechiul tip de clase nu mostenesc object.

In lucrul cu clase, trebuie stiute urmatoarele reguli:

Primul argument pentru metodele (operatiile) de instanta ale unei clase este intotdeauna obiectul sursa, numit "self" prin conventie. Cand ne referim la membri ai clasei, vom folosi self.membru, intr-un mod asemanator cu folosirea "this" din Java.Metoda speciala __init__() este apelata la instantierea clasei (crearea unui obiect de tipul clasei) si poate fi asemuita cu un constructor.Metoda speciala __del__() este apelata cand nu mai sunt referinte la acest obiect (mecanism de garbage collector) si poate fi asemuita cu un destructor.Instantierea se face prin apelarea obiectului clasa, posibil cu argumente (astfel instance=apply(aClassObject, args...) creaza o instanta). Spre exemplu:class Complex:def __init__(self, realpart, imagpart):self.r = realpartself.i = imagpartx = Complex( 3.0, -4.5)De multe ori vom implementa clase derivand din clasa Thread, caz in care ar trebui respectate urmatoarele reguli:

Subclasati threading.Thread()Suprascrieti __init__() si run()Nu suprascrieti start()In __init__(), apelati Thread.__init__()Exceptii

Unele apeluri de functii pot arunca exceptii care trebuie prinse. In Python exista mecanismul try-except, asemanator celui try-catch din Java.

try:

8

Page 9: Python

x = int(buffer)except(ValueError): print "Date de intrare invalide"Mecanismul functioneaza in felul urmator: se executa instructiunile din blocul try. Daca apare o exceptie tratata de un bloc except, executia sare la instructiunile din blocul repectiv. Dupa ce exceptia este tratata, executia continua cu prima instructiune din blocul try. Daca apare o exceptie ce nu este tratata de nici un bloc except, aceasta este propagata ascendent in alte blocuri try si primeste denumirea de excetie netratata (unhandled exception).

O exceptie poate fi aruncata folosind instructiunea raise. Aceasta poate fi folosita si fara argumente in interiorul unui bloc except pentru a re-arunca exceptia prinsa de blocul respectiv.

if (j>100): raise ValueError,jO instructiune try poate avea mai multe clauze except. Ultima clauza except poate sa nu aiba specificata nici o exceptie de tratat fiid astfel folosita pentru a trata toate exceptiile netratate de celelalte clauze.

Instructiunile try pot avea optional si o clauza else. Instructiunile din blocul else sunt executate atunci cand blocul try nu genereaza nici o exceptie.

Alte particularitati Python

Generarea de numere pseudo-aleatoare se face la fel de usor ca in alte limbaje. Se importa modulul random (import random), se seteaza eventual seed-ul folosind random.seed, iar random.randint(a,b) spre exemplu va intoarce un intreg cuprins in intervalul inchis [a,b].

Lucrul cu liste este foarte comod in Python. Listele pot fi folosite si sub forma de stiva sau coada prin intermediul functiilor puse la dispozitie (append() si pop() ). Afisarea unei liste se poate face folosind un simplu print lista.

O lista se initializeaza la fel de simplu:

lista = []Putem referi o sublista a unei liste, ajutandu-ne de doi indecsi:

sublista = lista[index1:index2]Indexarea se face de la zero. Mai sus, se vor intoarce elementele listei initiale de la index1 la index2-1. Astfel, lista[n: (n+1)] va intoarce o lista care contine un singur element, cel de pe pozitia n, iar lista[n:n] va intoarce [].

In plus, exista o suita de functii foarte utile pentru obiectele de tip lista. Cele mai folosite sunt:

len(lista) intoarce numarul de elemente din listalista.append(x) adauga un element la sfarsitul listeilista.extend(alta_lista) concateneaza alta_lista la listalista.sort() sorteaza elementele listeireverse() inverseaza ordinea elementelor din listaUnele apeluri de functii pot arunca exceptii care trebuie prinse. Exista mecanismul try-except, asemanator celui try-catch din Java.

Lucrul cu fisiere este, de asemenea, simplu. Pentru a obtine un obiect de tip fisier, se apeleaza functia open, de obicei cu doi parametri: numele (calea) fisierului si modul de acces (r - read only; w - write only si daca exista va fi suprascris; a - append; r+ - citire si scriere; rb, wb, r+b - deschide fisierul in mod binar):

f = open('input.txt','w')Odata obtinut obiectul fisier f, se vor putea folosi functiile pentru lucrul cu fisiere: read, readline, readlines, write, seek sau close ca metode ale clasei file (exemplu: f.read()).

Uneori, pentru a scrie obiecte Python in fisiere, acestea trebuie transformate intr-un string, proces numit pickling (iar procesul invers: unpickling). Folosind modulul pickle cu functiile pickle.dump si pickle.load, acest lucru poate fi realizat cu usurinta. Urmatorul exemplu este concludent:

# Salvam un dictionar intr-un fisier folosind pickle

9

Page 10: Python

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 pickleculoarea_mea_fav = pickle.load( open( "save.p" ) )print culoarea_mea_fav# culoarea_mea_fav e acum { "caisa": "galbena", "portocala": "orange", "cireasa": "rosie" }Pentru lucrul cu siruri de caractere exista functii ajutatoare precum rstrip, lower, etc.

Exemple de programe rezolvate

1) Calculul sumelor partiale a primelor N numere naturale

Iata un exemplu simplu de script Python, in care se defineste o rutina si se apeleaza. #!/usr/bin/python

# definim o functie care afiseaza numerele de la 1 la n si calculeaza suma lor

def calc_suma( n): # n este parametru al functiei

# virgula de la print suprima aparitia lui \n dupa textul tiparit

print 1,

suma = 1

i = 2

# nu uitati de ':' de la sfarsitul liniilor care preced sub-blocuri!

# adica dupa for, while, if, def etc.

while i <= n:

print "+", i,

suma += i

i += 1

print "=", suma

# raw_input citeste un string de la tastatura afisand promptul dat

# acest string se converteste la un intreg cu int(..). Daca nu se introduce un

# numar valid, se va genera o exceptie.

n = int(raw_input("Dati n="))

# range(a, b) intoarce o lista ce contine [a, a+1, ..., b-1]

for i in range(1, n+1):

calc_suma( i)

Exemplu de executie:

10

Page 11: Python

$ chmod +x sume_partiale.py

$ ./sume_partiale.py

Dati n=4

1 = 1

1 + 2 = 3

1 + 2 + 3 = 6

1 + 2 + 3 + 4 = 10

2) Calculul numerelor prime pana la un N dat

import math # import modulul math

from sys import argv # din modulul sys import lista argv (argumente in linia de comanda)

def isPrime(x): # definesc o functie care decide daca x e prim

for i in range(2, int(math.sqrt(x)+1)): # range(a, b) => lista [a, ..., b-1]

if x % i == 0: # nu uita de ':' !

return 0

return 1

def buildPrimes(max = 100): # se poate da o valoare implicita pentru parametru

result = [] # initializez lista

for i in range(1, max+1):

if isPrime(i):

result.append(i) # adaug la sfarsitul ei un nou element

return result

# pentru ca parametrul are o valoare implicita, vom putea apela si asa: buildPrimes()

if len(argv) == 2: # argv[0]=nume script; len(argv)==2 inseamna un argument in plus

n = int(argv[1])

print buildPrimes( n)

else: # daca nu am un parametru

try:

n=int(raw_input("Dati N= ")) # raw_input citeste un string de la tastatura

# daca a fost "prinsa" o exceptie:

except(ValueError):

11

Page 12: Python

print "Asteptam un numar intreg."

else:

for k in buildPrimes( n): # tiparesc fiecare numar din lista

print k,

print # print simplu inseamna de fapt newline

Exemple de executie:

$ python prim.py 30

[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

sau

$ python prim.py

Dati N= 50

1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Pe Windows, pentru a da un argument din linia de comanda, sunt suficiente numele scriptului si argumentul:

c:\> prim.py 30

Exemple Python

1.''' program ce determina oglinda unui numar creat de Vasile Cioban 11.10.2012''' def Citeste(): n=int(input("dati un numar natural:")) return n;

def Oglinda(a): Og=0 while (a>0):

12

Page 13: Python

UltCifra=a % 10 Og=Og*10+UltCifra a=a//10 return Og; a=Citeste();d=Oglinda(a);print ("Oglinda="+str(d));print ("program terminated");

2.''' program ce determina daca un numar este prim creat de Vasile Cioban 11.10.2012'''

def Prim(n): i=2; while (i*i<=n) and (n % i !=0): if i==2: i+=1; else: i+=2;

if i*i > n: return 1; else: return 0; n=int(input("dati un numar natural:"));if (Prim(n)==1): print (n," este prim");else: print (n," nu este prim");

3.''' program ce determina daca cel mai mare dicvizor comun numar a doua numere creat de Vasile Cioban 11.10.2012''' def Citeste(): n=int(input("dati un numar natural:")) return n;

def CMMDC(a,b): while (a!=b): if a>b: a-=b #a=a-b else: b-=a; #b=b-a

13

Page 14: Python

return a; a=Citeste();b=Citeste();d=CMMDC(a,b);print ("cmmdc("+str(a)+","+str(b)+")="+str(d));print ("cmmdc(",a,",",b,")=",d);

4.def gcd(a, b): """ Compute the greatest common divisor of two positive integers a, b integers a,b >=0 Return the greatest common divisor of two positive integers. """ if a == 0: return b if b == 0: return a while a != b: if a > b: a = a - b else: b = b - a return a

def test_gcd(): assert gcd(2, 3) == 1 assert gcd(2, 4) == 2 assert gcd(6, 4) == 2 assert gcd(0, 2) == 2 assert gcd(2, 0) == 2 assert gcd(24, 9) == 3 test_gcd()

5.''' program ce determina 2 numere prime gemene strict mai mici decat un numar natural dat creat de Vasile Cioban 18.10.2012'''

def Prim(n): i=2; while (i*i<=n) and (n % i !=0): if i==2: i+=1; else: i+=2;

14

Page 15: Python

if i*i > n: return 1; else: return 0; n=int(input("dati un numar natural:"));if (n%2==0): p1=n-1 p2=n-3else: p1=n-2; p2=n-4;if (n<=5): print ("nu exista numere prime gemene mai mici");else: while ((Prim(p1)==0) or (Prim(p2)==0)): p1=p2; p2-=2; print (p1," ",p2);input("dati un Enter:");

6.''' program ce determina 2 numere prime gemene p si q cu |p-q|=2 strict mai mari decat un numar natural dat creat de Vasile Cioban 18.10.2012'''

def Prim(n): i=2; while (i*i<=n) and (n % i !=0): if i==2: i+=1; else: i+=2;

if i*i > n: return True; else: return False; n=int(input("dati un numar natural:"));if (n%2==0): p1=n+1 p2=n+3else: p1=n+2;

15

Page 16: Python

p2=n+4;while ((Prim(p1)) or (Prim(p2))): p1=p2; p2+=2; print (p1," ",p2);input("dati un Enter:");

7.''' program ce determina 2 numere prime gemene strict mai mari decat un numar natural dat creat de Vasile Cioban 18.10.2012'''

def Prim(n): i=2; while (i*i<=n) and (n % i !=0): if i==2: i+=1; else: i+=2;

if i*i > n: return 1; else: return 0; n=int(input("dati un numar natural:"));if (n%2==0): p1=n+1 p2=n+3else: p1=n+2; p2=n+4;while ((Prim(p1)==0) or (Prim(p2)==0)): p1=p2; p2+=2; print (p1," ",p2);input("dati un Enter:");

8.'''Created on Oct 18, 2012

@author: Vasile Cioban'''stri = 'HelloWorld!'

print (stri) # Prints complete stringprint (stri[0]) # Prints first character of the stringprint (stri[2:5]) # Prints characters starting from 3rd to 6th

16

Page 17: Python

print (stri[2:]) # Prints string starting from 3rd characterprint (stri * 2) # Prints string two timesprint (stri + "TEST") # Prints concatenated string list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john']

print (list) # Prints complete listprint (list[0]) # Prints first element of the listprint (list[1:3]) # Prints elements starting from 2nd to 4thprint (list[2:]) # Prints elements starting from 3rd elementprint (tinylist * 2) # Prints list two timesprint (list + tinylist) # Prints concatenated lists

dict = {}dict['one'] = "This is one"dict[2] = "This is two"

tinydict = {'name': 'john','code':6734, 'dept': 'sales'}

print (dict['one']) # Prints value for 'one' keyprint (dict[2]) # Prints value for 2 keyprint (tinydict) # Prints complete dictionaryprint (tinydict.keys()) # Prints all the keysprint (tinydict.values()) # Prints all the values

9.'''Created on Oct 18, 2012INSTRUCTIUNEA if@author: Vasile Cioban'''var1 = 100if (var1): print ("1 - Got a true expression value") print (var1)else: print ("1 - Got a false expression value") print (var1)

var2 = 0if (var2): print ("2 - Got a true expression value") print (var2)else: print ("2 - Got a false expression value") print (var2)print ("Good bye!")

17

Page 18: Python

var = 100if (var < 200): print ("Expression value is less than 200") if (var == 150): print ("Which is 150") elif (var == 100): print ("Which is 100") elif (var == 50): print ("Which is 50")elif (var < 50): print ("Expression value is less than 50")else: print ("Could not find true expression")

print ("Good bye!") 10.'''Created on Oct 18, 2012INSTRUCTIUNEA while@author: Vasile Cioban'''

count = 0while (count <= 9): print ('The count is:', count) count += 1

print ("Good bye!")

var = 1while (var == 1) : # This constructs an infinite loop num = input("Enter a number :") print ("You entered: ", num)

print ("Good bye!")

11.'''INSTRUCTIUNEA for

Created on Oct 18, 2012

@author: Vasile Cioban'''for letter in 'Python': # First Example print ('Current Letter :', letter)

fruits = ['banana', 'apple', 'mango']for fruit in fruits: # Second Example

18

Page 19: Python

print ('Current fruit :', fruit)

tinylist=['orange']fruits=fruits + tinylist

for index in range(len(fruits)): print ('Current fruit :', fruits[index])

for index in fruits: print ('Current fruit :', index)print ("Good bye!")

12.'''Created on Oct 18, 2012@author: Vasile Cioban'''

def fibo(x): if (x==0 or x==1): return x return fibo(x-1)+fibo(x-2) def CreListFibo(n): L=[] i =0 while (i<=n): x=fibo(i) L=L+[x] #print(L) i+=1 return L

n=int(input("dati un natural:"))Lista=CreListFibo(n)

print(Lista);13. '''Created on Oct 25, 2012LISTE@author: Vasile Cioban'''def sumaPare(x): ''' face suma numerelor pare din x x este o lista de nr. returneaza un numar ''' sum=0

19

Page 20: Python

for el in x: if el%2==0: sum=sum+el print ("el=",el,"suma partiala=",sum) return sum

s =sumaPare([1,2,4,3,5,8,11,14])print ("suma finala:",s)

def citirelista(): """ citeste lista de la tastatura """ x=int(input("dati lungimea listei:")) rez=[] for i in range (0, x): nr =input( "da un numar pentru pozitia "+str(i)+":" ) rez.append(nr) return rez

x=citirelista()print (x)

def citirelista2(): """ citeste lista numere de la tastatura returneaza lista de numere """ l=[] x=int(input("dati un numar:")) while (x!=-1000): #terminare cu -1000 print (l, x) l =l+[x] x =int(input("mai da un nr:")) return l

x=citirelista2()print (x)

14.'''Created on Oct 25, 2012LISTE@author: Vasile Cioban'''

def citirelista2(): """ citeste lista numere de la tastatura returneaza lista de numere """ l=[] x=input("dati un numar:")

20

Page 21: Python

while (x!=""): #terminare cu ENTER x = int(x) l = l+[x] print (l) x =input("mai da un nr:") return l lista=citirelista2()print (lista)

15.'''Created on Oct 25, 2012

@author: Vasile Cioban'''

def Citire(): lista=[] x=input("Da un numar:") while (x!=""): x =int(x) lista=lista+[x] print("lista partiala:"+str(lista)) x=input("Da un numar:"); return lista

def Negative(L): LNeg=[] for i in L: if i<0: LNeg=LNeg+[i] return LNeg

L=Citire()print("lista citita:"+str(L))L=Negative(L)print("lista citita:"+str(L))

16.'''Created on Oct 25, 2012

@author: Vasile Cioban'''

def Citire(): lista=[] x=input("Da un numar:") while (x!=""):

21

Page 22: Python

x =int(x) lista=lista+[x] print("lista partiala:"+str(lista)) x=input("Da un numar:"); return lista L=Citire()print("lista citita:"+str(L))

17.'''Created on Nov 1, 2012produs polinoame@author: Vasile Cioban''''''Algoritmul Produs Este : { R:=P*Q } Date m,(P[i] , i=0,m), m=gradul lui P n,(Q[j] , j=0,n); n=gradul lui Q } Pentru k:=0,m+n Executa { m+n=gradul lui R } R[k]:=0 SfPentru; Pentru i:=0,m Executa Pentru j:=0,n Executa R[i+j]:=R[i+j]+P[i]*Q[j]

SfPentru; SfPentru; Rezultate (R[k], k=0,m+n)SfAlgoritm.'''def Produs(P,Q): R=[]; m=len(P) n=len(Q) k=0 while (k<m+n-1): R=R+[0] k=k+1 for i in range(len(P)): for j in range (len(Q)): R[i+j]=R[i+j]+P[i]*Q[j] return R def CitPol(): lista=[] x=input("Da un Coef:") while (x!=""): x =int(x) lista =lista+[x] print ("lista partiala:"+str(lista))

22

Page 23: Python

x=input("Da un Coef:"); return lista

def AfisPol(P): Afis="" i=0 while (i<len(P) and (P[i]==0)): i+=1 while (i<len(P)): if (P[i]==1): if (i==0): Afis=Afis+"1" else: Afis=Afis+"+x^"+str(i) if (i==1): Afis=Afis+"+x" else: if(P[i]!=0): if(P[i]>0): Afis=Afis+"+"+str(P[i])+"x^"+str(i) else: if (P[i]==-1): Afis=Afis+"-x^"+str(i) else: Afis=Afis+str(P[i])+"x^"+str(i) i=i+1 return Afis ''' 1,1 1+x 1,1,1 1+x+x^2 1,-1,1 1-X+x^2 -1,0,1 -1+x^2'''

P=CitPol()print("Polinomul P:"+AfisPol(P))print(" ")

Q=CitPol()print("Polinomul Q:"+AfisPol(Q))print(" ")

R=Produs(P,Q)for i in range(len(R)): print(str(R[i])+" ",end="") print(" ") print("polinomul produs:"+AfisPol(R))

23

Page 24: Python

Probleme propuse

Să se scrie un algoritm care rezolvă problema de mai jos folosind limbajul Python.

1. Să se determine primul numar prim mai mare decât un numar natural n dat.

2. Determinaţi vârsta (în număr de zile) pentru o persoană.

3. Determinaţi o dată calendaristică (sub forma an, luna, zi) pornind de la două numere întregi care reprezintă anul şi numărul de ordine al zilei în anul respectiv.

4. Dându-se numărul natural n par, determinaţi numerele prime p1 şi p2 (p1 p2 ) astfel ca n = p1 + p2

(verificarea ipotezei lui Goldbach).

5. Determinaţi numerele prime p1 şi p2 gemene imediat superioare numărului natural nenul n dat. Două numere prime p şi q sunt gemene dacă |q-p| = 2.

6. Determinaţi primele n cifre din scrierea fracţiei subunitare k/m = 0.c1c2c3...cn,..., pentru k şi m numere naturale date.

7. Fie n un număr natural dat. Calculaţi produsul p al tuturor divizorilor proprii ai lui n.

8. Pentru un număr natural n dat găsiţi numărul natural minim m format cu aceleaşi cifre. Exemplu n=3658, m=3568.

9. Pentru un număr natural n dat găsiţi numărul natural maxim m format cu aceleaşi cifre. Exemplu n=3658, m=8653.

10. Oglinda unui număr este numărul obţinut prin scrierea cifrelor în ordine inversa (Exemplu oglinda(237) = 732). Pentru un n dat determinaţi dacă este palindrom (numărul şi oglinda sa au aceeaşi valoare).

11. Numerele n1 şi n2 au proprietatea P dacă scrierile lor în baza 10 conţin aceleaşi cifre (ex. 2113 şi 323121). Determinaţi dacă două numere naturale date au proprietatea P.

12. Generaţi cel mai mic număr perfect mai mare decât un numar n dat. În cazul în care nu există, se afişează un mesaj corespunzător. Un număr este perfect daca este egal cu suma divizorilor săi, exceptându-l pe el însuşi. (6=1+2+3).

13. Generaţi cel mai mare numar prim mai mic decat un numar n dat. În cazul în care nu există, se afişează mesaj corespunzător.

14. Generează toate numerele prime strict mai mici decat un număr natural n dat.

24

Page 25: Python

15. Generează primele n (n natural dat) numere prime.

16. Determinaţi toate reprezentările posibile ale unui număr natural n, ca sumă de numere naturale consecutive. Exemplu n=15=1+2+3+4+5= 3+4+5=7+8 (3 variante)

17.Generează primele n (n natural dat) numere prime, mai mari ca m, dat de asemenea.

18. Afişaţi triunghiul lui Pascal, cu toate combinările C(m,k) de m obiecte luate câte k, k = 0, 1, ..., m, în linia m, pentru m = 1, 2, ..., n, n dat.

19. Calculaţi o valoare aproximativă a numărului e^x pentru x real dat, cu o precizie fixată.

20. Calculaţi o valoare aproximativă a rădăcinii pătrate a unui număr real pozitiv, cu o precizie dată.

21. Afişaţi exponentul la care numarul prim p apare în descompunerea în factori primi ai numărului 1*2*...*n (n natural nenul dat). Exemplu dacă n=100 şi p=3, atunci n! are ca divizor pe 3^48.

22. Se citeşte un şir de numere naturale nenule (terminat cu 0) să se determine numărul cifrelor 0 în care se termină produsul numerelor citite.

23. Calculaţi o valoare aproximativă pentru ln(1+x) cu o precizie dată.

24. Afişaţi un numar precizat de sume parţiale din dezvoltarea

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

25. Descompune în factori primi un numar natural nenul dat.

26. Determinaţi toate numerele naturale mai mici decat un număr natural nenul dat n şi care sunt relativ prime cu n.

27. Descompuneţi un numar natural dat ca sumă de termeni distincţi ai şirului lui Fibonacci.

28. Descompuneţi un numar natural dat n ca suma de puteri distincte ale lui 2.

29. Determinaţi toate numerele naturale cuprinse între doua limite m şi n, care au acelaşi număr de cifre 1 în scrierea binară a lor şi a pătratului lor.

30. Tipariţi un număr precizat de termeni din şirul 1, 2,1, 3,2,1, 4,2,2, 5,4,3,2,1, 6,2,2,3,3,3, 7,6, ... obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr natural n printr-un grup de numere astfel: numărul prim p este inlocuit prin numerele p,p-1,...3,2,1, iar numărul compus n este înlocuit prin n urmat de toţi factorii săi proprii, un factor d repetandu-se de d ori.

25

Page 26: Python

31. Fie n un număr natural dat. Calculaţi suma s a tuturor factorilor proprii ai lui n.

32. Determinaţi numerele prime p1 şi p2 gemene imediat inferioare numărului natural nenul n dat. Două numere prime p şi q sunt gemene dacă |q-p| = 2.

33. Fie n un număr natural dat. Calculaţi produsul p al tuturor numerelor prime cu n, şi mai mici ca n.

34. Fie n un număr natural dat. Calculaţi suma s a tuturor numerelor prime cu n, şi mai mici ca n.

35. Calculaţi suma s a primelor n numere prime, n dat. 36. Determinati toţi divizorii unui număr n dat. Exemplu n=18 D18={1,2,3,6,9,18}37. Determianti toate numerele relativ prime cu n dat, şi strict mai mici ca n.38. Determinati toate numerele strict mai mici ca n şi cu care n nu este divizibil.39. Să se determine primele n (dat) numere impare din şirul lui Fibonacci.40. Să se determine numerele pare din şirul lui Fibonacci, strict mai mici ca un n dat.41. Să se determine sume de numere consecutive care dau exact n, n dat. Exemplu 15=1+2+3+4+5=4+5+6=7+842. Să se determine produsul de numere consecutive care dau exact n, n dat.43. Program care determină cel mai mare divizor comun (CMMDC) al două numere naturale date a şi b.44. Să se determine CMMDC al unei secvenţe de numere date.45. Să se detemine sublista de numere prime dintr-o listă dată. Exemplu: [23,4,5,34,6,7,9,11,12,14,16] [23,5,7,11]46. Să se determine sublista de numere palindromice dintr-o listă dată. Exemplu: [23,4,5,34,616,7,9,11,12,14,16] [4,5,616,7,9,11]47. Să se determine sublistele (consecutive din lista iniţială) de numere strict crescătoare dintr-o listă dată. Exemplu: [1,2,3,5,5,5,4,3,6,8,9,10] [1,2,3,5] [3,6,8,9,10]48. Să se determine sublistele (consecutive din lista iniţială) de numere strict descrescătoare dintr-o listă dată. Exemplu: [1,2,3,5,5,5,4,3,6,5,2,10] [5,4,3] [6,5,2]49. Să se determine sublistele de tip platou (mai lungi sau egale cu 2) dintr-o listă dată. Exemplu: [1,2,3,3,3,5,5,5,4,3,6,8,9,9] [3,3,3] [5,5,5] [9,9].50. Să se determine sublistele (consecutive din lista iniţială) de numere negative dintr-o listă dată. Exemplu: [1,2,-3,5,5,-55,-4,4,3,6,-8,-9,-10] [-3] [-55,-4] [-8,-9,-10]51. Să se determine sublistele (consecutive din lista iniţială) de numere strict crescătoare şi pare dintr-o listă dată. Exemplu: [1,2,12, 24,5,5,5,4,3,6,8,9,10] [2,12,24] [6,8]52. Să se determine sublistele (consecutive din lista iniţială) de numere strict descrescătoare şi impare dintr-o listă dată. Exemplu: [1,2,13,5,5,5,4,3,6,15,11,1,2,10] [13,5] [15,11.1]53. Să se determine sublistele de tip platou (mai lungi sau egale cu 2) de numere prime dintr-o listă dată. Exemplu: [1,2,3,3,3,5,5,5,4,3,6,8,9,9] [3,3,3] [5,5,5] .54. Să se determine sublistele (consecutive din lista iniţială) de numere negative strict crescătoare dintr-o listă dată. Exemplu: [1,2,-3,-2,-1, 5,5,-55,-4,4,3,6,-8,-9,-10] [-3,-2,-1] [-55,-4] .55. Să se determine sublistele (consecutive din lista iniţială) de numere palindromice dintr-o listă dată.

26

Page 27: Python

Exemplu: [1,2,3,21,11, 55, 121,4,3,6,-81,9,10] [1,2,3] [11,55,121,4,3,6] [9] 56. Să se determine sublistele (consecutive din lista iniţială) de numere prime dintr-o listă dată. Exemplu: [1,2,3,21,11, 55, 121,4,3,6,-81,9,10] [2,3] [11] [3] 57. Să se determine CMMDC şi CMMMC al unei liste de numere întregi. Exemplu: [45,90,75,30] CMMDC=15 iar CMMMC=450.

27