Quels sont exactement itérateur, itératif, et l'itération?
Ce qui est la définition la plus basique de "itératif", "itérateur" et "itération" en Python?
J'ai lu plusieurs définitions, mais je suis incapable d'identifier le sens exact qu'il persiste à ne pas sombrer dans.
Quelqu'un peut s'il vous plaît aidez-moi avec les 3 définitions en termes simples?
Vous devez vous connecter pour publier un commentaire.
Itération est un terme général pour chaque élément de quelque chose, l'un après l'autre. Chaque fois que vous utilisez une boucle, explicite ou implicite, d'aller sur un groupe d'éléments, c'est-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 un__getitem__
méthode qui peut prendre des séries d'indices en partant de zéro (et soulève uneIndexError
lorsque les index ne sont plus valides). Donc un itérable est un objet que vous pouvez obtenir une itérateur de.Un itérateur est un objet avec une
next
(Python 2) ou__next__
(Python 3) de la méthode.Chaque fois que vous utilisez un
for
boucle, oumap
, ou une compréhension de liste, etc. en Python, lesnext
méthode est appelée automatiquement à chaque élément de la itérateur, donc passer par le processus de itération.Un bon endroit pour commencer à apprendre à serait la les itérateurs de la section du tutoriel et la itérateur section des types des types standard de la page. Après vous comprenez les bases, essayez de le les itérateurs de la section de la Programmation Fonctionnelle HOWTO.
__getitem__
méthode est considérée comme itératif, mais tout existant__len__
méthode est complètement ignoré. Principe de moindre étonnement dur défaillant ici...collections.abc.AsyncIterator
tests pour__aiter__
et__anext__
méthodes. C'est un nouvel ajout à 3.6.__len__
être nécessairement lié à l'itération? Comment connaître la longueur de quelque chose de vous aider à effectuer une itération sur elle?__getitem__
.{'a': 'hi', 'b': 'bye'}
a une longueur de 2, mais ne peut pas être indexé par 0, 1, ou 2.__iter__
méthode. Je pense que jlh est en se référant à des objets qui sont itérable, précisément parce qu'ils définissent: "un__getitem__
méthode qui peut prendre des séries d'indices en partant de zéro".__getitem__
sans le soutien de la durée du protocole.len
a tout simplement rien à voir avec l'itération.__getitem__
pourrait cochez lalen
pour voir qui des indices numériques sont valables, et jlh supposé que c'était la façon dont il est de mise en œuvre ... jusqu'à ce qu'il a découvert qu'il n'était pas.__getitem__
jusqu'à ce qu'elle lève une exception, puis éleverStopIteration
à sa place.__len__
est ignoré car il n'est pas nécessaire avec__getitem__
et pas utile sans elle.Voici l'explication que j'ai utiliser dans l'enseignement des classes Python:
Un objet iterable est:
for x in iterable: ...
ouiter()
qui retourne un ITÉRATEUR:iter(obj)
ou__iter__
qui renvoie une nouvelle ITÉRATION,ou il peut avoir un
__getitem__
méthode appropriée pour indexés de recherche.Un ITÉRATEUR est un objet:
__next__
méthode:StopIteration
__iter__
méthode qui retourneself
).Notes:
__next__
méthode en Python 3 est épeautrenext
en Python 2, etnext()
appels de méthode sur l'objet passé en elle.Par exemple:
for
boucles, et le 1er point est sur "parcourir". Pourriez-vous pls adresse ces?iter()
" comme "tout ce que vous pouvez passer àiter()
"Les réponses ci-dessus sont grands, mais comme la plupart de ce que j'ai vu, ne pas le stress de la distinction assez pour que les gens comme moi.
Aussi, les gens ont tendance à obtenir "trop Pythonic" en mettant des définitions comme "X est un objet qui a
__foo__()
méthode" avant de. De telles définitions sont correctes--ils sont basés sur le canard-la dactylographie de la philosophie, mais l'accent sur les méthodes qui tend à obtenir entre en essayant 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ératif, qui tout simplement, signifie que
il peut être utilisé dans l'itération, par exemple, avec un
for
boucle. Comment? En utilisant itérateur.Je vais vous expliquer ci-dessous.
... alors que itérateur est un objet qui définit comment faire l'
itération, plus précisément quelle est la prochaine élément. C'est pourquoi il doit avoir
next()
méthode.Les itérateurs sont eux aussi itératif, avec la distinction que leur
__iter__()
méthode renvoie le même objet (self
), indépendamment de si oui ou non ses éléments ont été consommés par les précédents appels ànext()
.Donc, ce n'est interpréteur Python pense que quand il voit
for x in obj:
déclaration?Depuis que M.
obj
réussi dans ce test (par une certaine méthode retournant un valide itérateur), nous récompensez-le avec un adjectif: vous pouvez maintenant appeler "objet iterable M.obj
".Toutefois, dans les cas simples, vous n'avez pas l'habitude de bénéficier de la itérateur et itératif séparément. Si vous définissez un seul objet, qui est aussi son propre itérateur. (Python n'a pas vraiment de soins que
_i
remis parobj
n'est pas brillant, mais juste leobj
lui-même.)C'est pourquoi dans la plupart des exemples que j'ai vu (et ce qui a été source de confusion sur moi et plus),
vous pouvez voir:
au lieu de
Il y a des cas, cependant, où vous pouvez bénéficier d'itérateur séparé de l'itératif, comme lorsque vous voulez avoir une rangée d'éléments, mais en plus "curseurs". Par exemple, lorsque vous voulez travailler avec "en cours" et "venir" les éléments, vous pouvez séparer les itérateurs pour les deux. Ou plusieurs threads en tirant à partir d'une liste énorme: chacun peut avoir ses propres itérateur pour parcourir plus de tous les éléments. Voir @Raymond la et @glglgl de l' les réponses ci-dessus.
Imaginez ce que vous pourriez faire:
Notes:
Je vais le répéter encore une fois: itérateur n'est pas itératif. Itérateur ne peut pas être utilisé comme
une "source" dans
for
boucle. Cefor
boucle principalement besoins est__iter__()
(qui renvoie à quelque chose avec
next()
).Bien sûr,
for
n'est pas la seule itération de la boucle, donc au-dessus s'applique à certains autresconstruit ainsi (
while
...).Itérateur est
next()
pouvez jeter StopIteration pour arrêter l'itération. Ne doit pas,cependant, il peut itérer pour toujours ou utiliser d'autres moyens.
Dans l'au-delà "processus de pensée",
_i
n'existe pas vraiment. J'ai composé ce nom.Il y a un petit changement dans Python 3.x:
next()
méthode (le) maintenantdoit être appelée
__next__()
. Oui, il doit avoir été comme ça tout le long.Vous pouvez aussi penser de cette façon: itérable a les données, iterator tire la prochaine
élément
Avertissement: je ne suis pas un développeur de n'importe quel interpréteur Python, donc je ne sais pas vraiment ce que l'interprète de "pense". Les réflexions ci-dessus sont uniquement démonstration de la façon dont je comprends le sujet à partir d'autres explications, des expériences et des expériences de la vraie vie d'un Python de newbie.
for
boucle besoin d'un itérateur ("Regardez, une boucle for. Ressemble à un travail pour un itérateur... nous allons en faire un."). Mais ensuite, vous dites dans les notes à la fin que "Itérateur ne peut pas être utilisé comme une source dans unefor
boucle"...?pass
dans le code pour ceuxnext
définitions? Je vais supposer que vous venez de dire que quelqu'un doit mettre en œuvre un moyen d'obtenir la prochaine, car suivant doit retourner quelque chose.pass
est pour, après tout.)pass
, je pense qu'il est là pour des raisons syntaxiques. J'ai juste couru à travers les réponses à bouton de sélection de l'objet qui sont tout à fait intéressante: vous pouvez utiliser...
pour indiquer un "todo plus tard" bloquer.NotImplemented
est également disponible.for
en boucle". Je reçois le point de votre réponse, et comme il le contraire, mais je pense qu'il serait avantageux de corriger ce.Un objet iterable est un objet qui a une
__iter__()
méthode. Il peut éventuellement itéré plusieurs fois, commelist()
s ettuple()
s.Un itérateur est un objet qui se répète. Il est renvoyé par une
__iter__()
méthode, renvoie lui-même au travers de son propre__iter__()
méthode et a unnext()
méthode (__next__()
en 3.x).Itération est le processus de l'appel de cette
next()
resp.__next__()
jusqu'à ce qu'il soulèveStopIteration
.Exemple:
Iterable
.Iterator
est toujoursIterable
et est son propreIterator
, deux appels deiter()
ne donnent pas nécessairement les deux indépendantsIterator
s.Je ne sais pas si ça aide quelqu'un mais j'aime toujours de visualiser les concepts dans ma tête pour mieux les comprendre. Donc comme j'ai un petit fils je visualise itératif/itérateur concept avec des briques et du papier blanc.
Supposons que nous sommes dans la chambre noire et de l'étage, nous avons des briques pour mon fils. Des briques de différentes taille, la couleur n'a pas d'importance maintenant. Supposons que nous disposons de 5 briques comme ceux. Ces 5 briques peut être décrit comme un objet – disons briques kit. Nous pouvons faire beaucoup de choses avec ce kit de briques – peut prendre un et puis la deuxième, puis de troisième, il peut changer les lieux de briques, de mettre à la première place de la brique au-dessus de la seconde. Nous pouvons faire beaucoup de sortes de choses avec ceux-ci. Par conséquent, cette briques kit est un objet itérable ou séquence que nous pouvons aller à travers chaque brique et de faire quelque chose avec elle. Nous ne pouvons le faire comme mon petit – fils, nous pouvons jouer avec un brique à un moment. Encore une fois, je m'imaginer ce kit de briques à un itérable.
Maintenant, rappelez-vous que nous sommes dans la chambre noire. Ou presque sombre. Le truc, c'est que nous n'avons pas de voir clairement ces briques, de quelle couleur ils sont, ce que la forme etc. Donc, même si nous voulons faire quelque chose avec eux – aka itérer à travers eux – nous ne savons pas vraiment quoi et comment parce que c'est trop sombre.
Ce que nous pouvons faire est de près pour la première brique comme élément d'un kit de briques – on peut mettre un morceau de blanc fluorescent papier afin de nous permettre de voir où la première brique est l'élément. Et chaque fois que nous prenons une brique à partir d'un kit, on remplace la feuille de papier blanc pour une brique afin d'être en mesure de voir que dans la chambre noire. Ce morceau de papier blanc est rien de plus qu'un itérateur. C'est un objet ainsi. Mais un objet avec ce que l'on peut travailler et jouer avec les éléments de notre objet itérable – briques kit.
Que par la voie explique le début de mon erreur quand j'ai essayé ce qui suit, dans un RALENTI et a obtenu une exception TypeError:
Liste X c'était notre kit de briques, mais PAS un morceau de papier blanc. J'ai besoin de trouver un itérateur d'abord:
Ne sais pas si ça aide, mais ça m'a aidé. Si quelqu'un pouvait confirmer/visualisation correcte de la notion, je vous serais reconnaissant. Il pourrait m'aider à en savoir plus.
Voici la mienne:
Quiz: voyez-vous comment...
__iter__()
méthode peut être implémentée comme un générateur?__next__
méthode n'est pas nécessairement un itérateur?Itérable:- quelque chose qui est itératif est itératif; comme les séquences comme des listes ,des chaînes, etc.
Il a aussi le
__getitem__
méthode ou d'une__iter__
méthode. Maintenant, si nous utilisonsiter()
la fonction de cet objet, nous allons obtenir un itérateur.Itérateur:- Quand nous arrivons à l'itérateur objet de la
iter()
fonction; nous l'appelons__next__()
méthode (en python3) ou tout simplementnext()
(en python2) pour obtenir les éléments un par un. Cette classe ou une instance de cette classe est appelé un itérateur.De docs:-
L'utilisation des itérateurs envahit et unifie Python. En coulisses, le de l'état des appels
iter()
sur l'objet conteneur. La fonction retourne un itérateur objet que définit la méthode__next__()
qui accède à des éléments dans le conteneur un à la fois. Quand il n'y a pas plus d'éléments,__next__()
pose d'un StopIteration exception qui raconte l' pour boucle à la fin. Vous pouvez appeler le__next__()
méthode utilisant lenext()
la fonction intégrée; cet exemple montre comment tout cela fonctionne:Ex d'une classe:-
Je ne pense pas que vous pouvez obtenir beaucoup plus simple que la la documentation, mais je vais essayer:
Vous pouvez penser Itérateur comme une aide de pseudo-méthode (ou pseudo-attribut) qui donne (ou titulaire) le prochain (ou la première) à partir de la itérable. (Dans la pratique, il est juste un objet qui définit la méthode
next()
)Itération s'explique sans doute par le Merriam-Webster définition du mot :
donc,
iterable
est un objet qui peut être en boucle sur. par exemple, liste , string tuple etc.à l'aide de la
iter
fonction sur notreiterable
objet sera de retour une itérateur objet.maintenant ce itérateur objet a méthode nommée
__next__
(en Python 3, ou tout simplementnext
en Python 2) par lequel vous pouvez accéder à chaque élément de l'objet iterable.donc,
SORTIE DE CODE CI-DESSUS SERA:
1
2
Avant d'aborder le iterables et itérateur le facteur majeur qui décident de la itérable et itérateur est une séquence
Séquence:la Séquence de la collecte de données
Itératif:Itérable sont le type de séquence de l'objet que le soutien Iter méthode.
Iter méthode:Iter méthode prendre séquence d'entrée et de créer un objet qui est connu comme un itérateur
Itérateur:Iterator sont l'objet que l'appel de méthode suivante et transversale à travers la séquence.Sur l'appel de la méthode suivante, il retourne l'objet qu'il transversed actuellement.
exemple:
x est une séquence qui consiste en la collecte de données
Sur l'appel de iter(x) retourne un itérateur uniquement lorsque l'objet x a iter méthode sinon il lever une exception.Si elle renvoie un itérateur alors y est d'assigner comme ceci:
Que y est un itérateur par conséquent, il soutien la méthode next ()
Sur l'appel de méthode suivante il retourne les éléments individuels de la liste un par un.
Après le retour du dernier élément de la séquence si nous avons de nouveau appel à la méthode suivante il soulever une StopIteration erreur
exemple:
Luciano Ramalho, Couramment Python.
En Python, tout est objet. Lorsqu'un objet est dit être itératif, cela signifie que vous pouvez parcourir (c'est à dire itérer) l'objet que d'une collection.
Tableaux, par exemple, sont itératif. Vous pouvez les parcourir avec une boucle for, et continuez à partir de l'indice 0 à l'indice n, n étant la longueur de l'objet array moins 1.
Dictionnaires (les paires de clé/valeur, aussi appelé tableaux associatifs) sont également itératif. Vous pouvez parcourir leurs clés.
Évidemment les objets qui ne sont pas des collections ne sont pas itératif. Un bool objet par exemple ont seulement une valeur Vraie ou Fausse. Il n'est pas itérable (il ne serait pas sensé de dire que c'est un objet itérable).
Lire la suite. http://www.lepus.org.uk/ref/companion/Iterator.xml
iter()
sur la norme collection de types sont itérable, mais ne sont pas, eux-mêmes, des collections.