Ontdek hoe dit alternatieve functietype u kan helpen de geheugenvoetafdruk te verkleinen.
Als u regels uit een logbestand leest of een lange lijst met items verwerkt, is één optie het laden van de volledige gegevens in het geheugen. Deze aanpak kan echter veel geheugen gebruiken en de prestaties belemmeren. Generatoren bieden een waardevolle oplossing.
Generatoren elimineren de noodzaak om alle gegevens tegelijkertijd in het geheugen te laden. Ze zijn handig bij het verwerken van grote datasets, oneindige reeksen of elk scenario waarin geheugenefficiëntie van het grootste belang is.
Wat zijn generatoren?
Een generator is een speciale functie waarmee u een reeks waarden kunt herhalen. In plaats van een volledige set gegevens terug te sturen, genereren ze één waarde tegelijk (of leveren ze deze op). Dit maakt ze efficiënt voor het werken met grote of onbegrensde gegevensreeksen.
A reguliere Python-functie berekent doorgaans een waarde en retourneert deze. Maar generatoren werken anders. Ze kunnen in de loop van de tijd meerdere waarden opleveren door de uitvoering tussen elke opbrengst te pauzeren en te hervatten.
Het belangrijkste onderscheid tussen reguliere functies en generatoren is dat in plaats van het gebruik van de opbrengst trefwoord om een resultaat te produceren, gebruiken generatoren opbrengst.
Hoe u een generator maakt
Om een generator te maken, in plaats van de opbrengst verklaring, gebruik een opbrengst verklaring binnen de functie. De opbrengst trefwoord geeft de functie niet alleen de opdracht een waarde te retourneren, maar zorgt er ook voor dat de status ervan wordt opgeslagen, zodat deze in de toekomst kan worden hervat.
Hier is een voorbeeld van een eenvoudige generatorfunctie:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Deze generatorfunctie levert numerieke waarden op van 1 tot en met 3.
De opbrengst statement slaat de status van de functie op, waarbij lokale variabelen tussen aanroepen behouden blijven, om te hervatten wanneer u de volgende waarde opvraagt.
Door een generatorfunctie aan een variabele toe te wijzen, ontstaat een generatorobject waarmee u kunt werken.
Werken met generatoren
Generatoren hebben meerdere toepassingen. Je kunt ze gebruiken in voor lussen of binnen het begrip van de lijst, evenals andere iterabele structuren. Generatoren kunnen ook dienen als argumenten voor functies.
Nadat u een generator heeft gemaakt, kunt u deze herhalen met behulp van een for-lus:
for i in numeric_generator():
print(i)
Je kunt ook gebruik maken van de volgende functie om waarden één voor één op te halen:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Dit geeft u meer controle over het generatorobject.
Generatoren kunnen hun status bijhouden. Elke opbrengstinstructie in een functie fungeert als een controlepunt. Wanneer u belt met de volgende() functie op het generatorobject, wordt de uitvoering voortgezet vanaf het vorige vloeipunt.
U kunt ook waarden doorgeven aan een generator met behulp van versturen():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
De versturen() Met de methode kunt u waarden uit de generator ophalen en waarden terugsturen naar de generatorfunctie, waardoor deze effectief wordt gepauzeerd en u de uitvoering ervan kunt controleren. De versturen() Deze methode is handig bij het schrijven van coroutines of het gebruik van generatoren voor geavanceerde doeleinden.
Generator-expressies gebruiken
Generatorexpressies bieden een beknopte manier om een eenvoudige en anonieme generator te maken. Ze lijken op lijstbegrippen, maar gebruiken haakjes in plaats van haakjes.
Hier is een voorbeeld:
gen = (i**2for i in range(10))
for x in gen:
print(x)
De code creëert een generatorexpressie die de vierkanten van de getallen 0 tot en met 9 oplevert. Generatorexpressies zijn ideaal voor het lui genereren van een reeks waarden.
Generatoren gebruiken voor gegevensverwerking
Python-generatoren zijn een handige manier om datastromen te beschrijven en iterators te bouwen zonder alles in het geheugen te bewaren. U kunt uw programmering aanzienlijk verbeteren door generatoren te leren gebruiken, waardoor u gemakkelijker uitdagende gegevensverwerkingstaken kunt uitvoeren.
Houd de volgende keer dat u met grote datasets werkt rekening met generatoren en delegeer de arbeidsintensieve taken aan hen, zodat uw code responsief en efficiënt blijft.