Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Jak korzystać ze słowników jako alternatywy dla if-else w Pythonie (przykłady)

Khuyen Tran Data Science Intern / Ocelot Consulting
Sprawdź, jak wykorzystać słowniki w Pythonie jako alternatywę dla instrukcji if-else.
Jak korzystać ze słowników jako alternatywy dla if-else w Pythonie (przykłady)

Pracowałeś już pewnie ze słownikami Pythona. Pytanie, czy w pełni wykorzystałeś ich potencjał do pisania bardziej wydajnego kodu? Gdybyś nie wiedział, jak tworzy się uporządkowany słownik, grupuje wiele słowników w jeden, tworzy słownik tylko do odczytu, to informacje na ten temat znajdziesz tutaj. My skupimy się na tym, jak korzystać ze słowników Pythona jako alternatywy dla instrukcji if-else


Usuń if-else (i przy okazji zyskaj domyślną wartość)

Weźmy na przykład cennik produktów ze sklepu spożywczego: 

price_list = {
'fish': 8,
'beef': 7,
'broccoli': 3,
}


Chcemy wydrukować cenę danego przedmiotu, ale zakładamy, że nie każda rzecz znajduje się w price_list. Tworzymy więc następującą funkcję:

def find_price(item):
    if item in price_list:
        return 'The price for {} is {}'.format(item, price_list[item])
    else:
        return 'The price for {} is not available'.format(item)
>>> find_price('fish')
'The price for fish is 8'
>>> find_price('cauliflower')
'The price for cauliflower is not available'

 

Nieźle. Instrukcja if-else robi dokładnie to, czego od niej oczekujemy: zwraca następną wartość, gdy jakiegoś przedmiotu nie ma w cenniku. Musieliśmy jednak wysłać zapytanie do słownika dwa razy i używamy dwóch instrukcji, aby zwrócić właściwie to samo. Czy stać nas na więcej? Czy istnieje sposób na zwrócenie wartości domyślnej, jeśli jakiegoś elementu nie ma na liście? Tak, a można to na szczęście zrobić za pomocą metody get().

def find_price(item):
    return 'The price for {} is {}'.format(item, price_list.get(
        item, 'not available'))


.get() szuka klucza i zwraca domyślną wartość z nieistniejącym kluczem. Kod wygląda na zdecydowanie krótszy, ale czy robi to, co chcemy? 

>>> find_price('fish')
'The price for fish is 8'
>>> find_price('cauliflower')
'The price for cauliflower is not available'


Nieźle!


Czy można użyć słownika tam, gdzie nie dostajemy słownika?

Dobre pytanie. Spójrzmy na przykład, w którym nie będziemy mieć w ogóle do czynienia ze słownikami. Załóżmy, że chcemy stworzyć funkcję, która zwraca wartość dla operacji między dwoma liczbami. Oto jak to robimy:

def operations(operator, x, y):
    if operator == 'add':
        return x + y
    elif operator == 'sub':
        return x - y
    elif operator == 'mul':
        return x * y
    elif operator == 'div':
        return x / y
>>> operations('mul', 2, 8)
16

 


A to jest jeszcze bardziej imponujące: 

def operations(operator, x, y):
    return {
        'add': lambda: x+y,
        'sub': lambda: x-y,
        'mul': lambda: x*y,
        'div': lambda: x/y,
    }.get(operator, lambda: 'Not a valid operation')()


Nazwy operatora stają się kluczami, a lambda dobrze kondensuje funkcje jako wartości w słowniku. get() zwraca wartość domyślną, gdy nie zostanie odnaleziony żaden klucz. Sprawdźmy naszą funkcję:

>>> operations('mul', 2, 8)
16
>>> operations('unknown', 2, 8)
'Not a valid operation'


Podsumowanie

Gratulacje! Teraz możesz używać słowników jako alternatywy dla instrukcji if-else. Kiedy się to przydaje? Np. jeśli uznasz, że ciągle korzystasz z if-else i Twój kod jest powtarzalny, to może warto skorzystać wtedy ze słownika. Warto jednak zaznaczyć, że technika ta nie przyda się w każdej sytuacji, ale zawsze warto mieć w zanadrzu jakąś alternatywę dla innego rozwiązania.


Oryginał tekstu w języku angielskim możesz przeczytać tutaj.

2 komentarzy

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej