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?

319
demandé sur abccd 2012-03-27 10:03:37

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 .

401
répondu agf 2014-08-08 15:53:46

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 retourne self ).

Notes:

  • la méthode __next__ en Python 3 est appelée next 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
266
répondu Raymond Hettinger 2017-02-01 21:36:47

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 ce obj , alors demandons-lui.

" M. obj , avez-vous votre itérateur?"(... appels iter(obj) , qui appelle obj.__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 que for besoins principaux de la boucle est __iter__() (qui renvoie quelque chose avec next() ).

  • 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.

84
répondu Alois Mahdal 2017-05-23 11:55:19

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
20
répondu glglgl 2014-12-06 22:01:07

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.

8
répondu Nikolay Dudaev 2015-09-30 12:25:25

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?
4
répondu AXO 2018-04-04 10:31:02

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

3
répondu Kimvais 2012-03-27 06:23:36
iterable = [1, 2] 

iterator = iter(iterable)

print(iterator.__next__())   

print(iterator.__next__())   

,

  1. iterable est un objet qui peut être en boucle sur . par exemple, liste , string tuple etc.

  2. en utilisant la fonction iter sur notre objet iterable retournera un objet itérateur .

  3. maintenant cet" objet itérateur 1519110920" a une méthode appelée __next__ (en Python 3, ou tout simplement next en Python 2) par laquelle vous pouvez accéder à chaque élément itérable.

donc, LA SORTIE DU CODE CI-DESSUS SERA:

1

2

1
répondu arpan kumar 2017-07-24 14:40:33

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
1
répondu Shadow 2018-01-28 09:04:07

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
1
répondu Vicrobot 2018-07-20 04:50:37

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 retourne self .

par conséquent, les itérateurs sont également itérables, mais les itérables ne sont pas des itérateurs.

Luciano Ramalho, Python Fluent.

0
répondu trthhrtz 2018-09-06 11:10:36

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

-6
répondu user93097373 2014-07-15 08:59:16