[Zadanie rekrutacyjne 6] Zasymuluj konstrukcję Switch Case w Pythonie

Data publikacji: 2016-04-12 | Tagi:

Konstrukcji Switch Case jako takiej w pythonie nie ma. Ale jeśli jest niezbędna (rzadko, ale bywa), możemy ją w jakiś sposób zasymulować.

Treść zadania: jak to zrobić? :)

Dla przypomnienia kawałek pseudokodu:

Switch zmienna
    Case 1:
        Print("Zmienna ma wartość 1")
        Break
    EndCase
    Case 2:
        Print("Zmienna ma wartość 2")
        Break
    EndCase
    Case Default:
        Print("Zmienna ma wartość nie 1 i nie 2")
        Break
    EndCase
EndSwitch

Sprawdzamy stan zmiennej zmienna i w zależności od jej wartości wyświetlamy odpowiedni komunikat. Przy czym, jeśli wartość zmiennej będzie równia 1 zostanie wyświetlony tekst Zmienna ma wartość 1; jeśli wartość zmiennej będzie równa 2 zostanie wyświetlony tekst Zmienna ma wartość 2. W każdym innym wypadku zostanie wyświetlony tekst Zmienna ma wartość nie 1 i nie 2.

Dawno nie używałem tej konstrukcji, ale pamiętam, że trzeba było używać instrukcji Break na końcu każdego segmentu Case ponieważ w innym wypadku, oprócz kodu w Case .. EndCase wykonywał się również bezwarunkowo ostatni, domyślny segment.

Ok, to jak to zrobić w pythonie?

Najbardziej prawidłowa odpowiedź: nie robić. Konstrukcje te są niezbyt czytelne, długie, ciężko czasem dojść o co i gdzie chodzi w bloku, który ma naście rozgałęzień.

Ale jeśli już zajdzie potrzeba zrobienia czegoś takiego, to proponuję taki kod:

def print_1():
    print(u"Zmienna ma wartość 1")


def print_2():
    print(u"Zmienna ma wartość 2")


def print_default():
    print(u"Zmienna ma wartość nie 1 i nie 2")


case = {
    1: print_1,
    2: print_2,
}

case.get(zmienna, print_default)()

Albo taki kod:

def print_1():
    print(u"Zmienna ma wartość 1")


def print_2():
    print(u"Zmienna ma wartość 2")


def print_default():
    print(u"Zmienna ma wartość nie 1 i nie 2")


if zmienna == 1:
    print_1()
elif zmienna == 2:
    print_2()
else:
    print_default()

W obu przypadkach mamy definicje trzech funkcji wykonywanych dla każdej wartości zmiennej. Ciekawie zaczyna się robić, gdy dojdziemy do sedna kodu. W pierwszym przypadku jest to:

case = {
    1: print_1,
    2: print_2,
}
case.get(zmienna, print_default)()

W drugim przypadku jest to:

if zmienna == 1:
    print_1()
elif zmienna == 2:
    print_2()
else:
    print_default()

Drugi przypadek nie potrzebuje moim zdaniem wytłumaczenia: mamy if, mamy elif, mamy else. Koniec, każdy powinien wiedzieć, o co chodzi :).

Pierwszy przypadek jest nieco ciekawszy. Inicjalizujemy słownik kluczami obsługiwanymi (1, 2), jako wartości nadając im nazwy funkcji do wywołania. Następnie korzystamy z metody get słownika. Jako pierwszy parametr podajemy klucz, który chcemy pobrać (w naszym wypadku, jest to zmienna), jako drugi podajemy nazwę funkcji domyślnej (kiedy nie zostanie znaleziony klucz słownika). Jako wisienka na torcie służą nam dwa nawiasy (), które powodują, że funkcja zostanie wykonana.

Jak widać ani pierwszy przykład, ani drugi, ani tym bardziej pseudokod nie należą do najczytelniejszych.

Tutaj mają zastosowanie przynajmniej dwie zasady zen pythona:

Simple is better than complex.

oraz:

If the implementation is hard to explain, it's a bad idea.

To by było na tyle. Moim zdaniem Switch Case pod względem uzyteczności i czytelności zajmuje miejsce blisko GoTo, ale co ja tam wiem ;).


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: