Mustripõhine tingimuslause

Sissejuhatus

Python pakub võimsaid võimalusi tingimuslike avaldiste loomiseks. Võimalus tingimuslausetega töötamiseks on kasutada sõnastikku või match'i, mis toimivad sarnaselt "switch/case" avaldistele mõnes teises programmeerimiskeeles. See võimaldab teil asendada pika if-else ahela kompaktsema ja loetavama koodiga.

Sõnastiku kasutamine "switch/case" asemel

Pythonis puudub sisseehitatud "switch/case" avaldis nagu mõnes teises keeles (näiteks C või Java). Selle puudumisel saab aga sõnastikku kasutada samalaadsete tulemuste saavutamiseks. Siin on näide, kuidas seda teha:

def switch_case_example(case):
    switch_dict = {
        'option1': 'Te valisite esimese võimaluse',
        'option2': 'Te valisite teise võimaluse',
        'option3': 'Te valisite kolmanda võimaluse'
    }

    return switch_dict.get(case, 'Valikut ei leitud')

choice = 'option2'
result = switch_case_example(choice)

print(result)

# Väljund:
# Te valisite teise võimaluse

Siin loome funktsiooni switch_case_example, mis võtab argumendiks võtme (case), otsib sellele vastavat väärtust sõnastikust ja tagastab vastava tulemuse. Kui valitud võtit pole sõnastikus, tagastatakse vaikimisi väärtus.

Näide sõnastiku kasutamisest

Allpool toome näite, kuidas saab sõnastikku kasutada if-lausete asemel, et lihtsustada ja selgitada koodi.

def get_weekday_name(weekday):
    days = {
        1: 'Esmaspäev',
        2: 'Teisipäev',
        3: 'Kolmapäev',
        4: 'Neljapäev',
        5: 'Reede',
        6: 'Laupäev',
        7: 'Pühapäev'
    }
    return days.get(weekday, 'Tundmatu päev')

day = 3
day_name = get_weekday_name(day)
print(f'Päev {day} on {day_name}.')

# Väljund:
# Päev 3 on Kolmapäev.

Siin loome funktsiooni get_weekday_name, mis kasutab sõnastikku, et leida nädalapäeva nimi vastavalt antud numbrile. Kui päeva numbrit ei leita sõnastikust, tagastatakse "Tundmatu päev".

Match-Case kasutamine

Alates Python3.10 versioonist on olemas match-case süntaks. Match lubab mugavalt olenevalt muutuja mustrist jooksutada koodi blokke. Match ei võimalda kõiki viise, mida sõnastik pakkub, et pääseda ligi väärtustele, aga on see eest kiirem ja lihtsamini debuggitav. Peamiselt on see sarnane switch-case'iga, mis on olemas C, Java või JavaScrpit keeles, aga tegelikult on see sarnasem mustrilise võrdlusega nagu keeltes Rust ja Haskell. Match kontrollib antud avaldis sobitub mingi case'iga. Python võrdleb ülevalt alla case'e kuni mõni neist osutub sobvaks. (Ainult 1 case jooksutatakse)

a = 2
match a:                        # Found two
    case 1:
        print("Found one")
    case 2:
        print("Found two")
    case 3:
        print("Found three")
    case 2 | 3:
        print("Found two or three")
    case _:
        print("Not found")

Siin on näha, et match case'i loomiseks peame panema ette sõna match, millele järgneb avaldis, ning seejärel koolon. Teine case osutub tõeseks ning see jooksutatakse. Kuigi neljas case on ka sobilik jäätakse see ära, kuna enne selleni jõudmist oli juba sobilik case. Viimane case kasutab erilist süntaksi case _:, mis sobitub kõikide väärtustega. Hea harjumus on tagada, et match on kõikide olude jaoks kaetud ning selle jaoks on hea kasutada case _: tähistust. See on hea tava kuna see väldib olukordasi, kus arendaja teeb vale eelduse, et muutuja ei saa omandada kindlat väärtust, ning seetõttu koodi tomivus ei vasta eeldustele.

Match lubab ka muutujate lahti pakkimist.

match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

Kokkuvõte

Pythonis puudub sisseehitatud "switch/case" avaldis, kuid sõnastiku kasutamine võib olla tõhus ja loetav viis tingimuslike avaldiste loomiseks. Sõnastiku abil saate asendada pika if-else ahela ja teha oma koodi selgemaks ning kergemini hooldatavaks, käsitledes erinevaid valikuid elegantsemalt.

Sõnastiku kasutamine muudab teie koodi loetavamaks ja aitab vältida pikki if-else jadasid.