Praktiske Eksempler
I Python tillater iterasjon oss å gå over en liste over elementer for å utføre bestemte operasjoner. En vanlig måte å lage en iterasjon på er å bruke loopene for
, som har følgende generelle format.
for i in iterable:
expression
som diskutert i min forrige artikkel, kan vi lage våre tilpassede iteratorer som kan brukes som iterables i for
looper. For å tilfredsstille «duck testing» for iteratorer, må den tilpassede klassen implementere __iter__()
og __next__()
metodene. Et spesifikt eksempel er gitt nedenfor.
i kodebiten ovenfor implementerte vi både __iter__()
og __next__()
metoder som gjør forekomster av den egendefinerte klassen Cubes
iteratorer, slik at forekomsten kunne brukes i en for
sløyfe.
Callables
I Tillegg til den innebygde dict
datatypen, er en annen viktig ordbok type defaultdict
, tilgjengelig i collections
modulen. Denne ordlistelignende datatypen har følgende konstruktør: defaultdict(])
. Spesielt er argumentet default_factory
en type kallbar, for eksempel en funksjon eller lambda-funksjon.
i min forrige artikkel viste jeg at vi kunne utnytte defaultdict
ved å sende en lambda-funksjon. Her er eksemplet på bruken.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
Spesielt kan vi ha bedre fleksibilitet til å bruke datatypen defaultdict
hvis vi lager vår egen standardfabrik. Med» duck typing » – filosofien må den tilpassede klassen implementere __call__()
– metoden, som er å gjøre noe callable. La oss se hvordan det fungerer.
som vist i koden ovenfor, oppretter vi DucklingFactory
– klassen, hvis __call__()
– funksjon returnerer en liste over en Duckling
– forekomst. Ved hjelp av denne fabrikkfunksjonen kan vi lage ønsket antall andunger ved å multiplisere standard andungen listen.
Sortering Med Len ()
En annen mulig bruk av andetyping er å implementere den tilpassede len()
– funksjonen, som kan brukes til å sortere en liste ved hjelp av sort()
– funksjonen. Som et sidenotat refererer noen til funksjonen len()
som en magisk funksjon, fordi den implementeres ved å kalle funksjonen __len__()
bak scenen (de funksjonene med doble understreker som prefiks og suffiks kalles magiske funksjoner).
Anta at vi vil sortere en liste over ender basert på lengden på navnet på hver and. Her er hvordan vi kan bruke anda skrive i dette tilfellet.
i kodebiten ovenfor implementerer custom NamedDuck
– klassen __str__()
og __len__()
– funksjonene, som gjør at vi kan bruke str()
og len()
– funksjonene på sine forekomster i Henholdsvis Linjene 10 og 12. Viktig, som du kan se, selv om listen er blandet med navngitte ender og strenger, kan alle elementer ringe til funksjonene str()
og len()
, slik at listen kan sorteres ved hjelp av len()
som nøkkel og brukes i listeforståelsen når vi vil skrive ut det sorterte resultatet.
således er den bredere implikasjonen av denne bruken at når vi har en blandet liste over elementer av forskjellige datatyper, så lenge hver datatype implementerer de samme funksjonene, vil elementene passere and-testen og bli brukt med de riktige operasjonene. Her er et eksempel på generell bruk ved hjelp av len () – funksjonen på en blandet liste over datatyper str
, tuple
og list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']