Die Generatorfunktion ist schwer zu erklären, aber kurz gesagt, es ist eine "Funktion, die einen Wert in kleinen Mengen zurückgibt (eine Funktion, die erzeugt)". In Python können Sie es beispielsweise so verwenden. Es kann eine Funktion genannt werden, die einen Kursivator erstellt.
def firstn(n):
num = 0
while num < n:
yield num
num += 1
gen = firstn(10)
print gen.next() # —> 0
print gen.next() # —> 1
print gen.next() # —> 2
…
print gen.next() # —>11. Mal tritt eine StopIteration-Ausnahme auf
Natürlich kann es auch für Schleifen und Listeneinschlussnotationen verwendet werden.
for n in firstn(10):
print n,
# —> 0 1 2 3 4 5 6 7 8 9
print [n for n in firstn(10)]
# -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Es scheint also, dass diese Generatorfunktion auch in JavaScript verwendet werden kann. Es wird offiziell in ES6 (ECMAScript Version 6) standardisiert, aber einige Implementierungen haben bereits begonnen, diese Funktion zu integrieren.
Node.js wird auch in der nächsten stabilen Version v0.12 offiziell übernommen, sodass der Generator in v0.11 verwendet werden kann. Also habe ich es versucht.
Schreiben Sie zunächst das obige Beispiel in JavaScript neu.
firstn = function* (n) {
var num = 0
while (num < n) {
yield num
num += 1
}
};
gen = firstn(10);
console.log(gen.next()); // —> { value: 0, done: false }
console.log(gen.next()); // —> { value: 1, done: false }
console.log(gen.next()); // —> { value: 2, done: false }
…
console.log(gen.next()); // —>11. Mal{ value: undefined, done: true }Kehrt zurück
Der Unterschied zu Python besteht darin, dass kein Wert zurückgegeben wird, sondern ein Objekt mit zwei Attributen, value und done. Wenn die Iteration beendet ist, ist done wahr, anstatt eine Ausnahme auszulösen.
Verwenden Sie zur Laufzeit node - harmony
. "Harmony" scheint der Codename von ES6 zu sein.
Und dies kann auch in einer for-Schleife verwendet werden
for (n of firstn(10)) {
process.stdout.write(n + " ");
}
// —> 0 1 2 3 4 5 6 7 8 9
Es scheint, dass die Notation zur Aufnahme von Listen in ES6 verfügbar sein wird, sie wird jedoch in der aktuellen Version (0.11.9) nicht unterstützt. Es tut uns leid.
Recommended Posts