Comprenez comment fonctionne le code ci-dessous
for i in range(5):
print(i)
# 0
# 1
# 2
# 3
# 4
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.
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
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.
(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. (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)
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.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.
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