[PYTHON] Qu'est-ce qu'un itérateur?

objectif

Comprenez comment fonctionne le code ci-dessous

for i in range(5):
    print(i)
# 0
# 1
# 2
# 3
# 4

Qu'est-ce qu'un itérateur

Python pour les instructions fonctionne pour les itérateurs.

Je ne pense pas que cela vous viendra même si vous dites cela. Alors, je vais vous expliquer pourquoi vous avez besoin d'un tel concept.

Essayez de reproduire une fois avec l'instruction while

Considérez l'exemple suivant pour l'instruction.

l = ['Alpha', 'Beta', 'Charlie']

for name in l:
    print(name)

Quiconque a appris Python saura ce que cela produira?

Alpha
Beta
Charlie

Oui, il le sort du tableau et affiche le nom. Si vous réécrivez ceci avec while, vous pouvez le réécrire comme ceci.

l = ['Alpha', 'Beta', 'Charlie']
i = 0
while True:
    if i == len(l):
        break
    print(l[i])
    i += 1

Faites de même pour Set

La sortie est la même. L'instruction Python for est-elle une fonctionnalité qui facilite l'exécution de telles opérations sur divers tableaux? Prenons l'exemple suivant. Cette fois, c'est un exemple d'utilisation du type set au lieu du tableau. set est un objet qui représente un ensemble, et même si vous entrez le même nombre, il sera enregistré comme un.

s = {1, 2, 2, 3, 1, 4}
↓
{1, 2, 3, 4}

Tente d'opérer sur cet objet comme auparavant.

s = {1, 2, 3, 4, 5}

i = 0
while True:
    if i == len(s):
        break
    print(s[i])
    i += 1

Lorsque j'exécute ce programme, j'obtiens une erreur et je me fâche.

Traceback (most recent call last):
  File "a.py", line 7, in <module>
    print(s[i])
TypeError: 'set' object is not subscriptable

Je me demande pourquoi? En effet, les objets tels que les types Set et Dict ne sont pas disposés sur une ligne horizontale comme un tableau. Il est représenté par une structure appelée table de hachage.

1200px-HASHTB08.svg.png (Image de Wikipedia)

Il existe également des structures de données dans le monde qui sont représentées par des arbres. Cette fois, c'est facile à comprendre, alors prenons cela comme exemple. Binary_tree.png (Image de Wikipedia)

Les objets ainsi exprimés ne seront pas pris immédiatement même si vous leur demandez de dire "Obtenez le 5ème!". Vous devez suivre dans l'ordre à partir des 2 premiers de cette figure. Par conséquent, l'accès par indice est interdit. Au lieu de cela, ils répondront immédiatement à des instructions comme "Cherchez celui qui dit hogehoge!". Le type de dictionnaire est un objet qui tire parti de ces caractéristiques.

Alors, comment reproduisez-vous le même comportement avec une instruction while? Ce qui suit est un exemple.

s = {1, 2, 3, 4, 5}

while True:
    if s == set():
        break
    print(s.pop())

Je vais omettre l'algorithme détaillé, mais vous pouvez voir que l'opération est complètement différente de la liste. Cependant, l'instruction for peut également être utilisée pour ce type d'ensemble.

s = {1, 2, 3, 4, 5}

for num in s:
    print(num)

Je me demande pourquoi? C'est l'essence même de "l'instruction for de Python entraîne un itérateur". Les itérateurs sont implémentés dans une liste et un ensemble. Et l'instruction for transmet l'objet itérateur de list et set. Donc, même si vous écrivez comme suit, cela fonctionne de la même manière.

s = {1, 2, 3, 4, 5}

a = iter(s)
for num in a:
    print(num)

Image de l'opération d'itérateur

Et \ _ \ _next \ _ \ _ () est toujours implémenté dans l'objet itérateur, et c'est une fonction qui renvoie la valeur de l'emplacement à côté de l'itérateur courant.

Donc, cela donnera toujours le même résultat

s = {1, 2, 3, 4, 5}

a = iter(s)

print(next(a)) # __next__Appel de l'extérieur
print(next(a))
print(next(a))
print(next(a))
print(next(a))

Ceci est illustré ci-dessous.

Je pense que vous avez en quelque sorte trouvé la commodité de l'itérateur. L'itérateur n'a besoin que de prendre les valeurs suivantes, vous n'avez donc pas à conserver toutes les données.

Comprendre le but

Jetez un œil au code suivant. C'est le code que j'ai écrit à cet effet

for i in range(5):
    print(i)
# 0
# 1
# 2
# 3
# 4

Vous pouvez également considérer ce code comme:

a = [0, 1, 2, 3, 4]

for i in a:
    print(i)
# 0
# 1
# 2
# 3
# 4

Et si c'était 10000 au lieu de 5? Et si c'était 1000000? Générera-t-il une liste de 0 à 999999? faux. Tout ce que vous avez à faire est de préparer un seul numéro et de l'augmenter.

De cette façon, vous pouvez économiser de la mémoire en ne créant pas réellement une liste de 0 à 999999. Et l'instruction for peut utiliser efficacement divers objets en appelant cet itérateur.

Modifier l'historique

2020-06-19 Correction du code source qui appelait next depuis le début, comme indiqué par shiracamus. 2020-06-21 https://github.com/zerokpr a souligné que l'erreur autour de la structure de données de Set a été corrigée.

Recommended Posts

Qu'est-ce qu'un itérateur?
Qu'est-ce qu'une variable d'instance?
Qu'est-ce que l'espace de noms
Qu'est-ce que copy.copy ()
Qu'est-ce que dotenv?
Qu'est-ce que Linux
Qu'est-ce que le klass?
Qu'est-ce que SALOME?
Qu'est-ce que Linux?
Qu'est-ce que Linux
Qu'est-ce que pyvenv
Qu'est-ce que __call__
Qu'est-ce que Linux
Qu'est-ce que Python
[Statistiques pour les programmeurs] Qu'est-ce qu'un événement?
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
Qu'est-ce qu'une distribution?
Qu'est-ce que le F-Score de Piotroski?
Qu'est-ce que Raspberry Pi?
[Python] Qu'est-ce que Pipeline ...
Qu'est-ce que Calmar Ratio?
Qu'est-ce qu'un terminal?
[Tutoriel PyTorch ①] Qu'est-ce que PyTorch?
Qu'est-ce qu'un hacker?
Qu'est-ce que JSON? .. [Remarque]
À quoi sert Linux?
Qu'est-ce qu'un pointeur?
Qu'est-ce que l'apprentissage d'ensemble?
Qu'est-ce que TCP / IP?
Qu'est-ce que __init__.py de Python?
Qu'est-ce que UNIT-V Linux?
[Python] Qu'est-ce que virtualenv
Qu'est-ce que l'apprentissage automatique?
Qu'est-ce que l'algorithme [Ruby / Python / Java / Swift / JS]?
[Statistiques] Comprenez ce qu'est la courbe ROC par animation.
Qu'est-ce que Mini Sam ou Mini Max?
Qu'est-ce que l'analyse de régression logistique?
Quelle est la fonction d'activation?
Python est un langage pour adultes
Qu'est-ce qu'un arbre de décision?
Qu'est-ce qu'un changement de contexte?
Qu'est-ce que Google Cloud Dataflow?
[DL] Qu'est-ce que la décroissance du poids?
[Python] Python et sécurité-① Qu'est-ce que Python?
Qu'est-ce qu'un super utilisateur?
La programmation du concours, c'est quoi (bonus)
[Python] * args ** Qu'est-ce que kwrgs?
Qu'est-ce qu'un appel système
[Définition] Qu'est-ce qu'un cadre?
A quoi sert l'interface ...
Qu'est-ce qu'une fonction de rappel?
Qu'est-ce que la fonction de rappel?
Quel est votre "coefficient de Tanimoto"?
Cours de base Python (1 Qu'est-ce que Python)
[Python] Qu'est-ce qu'une fonction zip?
[Python] Qu'est-ce qu'une instruction with?
Qu'est-ce que la régression de crête de rang réduit?
Qu'est-ce que Azure Automation Update Management?