Fonction générateur même en JavaScript

La fonction de générateur est difficile à expliquer, mais en un mot, c'est une "fonction qui renvoie une valeur en petites quantités (une fonction qui crée)". En Python, par exemple, vous pouvez l'utiliser comme ceci. Cela peut être appelé une fonction qui crée un italateur.

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ème fois qu'une exception StopIteration se produit

Bien sûr, il peut également être utilisé pour les boucles for et la notation d'inclusion de liste.

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]

Il semble donc que cette fonction de générateur puisse également être utilisée en JavaScript. Il sera officiellement standardisé dans ES6 (ECMAScript version 6), mais certaines implémentations ont déjà commencé à intégrer cette fonctionnalité.

Node.js sera également officiellement adopté dans la prochaine version stable v0.12, de sorte que le générateur pourra être utilisé dans la v0.11. Alors j'ai essayé de l'utiliser.

Tout d'abord, réécrivez l'exemple ci-dessus en JavaScript.

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()); // —>11e fois{ value: undefined, done: true }Retour

La différence avec Python est qu'il ne renvoie pas de valeur, mais un objet avec deux attributs, value et done. Lorsque l'itération est terminée, done est vrai au lieu de lever une exception.

Au moment de l'exécution, utilisez node —harmony. "Harmony" semble être le nom de code de l'ES6.

Et cela peut également être utilisé dans une boucle for

for (n of firstn(10)) {
	process.stdout.write(n + " ");
}
// —> 0 1 2 3 4 5 6 7 8 9 

Il semble que la notation d'inclusion de liste sera disponible dans ES6, mais elle n'est pas prise en charge dans la dernière version actuelle (0.11.9). Pardon.

Recommended Posts

Fonction générateur même en JavaScript
[Python] Fonction de générateur
Dualité en fonction
Exécuter des fonctions en parallèle
Zundokokiyoshi (générateur) en Python
Covector pour penser en fonction
Créer une fonction en Python
Fonction ntile (décile) en python
Implémenter la fonction de minuterie dans pygame
Modélisation de fonctions non linéaires en Python
Dessiner la fonction Yin en python
Fonction immédiate (lie) en python
Créer une fonction d'authentification utilisateur dans Airflow
Avertissement de tri dans la fonction pd.concat
Définition du type d'argument de fonction en python
Implémentation de la fonction de connexion dans Django
Générateur principal infini en Python3
Ecrire une fonction AWS Lambda en Python
Générateur
Mesurer le temps d'exécution de la fonction en Python
Synthèse de fonctions et application en Python
Créez un générateur de rideaux avec Blender
Générateur
Différence d'authenticité entre Python et JavaScript
Précautions lors du décapage d'une fonction en python
Rendement Python express en JavaScript ou Java
Prenez la somme logique de List en Python (fonction zip)
Définir des actions personnalisées dans JupyterHub (fonction hook)
Scraping de sites Web à l'aide de JavaScript en Python
Différence de sortie de la fonction de fenêtre de longueur paire