José: Hallo en welkom terug.
In deze video kijken we naar iterables in Python.
In de laatste video hebben we
gekeken naar iterators, dus wat is in vredesnaam een iterable?
Welnu, een iterabel is
een object met een __iter__()-methode of een __iter__()-methode.
Dus iets dat er zo uitziet.
Zodra u deze methode in een willekeurig object definieert,
is dat nu een iterable.
Dus laten we hier iets definiëren.
Laten we een FirstHundredIterable definiëren.
Deze FirstHundredIterable gaat gewoon deze
__iter__(), of __iter() methode definiëren, en deze __iter__() methode vertelt Python
dat je in staat wilt zijn om over deze iterable
te itereren, zoals in een for-lus, of je wilt
doen een deel ervan, of je
wilt er een lijst van maken.
Wat heeft het om terug te keren?
Het moet een iterator retourneren.
Dus retourneer FirstHundredGenerator().
Nu kun je zoiets doen
als de som van FirstHundredIterable afdrukken, en het
zal het leuk vinden, en het zal je 4950 vertellen.
Je kunt het ook herhalen
met een for-lus en het komt goed.
Het geeft je ook alle nummers daar.
Dus dat maakt een itereerbaar.
Niets magisch, hoeft niets gekunstelds te doen.
Voor Python, om een iterable te worden, hoef
je alleen deze methode te definiëren, en die methode
moet iets teruggeven
waarop je __next__() kunt aanroepen.
Het moet een iterator retourneren.
Alle generatoren zijn
iteratoren, dus dit kan natuurlijk een generator zijn.
Als je dit een beetje eenvoudiger wilt maken, wat
je kunt doen,
in plaats van een aparte klasse te
hebben die de FirstHundredIterator retourneert, kun je jezelf afvragen ...
Er is hier
een __iter__() methode die een object van dit type retourneert.
Wat is FirstHundredGenerator() in de
context van deze klasse?
Dit is een vrij vage vraag, maar ik zou zeggen dat het zelf.
Zelf is altijd het huidige object,
en wat je hier doet, is een object
retourneren, dus je kunt dit
zeker doen.
Nu heb je deze FirstHundredIterable niet langer
nodig, en je kunt gewoon FirstHundredGenerator() hier retourneren, en het
zal nu zo blijven.
Nu is je generator een beetje meer verwarrend omdat
het zowel een iterator als een iterable is, en dat kan in
sommige gevallen verwarrend zijn, maar in andere
gevallen kan het echt
handig zijn omdat het veel korter is dan een
aparte klasse om dat voor je te doen.
Nogmaals, de iterabele retourneerde een iterator met behulp
van deze __iter__() methode.
Dus je kunt dat ook vanuit
de iterator zelf doen, aangezien self altijd een iterator
is, omdat self het object is dat deze dunder __next__() methode heeft.
Dus ik heb veel eerder
in de cursus iets gezegd over for-loops en hoe
we een object nodig hadden waarin dunder __len__() en dunder __getitem__() waren gedefinieerd.
Dus waar gaat dat over?
Laten we een
andere iterabele definiëren, en het zal
een __len__(), len(self. auto's), en ik ga hier auto's initialiseren.
Dus laten we zeggen dat we onszelf hebben. cars gelijk
is aan deze lijst met twee elementen, definiëren we een dunder __len__()
methode, die de lengte van de lijst
retourneert, en we definiëren ook een __getitem__() methode die de
index opneemt die we willen ophalen, en
alleen retourneert zelf. auto's [ik].
Eerder in de cursus hebben we hiernaar gekeken en ik zei dat wanneer
je een object hebt dat
er zo uitziet en dat de __len__() en de __getitem__() methode
heeft, je for loop erop kunt gebruiken.
En inderdaad, als we dat doen voor auto in AnotherIterable(), zul
je zien dat dit de auto's, Fiesta en Focus afdrukt.
Dus dit is ook een herhaling?
Het heeft geen __iter__() methode.
Het retourneert geen generator.
En het antwoord is ja.
In Python kun je je iterables laten definiëren met een __iter__()
methode die een iterable retourneert, of je
kunt een object hebben met een lengte en een getitem.
Beide zijn iterables en je kunt for-loops gebruiken, je kunt __sum__()
gebruiken, je kunt __len__() erin gebruiken ...
Sorry, niet __len__(), je kunt __list__() erin gebruiken.
Dus beide dingen zijn herhalingen.
Nou, oké?
En nu hebben we wat geleerd over
iterables, hoe ze verschillen van
iterators, maar ze zijn normaal gesproken samen, hand in hand.
Een iterator wordt gebruikt om de volgende waarde te krijgen, en een
iterabel wordt gebruikt om alle waarden van een
iterator te doorlopen.
Dus een iterator laat je meer stap voor
stap gaan, voor het geval je dat wilt doen, door
__next__() aan te roepen, en met de iterable kun je alle elementen doornemen.
Dus dat was het voor deze video.
Als het niet veel zin heeft en je je afvraagt:
"Waarom heb ik dit in godsnaam nodig? "Maak je geen
zorgen.
Over een paar delen
zul je denken: "Oh mijn god, dit is
zo logisch", terwijl we leren over asynchrone Python.
Ik geef je hier maar een paar hints.
En ook, als je een lijst wilt gebruiken of
doornemen die wat langer is, kun je generatoren gebruiken om dat te doen.
Laat me nu ook zeggen, nu we
hier zijn, dat in plaats van my_numbers = [x
voor x in [1, 2,
3, 4, 5]] bijvoorbeeld, dit een lijstbegrip is.
my_numbers_gen(), u kunt een generatorbegrip doen.
Deze instantie is niet erg handig, maar
dit is nu ook een generatorobject.
Dat is slechts een afkorting voor het herhalen van een reeks.
U kunt het volgende doen (my_numbers_gen).
Je kunt het uitprinten.
Dus begrip van generatoren, een behoorlijk
populair ding om te doen, en het is ook niet afgedrukt.
Dus dat wilde ik toch even noemen.
Dit is niet het
tuple-begrip; dit is een generatorbegrip.
En we kunnen het gebruiken om direct een generatorobject
te maken, laten we __next__() ook in deze syntaxis aanroepen.
Nogmaals, het enige dat het doet, is
deze lijst doornemen en elk nummer opleveren terwijl u __next__() aanroept.
Het kopieert dus niet de hele lijst, wat dit wel doet.
Hiermee kopieert u de lijst en krijgt u een ander exemplaar.
Hiermee kunt u het één voor
één bekijken zonder de hele lijst te kopiëren.
Natuurlijk is dit voorbeeld niet erg goed.
Je zou deze lijst
gewoon kunnen herhalen omdat je hem daar al
hebt, maar het kan handig zijn in
andere gevallen, zoals wanneer je over een andere
generator itereert en je er meteen wat wijzigingen in wilt aanbrengen.
Dus het kan handig zijn in bepaalde gevallen.
We zullen hier later nog meer voorbeelden van tegenkomen.
Ik wilde je een beetje van de syntaxis geven.
Dat was het in ieder geval voor deze video.
Ik wil je niet langer houden.
Ik zie je bij de volgende.