Sunteți pe pagina 1din 27

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.

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:

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

1
>>>
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 python


Sau il puteti descarca, apoi compila si instala manual:

./configure
make
make install
Pe 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
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=5
i 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=1
b=2
print "Un string:", i+j
print "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
Un string: 12
Un numar: 3
Un string 12
Afisare formatata: persoana 2 are 1 ani
Alocarea 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, 3
Datorita 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, x
In 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 = """text
pe 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 g
index: 0 1 2 3 4 5
index negativ: -6 -5 -4 -3 -2 -1
Caracterul : 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 + " " + s
va afisa:

st
str
ing
Write oneone string

4
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 lista
print [(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"] = 2
Pentru a acesa un element al unui dictionar se procedeaza in felul urmator:

var = dict[0]
sau

var = dict["unu"]

5
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:
instructiuni
elif conditie2:
instructiuni
else:
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
[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
client : Alex
vanzator : 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 = realpart
self.i = imagpart
x = 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
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,j
O 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 lista


lista.append(x) adauga un element la sfarsitul listei
lista.extend(alta_lista) concateneaza alta_lista la lista
lista.sort() sorteaza elementele listei
reverse() inverseaza ordinea elementelor din lista
Unele 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
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


culoarea_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
$ 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
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
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
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
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-3
else:
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+3
else:
p1=n+2;

15
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+3
else:
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 string


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

16
print (stri[2:]) # Prints string starting from 3rd character
print (stri * 2) # Prints string two times
print (stri + "TEST") # Prints concatenated string

list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]


tinylist = [123, 'john']

print (list) # Prints complete list


print (list[0]) # Prints first element of the list
print (list[1:3]) # Prints elements starting from 2nd to 4th
print (list[2:]) # Prints elements starting from 3rd element
print (tinylist * 2) # Prints list two times
print (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' key


print (dict[2]) # Prints value for 2 key
print (tinydict) # Prints complete dictionary
print (tinydict.keys()) # Prints all the keys
print (tinydict.values()) # Prints all the values

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

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

17
var = 100
if (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, 2012
INSTRUCTIUNEA while
@author: Vasile Cioban
'''

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

print ("Good bye!")

var = 1
while (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
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, 2012
LISTE
@author: Vasile Cioban
'''
def sumaPare(x):
'''
face suma numerelor pare din x
x este o lista de nr.
returneaza un numar
'''
sum=0

19
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, 2012
LISTE
@author: Vasile Cioban
'''

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

20
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
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, 2012
produs 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
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
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 dect un numar natural n dat.

2. Determinai vrsta (n numr de zile) pentru o persoan.

3. Determinai o dat calendaristic (sub forma an, luna, zi) pornind de la dou numere ntregi
care reprezint anul i numrul de ordine al zilei n anul respectiv.

4. Dndu-se numrul natural n par, determinai numerele prime p1 i p2 (p1 p2 ) astfel ca


n = p 1 + p2
(verificarea ipotezei lui Goldbach).

5. Determinai numerele prime p1 i p2 gemene imediat superioare numrului natural nenul n dat.
Dou numere prime p i q sunt gemene dac |q-p| = 2.

6. Determinai primele n cifre din scrierea fraciei subunitare k/m = 0.c1c2c3...cn,..., pentru k i m
numere naturale date.

7. Fie n un numr natural dat. Calculai produsul p al tuturor divizorilor proprii ai lui n.

8. Pentru un numr natural n dat gsii numrul natural minim m format cu aceleai cifre.
Exemplu n=3658, m=3568.

9. Pentru un numr natural n dat gsii numrul natural maxim m format cu aceleai cifre.
Exemplu n=3658, m=8653.

10. Oglinda unui numr este numrul obinut prin scrierea cifrelor n ordine inversa (Exemplu
oglinda(237) = 732). Pentru un n dat determinai dac este palindrom (numrul i oglinda sa au
aceeai valoare).

11. Numerele n1 i n2 au proprietatea P dac scrierile lor n baza 10 conin aceleai cifre (ex. 2113
i 323121). Determinai dac dou numere naturale date au proprietatea P.

12. Generai cel mai mic numr perfect mai mare dect un numar n dat. n cazul n care nu exist,
se afieaz un mesaj corespunztor. Un numr este perfect daca este egal cu suma divizorilor
si, exceptndu-l pe el nsui. (6=1+2+3).

13. Generai cel mai mare numar prim mai mic decat un numar n dat. n cazul n care nu exist, se
afieaz mesaj corespunztor.

14. Genereaz toate numerele prime strict mai mici decat un numr natural n dat.

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

16. Determinai toate reprezentrile posibile ale unui numr 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. Afiai triunghiul lui Pascal, cu toate combinrile C(m,k) de m obiecte luate cte k,
k = 0, 1, ..., m, n linia m, pentru m = 1, 2, ..., n, n dat.

19. Calculai o valoare aproximativ a numrului e^x pentru x real dat, cu o precizie fixat.

20. Calculai o valoare aproximativ a rdcinii ptrate a unui numr real pozitiv, cu o precizie
dat.

21. Afiai exponentul la care numarul prim p apare n descompunerea n factori primi ai numrului
1*2*...*n (n natural nenul dat). Exemplu dac n=100 i p=3, atunci n! are ca divizor pe 3^48.

22. Se citete un ir de numere naturale nenule (terminat cu 0) s se determine numrul cifrelor 0


n care se termin produsul numerelor citite.

23. Calculai o valoare aproximativ pentru ln(1+x) cu o precizie dat.

24. Afiai un numar precizat de sume pariale 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. Determinai toate numerele naturale mai mici decat un numr natural nenul dat n i care sunt
relativ prime cu n.

27. Descompunei un numar natural dat ca sum de termeni distinci ai irului lui Fibonacci.

28. Descompunei un numar natural dat n ca suma de puteri distincte ale lui 2.

29. Determinai toate numerele naturale cuprinse ntre doua limite m i n, care au acelai numr de
cifre 1 n scrierea binar a lor i a ptratului lor.

30. Tiparii un numr 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, ...

obinut din irul numerelor naturale prin nlocuirea fiecrui numr natural n printr-un grup de
numere astfel: numrul prim p este inlocuit prin numerele p,p-1,...3,2,1, iar numrul compus n
este nlocuit prin n urmat de toi factorii si proprii, un factor d repetandu-se de d ori.

25
31. Fie n un numr natural dat. Calculai suma s a tuturor factorilor proprii ai lui n.

32. Determinai numerele prime p1 i p2 gemene imediat inferioare numrului natural nenul n dat.
Dou numere prime p i q sunt gemene dac |q-p| = 2.

33. Fie n un numr natural dat. Calculai produsul p al tuturor numerelor prime cu n, i mai mici
ca n.

34. Fie n un numr natural dat. Calculai suma s a tuturor numerelor prime cu n, i mai mici ca n.

35. Calculai suma s a primelor n numere prime, n dat.


36. Determinati toi divizorii unui numr 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+8
42. 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 secvene 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 iniial) de numere strict cresctoare 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 iniial) de numere strict descresctoare 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 iniial) 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 iniial) de numere strict cresctoare 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 iniial) de numere strict descresctoare 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 iniial) de numere negative strict cresctoare
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 iniial) de numere palindromice dintr-o list

26
dat.
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 iniial) 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