Quels sont exactement itérateur, itératif, et l'itération?
quelles sont les définitions les plus basiques de "iterable", "iterator" et "itération en Python?
j'ai lu plusieurs définitions, mais leur signification exacte ne sera pas intégrée.
quelqu'un peut-il s'il vous plaît m'aider avec l'idée de base?
12 réponses
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ératif et itérateur ont des significations spécifiques.
Un itératif est un objet qui a une __iter__
méthode qui retourne un iterator , ou qui définit une méthode __getitem__
qui peut prendre des indices séquentiels à partir de zéro (et soulève un IndexError
lorsque les indices ne sont plus valides). Ainsi un itératif est un objet que 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 boucle for
, ou map
, ou une liste de compréhension, etc. en Python , la méthode next
est appelée automatiquement pour récupérer chaque item du iterator , passant ainsi par le processus de itération .
un bon endroit pour commencer l'apprentissage serait la section itérateurs du tutoriel et la section types itérateurs de la page des types standards . Après avoir compris les bases, essayez la section itérateurs du HOWTO de programmation fonctionnelle .
Voici l'explication que j'utilise dans l'enseignement des classes de Python:
un itérable est:
- tout ce qui peut être bouclé (c.-à-d. que vous pouvez boucler une chaîne ou un fichier) ou
- tout ce qui peut apparaître sur le côté droit d'une boucle:
for x in iterable: ...
ou - tout ce que vous pouvez appeler avec
iter()
qui retournera un itérateur:iter(obj)
ou - un objet qui définit
__iter__
qui renvoie un nouvel itérateur, ou il peut avoir une méthode__getitem__
appropriée pour la recherche indexée.
un itérateur est un objet:
- avec un État qui se rappelle où il est pendant l'itération,
- avec une méthode
__next__
qui:- renvoie la valeur suivante dans l'itération
- met à jour l'État pour pointer vers la valeur suivante
- signale quand il est fait en soulevant
StopIteration
- et qui est auto-itérable (ce qui signifie qu'il a une méthode
__iter__
qui retourneself
).
Notes:
- la méthode
__next__
en Python 3 est appeléenext
en Python 2, et - la fonction intégrée
next()
appelle cette méthode sur le l'objet est passé.
par exemple:
>>> s = 'cat' # s is an ITERABLE
# s is a str object that is immutable
# s has no state
# s has a __getitem__() method
>>> t = iter(s) # t is an ITERATOR
# t has state (it starts by pointing at the "c"
# t has a next() method and an __iter__() method
>>> next(t) # the next() function returns the next value and advances the state
'c'
>>> next(t) # the next() function returns the next value and advances
'a'
>>> next(t) # the next() function returns the next value and advances
't'
>>> next(t) # next() raises StopIteration to signal that iteration is complete
Traceback (most recent call last):
...
StopIteration
>>> iter(t) is t # the iterator is self-iterable
les réponses ci-dessus sont grandes, mais comme la plupart de ce que j'ai vu, ne mettez pas l'accent sur le distinction assez pour 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 telles définitions sont correctes-elles sont basées sur la philosophie du canard-typing, mais l'accent sur les méthodes a tendance à s'interposer lorsqu'on essaie de comprendre le concept dans sa simplicité.
donc j'ajoute ma version.
en langage naturel,
- itération est le processus de prendre un élément à la fois dans une rangée d'éléments.
En Python,
-
itérable est un objet qui est, bien, itératif, qui tout simplement, signifie que il peut être utilisé en itération, p.ex. avec une boucle
for
. Comment? En utilisant iterator . Je vais vous expliquer ci-dessous. -
... alors que iterator est un objet qui définit comment faire réellement le itération -- spécifiquement Quel est le prochain élément . C'est pourquoi il doit avoir
next()
la méthode.
Les itérateurs sont eux aussi itérables, à la différence que leur méthode __iter__()
renvoie le même objet ( self
), que ses articles aient été consommés ou non par des appels antérieurs à next()
.
alors que pense Python interpreter quand il voit la déclaration for x in obj:
?
regardez, une boucle
for
. Ressemble à un travail pour un itérateur... Let's get un. ... Il y a ceobj
, alors demandons-lui." M.
obj
, avez-vous votre itérateur?"(... appelsiter(obj)
, qui appelleobj.__iter__()
, qui distribue heureusement un nouveau itérateur brillant_i
.)OK, c'était facile... Nous allons commencer à répéter ensuite. (
x = _i.next()
...x = _i.next()
...)
puisque M. obj
a réussi ce test (en ayant une méthode retour d'un itérateur de validation), nous le récompensons par un adjectif: vous pouvez maintenant l'appeler "M. itérable obj
".
cependant, dans les cas simples, vous ne bénéficiez pas normalement d'avoir itérateur et itérable séparément. Ainsi, vous définissez seulement un objet, qui est aussi son propre itérateur. (Python ne se soucie pas vraiment que _i
distribué par obj
n'était pas si brillant, mais juste le obj
lui-même.)
C'est pourquoi dans la plupart des exemples j'ai vu (et ce qui avait été confus moi encore et encore), vous pouvez voir:
class IterableExample(object):
def __iter__(self):
return self
def next(self):
pass
au lieu de
class Iterator(object):
def next(self):
pass
class Iterable(object):
def __iter__(self):
return Iterator()
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 des éléments "actuels" et "à venir", vous pouvez avoir des itérateurs distincts pour les deux. Ou plusieurs threads à partir d'une liste énorme: chacun peut avoir son propre itérateur pour parcourir tous les éléments. Voir de @Raymond et de @glglgl Réponses ci-dessus.
imaginez ce que vous pourriez faire:
class SmartIterableExample(object):
def create_iterator(self):
# An amazingly powerful yet simple way to create arbitrary
# iterator, utilizing object state (or not, if you are fan
# of functional), magic and nuclear waste--no kittens hurt.
pass # don't forget to add the next() method
def __iter__(self):
return self.create_iterator()
Notes:
-
je le répète encore une fois: itérateur n'est pas itératif . Itérateur ne peut pas être utilisé comme une "source" dans
for
boucle. Ce quefor
besoins principaux de la boucle est__iter__()
(qui renvoie quelque chose avecnext()
). -
bien sûr,
for
n'est pas la seule boucle d'itération, donc ci-dessus s'applique à un autre construit aussi (while
...). -
Itérateur
next()
peut jeter StopIteration pour arrêter l'itération. N'a pas à, cependant, il peut itérer pour toujours ou utiliser d'autres moyens. -
dans le "processus de pensée" ci-dessus,
_i
n'existe pas vraiment. J'ai composé ce nom. -
il y a un petit changement en Python 3.x: méthode
next()
(pas la méthode intégrée) maintenant doit s'appeler__next__()
. Oui, ça aurait dû être comme ça depuis le début. -
vous pouvez aussi le penser comme ceci: iterable a les données, iterator tire la prochaine article
avis de non-responsabilité: Je ne suis pas un développeur D'interpréteur Python, donc je ne sais pas vraiment ce que l'interpréteur"pense". Les réflexions ci-dessus ne sont que la démonstration de la façon dont je comprends le sujet à partir d'autres explications, expériences et expérience de la vie réelle d'un débutant de Python.
un itérable est un objet qui a une méthode __iter__()
. Il peut éventuellement itéré plusieurs fois, comme list()
et de tuple()
.
un itérateur est l'objet qui itère. Il est retourné par une méthode __iter__()
, retourne lui-même par sa propre méthode __iter__()
et a une méthode next()
( __next__()
en 3.x).
itération est le processus d'appel de ce next()
resp. __next__()
jusqu'à ce qu'il soulève StopIteration
.
exemple:
>>> a = [1, 2, 3] # iterable
>>> b1 = iter(a) # iterator 1
>>> b2 = iter(a) # iterator 2, independent of b1
>>> next(b1)
1
>>> next(b1)
2
>>> next(b2) # start over, as it is the first call to b2
1
>>> next(b1)
3
>>> next(b1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> b1 = iter(a) # new one, start over
>>> next(b1)
1
Je ne sais pas si cela aide quelqu'un, mais j'aime toujours visualiser les concepts dans ma tête pour mieux les comprendre. Comme j'ai un petit fils, je visualise le concept itératif/itérateur avec des briques et du papier blanc.
supposons que nous soyons dans la chambre noire et que sur le sol nous ayons des briques pour mon fils. Briques de différentes tailles, couleur, n'a pas d'importance maintenant. Supposons qu'on ait 5 briques comme ça. Ces 5 briques peuvent être décrites comme un objet - disons briques "kit 151990920" . Nous pouvons faire beaucoup de choses avec ce kit de briques – peut prendre un et puis prendre deuxième et puis troisième, peut changer les places des briques, mettre première brique au-dessus de la deuxième. Nous pouvons faire beaucoup de sortes de choses avec ceux-ci. Par conséquent, ce kit de briques est un objet itérable ou séquence que nous pouvons passer à travers chaque brique et faire quelque chose avec elle. Nous ne pouvons le faire comme mon petit – fils, nous pouvons jouer avec un brique à l'heure . Je me suis donc imaginé que ce kit de briques serait un itérable .
rappelez-vous que nous sommes dans la chambre noire. Ou presque sombre. La chose est que nous ne voyons pas clairement ces briques, quelle couleur ils sont, quelle forme etc. Donc, même si nous voulons faire quelque chose avec eux – aka itérer – nous ne savons pas vraiment quoi et comment parce que c'est trop sombre.
ce que nous pouvons faire est proche de la première brique – comme élément d'un kit de briques – nous pouvons mettre un morceau de papier blanc fluorescent afin de nous permettre de 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 à une brique suivante afin de pouvoir le voir dans la pièce sombre. Ce papier blanc n'est rien de plus qu'un itérateur . C'est un objet . Mais un objet avec ce que nous pouvons travailler et jouer avec les éléments de notre kit objet – Briques itérables.
qui explique d'ailleurs mon erreur de début quand j'ai essayé la suivante dans un ralenti et obtenu une erreur de typographie:
>>> X = [1,2,3,4,5]
>>> next(X)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
next(X)
TypeError: 'list' object is not an iterator
liste X voici notre kit de briques, mais pas un morceau de papier blanc. Il me fallait d'abord trouver un itérateur:
>>> X = [1,2,3,4,5]
>>> bricks_kit = [1,2,3,4,5]
>>> white_piece_of_paper = iter(bricks_kit)
>>> next(white_piece_of_paper)
1
>>> next(white_piece_of_paper)
2
>>>
je Ne sais pas si ça aide, mais ça m'a aidé. Si quelqu'un pouvait confirmer/visualisation correcte de la notion, je serait reconnaissant. Il pourrait m'aider à en savoir plus.
voici ma feuille de tricherie:
sequence
+
|
v
def __getitem__(self, index: int):
+ ...
| raise IndexError
|
|
| def __iter__(self):
| + ...
| | return <iterator>
| |
| |
+--> or <-----+ def __next__(self):
+ | + ...
| | | raise StopIteration
v | |
iterable | |
+ | |
| | v
| +----> and +-------> iterator
| ^
v |
iter(<iterable>) +----------------------+
|
def generator(): |
+ yield 1 |
| generator_expression +-+
| |
+-> generator() +-> generator_iterator +-+
Quiz: voyez-vous comment...
- chaque itérateur est un itérable?
- la méthode
__iter__()
d'un objet conteneur peut-elle être mise en œuvre en tant que générateur? - une méthode itérable plus une méthode
__next__
n'est pas nécessairement un itérateur?
Je ne pense pas que vous pouvez obtenir beaucoup plus simple que le documentation , cependant je vais essayer:
- Iterable est quelque chose qui peut être itéré plus. Dans la pratique, it habituellement signifie une "séquence 1519100920" par exemple, quelque chose qui a un début et une fin et un moyen de passer en revue tous les éléments qui s'y trouvent.
-
Vous pouvez penser Itérateur en tant qu'aide de pseudo-méthode (ou pseudo-attribut) qui donne (ou titulaire) le prochain (ou la première) à partir de la itératif . (En pratique, c'est juste un objet qui définit la méthode
next()
) -
itération est probablement mieux expliqué par le Merriam-Webster définition du mot :
b: répétition d'une séquence d'instructions informatiques a spécifiée nombre de fois ou jusqu'à ce qu'une condition soit remplie-comparer recursion
iterable = [1, 2]
iterator = iter(iterable)
print(iterator.__next__())
print(iterator.__next__())
,
-
iterable
est un objet qui peut être en boucle sur . par exemple, liste , string tuple etc. -
en utilisant la fonction
iter
sur notre objetiterable
retournera un objet itérateur . -
maintenant cet" objet itérateur 1519110920" a une méthode appelée
__next__
(en Python 3, ou tout simplementnext
en Python 2) par laquelle vous pouvez accéder à chaque élément itérable.
donc, LA SORTIE DU CODE CI-DESSUS SERA:
1
2
avant de traiter avec les itérables et l'itérateur le facteur principal qui décide de l'itératif et l'itérateur est la séquence
de la Séquence:la Séquence de la collecte des données
Itératif:Itérable sont le type de séquence de l'objet que le soutien Iter méthode.
méthode Iter:méthode Iter prendre la séquence comme une entrée et créer un objet qui est connu sous le nom iterator
Iterator:Iterator sont l'objet d'appel méthode suivante et transversale à travers la séquence.En appelant la méthode suivante, il retourne l'objet qu'il a traversé en ce moment.
exemple:
x=[1,2,3,4]
x est une séquence qui consiste en la collecte de données
y=iter(x)
lors de l'appel d'iter(x) il renvoie un itérateur seulement lorsque l'objet x a une méthode iter sinon il soulève une exception.Si elle renvoie iterator alors y est assignée comme ceci:
y=[1,2,3,4]
Comme 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 avoir retourné le dernier élément de la séquence si nous appelons à nouveau la méthode suivante, il élever une erreur de Stopitération
exemple:
>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration
Itératif :- quelque chose qui est itératif est itératif; comme les séquences comme des listes ,des chaînes, etc.
En outre, il a soit la méthode __getItem__()
ou une fonction iter()
qui renvoie un itérateur.
Iterator : - lorsque nous obtenons un objet iterator de la méthode iter()
de iterable; nous appelons la méthode __next__()
(en python3) ou simplement next()
(en python2) pour obtenir des éléments un par un. Cette classe ou instance de cette classe est appelé un itérateur.
De docs:-
L'utilisation d'itérateurs pervade et unifie Python. En coulisses, la déclaration appelle iter()
sur 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 à la fois. Lorsqu'il n'y a plus d'éléments, __next__()
soulève une exception D'arrêt qui raconte pour la boucle à la fin. Vous pouvez appeler la méthode __next__()
en utilisant la fonction intégrée next()
; cet exemple montre comment tout cela fonctionne:
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
Ex D'une classe: -
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s
Iterables ont une méthode
__iter__
qui instancie un nouveau itérateur à chaque fois.itérateurs mettre en œuvre une méthode
__next__
qui retourne des éléments individuels, et une méthode__iter__
qui retourneself
.par conséquent, les itérateurs sont également itérables, mais les itérables ne sont pas des itérateurs.
Luciano Ramalho, Python Fluent.
en Python tout est un objet. Quand un objet est dit itérable, cela signifie que vous pouvez passer par (C.-à-d. itérer) l'objet en tant que collection.
Les tableaux, par exemple, sont itérables. 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.
Les dictionnaires(paires clé/valeur, aussi appelées tableaux associatifs) sont également itérables. Vous pouvez parcourir leurs clés.
Évidemment, les objets qui ne sont pas des collections ne sont pas itératif. Un objet bool par exemple n'a qu'une valeur, True ou False. Il n'est pas itérable (il ne serait pas logique que ce soit un objet itérable).
lire la suite. http://www.lepus.org.uk/ref/companion/Iterator.xml