Python __iter__() y __next__() | Convertir un objeto en un iterador

En muchos casos, tenemos la necesidad de acceder a un objeto como un iterador. Una forma es formar un bucle generador pero eso extiende la tarea y el tiempo que toma el programador. Python facilita esta tarea al proporcionar un método integrado __iter__() para esta tarea.
La función __iter__() devuelve un iterador para el objeto dado (array, conjunto, tupla, etc. u objetos personalizados). Crea un objeto al que se puede acceder un elemento a la vez usando la función __next__() , que generalmente es útil cuando se trata de bucles.

Sintaxis: 

iter(object)
iter(callable, sentinel)
  • Objeto: el objeto cuyo iterador debe crearse. Puede ser un objeto de colección como una lista o tupla o un objeto definido por el usuario (usando OOPS).
  • Callable, Sentinel: Callable representa un objeto que se puede llamar, y centinela es el valor en el que se necesita terminar la iteración, el valor de centinela representa el final de la secuencia que se itera.

Excepción :  

If we call the iterator after all the elements have 
been iterated, then StopIterationError is raised.

La función __iter__() devuelve un objeto iterador que pasa por cada elemento del objeto dado. Se puede acceder al siguiente elemento a través de la función __next__(). En el caso de objeto invocable y valor centinela, la iteración se realiza hasta que se encuentra el valor o se alcanza el final de los elementos. En cualquier caso, el objeto original no se modifica.

Código #1:  

Python3

# Python code demonstrating
# basic use of iter()
listA = ['a','e','i','o','u']
 
iter_listA = iter(listA)
 
try:
    print( next(iter_listA))
    print( next(iter_listA))
    print( next(iter_listA))
    print( next(iter_listA))
    print( next(iter_listA))
    print( next(iter_listA)) #StopIteration error
except:
    pass

Producción : 

a
e
i
o
u

Código #2: 

Python3

# Python code demonstrating
# basic use of iter()
lst = [11, 22, 33, 44, 55]
 
iter_lst = iter(lst)
while True:
    try:
        print(iter_lst.__next__())
    except:
        break

Producción : 

11
22
33
44
55

Código #3:  

Python3

# Python code demonstrating
# basic use of iter()
 
listB = ['Cat', 'Bat', 'Sat', 'Mat']
 
 
iter_listB = listB.__iter__()
 
try:
    print(iter_listB.__next__())
    print(iter_listB.__next__())
    print(iter_listB.__next__())
    print(iter_listB.__next__())
    print(iter_listB.__next__()) #StopIteration error
except:
    print(" \nThrowing 'StopIterationError'",
                     "I cannot count more.")

Producción : 

Cat
Bat
Sat
Mat
 
Throwing 'StopIterationError' I cannot count more.

Código #4: Objetos definidos por el usuario (usando OOPS) 

Python3

# Python code showing use of iter() using OOPs
 
class Counter:
    def __init__(self, start, end):
        self.num = start
        self.end = end
 
    def __iter__(self):
        return self
 
    def __next__(self):
        if self.num > self.end:
            raise StopIteration
        else:
            self.num += 1
            return self.num - 1
             
             
# Driver code
if __name__ == '__main__' :
     
    a, b = 2, 5
     
    c1 = Counter(a, b)
    c2 = Counter(a, b)
     
    # Way 1-to print the range without iter()
    print ("Print the range without iter()")
     
    for i in c1:
        print ("Eating more Pizzas, counting ", i, end ="\n")
     
    print ("\nPrint the range using iter()\n")
     
    # Way 2- using iter()
    obj = iter(c2)
    try:
        while True: # Print till error raised
            print ("Eating more Pizzas, counting ", next(obj))
    except:
        # when StopIteration raised, Print custom message
        print ("\nDead on overfood, GAME OVER")
Producción

Print the range without iter()
Eating more Pizzas, counting  2
Eating more Pizzas, counting  3
Eating more Pizzas, counting  4
Eating more Pizzas, counting  5

Print the range using iter()

Eating more Pizzas, counting  2
Eating more Pizzas, counting  3
Eating more Pizzas, counting  4
Eating more Pizzas, counting  5

Dead on overfood, GAME OVER

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *