Problem Decomposition
Bun venit la a doua parte a curriculumului de Python. Până acum, am învățat uneltele: variabile, bucle, funcții, liste, dicționare. Acum învățăm cum să gândim cu ele
Cea mai importantă abilitate în programare nu este să cunoști sintaxa. Este să știi cum să împarți o problemă în pași mai mici. Asta se numește descompunere
Să zicem că cineva îți cere: „Scrie un program care găsește cel mai frecvent cuvânt dintr-o propoziție"
Dacă încerci să scrii totul dintr-o dată, te vei pierde. În schimb, gândește-te pas cu pas
Pasul 1: Cum obțin cuvintele individuale dintr-o propoziție? → folosește .split()
propozitie = "the cat sat on the mat the cat"
cuvinte = propozitie.split(" ")
print(cuvinte)
Rezultat ['the', 'cat', 'sat', 'on', 'the', 'mat', 'the', 'cat']
Pasul 2: Cum număr de câte ori apare fiecare cuvânt? → folosește un dicționar
contor = {}
for cuvant in cuvinte:
if cuvant in contor:
contor[cuvant] = contor[cuvant] + 1
else:
contor[cuvant] = 1
print(contor)
Rezultat {'the': 3, 'cat': 2, 'sat': 1, 'on': 1, 'mat': 1}
Pasul 3: Cum găsesc care cuvânt are numărul cel mai mare? → parcurge dicționarul
cel_mai_bun_cuvant = ""
cel_mai_bun_numar = 0
for cuvant, numar in contor.items():
if numar > cel_mai_bun_numar:
cel_mai_bun_numar = numar
cel_mai_bun_cuvant = cuvant
print(f"Cel mai frecvent: {cel_mai_bun_cuvant} ({cel_mai_bun_numar} ori)")
Rezultat Cel mai frecvent: the (3 ori)
Fiecare pas este simplu în sine. Trucul este să nu încerci să rezolvi totul dintr-o dată. În schimb:
- Înțelege ce cere problema
- Împarte-o în sub-probleme mai mici
- Rezolvă fiecare sub-problemă pe rând
- Combină soluțiile
Așa gândesc programatorii profesioniști. Nimeni nu scrie un program dintr-o singură mișcare. Îl construiesc bucată cu bucată, testând fiecare bucată pe parcurs
Hai să mai facem una. „Dată fiind o listă de numere, găsește toate perechile care însumează o țintă"
Pasul 1: Ce înseamnă „toate perechile"? → fiecare combinație de două numere
numere = [1, 3, 5, 7, 2]
tinta = 8
Pasul 2: Cum verific fiecare pereche? → buclă imbricată
for i in range(len(numere)):
for j in range(i + 1, len(numere)):
if numere[i] + numere[j] == tinta:
print(f"{numere[i]} + {numere[j]} = {tinta}")
Ieșire
1 + 7 = 8
3 + 5 = 8
De ce range(i + 1, len(numere))? Pentru că nu vrem să formăm o pereche dintr-un număr cu el însuși, și nu vrem să numărăm aceeași pereche de două ori (3+5 și 5+3 sunt aceeași pereche)
Misiune: Analizatorul de Jurnal
Jurnalul stației, stocat într-o variabilă numită jurnal, este un singur șir de coduri de eveniment separate prin spații. Împarte munca în trei funcții, apoi folosește-le împreună:
desparte_coduri(jurnal): returnează lista de coduri (folosește.split(" "))numara_coduri(coduri): returnează un dicționar care asociază fiecărui cod de câte ori aparecel_mai_frecvent(contor): returnează codul cu numărul cel mai mare
În programul principal, apelează funcțiile în ordine, apoi afișează:
Coduri:apoi numărul total de coduri- fiecare cod ca
cod: contor(parcurge dicționarul) Cel mai frecvent:apoi codul cel mai frecvent
Ieșire
Coduri: 6
alpha: 3
beta: 2
gamma: 1
Cel mai frecvent: alpha