iter ( )
DESCRIPTION.
Retourne un objet iterateur généré depuis un objet collection.
SYNTAXE.
TRT_Collection = iter ( objet , sentinelle )
TRT_Collection = ⇨ variable qui recevra la collection [ optionnel ]
iter ( ) ⇨ appel de la méthode [ OBLIGATOIRE ]
objet ⇨ objet collection parent [ OBLIGATOIRE ]
sentinelle ⇨ force objet à être appelable [ optionnel ]
REMARQUES.
iterable doit être un objet collection, ou séquencée, tel que : list ( ), tuple ( ), bytes ( ) ou bytearray ( ).
Si sentinelle est absent, objet doit être un objet collection possédant la méthode de classe __iter__ ( ) ou le protocole des séquences. Si sentinelle est précisé, alors objet doit être appelable.
ITERABLES ET ITERRATEURS.
Les itérables sont, par exemple, de type list ( ), tuple ( ), dict ( ), set ( ), str ( ).
Les itérateurs sont de type iterator, et sont générés :
- par l'appel de la méthode __iter__ ( ) ;
- par la fonction range ( ) et ;
- par l'instruction for.
Un objet itérable possède une méthode __iter__ ( ) qui génère un itérateur.
Un objet itérateur possède :
- une méthode __iter__ ( ) qui s'appelle elle-même et ;
- une méthode __next__ ( ) qui permet de parcourir les éléments de l'itérateur.
Il est possible d’accéder à tout moment aux éléments d'un itérable grâce à son index.
On ne peux lire que le premier élément d'un itérateur grâce à la méthode __next__ ( ).
La lecture d'un élément d'un itérable ne produit pas sa destruction.
La lecture d'un élément d'un itérateur provoque sa destruction.
Un itérable vide reste en mémoire, jusqu'à sa destruction avec l'instruction del.
Un itérateur vide est détruit et sa place en mémoire est libérée.
Un générateur d'itérateurs souvent utilisés est la fonction range ( ) pour la création d'une collection (list ( ), tuple ( ), ...), dans une compréhension de liste, ou bien encore dans une boucle avec l'instruction for. En effet, range ( ) génère un objet itérateur, qui sera utilisé pour concevoir une collection (list ( ) ou autres ), en parcourant tous les éléments de la séquences de nombres et en les ajoutant à l'objet collection. Une fois la séquence terminée, l'itérateur étant vide, il n'existe plus en mémoire.
LST_Suite = list ( range ( 5 ) )
print ( LST_Suite ) retourne [0, 1, 2, 3, 4]
Les iterateurs sont principalement créés et utilisés par et avec l'instruction for ... in ... :.
Avec la fonction range ( ) :
for i in range ( 5 ) : print ( i , end = " ," )
Avec un itérable :
LST_Carres = [ knombre * knombre for knombre in range ( 11 ) ]
for kcarre in LST_Carres : print ( f"La racine carrée de { kcarre } est { int ( kcarre**.5 ) }." )
Dans cet exemple :
- un premier itérateur est : créé, parcouru, vidé et détruit dans la compréhension de liste [ knombre * knombre for knombre in range ( 11 ) ] ;
- un second itérateur est créé, parcouru, vidé et détruit par l'utilisation de l'instruction for kcarre in LST_Carres :.
En effet, ce n'est pas la list ( ) LST_Carres qui est parcouru, mais bien un itérateur, créé par sa méthode __iter__ ( ) de l'objet LST_Carres, héritée de la classe list ( ).
COMPARAISONS.
LST_Jours = [ "lundi" , "mardi" , "mercredi" , "jeudi" , "vendredi" , "samedi" , "dimanche" ]
TRT_Jours = iter ( LST_Jours )
print ( type ( LST_Jours ) ) retourne <class 'list'>
print ( type ( TRT_Jours ) ) retourne <class 'list_iterator'>
print ( len ( LST_Jours ) ) retourne 7
print ( len ( TRT_Jours ) ) retourne TypeError: object of type 'list_iterator' has no len()
print ( LST_Jours ) retourne ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
print ( TRT_Jours ) retourne <list_iterator object at 0xb50ea390>
print ( LST_Jours [ 4 ] ) retourne vendredi
print ( TRT_Jours [ 4 ] ) retourne TypeError: 'list_iterator' object is not subscriptable
print ( LST_Jours.__next__ ( ) ) retourne AttributeError: 'list' object has no attribute '__next__'
print ( TRT_Jours.__next__ ( ) ) retourne 'lundi'
A chaque nouvel appel de sa méthode __next__ ( ), l'objet itérateur (ici : TRT_Jours ) effacera son premier élément et retournera sa valeur.
print ( TRT_Jours.__next__ ( ) ) retourne 'mardi'
print ( TRT_Jours.__next__ ( ) ) retourne 'mercredi'
print ( TRT_Jours.__next__ ( ) ) retourne 'jeudi'
print ( TRT_Jours.__next__ ( ) ) retourne 'vendredi'
print ( TRT_Jours.__next__ ( ) ) retourne 'samedi'
print ( TRT_Jours.__next__ ( ) ) retourne 'dimanche'
Une fois tous ses éléments épuisés (effacés et retournés), l'objet, devenu vide, est détruit. Un nouvel appel de sa méthode __next__ ( ) lève une exception.
print ( TRT_Jours.__next__ ( ) ) retourne StopIteration
Il est possible, bien entendu, de créer un nouvel itérateur avec le même nom depuis le même itérable, pour redémarrer la même séquence.
TRT_Jours = iter ( LST_Jours )
print ( TRT_Jours.__next__ ( ) ) retourne 'lundi'
print ( TRT_Jours.__next__ ( ) ) retourne 'mardi'
print ( TRT_Jours.__next__ ( ) ) retourne 'mercredi'
print ( TRT_Jours.__next__ ( ) ) retourne 'jeudi'
TRT_Jours = iter ( LST_Jours )
print ( TRT_Jours.__next__ ( ) ) retourne 'lundi'
print ( TRT_Jours.__next__ ( ) ) retourne 'mardi'
Pour éviter de lever une exception quand l'itérateur est vide, on pourra utiliser la méthode next ( ).
while True :
klecture = next ( TRT_Jours , "La semaine est terminée !" )
print ( klecture )
if klecture == "La semaine est terminée !" : break
Cette technique pourra s'avérer utile, dans les cas où l'on ne connait pas la quantité d'éléments, et que l'on n’utilise pas l'itérateur dans une boucle for.
Certaines fonctions peuvent recevoir des itérateurs comme attributs (parfois même à l'aide d'un générateur d'itérateurs).
print ( sum ( range ( 14 , 25 , 2 ) ) retourne 24
print ( max ( ( kvaleur % 5 for kvaleur in range ( 138 , 485 , 27 ) ) ) ) retourne 4
iter ( ) peut aussi répéter l'appel d'une fonction, jusqu'à ce que la valeur de retour de la fonction soit celle de la valeur sentinelle.
def FNC_Reste ( ) :
knombre = int ( input ( "Entrez un nombre ... " ) )
kreste = knombre % 21
print ( f"{ knombre } divisé par 21 donne un reste de { kreste }." )
return kreste
for ktest in iter ( FNC_Reste , 0 ) :
print ( f"Le reste de la division était { ktest }" )
print ( "Trouvez un reste égal à 0 pour sortir du programme ..." )
print ( )
Entrez un nombre ... 453
453 divisé par 21 donne un reste de 12.
Le reste de la division était 12
Trouvez un reste égal à 0 pour sortir du programme ...
Entrez un nombre ... 54
54 divisé par 21 donne un reste de 12.
Le reste de la division était 12
Trouvez un reste égal à 0 pour sortir du programme ...
Entrez un nombre ... 84
84 divisé par 21 donne un reste de 0.
Si vous souhaitez passer des arguments à la fonction appelée, utilisez l'instruction lambda.
def FNC_Reste ( Q ) :
knombre = int ( input ( "Entrez un nombre ... " ) )
kreste = knombre % Q
print ( f"{ knombre } divisé par { Q } donne un reste de { kreste }." )
return kreste
ktempo = int ( input ( "Entrez le diviseur ..." ) )
for iktest in iter ( lambda : FNC_Reste ( ktempo ) , 0 ) :
print ( f"Le reste de la division était { ktest }" )
print ( "Trouvez un reste égal à 0 pour sortir du programme ..." )
print ( )
Entrez le diviseur ...53
Entrez un nombre ... 7893656
7893656 divisé par 53 donne un reste de 48.
Le reste de la division était 48
Trouvez un reste égal à 0 pour sortir du programme ...
Entrez un nombre ... 106
106 divisé par 53 donne un reste de 0.
EXEMPLES.
LST_Jours = [ "lundi" , "mardi" , "mercredi" , "jeudi" , "vendredi" , "samedi" , "dimanche" ]
TRT_Jours = iter ( LST_Jours )
print ( TRT_Jours ) retourne <list_iterator object at 0x000001C9F184C160>
print ( type ( TRT_Jours ) ) retourne <class 'list_iterator'>
for kjour in TRT_Jours :
print ( kjour )
retourne
lundi
mardi
mercredi
jeudi
vendredi
samedi
dimanche
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la LOGITHEQUE de MON PYTHON PAS A PAS
vous trouvez des suggestions de projets simples et classiques pour
ooo
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
ooo
la programmation récréative avec le langage PYTHON 3
avec un exemple de résolution à télécharger pour vous inspirer.