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.
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.
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.
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']