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.