Frage

Was ist der Unterschied zwischen einem Iterator und einem Generator?

War es hilfreich?

Lösung

Generatoren sind Iteratoren, aber nicht alle Iteratoren sind Generatoren.

Ein Iterator ist in der Regel etwas, das eine nächste hat Methode das nächste Element aus einem Stream zu erhalten. Ein Generator ist ein Iterator, der an eine Funktion gebunden ist.

Zum Beispiel ein Generator in Python:

def genCountingNumbers():
  n = 0
  while True:
    yield n
    n = n + 1

Dies hat den Vorteil, dass Sie nicht brauchen, unendliche Zahlen im Speicher speichern über sie zu wechseln.

Sie würden verwenden diese wie jede Iterator:

for i in genCountingNumbers():
  print i
  if i > 20: break  # Avoid infinite loop

Sie können auch ein Array iterieren:

for i in ['a', 'b', 'c']:
  print i

Andere Tipps

Ein Iterator quert eine Sammlung eines nach dem anderen.

A Generator erzeugt eine Folge, ein Element zu einem Zeitpunkt.

Sie könnten beispielsweise iterieren das Ergebnis eines Generators ...

Es gibt zu viel Python hier, und zu viele Leute, die sagen Generatoren sind die nur Art und Weise eine unendliche Iterator zu implementieren. Hier ist das Beispiel, das ich erwähnte (Quadrate aller natürlichen Zahlen) in C # implementiert. ExplicitSquares implementiert explizit einen Iterator (IEnumerator in C # genannt). ImplicitSquares verwendet einen Generator, das Gleiche zu tun. Beide sind unendlich Iteratoren und haben keine Unterstützung Sammlung. Der einzige Unterschied ist, ob die Zustandsmaschine buchstabiert wird, oder alternativ ein Generator verwendet wird.

using System.Collections;
using System.Collections.Generic;
using System;

class ExplicitSquares : IEnumerable<int>
{
    private class ExplicitSquaresEnumerator : IEnumerator<int>
    {
        private int counter = 0;

        public void Reset()
        {
            counter = 0;
        }

        public int Current { get { return counter * counter; }}

        public bool MoveNext()
        {
            counter++;
            return true;
        }

        object IEnumerator.Current { get { return Current; } }

        public void Dispose(){}
    }

    public IEnumerator<int> GetEnumerator()
    {
        return new ExplicitSquaresEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class ImplicitSquares : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        int counter = 1;
        while(true)
        {
            int square = counter * counter;
            yield return square;
            counter++;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class AllSquares
{
    private static readonly int MAX = 10;

    public static void Main()
    {
        int i = 0;
        foreach(int square in new ExplicitSquares())
        {
            i++;
            if(i >= MAX)
                break;
            Console.WriteLine(square);
        }

        Console.WriteLine();

        int j = 0;
        foreach(int square in new ImplicitSquares())
        {
            j++;
            if(j >= MAX)
                break;
            Console.WriteLine(square);
        }
    }
}

Ein Generator ist eine Implementierung eines Iterators. Es ist in der Regel eine Routine, die mehrere Werte an seinen Aufrufer im Gegensatz zu nur einem.

ergibt

In c #

// yield-example.cs
using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
       {
            result = result * number;
            yield return result;
    }
}

static void Main()
{
    // Display powers of 2 up to the exponent 8:
    foreach (int i in Power(2, 8))
    {
        Console.Write("{0} ", i);
    }
}
}

Siehe Wikipedias Eintrag

Ein Generator ist eine spezielle Funktion, die als Iterator verhalten können, wird ein Wert jedes Mal zurückkehr sie aufgerufen wird. Da es sich um eine Funktion ist, kann sie jeden Wert auf Nachfrage berechnen. Und weil es speziell ist, kann er seinen Zustand vom letzten Mal erinnert sie genannt wurden, so dass der resultierende Code recht einfach aussieht.

Zum Beispiel wird dieser Generator in Python eine Folge von ganzen Zahlen erzeugt

def integers():
    int n = 0
    while True:
        yield n
        n += 1

Das Wichtigste in diesem Beispiel ist die yield n Aussage. Die Funktion wird den Wert zurück, und das nächste Mal aufgerufen wird, wird es von diesem Punkt aus fortgesetzt werden.

Dieser Link hat eine längere Erklärung von Generatoren in Python: Link-Text

(von Javascript useland, aber wie alle anderen)

Ein interator ist ein Objekt , die eine .next () Funktion

Ein Generator ist eine Funktion , einmal aufgerufen, einen Iterator erzeugt, ist es eine Fabrik für Iterator.

in JavaScript, Generatorfunktion erfordert eine spezielle Syntax Funktion * () {} und die Verwendung für die Ausbeute Schlüsselwort

Siehe MDN dazu: https: //developer.mozilla .org / en-US / docs / Web / JavaScript / Guide / Iterators_and_Generators

Ein Iterator wird verwendet, um die Objekte in einer Sammlung iterieren, das auf ein Array, verknüpfte Liste, Baum, Hash-Karte, was auch immer. Sie haben eine Reihe von Objekten bekommen, und Sie wollen etwas mit jedem von ihnen tun.

Ein Generator kehrt nicht nur die Elemente aus einer endlichen Sammlung von Objekten. Stattdessen erzeugt er sich im Fluge. Man könnte es als Iterator über eine Sammlung konzeptionieren, die erstellt wird , während Sie über sie iterieren und nicht endliche Größe haben.

Zum Beispiel könnten Sie einen Generator, die bis ins Unendliche aus zwei Primzahlen ausspuckt. Es gibt keine Möglichkeit, eine Sammlung von „aller Primzahlen“ haben könnte und iteriert es mit einem Iterator. Sie benötigen einen Generator an.

Oder Sie könnten einen Generator, die eine ganze Zahl nimmt und liefert die Faktoren dieser Zahl einen nach dem anderen. Ein Generator würden Sie hier profitieren, da Sie im Voraus für alle Faktoren, die Faktoren einer nach dem anderen, ohne das Zuweisen von Speicher untersuchen konnte. Es würde auch ermöglicht es Ihnen, sie zu benutzen, da sie eher erzeugt werden, als vorne die gesamte Liste zu erzeugen, die, die möglicherweise langsamer als Sie mögen. Hier ist ein Beispiel für einen solchen Generator in Python:

def factors(n):
    for i in xrange(1, n+1):
        if n % i == 0:
            yield i

for n in factors(1234567890):
    print n

Wenn Sie dies ausführen können Sie die Faktoren sehen gedruckt, wie sie berechnet werden. Wir brauchen nicht, um tatsächlich eine ganze Liste aller Faktoren im Speicher zu halten.

Ein Iterator wird allgemein bewegen sich durch eine Sammlung von Gegenständen verwendet. Oft mit Movenext () und Strom () Methoden. Movenext () würde die Zeiger auf den nächsten Auflistelement verschieben (wenn möglich) und return true / false basierend auf Erfolg. Strom () würde den tatsächlichen Wert.

Ein Generator ist eine Implementierung der Iterator, sondern auf eine bereits bestehende Sammlung des Zeigens, erstellt es neue Objekte auf jeder Movenext () -Aufruf.

Iteratoren der Regel eine bestehende Sequenz zu Fuß über (wie einen Array oder eine Liste) und Generatoren berechnen einen neuen Wert bei jeder Anfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top