käytännön esimerkkejä
Pythonissa iteroinnin avulla voidaan käydä läpi lista kohteista, joilla voidaan suorittaa tiettyjä operaatioita. Yksi yleinen tapa luoda iteraatio on käyttää for
silmukoita, joilla on seuraava yleinen muoto.
for i in iterable:
expression
kuten edellisessä artikkelissani todettiin, voimme luoda omia iteraattoreitamme, joita voidaan käyttää iteraattoreina for
– silmukoissa. Iteraattoreiden ”ankkatestauksen” täyttämiseksi custom-luokan on toteutettava __iter__()
ja __next__()
– menetelmät. Alla on erityinen esimerkki.
yllä olevassa koodinpätkässä toteutimme sekä __iter__()
että __next__()
menetelmiä, joiden avulla custom-luokan Cubes
iteraattorit saadaan siten, että instanssia voitiin käyttää for
silmukassa.
Callables
sisäänrakennetun dict
tietotyypin lisäksi toinen tärkeä sanakirjatyyppi on defaultdict
, joka löytyy collections
-moduulista. Tällä sanakirjamaisella tietotyypillä on seuraava konstruktio: defaultdict(])
. Erityisesti default_factory
– argumentti on kutsuttava tyyppi, kuten funktio tai lambda-funktio.
edellisessä kirjoituksessani osoitin, että voimme hyödyntää defaultdict
: ää läpäisemällä lambda-funktion. Tässä on esimerkki sen käytöstä.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
varsinkin defaultdict
tietotyypin käyttö voi sujua joustavammin, jos luomme oman oletustehtaan. ”Ankkakirjoitusfilosofialla” kustomoidun luokan on toteutettava __call__()
– menetelmä, joka on tehdä jotain kutsuttavaa. Katsotaan, miten se toimii.
kuten yllä olevasta koodista käy ilmi, luodaan DucklingFactory
luokka, jonka __call__()
funktio palauttaa luettelon yhdestä Duckling
esiintymästä. Tämän tehdastoiminnon avulla voimme tehdä halutun määrän ankanpoikasia kertomalla oletuslistan.
Lajittelu Len-funktiolla ()
toinen mahdollinen sorsatyypityksen käyttötapa on toteuttaa oma len()
– funktio, jota voidaan käyttää luettelon lajittelussa sort()
– funktion avulla. Sivuhuomautuksena jotkut viittaavat len()
– funktioon taikafunktiona, koska se toteutetaan kutsumalla __len__()
– funktiota kohtauksen takana (niitä funktioita, joissa on kaksoisalaviiva etuliitteenä ja loppuliitteenä, kutsutaan taikafunktioiksi).
Oletetaan, että haluamme lajitella luettelon sorsista kunkin Sorsan nimen pituuden perusteella. Näin voimme soveltaa ankka kirjoittamalla tässä tapauksessa.
yllä olevassa koodinpätkässä custom NamedDuck
luokka toteuttaa __str__()
ja __len__()
funktiot, joiden avulla voidaan käyttää str()
ja len()
funktioita sen instansseissa linjoilla 10 ja 12. Tärkeää on, että vaikka lista on sekoitettu nimettyihin ankkoihin ja merkkijonoihin, kaikki elementit voivat kutsua funktioita str()
ja len()
siten, että luettelo voidaan lajitella käyttäen avainta len()
ja käyttää sitä luettelon ymmärtämisessä, kun haluamme tulostaa lajitellun tuloksen.
tämän käytön laajempi seuraus on siis se, että kun meillä on eri tietotyyppien eri osien sekalainen luettelo, kunhan kukin tietotyyppi toteuttaa samat toiminnot, elementit läpäisevät ankkatestin ja niitä sovelletaan asianmukaisin operaatioin. Tässä on yleinen käyttötapausesimerkki käyttäen Len () – funktiota sekalaisessa luettelossa tietotyypeistä str
, tuple
ja list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']