Generator (informatyka)
W informatyce, generator jest szczególnym rodzajem kontynuacji, który można wykorzystywać jako iterator. Po raz pierwszy generatory zostały wprowadzone w CLU (1975) i obecnie są dostępne w Pythonie, PHP, C#, Ruby i JavaScript. (W CLU i C# nazywane są iteratorami.)
Generator jest bardzo podobny do funkcji zwracającej tablicę w tym, że tak jak ona może być wywoływany z argumentami i generuje listę wartości. Jednak zamiast budować pełną tablicę zawierającą wszystkie elementy i zwracać je wszystkie naraz, generator zwraca je po jednym, co znacznie oszczędza pamięć i pozwala funkcji wywołującej generator korzystać z danych od razu już od pierwszych elementów. Generatory można też wykorzystywać do leniwej iteracji po elementach listy. Jest to użyteczne, gdy prawdopodobnie potrzebnych będzie tylko kilka pierwszych elementów listy, a obliczenie całej listy byłoby kosztowne lub niepraktyczne.
Przykładowy generator w C#:
static IEnumerable<Pair<T>> WszystkieParyElementów<T>(IList<T> l)
{
for (int x=0;x<l.Count;x++)
{
for (int y=x+1;y<l.Count;y++)
{
yield return new Pair<T>(l[x],l[y]);
}
}
}
W Pythonie generator można traktować jako iterator zawierający zamrożone wywołanie funkcji. Za każdym razem, gdy wywoływana jest metoda next()
iteratora, zamrożone wywołanie wykonuje się dalej aż do instrukcji yield
. Wtedy wywołanie funkcji jest ponownie zamrażane, iterator podaje wartość obliczoną w instrukcji yield
, a wykonanie programu jest kontynuowane w kodzie wywołującym iterator.