Les types de données pouvant être utilisés directement dans une boucle for en Python comprennent : - Types de données de collection : list : par exemple, ['alice', 'bob', 'charlie'] tuple : par exemple, ('alice', 'bob', 25, 30) dict : par exemple, {'alice': 25, 'bob': 30} set : par exemple, set(['alice', 'bob']) str : par exemple, 'python' - Générateurs : Y compris les générateurs et les fonctions générateurs avec yield Ces objets directement utilisables dans une boucle for sont appelés objets itérables. Vérification des objets itérables
On peut utiliser isinstance() pour vérifier si un objet est itérable : ``` #!/usr/bin/env python from collections.abc import Iterable
ma_liste = ["python", "programmation"] print(isinstance(ma_liste, Iterable))
Introduction aux générateurs
----------------------------
Les générateurs non seulement peuvent être utilisés dans des boucles for, mais peuvent aussi être appelés par la fonction next() pour retourner la valeur suivante, jusqu'à ce qu'une erreur StopIteration soit levée lorsqu'il n'y a plus de valeurs. Les objets qui peuvent être appelés par next() pour retourner continuellement la valeur suivante sont appelés itérateurs. Vérification des itérateurs
---------------------------
On peut utiliser isinstance() pour vérifier si un objet est un itérateur : ```
>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([1, 2, 3], Iterator)
False
>>> isinstance({"cle": "valeur"}, Iterator)
False
>>> isinstance("chaîne", Iterator)
False
Les générateurs sont tous des objets itérables, mais les listes, dictionnaires et chaînes de caractères sont itérables sans être des itérateurs. ### Conversion d'itérables en itérateurs
Pour trensformer des listes, dictionnaires ou chaînes de caractères en itérateurs, on utilise la fonction iter() : ```
from collections.abc import Iterator
isinstance(iter([]), Iterator) True isinstance(iter('exemple'), Iterator) True
### Pourquoi les listes, dictionnaires et chaînes ne sont pas des itérateurs ?
Un itérateur Python représente un flux de données. Il peut être appelé par next() pour retourner la donnée suivante jusqu'à ce qu'une erreur StopIteration soit levée. Ce flux de données peut être vu comme une séquence ordonnée. Cependant, on ne peut pas connaître la longueur de la séquence à l'avance, on ne peut qu'appeler continuellement next() pour calculer la donnée suivnate. Le calcul d'un itérateur est paresseux (lazy) - il ne calcule que la donnée suivante lorsqu'elle est nécessaire. Un itérateur peut même représenter un flux de données infini, comme tous les nombres naturels, ce qui serait impossible à stocker dans une liste. ### Le mécanisme des boucles for
Une boucle for en Python est essentiellement une série d'appels à next() : ```
for element in [1, 2, 3, 4, 5]:
print(element)
Ce code est équivalent à : ``` iterateur = iter(['un', 'deux', 'trois']) while True: try: element = next(iterateur) print(element) except StopIteration: break
</div>