Pattern: Flag
Uneori nu trebuie să numărăm lucruri sau să acumulăm un rezultat. Trebuie doar să știm: s-a întâmplat ceva sau nu? Da sau nu. Acesta este tiparul steag (flag)
Un steag este o variabilă booleană care pornește ca True sau False și se schimbă când o anumită condiție este îndeplinită
numere = [2, 4, 6, 8, 10]
toate_pare = True
for n in numere:
if n % 2 != 0:
toate_pare = False
if toate_pare:
print("Toate numerele sunt pare")
else:
print("Nu toate numerele sunt pare")
Rezultat Toate numerele sunt pare
Am pornit de la presupunerea all_even = True (optimist, credem că sunt toate pare). Dacă găsim măcar un număr care nu este par, setăm steagul la False. La final, verificăm steagul
numere = [2, 4, 7, 8, 10]
toate_pare = True
for n in numere:
if n % 2 != 0:
toate_pare = False
if toate_pare:
print("Toate numerele sunt pare")
else:
print("Nu toate numerele sunt pare")
Rezultat Nu toate numerele sunt pare (din cauza lui 7)
Și varianta opusă funcționează: pornim cu False și trecem la True
nume = ["Tommy", "Lance", "Cortez", "Phil"]
tinta = "Cortez"
gasit = False
for n in nume:
if n == tinta:
gasit = True
if gasit:
print(f"{tinta} este in lista!")
else:
print(f"{tinta} nu este in lista")
Rezultat Cortez este în listă!
Pornim pesimist (gasit = False) și trecem la True doar dacă chiar găsim ținta
Putem combina steagul cu break pentru eficiență. Odată ce am găsit ce ne trebuie, de ce să continuăm căutarea?
nume = ["Tommy", "Lance", "Cortez", "Phil"]
tinta = "Lance"
gasit = False
for n in nume:
if n == tinta:
gasit = True
break
if gasit:
print(f"Gasit {tinta}!")
else:
print(f"{tinta} negasit")
Un exemplu practic: verificarea dacă o parolă este puternică (are cel puțin o literă majusculă, o literă minusculă și o cifră)
parola = "Tommy123"
are_majuscula = False
are_minuscula = False
are_cifra = False
for caracter in parola:
if caracter.isupper():
are_majuscula = True
elif caracter.islower():
are_minuscula = True
elif caracter.isdigit():
are_cifra = True
if are_majuscula and are_minuscula and are_cifra:
print("Parola puternica")
else:
print("Parola slaba")
Rezultat Parolă puternică. Trei steaguri, câte unul pentru fiecare cerință
Misiune: Verificarea Codului de Acces
Un cod de acces al stației este valid doar dacă îndeplinește toate cele trei reguli: are cel puțin o literă majusculă, cel puțin o cifră și are cel puțin 6 caractere lungime.
Citește un cod, apoi folosește steaguri (are_majuscula și are_cifra, fiecare pornind de la False și schimbat la True când găsești unul) plus o verificare a lungimii. Afișează fiecare rezultat, apoi verdictul:
Intrare:
- codul de acces
Ieșire: patru linii: cele trei verificări, apoi Cod de acces valid sau Cod de acces invalid.
Exemplu
Dacă utilizatorul tastează
Orbit42
programul ar trebui să afișeze
Are majuscula: True
Are cifra: True
Suficient de lung: True
Cod de acces valid
Dacă utilizatorul tastează
orbit
programul ar trebui să afișeze
Are majuscula: False
Are cifra: False
Suficient de lung: False
Cod de acces invalid