Array-uri în pattern matching
În construcția pattern matching, array-urile (sau listele) pot fi utilizate ca șabloane. Aceste șabloane pot conține fie valori specifice, fie variabile în care sunt stocate elementele array-urilor, fie simbolul underscore _, dacă un element al array-ului nu este important:
def print_people(people):
match people:
case ["Tom", "Sam", "Bob"]:
print("default people")
case ["Tom", second, _]:
print(f"Second Person: {second}")
case [first, second, third]:
print(f"{first}, {second}, {third}")
print_people(["Tom", "Sam", "Bob"]) # default people
print_people(["Tom", "Mike", "Bob"]) # Second Person: Mike
print_people(["Alice", "Bill", "Kate"]) # Alice, Bill, Kate
print_people(["Tom", "Kate"]) # nu corespunde niciunui șablon
În acest caz, funcția print_people primește un array care, se presupune, este compus din trei elemente.
Primul șablon presupune că elementele array-ului au valori specifice:
case ["Tom", "Sam", "Bob"]:
print("default people")
Aici, primul element al array-ului trebuie să fie șirul "Tom", al doilea - șirul "Sam", și al treilea - șirul "Bob".
Al doilea șablon presupune că primul element al array-ului trebuie să fie șirul "Tom", iar celelalte două elemente pot avea valori arbitrare:
case ["Tom", second, _]:
print(f"Second Person: {second}")
Valoarea celui de-al doilea element este atribuită variabilei second, iar valoarea celui de-al treilea element nu este importantă, astfel că se utilizează simbolul underscore _ în locul său.
Al treilea șablon corespunde oricărui array de trei elemente. Elementele acestuia sunt atribuite variabilelor first, second, și third:
case [first, second, third]:
print(f"{first}, {second}, {third}")
În acest caz, pentru a corespunde oricărui șablon, array-ul trebuie să aibă trei elemente. Totuși, se pot defini șabloane și pentru array-uri de diferite lungimi:
def print_people(people):
match people:
case [_]:
print("Array de un element")
case [_, _]:
print("Array de două elemente")
case [_, _, _]:
print("Array de trei elemente")
case _:
print("Neclar")
print_people(["Tom"]) # Array de un element
print_people(["Tom", "Sam"]) # Array de două elemente
print_people(["Tom", "Sam", "Bob"]) # Array de trei elemente
print_people("Tom") # Neclar
Array-uri cu lungime nedefinită
Dacă este necesar să se compare o expresie cu un array de lungime nedefinită, pot fi definite valori/variabile doar pentru elementele obligatorii ale array-ului, iar pentru cele neobligatorii se poate folosi simbolul * (stea):
def print_people(people):
match people:
case [first, *other]:
print(f"First: {first} Other: {other}")
print_people(["Tom"]) # First: Tom Other: []
print_people(["Tom", "Sam"]) # First: Tom Other: ["Sam"]
print_people(["Tom", "Sam", "Bob"]) # First: Tom Other: ["Sam", "Bob"]
În exemplul de mai sus, se folosește parametrul *other, care corespunde tuturor celorlalte elemente. Astfel, șablonul [first, *other] corespunde oricărui array care are cel puțin un element, iar acest element va fi atribuit variabilei first. Toate celelalte elemente vor fi atribuite variabilei other, care reprezintă un array de valori.
Dacă parametrul cu simbolul * (other) nu este important, dar dorim ca șablonul să corespundă unui array cu unul sau mai multe elemente, putem folosi sub-șablonul *_:
def print_people(people):
match people:
case [first, *_]:
print(f"First: {first}")
print_people(["Tom"]) # First: Tom
print_people(["Sam", "Tom"]) # First: Sam
print_people(["Bob", "Sam", "Tom"]) # First: Bob
Valori alternative
Dacă este necesar ca un element al array-ului să corespundă unui set de valori, aceste valori pot fi enumerate folosind o bară verticală:
def print_people(people):
match people:
case ["Tom" | "Tomas" | "Tommy", "Sam", "Bob"]:
print("default people")
case [first, second, third]:
print(f"{first}, {second}, {third}")
print_people(["Tom", "Sam", "Bob"]) # default people
print_people(["Tomas", "Sam", "Bob"]) # default people
print_people(["Alice", "Bill", "Kate"]) # Alice, Bill, Kate
În acest caz, primul șablon corespunde unui array de trei elemente, unde primul element este fie "Tom", fie "Tomas", fie "Tommy".
De asemenea, pot fi definite valori alternative atât pentru elemente individuale, cât și pentru array-uri alternative:
def print_people(people):
match people:
case ["Tom", "Sam", "Bob"] | ["Tomas", "Sam", "Bob"]:
print("Tom/Tomas, Sam, Bob")
case [first, second, third]:
print(f"{first}, {second}, {third}")
print_people(["Tom", "Sam", "Bob"]) # Tom/Tomas, Sam, Bob
print_people(["Tomas", "Sam", "Bob"]) # Tom/Tomas, Sam, Bob
print_people(["Alice", "Bill", "Kate"]) # Alice, Bill, Kate
În acest caz, primul șablon va corespunde la două array-uri: ["Tom", "Sam", "Bob"] și ["Tomas", "Sam", "Bob"].