Gevorderde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau
### Generators in Python Een generator in Python is een functie die gebruikt wordt om een iteratieoverzicht te produceren, maar in plaats van het hele gegevensverloop tegelijk te retourneren, produceert het items één voor één en alleen wanneer dat nodig is. Dit wordt gedaan met behulp van het `yield`-sleutelwoord in plaats van `return`. #### Waarom generators gebruiken? - **Efficiënt geheugengebruik**: Door gegevens één voor één te produceren, vermijden generators het opslaan van hele lijsten in het geheugen, wat vooral voordelig is bij het werken met grote gegevensverzamelingen. - **Gemakkelijk te implementeren**: Generators zorgen voor invoer en controle van iteratiestromen zonder het gebruik van tussenliggende lijsten. #### Hoe werken generators? Een eenvoudige generator kan als volgt worden gedefinieerd: ```python def eenvoudige_generator(): yield 1 yield 2 yield 3 ``` Gebruik de generator als volgt: ```python for waarde in eenvoudige_generator(): print(waarde) ``` Dit zal de uitvoer van 1, 2 en 3 afdrukken, elk op een nieuwe regel. #### `yield` versus `return` - `return` beëindigt de functie en retourneert een enkele waarde. - `yield` pauzeert de functie en retourneert de waarde, maar behoudt de staat van de functie voor de volgende iteratie.
Manueel een Generator Vooruitzetten
Doelstelling
Gebruik generator in een handmatige volgorde om materialen samen te stellen en te produceren om brood te maken.
Voor je ligt een faciliteit waar je brooddeeg kunt samenstellen met behulp van de persen. Normaal zou je de functie combine() gebruiken om materialen samen te voegen, maar dat is hier niet het geval, de materialen moeten eerst worden verfijnd voordat ze kunnen worden samengevoegd.
Voor deze taak kunnen we generators gebruiken, omdat ze kunnen worden aangepast om verschillende bestandstypen uit te voeren en hun volgorde op commando kan worden aangeroepen in plaats van automatisch zoals functies en lussen doen. Hier is een voorbeeld:
def bread():
yield 5
yield "grain"
De bovenstaande code heeft een generator met twee yield-verklaringen, waarvan er een een reëel getal produceert en een andere een string. We kunnen de waarden van de generator naar wens produceren met behulp van de next()-functie. Als volgt:
recipe = bread() # Stelt de generator in player.place(next(recipe)) # Eerste waarde wordt opgeroepen player.collect(next(recipe)) # Tweede waarde wordt opgeroepen
In het bovenstaande voorbeeld wordt de generator ingesteld en de next()-functie gebruikt met de generator om de eerste yield-waarde op te roepen voor gebruik in een place()-functie. Dit wordt herhaald met de tweede waarde, maar wordt in plaats daarvan gebruikt in een collect()-functie. Dit maakt het gemakkelijk om waarden van verschillende typen in een volgorde op te roepen zonder meerdere lijsten of variabelen te hoeven gebruiken.
Een generator genaamd bread() zal in de code-editor worden gedefinieerd, maar deze zal getalhoeveelheden voor elk ingrediënt nodig hebben om het brooddeeg te verfijnen. Deze cijfers staan op het bord naast de faciliteit. Stel de generator in voor gebruik door deze te refereren, als volgt: recipe = bread()
Loop eerst naar de lichte X-markering naast de melktank en collect() de laatste melk uit de tank met behulp van de generator next()-functie, als volgt: player.collect(next(recipe)). Loop vervolgens naar de gouden X-markering naast het bord en gebruik de speak()-functie om de getallen op te halen die nodig zijn voor de generator om het brood te produceren en schrijf ze op in de generator. De gegevens worden opgeslagen in een constante genaamd "sign" en worden als volgt opgeroepen: player.speak(sign).
Zodra alle waarden in de generator zijn ingevoerd, ga de faciliteit in en gebruik player.place(next(recipe)) op donkere X-markeringen en player.collect(next(recipe)) op lichte X-markeringen om het niveau te voltooien.