pisanie na kaczkę w Pythonie – 3 praktyczne przykłady

praktyczne przykłady

w Pythonie iteracja pozwala nam przejrzeć listę elementów do wykonania określonych operacji. Jednym z powszechnych sposobów tworzenia iteracji jest użycie pętli for, które mają następujący ogólny format.

for i in iterable:
expression

jak omówiłem w poprzednim artykule, możemy utworzyć nasze niestandardowe Iteratory, które mogą być używane jako iterable w pętlach for. Aby spełnić „duck testing” dla iteratorów, Klasa niestandardowa musi zaimplementować metody __iter__() i __next__(). Konkretny przykład podano poniżej.

Duck wpisując w Iteratorach

w powyższym fragmencie kodu zaimplementowaliśmy zarówno metody __iter__(), jak i __next__(), które tworzą instancje niestandardowych iteratorów klasy Cubes, tak że instancja może być używana w pętli for.

wywołania

oprócz wbudowanego typu danych dict, innym ważnym typem słownika jest defaultdict, dostępny w module collections. Ten słownikowy typ danych ma następujący konstruktor: defaultdict(]). W szczególności argument default_factory jest typem wywoływalnym, takim jak funkcja lub funkcja lambda.

w poprzednim artykule pokazałem, że możemy wykorzystać defaultdict przekazując funkcję lambda. Oto przykład jego użycia.

>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()

warto zauważyć, że możemy mieć większą elastyczność w użyciu typu danych defaultdict, jeśli utworzymy własną domyślną fabrykę. Z filozofią „Duck typing”, Klasa niestandardowa musi zaimplementować metodę __call__(), która ma sprawić, że coś będzie można wywołać. Zobaczmy, jak to działa.

Duck wpisując wywołania

jak pokazano w powyższym kodzie, tworzymy klasę DucklingFactory, której funkcja __call__() zwraca listę jednej instancji Duckling. Korzystając z tej funkcji fabrycznej, będziemy mogli uzyskać żądaną liczbę kacząt poprzez pomnożenie domyślnej listy kacząt.

sortowanie za pomocą Len()

innym możliwym zastosowaniem pisania kaczki jest implementacja niestandardowej funkcji len(), która może być używana do sortowania listy za pomocą funkcji sort(). Na marginesie, niektórzy ludzie odnoszą się do funkcji len() jako funkcji magicznej, ponieważ jest ona zaimplementowana przez wywołanie funkcji __len__() za sceną (te funkcje z podwójnymi podkreślnikami jako prefiksem i sufiksem nazywane są funkcjami magicznymi).

Załóżmy, że chcemy posortować listę kaczek na podstawie długości nazwy każdej kaczki. Oto jak możemy zastosować pisanie kaczki w tym przypadku.

Duck Typing in Sorting

w powyższym fragmencie kodu, niestandardowa Klasa NamedDuck implementuje funkcje __str__() i __len__(), które pozwalają nam używać funkcji str() i len() na swoich instancjach w wierszach 10 i 12, odpowiednio. Co ważne, jak widać, chociaż lista jest mieszana z nazwanymi kaczkami i łańcuchami, wszystkie elementy mogą wywoływać funkcje str() i len(), tak że lista może być sortowana za pomocą len() jako klucza i używana w zrozumieniu listy, gdy chcemy wydrukować posortowany wynik.

tak więc szersza implikacja tego użycia jest taka, że gdy mamy mieszaną listę elementów różnych typów danych, o ile każdy typ danych implementuje te same funkcje, elementy przejdą testy duck i zostaną zastosowane przy odpowiednich operacjach. Oto ogólny przykład użycia funkcji len () na mieszanej liście typów danych str, tuple i list.

>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']

You might also like

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.