1. De unde pornim?
În Partea 1 am învățat variabile, tipuri de date, conversii, citire, afișare, operatori și condiții. În Partea 2 introducem structuri care pot conține mai multe valori și instrumentele necesare pentru a le prelucra.
2. Repetarea instrucțiunilor: while, for și range()
Pentru vectori, matrice și multe probleme cu șiruri trebuie să putem repeta aceeași operație de mai multe ori.
2.1. while
while repetă un bloc cât timp condiția este adevărată.i = 1
while i <= 5:
print(i)
i = i + 1
Este important să modificăm variabila de control; altfel bucla se poate repeta la nesfârșit.
2.2. for
for este folosit frecvent când vrem să parcurgem o succesiune de valori sau elementele unei colecții.for i in range(5):
print(i)
Afișează 0, 1, 2, 3, 4. Capătul din dreapta nu este inclus.
2.3. range()
| Formă | Valori generate |
|---|---|
range(stop) | de la 0 la stop - 1 |
range(start, stop) | de la start la stop - 1 |
range(start, stop, pas) | cu pasul indicat |
for i in range(2, 8):
print(i)
for i in range(10, 0, -2):
print(i)
2.4. break și continue
break oprește bucla. continue sare peste restul iterației curente și trece la următoarea.
for i in range(1, 10):
if i == 5:
break
print(i)
3. Șiruri de caractere (str)
str. Exemplu: "Python".nume = "Ana"
mesaj = "Buna ziua!"
text = "12345"
Important: "12345" este text, nu numărul 12345. Pentru conversie folosim int(), float() sau str(), după caz.
3.1. Caracterul și cifra
O cifră ca text este un caracter: "7". Numărul 7 este un int. Sunt valori diferite.
| Valoare | Tip | Semnificație |
|---|---|---|
7 | int | numărul șapte |
7.0 | float | număr real |
"7" | str | caracterul/cifra 7 ca text |
3.2. Lungimea unui șir: len()
s = "Python"
print(len(s))Rezultatul este 6, deoarece șirul are șase caractere.
4. Indicii: accesarea caracterelor
Caracterele unui șir sunt numerotate începând de la 0.
s = "Python"
print(s[0])
print(s[1])
print(s[5])
| Caracter | P | y | t | h | o | n |
|---|---|---|---|---|---|---|
| Indice | 0 | 1 | 2 | 3 | 4 | 5 |
4.1. Indici negativi
s = "Python"
print(s[-1])
print(s[-2])-1 înseamnă ultimul caracter, iar -2 penultimul.
"Ana", s[3] produce eroare deoarece indicii sunt 0, 1 și 2.5. Secționarea șirurilor (slicing)
O secțiune are forma s[start:stop]. Caracterul de la stop nu este inclus.
s = "abcdef"
print(s[1:4])
print(s[:3])
print(s[3:])
Rezultatele sunt "bcd", "abc" și "def".
5.1. Pasul
s = "abcdef"
print(s[0:6:2])
print(s[::-1])s[0:6:2] ia caractere din doi în doi. s[::-1] construiește șirul inversat.
6. Funcții și metode specifice șirurilor
În Python, unele operații se scriu ca funcții, iar altele ca metode ale obiectului, de forma s.metoda(). Nu le confundăm cu sintaxa indicilor sau a secționării.
| Operație | Exemplu | Ce face |
|---|---|---|
| Lungime | len(s) | numărul de caractere |
| Majuscule | s.upper() | transformă literele în majuscule |
| Minuscule | s.lower() | transformă literele în minuscule |
| Eliminare spații la margini | s.strip() | elimină spațiile de la început și sfârșit |
| Înlocuire | s.replace(a,b) | înlocuiește aparițiile lui a cu b |
| Căutare | s.find(sub) | poziția primei apariții; -1 dacă nu găsește |
| Numărare | s.count(sub) | numărul de apariții |
| Începe cu | s.startswith(x) | verifică prefixul |
| Se termină cu | s.endswith(x) | verifică sufixul |
| Verificare cifre | s.isdigit() | True dacă toate caracterele sunt cifre și șirul nu este gol |
| Verificare litere | s.isalpha() | True dacă toate caracterele sunt litere și șirul nu este gol |
Exemplu
s = " Python "
s = s.strip()
s = s.upper()
print(s)
Rezultatul este PYTHON.
upper() nu modifică șirul existent în loc. Ele produc un nou șir, pe care îl putem atribui unei variabile.7. split() și join()
Aceste două metode sunt foarte utile când un text conține mai multe elemente separate prin spații sau alte delimitatoare.
7.1. split()
s = "Ana are mere"
cuvinte = s.split()
print(cuvinte)Rezultatul este o listă: ["Ana", "are", "mere"]. Fiecare cuvânt devine un element.
Putem indica separatorul:
s = "10,20,30"
valori = s.split(",")
7.2. join()
cuvinte = ["Ana", "are", "mere"]
s = "-".join(cuvinte)
print(s)Rezultatul este Ana-are-mere.
split() poate transforma un text într-o listă de elemente.8. Parcurgerea unui șir caracter cu caracter
Putem parcurge direct caracterele:
s = "Ana"
for c in s:
print(c)
Putem folosi și indicele:
s = "Ana"
for i in range(len(s)):
print(i, s[i])
A doua variantă este utilă când problema cere poziția caracterului.
9. Vectori în Python: liste (list)
list.a = [10, 20, 30, 40]
Lista are patru elemente. Spre deosebire de un șir de caractere, elementele pot fi numere, texte etc., iar lista poate fi modificată.
| Concept | Exemplu |
|---|---|
| Creare | a = [10, 20, 30] |
| Element | a[0] |
| Ultimul | a[-1] |
| Lungime | len(a) |
| Secțiune | a[1:3] |
9.1. Lista este modificabilă
a = [10, 20, 30]
a[1] = 99
print(a)Rezultatul este [10, 99, 30]. Am schimbat elementul cu indicele 1.
str este un vector Python. Un șir are indici, dar este de tip str; vectorul din acest curs este reprezentat printr-o list.10. Operații de bază pe vectori
10.1. Citirea unui vector
O variantă simplă, când valorile sunt scrise pe aceeași linie:
a = list(map(int, input().split()))
Ce se întâmplă? input() citește text, split() îl separă în bucăți, map(int, ...) convertește fiecare bucată la întreg, iar list(...) construiește lista.
split(), map() și list. Nu este o „comandă magică”.10.2. Parcurgerea elementelor
a = [4, 7, 2, 9]
for x in a:
print(x)
10.3. Parcurgerea prin indici
a = [4, 7, 2, 9]
for i in range(len(a)):
print(i, a[i])
10.4. Adăugare
a = [10, 20]
a.append(30)
print(a)append(x) adaugă un element la sfârșit.
10.5. Inserare
a = [10, 30]
a.insert(1, 20)Rezultatul este [10, 20, 30].
10.6. Ștergere
a = [10, 20, 30, 20]
a.remove(20)
# șterge prima apariție a valorii 20
10.7. Alte operații utile
| Operație | Exemplu | Rol |
|---|---|---|
| Număr elemente | len(a) | lungimea listei |
| Adăugare final | a.append(x) | adaugă x |
| Poziție | a.index(x) | prima poziție a lui x |
| Număr apariții | a.count(x) | de câte ori apare x |
| Ștergere după valoare | a.remove(x) | elimină prima apariție |
| Ștergere după poziție | a.pop(i) | scoate elementul de la i |
| Ștergere completă | a.clear() | golește lista |
11. Sortarea și agregarea unui vector
11.1. sort()
a = [5, 2, 8, 1]
a.sort()
print(a)Rezultatul este [1, 2, 5, 8].
a.sort(reverse=True)Acum ordinea este descrescătoare.
11.2. min(), max(), sum()
a = [4, 7, 2, 9]
print(min(a))
print(max(a))
print(sum(a))
Aceste funcții ne permit să rezolvăm direct probleme simple de minim, maxim și sumă.
11.3. Căutare prin parcurgere
a = [4, 7, 2, 9]
x = 7
gasit = False
for v in a:
if v == x:
gasit = True
break
print(gasit)
gasit în codul corect. Forma corectă este:a = [4, 7, 2, 9]
x = 7
gasit = False
for v in a:
if v == x:
gasit = True
break
print(gasit)
12. Frecvențe într-un vector
O problemă foarte importantă este să numărăm de câte ori apare o valoare.
a = [2, 5, 2, 7, 2, 5]
print(a.count(2))
Putem construi și noi numărătoarea:
a = [2, 5, 2, 7, 2, 5]
x = 2
cnt = 0
for v in a:
if v == x:
cnt = cnt + 1
print(cnt)
Această a doua variantă este importantă pentru înțelegerea algoritmilor, deoarece aceeași idee se poate adapta pentru multe alte criterii.
13. Matrice în Python
a = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
Aceasta are 3 linii și 3 coloane.
13.1. Accesarea unui element
print(a[0][0])
print(a[1][2])Primul indice indică linia, al doilea coloana.
| col 0 | col 1 | col 2 | |
|---|---|---|---|
| lin 0 | 1 | 2 | 3 |
| lin 1 | 4 | 5 | 6 |
| lin 2 | 7 | 8 | 9 |
13.2. Parcurgerea unei matrice
a = [
[1, 2, 3],
[4, 5, 6]
]
for i in range(len(a)):
for j in range(len(a[i])):
print(a[i][j])
Avem două bucle: prima pentru linii, a doua pentru coloane.
13.3. Citirea unei matrice
m = int(input())
n = int(input())
a = []
for i in range(m):
linie = list(map(int, input().split()))
a.append(linie)
Această formă presupune că pe fiecare linie de intrare se află n valori.
14. Algoritmi de bază pe matrice
14.1. Suma tuturor elementelor
s = 0
for i in range(len(a)):
for j in range(len(a[i])):
s = s + a[i][j]
print(s)
14.2. Suma unei linii
i = 1
s = 0
for j in range(len(a[i])):
s = s + a[i][j]
print(s)
14.3. Suma unei coloane
j = 2
s = 0
for i in range(len(a)):
s = s + a[i][j]
print(s)
14.4. Diagonala principală
Într-o matrice pătratică, elementele diagonalei principale au indicii a[i][i].
s = 0
for i in range(len(a)):
s = s + a[i][i]
print(s)
14.5. Diagonala secundară
Pentru o matrice pătratică de ordin n, elementele sunt a[i][n - 1 - i].
n = len(a)
s = 0
for i in range(n):
s = s + a[i][n - 1 - i]
print(s)
15. Algoritmi esențiali pe șiruri, vectori și matrice
După ce cunoaștem structurile de date, accentul se mută pe algoritm: ce trebuie să păstrăm în variabile și când le modificăm.
| Problemă | Idee |
|---|---|
| Numărăm caractere | parcurgem șirul și incrementăm un contor |
| Căutăm o valoare | parcurgem și verificăm o condiție |
| Calculăm suma | pornim de la 0 și adunăm elementele |
| Calculăm maximul | păstrăm cea mai mare valoare găsită |
| Frecvență | incrementăm contorul când apare valoarea cerută |
| Transformăm textul | folosim metode de șir sau construim un rezultat |
| Prelucrăm matricea | folosim de obicei două bucle imbricate |
16. Exerciții rezolvate
Se citește un șir. Afișați lungimea lui.
s = input()
print(len(s))Ideea: len() numără caracterele.
s = input()
print(s[0])
print(s[-1])Folosim indicii deja explicați.
s = input()
print(s[::-1])s = input()
cnt = 0
for c in s:
if c in "aeiouAEIOU":
cnt = cnt + 1
print(cnt)Ideea: parcurgem fiecare caracter și îl verificăm. Operatorul in este folosit pentru a verifica dacă un element apare într-o succesiune.
s = input()
s = s.replace("a", "@").replace("A", "@")
print(s)s = input()
cuvinte = s.split()
print(len(cuvinte))Mai întâi obținem lista cuvintelor, apoi numărăm elementele.
a = list(map(int, input().split()))
s = 0
for x in a:
s = s + x
print(s)a = list(map(int, input().split()))
cnt = 0
for x in a:
if x % 2 == 0:
cnt = cnt + 1
print(cnt)max() MEDIUa = list(map(int, input().split()))
mx = a[0]
for i in range(1, len(a)):
if a[i] > mx:
mx = a[i]
print(mx)De ce pornim cu a[0]? Avem nevoie de o valoare reală din vector pentru prima comparație.
a = list(map(int, input().split()))
x = int(input())
gasit = False
for v in a:
if v == x:
gasit = True
break
print(gasit)m = int(input())
n = int(input())
a = []
for i in range(m):
a.append(list(map(int, input().split())))
s = 0
for i in range(m):
for j in range(n):
s = s + a[i][j]
print(s)n = int(input())
a = []
for i in range(n):
a.append(list(map(int, input().split())))
s = 0
for i in range(n):
s = s + a[i][i]
print(s)m = int(input())
n = int(input())
a = []
for i in range(m):
a.append(list(map(int, input().split())))
mx = a[0][0]
for i in range(m):
for j in range(n):
if a[i][j] > mx:
mx = a[i][j]
print(mx)s = input()
cnt = 0
for c in s:
if c.isdigit():
cnt = cnt + 1
print(cnt)s = input()
cuvinte = s.split()
cuvinte = cuvinte[::-1]
print(" ".join(cuvinte))Observăm legătura dintre split(), listă, slicing și join().
17. Exerciții propuse
Încearcă mai întâi să scrii algoritmul în cuvinte. Abia apoi scrie codul.
Șiruri — nivel ușor
- Se citește un șir. Afișați primul caracter.
- Se citește un șir. Afișați ultimul caracter.
- Afișați șirul inversat.
- Numărați câte caractere are șirul fără a folosi
len(). - Numărați câte litere „a” apar.
- Verificați dacă șirul începe cu „Ana”.
- Transformați toate literele în majuscule.
- Înlocuiți toate spațiile cu caracterul „_”.
Șiruri — nivel mediu
- Numărați vocalele și consoanele.
- Numărați câte cifre apar într-un text.
- Verificați dacă un text este format numai din cifre.
- Afișați poziția primei apariții a unui caracter.
- Numărați de câte ori apare fiecare dintre vocalele a, e, i, o, u.
- Se citește o propoziție. Afișați cel mai lung cuvânt.
- Se citește o propoziție. Afișați cuvintele cu mai mult de 5 caractere.
Vectori — nivel ușor și mediu
- Citiți un vector și calculați suma elementelor.
- Calculați produsul elementelor.
- Numărați valorile pare și impare.
- Afișați minimul și maximul fără
min()șimax(). - Verificați dacă o valoare apare în vector.
- Numărați de câte ori apare o valoare dată.
- Calculați media aritmetică.
- Afișați elementele vectorului în ordine inversă.
- Ștergeți prima apariție a unei valori.
- Sortați vectorul crescător și apoi descrescător.
Vectori — nivel mai dificil
- Determinați al doilea cel mai mare element distinct.
- Eliminați toate aparițiile unei valori date.
- Determinați cea mai frecventă valoare.
- Construiți un vector care conține numai elementele pare.
- Intercalați două vectori.
- Verificați dacă un vector este palindrom.
Matrice — nivel mediu
- Citiți o matrice și afișați toate elementele.
- Calculați suma tuturor elementelor.
- Calculați suma fiecărei linii.
- Calculați suma fiecărei coloane.
- Determinați maximul din fiecare linie.
- Determinați minimul din fiecare coloană.
- Calculați suma diagonalei principale.
- Calculați suma diagonalei secundare.
- Numărați elementele pare din matrice.
- Verificați dacă o matrice pătratică este simetrică.
18. Recapitulare și verificarea cunoștințelor
știu ce este str, indici, slicing, len(), upper(), lower(), strip(), replace(), find(), count(), startswith(), endswith(), isdigit(), isalpha().
știu să folosesc split() și join().
știu să creez o listă, să accesez/modific elemente, să parcurg, să adaug, șterg, caut, număr și sortez.
știu că este o listă de liste, pot accesa a[i][j] și pot folosi două bucle pentru parcurgere.
știu să construiesc algoritmi pentru sumă, numărare, căutare, minim, maxim și frecvențe.
știu când folosesc while, for, range(), break și continue.
Ce urmează?
După această parte, baza pentru probleme mai complexe este completă: putem prelucra texte, vectori și matrice și putem combina aceste structuri cu condiții și repetări.