Python >> Tutoriel Python >  >> Python

Méthode magique Python __next__()

Syntaxe

object.__next__(self)

Le Python __next__ renvoie un élément arbitraire qui représente l'élément « suivant » lorsque vous parcourez l'objet sur lequel il est appelé. Par exemple, si vous parcourez my_object en utilisant for x in my_object , Python appelle en interne my_object.__next__() dans chaque itération de boucle pour déterminer l'élément suivant.

Formellement, le __next__() la méthode implémente le next() intégré fonction. Par exemple, si vous appelez next(x) un objet x , Python appelle en interne x.__next__() pour déterminer l'élément suivant de l'objet itérable x .

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

Arrière-plan suivant()

Le next(iterator) La fonction est l'une des fonctions intégrées de Python. Vous pouvez donc l'utiliser sans importer de bibliothèque.

Valeur de retour :Il renvoie la valeur suivante à partir du iterator vous passez comme premier argument obligatoire. Un second argument facultatif default renvoie la valeur par défaut passée au cas où l'itérateur ne fournirait pas de valeur suivante.

Avant d'en savoir plus sur le __next__() dunder, jetons un coup d'œil à quelques next() de base exemples :

users = ['Alice', 'Bob', 'Carl', 'David']

# convert the list to an iterator
users_iterator = iter(users)

x = next(users_iterator)
print(x)
# Output: 'Alice'

x = next(users_iterator)
print(x)
# Output: 'Bob'

x = next(users_iterator)
print(x)
# Output: 'Carl'

x = next(users_iterator)
print(x)
# Output: 'David'

Exemple personnalisé __next__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __init__() , __iter__() , et __next__() méthodes afin que vous puissiez créer votre propre itérateur sur un Data objet.

class Data:
    def __init__(self, data):
        self.data = data # an iterable

    def __iter__(self):
        self.current_index = 0
        return self

    def __next__(self):
        if self.current_index < len(self.data):
            x = self.data[self.current_index]
            self.current_index += 1
            return x
        raise StopIteration
  • __init__() initialise l'attribut de données qui devrait être un itérable.
  • __iter__() renvoie l'objet itérateur — celui qui implémente le __next__() méthode. Dans notre cas, il s'agit de l'objet Data sur lequel il s'appelle lui-même. Nous initialisons current_index avec zéro, nous commençons donc l'itération avec le premier index de data .
  • __next__() renvoie la valeur suivante après une itération. On incrémente le current_index attribut pour garder une trace de l'index actuel de l'élément dans data .

Créons un Data objet d et un itérateur sur l'objet de données en utilisant le iter() intégré fonction (qui appelle en interne __iter__() )—et commencez à itérer sur l'objet en utilisant le next() intégré fonction (qui appelle en interne __next__() ):

d = Data([1, 'Alice', 42, 'finxter'])

# Create an iterator
iterator = iter(d)

# Dynamically generate the next values - iterate!
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))

Le résultat est le suivant :les quatre premiers appels génèrent les éléments attendus de l'attribut de données, c'est-à-dire 1 , 'Alice' , 42 , et 'finxter' . Le cinquième appel de next() donne un StopIteration erreur car nous avons fini d'itérer sur tous les éléments.

1
Alice
42
finxter
Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 34, in <module>
    print(next(iterator))
  File "C:\Users\xcent\Desktop\code.py", line 14, in __next__
    raise StopIteration
StopIteration

Si vous n'aviez pas défini le __iter__() méthode, Python aurait généré une erreur :

TypeError :l'objet '...' n'est pas itérable

Si vous appelez le iter(x) sur un objet sur lequel le x.__iter__() la méthode dunder n'est pas définie, Python lèvera un TypeError: '...' object is not iterable .

Pour corriger cette erreur, définissez simplement le __iter__() méthode dans la définition de classe avant d'appeler iter() sur un objet et assurez-vous que __iter__() renvoie un objet itérateur sur lequel la méthode dunder __next__() est défini !

Voici un exemple :

class Data:
    def __init__(self, data):
        self.data = data # an iterable

    
        
d = Data([1, 'Alice', 42, 'finxter'])

# Create an iterator
iterator = iter(d)

Voici le message d'erreur :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 10, in <module>
    iterator = iter(d)
TypeError: 'Data' object is not iterable

Références :

  • https://docs.python.org/3/reference/datamodel.html