praktiske eksempler
i Python giver iteration os mulighed for at gå over en liste over emner til at udføre bestemte operationer. En almindelig måde at oprette en iteration på er at bruge for
sløjferne, som har følgende generelle format.
for i in iterable:
expression
som diskuteret i min tidligere artikel kan vi oprette vores brugerdefinerede iteratorer, der kan bruges som iterables i for
loops. For at tilfredsstille “duck testing” for iteratorer skal den brugerdefinerede klasse implementere __iter__()
og __next__()
metoderne. Et specifikt eksempel er angivet nedenfor.
i ovenstående kodestykke implementerede vi både __iter__()
og __next__()
metoder, der gør forekomsterne af den brugerdefinerede klasse Cubes
iteratorer, således at forekomsten kunne bruges i en for
loop.
Callables
udover den indbyggede dict
datatype er en anden vigtig ordbogstype defaultdict
, tilgængelig i collections
modulet. Denne ordbog-lignende datatype har følgende konstruktør: defaultdict(])
. Specifikt er argumentet default_factory
en type, der kan kaldes, såsom en funktion eller lambda-funktion.
i min tidligere artikel viste jeg, at vi kunne udnytte defaultdict
ved at passere en lambda-funktion. Her er eksemplet på dets brug.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
især kan vi have bedre fleksibilitet til at bruge datatypen defaultdict
, hvis vi opretter vores egen standardfabrik. Med filosofien “duck typing” skal den brugerdefinerede klasse implementere __call__()
– metoden, som er at gøre noget, der kan kaldes. Lad os se, hvordan det virker.
som vist i ovenstående kode opretter vi klassen DucklingFactory
, hvis __call__()
funktion returnerer en liste over en Duckling
forekomst. Ved hjælp af denne fabriksfunktion kan vi lave det ønskede antal ænder ved at multiplicere standard duckling-listen.
sortering med Len ()
en anden mulig anvendelse af ændertypning er at implementere den brugerdefinerede len()
– funktion, som kan bruges til at sortere en liste ved hjælp af funktionen sort()
. Som en sidebemærkning henviser nogle mennesker til len()
– funktionen som en magisk funktion, fordi den implementeres ved at kalde __len__()
– funktionen bag scenen (disse funktioner med dobbelt understregninger som præfiks og suffiks kaldes magiske funktioner).
Antag, at vi vil sortere en liste over ænder baseret på længden af navnet på hver And. Sådan kan vi anvende ændertypningen i dette tilfælde.
i ovenstående kodestykke implementerer den brugerdefinerede NamedDuck
– klasse funktionerne __str__()
og __len__()
, som gør det muligt for os at bruge funktionerne str()
og len()
på dens forekomster i henholdsvis linje 10 og 12. Det er vigtigt, som du kan se, selvom listen er blandet med navngivne ænder og strenge, kan alle elementer kalde funktionerne str()
og len()
, således at listen kan sorteres ved hjælp af len()
som nøglen og bruges i listeforståelsen, når vi vil udskrive det sorterede resultat.
den bredere implikation af denne brug er således, at når vi har en blandet liste over elementer af forskellige datatyper, så længe hver datatype implementerer de samme funktioner, vil elementerne bestå ændertesten og blive anvendt med de korrekte operationer. Her er et eksempel på generel brug ved hjælp af funktionen len() på en blandet liste over datatyper str
, tuple
og list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']