CyberStars

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