Yield (instruction)

Le yield est une instruction de programmation qui sert à imposer la constructivité d'une fonction. Elle est plus souvent présente dans les langages à haut niveau comme Python, Ruby ou le C#. Son utilisation dans une fonction permet de retourner un générateur. Dans le cas du python, appeler la méthode next() de ce générateur exécutera la fonction et retournera une valeur. Le yield procède comme un return au détail près que cette fonction est liée à un générateur et que le prochain appel de la méthode next() reprendra l'exécution là où elle en était.

Pour les articles homonymes, voir Yield.

Exemple en langage C#

En C#, le mot-clé yield est suivi de return pour retourner la valeur suivante ou break pour interrompre l'itération.

using System.Collections.Generic;

public class Mots
{
    // Tableau contenant des mots :
    public string[] mots;

    // Constructeur
    public Mots(params string[] mots)
    { this.mots = mots; }

    // Énumérer tous les mots jusqu'à trouver
    // le mot contenu dans le paramètre dernier (exclu)
    // ou la fin du tableau.
    public IEnumerable<string> TousLesMotsJusquA(string dernier)
    {
        foreach(string mot in mots)
            if (mot.Equals(dernier)) yield break; // fin prématurée de l'itération
            else yield return mot; // élément de l'itération
        // fin normale de la boucle d'itération
    }
}

public class TestProgram
{
    public static void Main()
    {
        Mots fruits = new Mots( "pomme", "poire", "abricot", "fraise", "kiwi" );
        foreach( string fruit in fruits.TousLesMotsJusquA("fraise") )
            Console.WriteLine( fruit );
    }
}

Exemple en langage Python

def fonction(max):
    print('début fonction')
    for x in range(0, max+1):
        yield x
        print('incrémente x')

gen = fonction(2)
gen.next()
# début fonction
# 0
gen.next()
# incrémente x
# 1

Exemple en langage Ruby

En Ruby, l'opérateur yield va entrainer l'exécution du bloc de code passé en paramètre :

def delimit
  puts "before yield"
  yield if block_given?
  puts "after yield"
end
delimit{ puts "in yield" } #=> "before yield\n" "in yield\n" "after yield\n"

Voir aussi

Lien externe

  • (en) yield sur la documentation de python.org
  • Portail de l’informatique
Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.