Itérateurs et générateurs Python3


L'itération est l'une des fonctionnalités les plus puissantes de Python et constitue un moyen d'accéder aux éléments d'une collection. .

Un itérateur est un objet qui peut mémoriser la position du parcours.

L'objet itérateur commence à accéder à partir du premier élément de la collection jusqu'à ce que tous les éléments soient accessibles. Les itérateurs ne peuvent qu'avancer et non reculer.

Les itérateurs ont deux méthodes de base : iter() et next().

Les objets chaîne, liste ou tuple peuvent être utilisés pour créer des itérateurs :

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

Les objets itérateurs peuvent être parcourus à l'aide d'instructions for régulières :

#!/usr/bin/python3

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

Exécutez le programme ci-dessus, la sortie le résultat est le suivant :

1 2 3 4

Vous pouvez également utiliser la fonction next() :

#!/usr/bin/python3

import sys         # 引入 sys 模块

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象

while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

Exécutez le programme ci-dessus, le résultat de sortie est le suivant :

1
2
3
4

Générateur


En Python, les fonctions qui utilisent le rendement sont appelées générateurs.

Différent des fonctions ordinaires, un générateur est une fonction qui renvoie un itérateur et ne peut être utilisée que pour des opérations itératives. Il est plus facile de comprendre qu'un générateur est un itérateur.

Pendant le processus d'appel du générateur, la fonction mettra en pause et enregistrera toutes les informations en cours d'exécution à chaque fois qu'elle rencontrera un rendement, et renverra la valeur du rendement. Et continuez à courir à partir de la position actuelle la prochaine fois que la méthode next() sera exécutée.

L'exemple suivant utilise rendement pour implémenter la séquence de Fibonacci :

#!/usr/bin/python3

import sys

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

Exécutez le programme ci-dessus et le résultat de sortie est le suivant :

0 1 1 2 3 5 8 13 21 34 55