Python de la zero — Partea 2

Șiruri de caractere • repetări • vectori (liste) • matrice • algoritmi de prelucrare

Continuăm exact de unde se termină Partea 1: întâi învățăm instrumentele, apoi le folosim în probleme.

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.

Variabile
→
Condiții
→
Repetări
→
Șiruri
→
Vectori
→
Matrice
Regula acestui curs: nu folosim o sintaxă într-un exercițiu înainte să fi fost explicată. De aceea, fiecare capitol introduce mai întâi noțiunea, apoi exemple simple și abia după aceea probleme.

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)

Un șir de caractere este o succesiune de caractere memorată ca valoare de tip 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.

ValoareTipSemnificație
7intnumărul șapte
7.0floatnumăr real
"7"strcaracterul/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])
CaracterPython
Indice012345

4.1. Indici negativi

s = "Python"
print(s[-1])
print(s[-2])

-1 înseamnă ultimul caracter, iar -2 penultimul.

Atenție: indicele trebuie să existe. Pentru "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.

Acum avem baza necesară pentru probleme precum extragerea primelor/ultimelor caractere, inversarea unui text și prelucrarea unor părți ale unui șir.

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țieExempluCe face
Lungimelen(s)numărul de caractere
Majuscules.upper()transformă literele în majuscule
Minuscules.lower()transformă literele în minuscule
Eliminare spații la marginis.strip()elimină spațiile de la început și sfârșit
Înlocuires.replace(a,b)înlocuiește aparițiile lui a cu b
Căutares.find(sub)poziția primei apariții; -1 dacă nu găsește
Numărares.count(sub)numărul de apariții
Începe cus.startswith(x)verifică prefixul
Se termină cus.endswith(x)verifică sufixul
Verificare cifres.isdigit()True dacă toate caracterele sunt cifre și șirul nu este gol
Verificare literes.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.

Atenție: metode precum 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.

Din acest moment putem face legătura naturală dintre șiruri și vectori: 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)

În problemele școlare, prin vector înțelegem o structură cu mai multe elemente. În Python, reprezentarea uzuală este lista, de tip 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ă.

ConceptExemplu
Crearea = [10, 20, 30]
Elementa[0]
Ultimula[-1]
Lungimelen(a)
Secțiunea[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.

Diferență importantă: nu spunem că un 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.

Ordinea contează: folosim această formă abia acum, după ce am explicat 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țieExempluRol
Număr elementelen(a)lungimea listei
Adăugare finala.append(x)adaugă x
Pozițiea.index(x)prima poziție a lui x
Număr aparițiia.count(x)de câte ori apare x
Ștergere după valoarea.remove(x)elimină prima apariție
Ștergere după pozițiea.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)
Atenție la exemplul de mai sus: nu există spațiu înainte de 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

O matrice este o structură organizată pe linii și coloane. În Python o putem reprezenta printr-o listă ale cărei elemente sunt alte liste.
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 0col 1col 2
lin 0123
lin 1456
lin 2789

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.

Într-o matrice rectangulară, fiecare linie trebuie să aibă numărul corect de elemente. În problemele școlare vom preciza de obicei numărul de linii și coloane.

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 caractereparcurgem șirul și incrementăm un contor
Căutăm o valoareparcurgem și verificăm o condiție
Calculăm sumapornim de la 0 și adunăm elementele
Calculăm maximulpăstrăm cea mai mare valoare găsită
Frecvențăincrementăm contorul când apare valoarea cerută
Transformăm textulfolosim metode de șir sau construim un rezultat
Prelucrăm matriceafolosim de obicei două bucle imbricate
Întrebarea principală înainte de cod: „Ce trebuie să aflu?” și „Ce informație trebuie să păstrez în timp ce parcurg datele?”

16. Exerciții rezolvate

1. Numărul de caractere UȘOR

Se citește un șir. Afișați lungimea lui.

s = input()
print(len(s))

Ideea: len() numără caracterele.

2. Primul și ultimul caracter UȘOR
s = input()
print(s[0])
print(s[-1])

Folosim indicii deja explicați.

3. Inversarea unui șir UȘOR
s = input()
print(s[::-1])
4. Numărul de vocale MEDIU
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.

5. Înlocuirea unui caracter UȘOR
s = input()
s = s.replace("a", "@").replace("A", "@")
print(s)
6. Cuvintele unui text UȘOR
s = input()
cuvinte = s.split()
print(len(cuvinte))

Mai întâi obținem lista cuvintelor, apoi numărăm elementele.

7. Suma elementelor unui vector UȘOR
a = list(map(int, input().split()))
s = 0
for x in a:
    s = s + x
print(s)
8. Numărul valorilor pare MEDIU
a = list(map(int, input().split()))
cnt = 0
for x in a:
    if x % 2 == 0:
        cnt = cnt + 1
print(cnt)
9. Maximul fără max() MEDIU
a = 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.

10. Căutarea unei valori MEDIU
a = list(map(int, input().split()))
x = int(input())
gasit = False
for v in a:
    if v == x:
        gasit = True
        break
print(gasit)
11. Suma unei matrice MEDIU
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)
12. Suma diagonalei principale MEDIU
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)
13. Elementul maxim din matrice MEDIU
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)
14. Numărul de cifre dintr-un text MEDIU
s = input()
cnt = 0
for c in s:
    if c.isdigit():
        cnt = cnt + 1
print(cnt)
15. Cuvintele în ordine inversă DIFICIL
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

  1. Se citește un șir. Afișați primul caracter.
  2. Se citește un șir. Afișați ultimul caracter.
  3. Afișați șirul inversat.
  4. Numărați câte caractere are șirul fără a folosi len().
  5. Numărați câte litere „a” apar.
  6. Verificați dacă șirul începe cu „Ana”.
  7. Transformați toate literele în majuscule.
  8. Înlocuiți toate spațiile cu caracterul „_”.

Șiruri — nivel mediu

  1. Numărați vocalele și consoanele.
  2. Numărați câte cifre apar într-un text.
  3. Verificați dacă un text este format numai din cifre.
  4. Afișați poziția primei apariții a unui caracter.
  5. Numărați de câte ori apare fiecare dintre vocalele a, e, i, o, u.
  6. Se citește o propoziție. Afișați cel mai lung cuvânt.
  7. Se citește o propoziție. Afișați cuvintele cu mai mult de 5 caractere.

Vectori — nivel ușor și mediu

  1. Citiți un vector și calculați suma elementelor.
  2. Calculați produsul elementelor.
  3. Numărați valorile pare și impare.
  4. Afișați minimul și maximul fără min() și max().
  5. Verificați dacă o valoare apare în vector.
  6. Numărați de câte ori apare o valoare dată.
  7. Calculați media aritmetică.
  8. Afișați elementele vectorului în ordine inversă.
  9. Ștergeți prima apariție a unei valori.
  10. Sortați vectorul crescător și apoi descrescător.

Vectori — nivel mai dificil

  1. Determinați al doilea cel mai mare element distinct.
  2. Eliminați toate aparițiile unei valori date.
  3. Determinați cea mai frecventă valoare.
  4. Construiți un vector care conține numai elementele pare.
  5. Intercalați două vectori.
  6. Verificați dacă un vector este palindrom.

Matrice — nivel mediu

  1. Citiți o matrice și afișați toate elementele.
  2. Calculați suma tuturor elementelor.
  3. Calculați suma fiecărei linii.
  4. Calculați suma fiecărei coloane.
  5. Determinați maximul din fiecare linie.
  6. Determinați minimul din fiecare coloană.
  7. Calculați suma diagonalei principale.
  8. Calculați suma diagonalei secundare.
  9. Numărați elementele pare din matrice.
  10. Verificați dacă o matrice pătratică este simetrică.

18. Recapitulare și verificarea cunoștințelor

Șiruri

știu ce este str, indici, slicing, len(), upper(), lower(), strip(), replace(), find(), count(), startswith(), endswith(), isdigit(), isalpha().

Legătura text → vector

știu să folosesc split() și join().

Vectori

știu să creez o listă, să accesez/modific elemente, să parcurg, să adaug, șterg, caut, număr și sortez.

Matrice

știu că este o listă de liste, pot accesa a[i][j] și pot folosi două bucle pentru parcurgere.

Algoritmi

știu să construiesc algoritmi pentru sumă, numărare, căutare, minim, maxim și frecvențe.

Repetări

ș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.

Obiectivul nu este memorarea comenzilor. Obiectivul este să poți explica, pentru fiecare linie de cod, ce date are, ce transformare face și de ce este necesară în algoritm.