L'itération est un terme général pour prendre chaque élément de quelque chose, l'un après l'autre. Chaque fois que vous utilisez une boucle, explicite ou implicite, pour parcourir un groupe d'éléments, c'est l'itération.
En Python, itérable et itérateur ont des significations spécifiques.
Un itérable est un objet qui a une __iter__
méthode qui retourne un itérateur , ou qui définit une __getitem__
méthode qui peut prendre des index séquentiels à partir de zéro (et déclenche un IndexError
lorsque les index ne sont plus valides). Un itérable est donc un objet dont vous pouvez obtenir un itérateur .
Un itérateur est un objet avec une méthode next
(Python 2) ou __next__
(Python 3).
Chaque fois que vous utilisez une for
boucle, ou map
, ou une compréhension de liste, etc. en Python, la next
méthode est appelée automatiquement pour obtenir chaque élément de l' itérateur , passant ainsi par le processus d' itération .
Un bon endroit pour commencer à apprendre serait la section itérateurs du didacticiel et la section types d'itérateurs de la page des types standard . Après avoir compris les bases, essayez la section itérateurs du HOWTO de programmation fonctionnelle .
collections.abc.AsyncIterator
tests__aiter__
et les__anext__
méthodes. Il s'agit d'un nouvel ajout en 3.6.__len__
nécessairement lié à l'itération? Comment le fait de connaître la longueur de quelque chose vous aiderait-il à le répéter?__getitem__
.{'a': 'hi', 'b': 'bye'}
longueur est de 2, mais ne peut pas être indexée par 0, 1 ou 2.__iter__
méthode. Je pense que jlh fait référence à des objets qui sont itérables spécifiquement parce qu'ils définissent: "une__getitem__
méthode qui peut prendre des index séquentiels à partir de zéro".Voici l'explication que j'utilise dans l'enseignement des classes Python:
Un ITERABLE c'est:
for x in iterable: ...
ouiter()
cela retournera un ITERATOR:iter(obj)
ou__iter__
qui renvoie un nouvel ITERATOR, ou il peut avoir une__getitem__
méthode appropriée pour la recherche indexée.Un ITERATOR est un objet:
__next__
méthode qui:StopIteration
__iter__
méthode qui revientself
).Remarques:
__next__
méthode en Python 3 est orthographiéenext
en Python 2, etnext()
appelle cette méthode sur l'objet qui lui est transmis.Par exemple:
la source
for
boucles et la 1ère puce concerne le "bouclage". Pourriez-vous les aborder?iter()
" comme "tout ce que vous pouvez transmettreiter()
"Les réponses ci-dessus sont excellentes, mais comme la plupart de ce que j'ai vu, n'insistez pas sur la distinction assez sur pour les gens comme moi.
De plus, les gens ont tendance à devenir "trop Pythonique" en mettant des définitions comme "X est un objet qui a
__foo__()
méthode" auparavant. De telles définitions sont correctes - elles sont basées sur la philosophie du typage du canard, mais l'accent mis sur les méthodes tend à se mettre entre les deux lorsque l'on essaie de comprendre le concept dans sa simplicité.J'ajoute donc ma version.
En langage naturel,
En Python,
itérable est un objet qui est, bien, itérable, ce qui signifie simplement qu'il peut être utilisé en itération, par exemple avec une
for
boucle. Comment? En utilisant l' itérateur . J'expliquerai ci-dessous.... tandis que l' itérateur est un objet qui définit comment faire réellement l'itération - en particulier quel est l' élément suivant . C'est pourquoi il doit avoir une
next()
méthode.Les itérateurs sont eux-mêmes également itérables, à la différence près que leur
__iter__()
méthode renvoie le même objet (self
), que ses éléments aient ou non été consommés par des appels précédents ànext()
.Alors, que pense l'interprète Python quand il voit une
for x in obj:
déclaration?Puisque M. a
obj
réussi ce test (en ayant une certaine méthode renvoyant un itérateur valide), nous le récompensons avec un adjectif: vous pouvez maintenant l'appeler "M. itérableobj
".Cependant, dans des cas simples, vous ne bénéficiez pas normalement d'avoir un itérateur et un itérable séparément. Vous définissez donc un seul objet, qui est également son propre itérateur. (Python ne se soucie pas vraiment de ce que
_i
distribué parobj
n'était pas si brillant, mais justeobj
lui - même.)C'est pourquoi dans la plupart des exemples que j'ai vus (et ce qui m'avait confus encore et encore), vous pouvez voir:
au lieu de
Il y a des cas, cependant, où vous pouvez bénéficier d'avoir l'itérateur séparé de l'itérable, comme quand vous voulez avoir une ligne d'éléments, mais plus de "curseurs". Par exemple, lorsque vous souhaitez travailler avec des éléments "actuels" et "à venir", vous pouvez avoir des itérateurs séparés pour les deux. Ou plusieurs threads tirés d'une énorme liste: chacun peut avoir son propre itérateur pour parcourir tous les éléments. Voir @ Raymond's et @ glglgl's réponses de ci-dessus.
Imaginez ce que vous pourriez faire:
Remarques:
Je le répète: l' itérateur n'est pas itérable . L'itérateur ne peut pas être utilisé comme "source" en
for
boucle. Ce dont lafor
boucle a principalement besoin est__iter__()
(qui renvoie quelque chose avecnext()
).Bien sûr, ce
for
n'est pas la seule boucle d'itération, donc ci-dessus s'applique également à d'autres constructions (while
...).Les itérateurs
next()
peuvent lancer StopIteration pour arrêter l'itération. Cela ne doit pas, cependant, il peut répéter pour toujours ou utiliser d'autres moyens.Dans le "processus de pensée" ci-dessus,
_i
n'existe pas vraiment. J'ai inventé ce nom.Il y a un petit changement dans Python 3.x: la
next()
méthode (pas la fonction intégrée) doit maintenant être appelée__next__()
. Oui, ça aurait dû être comme ça tout le temps.Vous pouvez également penser à cela comme ceci: l'itérable a les données, l'itérateur tire l'élément suivant
Avertissement: je ne suis pas un développeur d'interpréteur Python, donc je ne sais pas vraiment ce que "l'interprète" pense. Les réflexions ci-dessus sont uniquement une démonstration de la façon dont je comprends le sujet à partir d'autres explications, expériences et expériences réelles d'un débutant en Python.
la source
for
boucle a besoin d'un itérateur ("Regardez, une boucle for. On dirait un travail pour un itérateur ... Prenons-en un."). Mais alors vous dites dans les notes à la fin que "Iterator ne peut pas être utilisé comme source dans unefor
boucle" ...?pass
dans le code de cesnext
définitions? Je suppose que vous voulez simplement dire que quelqu'un doit mettre en œuvre un moyen d'obtenir le suivant, car le prochain doit retourner quelque chose.pass
sert , après tout.)pass
, je pense que c'est là pour des raisons syntaxiques. Je viens de parcourir les réponses à des points de suspension qui sont assez intéressants: vous pouvez utiliser...
pour indiquer un bloc "todo later".NotImplemented
est également disponible.for
boucle '. Je comprends l'essentiel de votre réponse, et j'aime bien le contraire, mais je pense qu'il serait avantageux de régler ce problème.Un itérable est un objet qui a une
__iter__()
méthode. Il peut éventuellement être répété plusieurs fois, commelist()
s ettuple()
s.Un itérateur est l'objet qui itère. Il est retourné par une
__iter__()
méthode, se retourne via sa propre__iter__()
méthode et possède unenext()
méthode (__next__()
en 3.x).L'itération est le processus d'appeler ce
next()
resp.__next__()
jusqu'à ce qu'il monteStopIteration
.Exemple:
la source
Iterable
.Iterator
est toujoursIterable
et est le sienIterator
, deux appels deiter()
ne donnent pas nécessairement deuxIterator
s indépendants .Voici ma feuille de triche:
Quiz: Voyez-vous comment ...
__iter__()
méthode d' un objet conteneur peut être implémentée en tant que générateur?__next__
méthode n'est pas nécessairement un itérateur?Réponses:
__iter__
méthode. Avoir__iter__
suffit pour être un itérable. Par conséquent, chaque itérateur est un itérable.Quand
__iter__
est appelé, il doit retourner un itérateur (return <iterator>
dans le diagramme ci-dessus). L'appel d'un générateur renvoie un itérateur de générateur qui est un type d'itérateur.Voici un exemple:
la source
__iter__
méthode. Pouvez-vous développer les 2e et 3e points en modifiant cette réponse__iter__()
Renvoie un itérateur. Un générateur est un itérateur, il peut donc être utilisé à cette fin. re 3.: Je ne peux que deviner ici, mais je pense que s'il__iter__()
manque, ou ne revient pasself
, ce n'est pas un itérateur, car un itérateur__iter__()
doit revenirself
.Je ne sais pas si cela aide quelqu'un, mais j'aime toujours visualiser les concepts dans ma tête pour mieux les comprendre. Donc, comme j'ai un petit fils, je visualise le concept itérable / itérateur avec des briques et du papier blanc.
Supposons que nous soyons dans la pièce sombre et que nous ayons au sol des briques pour mon fils. Les briques de différentes tailles, couleurs n'ont plus d'importance maintenant. Supposons que nous ayons 5 briques comme celles-ci. Ces 5 briques peuvent être décrites comme un objet - disons un kit de briques . Nous pouvons faire beaucoup de choses avec ce kit de briques - peut en prendre un, puis prendre le deuxième, puis le troisième, peut changer l'emplacement des briques, mettre la première brique au-dessus de la seconde. Nous pouvons faire beaucoup de choses avec ceux-ci. Par conséquent, ce kit de briques est un objet ou une séquence itérable car nous pouvons parcourir chaque brique et en faire quelque chose. Nous ne pouvons le faire que comme mon petit fils - nous pouvons jouer avec une brique à la fois . Encore une fois, je m'imagine que ce kit de briques est unitérable .
Rappelez-vous maintenant que nous sommes dans la pièce sombre. Ou presque sombre. Le fait est que nous ne voyons pas clairement ces briques, leur couleur, leur forme, etc. Donc, même si nous voulons faire quelque chose avec elles - aka itérer à travers elles - nous ne savons pas vraiment quoi et comment trop sombre.
Ce que nous pouvons faire, c'est près de la première brique - en tant qu'élément d'un kit de briques - nous pouvons mettre un morceau de papier fluorescent blanc afin que nous puissions voir où se trouve le premier élément de brique. Et chaque fois que nous prenons une brique d'un kit, nous remplaçons le morceau de papier blanc par une brique suivante afin de pouvoir le voir dans la pièce sombre. Cette feuille de papier blanche n'est rien de plus qu'un itérateur . C'est aussi un objet . Mais un objet avec ce que nous pouvons travailler et jouer avec des éléments de notre objet itérable - le kit de briques.
Cela explique d'ailleurs ma première erreur lorsque j'ai essayé ce qui suit dans un IDLE et obtenu une TypeError:
La liste X ici était notre kit de briques mais PAS un morceau de papier blanc. Je devais d'abord trouver un itérateur:
Je ne sais pas si cela aide, mais cela m'a aidé. Si quelqu'un pouvait confirmer / corriger la visualisation du concept, je lui en serais reconnaissant. Cela m'aiderait à en savoir plus.
la source
Iterable : - quelque chose qui est itérable est itérable; comme des séquences comme des listes, des chaînes, etc. Il possède également la
__getitem__
méthode ou une__iter__
méthode. Maintenant, si nous utilisons laiter()
fonction sur cet objet, nous aurons un itérateur.Itérateur : - Lorsque nous obtenons l'objet itérateur de la
iter()
fonction; nous appelons__next__()
méthode (en python3) ou simplementnext()
(en python2) pour obtenir les éléments un par un. Cette classe ou instance de cette classe est appelée un itérateur.De documents: -
L'utilisation d'itérateurs imprègne et unifie Python. En arrière-plan, l'instruction for appelle
iter()
l'objet conteneur. La fonction renvoie un objet itérateur qui définit la méthode__next__()
qui accède aux éléments du conteneur un par un. Lorsqu'il n'y a plus d'éléments,__next__()
déclenche une exception StopIteration qui indique à la boucle for de se terminer. Vous pouvez appeler la__next__()
méthode à l'aide de lanext()
fonction intégrée; cet exemple montre comment tout cela fonctionne:Ex d'une classe: -
la source
Je ne pense pas que vous puissiez l'obtenir beaucoup plus simple que la documentation , mais je vais essayer:
Vous pouvez penser Iterator comme une pseudo-méthode d'aide (ou pseudo-attribut) qui donne (ou détient) le prochain (ou premier) élément de l' itérable . (En pratique c'est juste un objet qui définit la méthode
next()
)L'itération est probablement mieux expliquée par la définition Merriam-Webster du mot :
la source
donc,
iterable
est un objet qui peut être bouclé . par exemple liste, chaîne, tuple, etc.l'utilisation de la
iter
fonction sur notreiterable
objet retournera un objet itérateur.maintenant cet objet itérateur a une méthode nommée
__next__
(en Python 3, ou justenext
en Python 2) par laquelle vous pouvez accéder à chaque élément d'itérable.donc, LA SORTIE DU CODE CI-DESSUS SERA:
1
2
la source
Luciano Ramalho, Fluent Python.
la source
Avant de traiter les itérables et l'itérateur, le principal facteur qui décide de l'itérable et de l'itérateur est la séquence
Séquence: la séquence est la collecte de données
Iterable: Iterable sont les objets de type séquence qui prennent en charge la
__iter__
méthode.Méthode Iter: la méthode Iter prend la séquence en entrée et crée un objet appelé itérateur
Itérateur: l'itérateur est l'objet qui appelle la méthode suivante et transverse à travers la séquence. En appelant la méthode suivante, elle retourne l'objet qu'elle a traversé actuellement.
exemple:
x est une séquence qui consiste en la collecte de données
En l'appelant,
iter(x)
il retourne un itérateur uniquement lorsque l'objet x a la méthode iter, sinon il déclenche une exception.Si il retourne l'itérateur, y est assigné comme ceci:Comme y est un itérateur, il supporte donc la
next()
méthodeEn appelant la méthode suivante, elle retourne les éléments individuels de la liste un par un.
Après avoir renvoyé le dernier élément de la séquence, si nous appelons à nouveau la méthode suivante, cela déclenche une erreur StopIteration
exemple:
la source
En Python, tout est un objet. Lorsqu'un objet est dit itérable, cela signifie que vous pouvez parcourir (c'est-à-dire itérer) l'objet en tant que collection.
Les tableaux par exemple sont itérables. Vous pouvez les parcourir avec une boucle for et passer de l'index 0 à l'index n, n étant la longueur de l'objet tableau moins 1.
Les dictionnaires (paires clé / valeur, également appelés tableaux associatifs) sont également itérables. Vous pouvez parcourir leurs clés.
Evidemment les objets qui ne sont pas des collections ne sont pas itérables. Un objet booléen par exemple n'a qu'une seule valeur, True ou False. Ce n'est pas itérable (cela n'aurait aucun sens que ce soit un objet itérable).
Lire la suite. http://www.lepus.org.uk/ref/companion/Iterator.xml
la source
iter()
aux types de collections standard sont itérables mais ne sont pas eux-mêmes des collections.