Итератор в Python

При программировании вы должны были использовать разные структуры данных, такие как словарь Python, список, кортеж и набор. Нам часто требуется доступ к элементам этих структур последовательным образом. Для последовательной итерации этих данных мы обычно используем циклы for и индекс элементов. В этой статье мы попытаемся понять, как мы можем получить доступ к элементам списка или кортежа без использования цикла или индексов. Итак, давайте погрузимся в концепцию итератора и итераторов в Python.

Что такое итерация в Python?

Контейнерный объект, такой как список или набор, может содержать множество элементов. Если мы можем получить доступ к элементам-членам объектов-контейнеров по одному, то объект-контейнер называется итерабельным. В наших программах мы используем разные итерации, такие как список, кортеж, набор или словарь.

К элементам любой итерации можно получить доступ по одному с помощью цикла for следующим образом:

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Elements of the list are:")
for element in myList:
    print(element)

Выход:

Elements of the list are:
1
2
3
4
5
6
7
8
9
10

В цикле for мы получаем доступ ко всем элементам от начала до конца. Но рассмотрим ситуацию, когда нам нужно получить доступ к следующему элементу итерации только тогда, когда происходит какое-то конкретное событие.

Например, давайте возьмем сценарий, в котором у нас есть список из 100 элементов. Мы постоянно просим пользователя ввести число, и всякий раз, когда он вводит четное число, мы печатаем следующий элемент списка. Теперь это невозможно сделать с помощью цикла for, поскольку мы не можем предсказать, когда пользователь введет четное число. Отсутствие порядка или последовательности во входных данных мешает нам использовать цикл for для перебора списка в нашей программе.

Итераторы могут быть удобным инструментом для доступа к элементам итераций в таких ситуациях. Итак, давайте узнаем, что такое итератор и как мы можем создать итератор в Python для доступа к элементам итератора.

Что такое итератор в Python?

Итератор – это объект, который можно повторять. Другими словами, мы можем получить доступ ко всем элементам в итеративном объекте с помощью итератора. В python мы можем создать итератор для любого объекта-контейнера с помощью метода iter (). Метод iter () принимает итеративный объект в качестве входных данных и возвращает итератор для того же объекта.

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
myIter = iter(myList)
print("list is:", myList)
print("Iterator for the list is:", myIter)

Выход:

list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Iterator for the list is: <list_iterator object at 0x7f4c21734070>

В выводе вы можете увидеть, что объект list_iterator был создан путем передачи списка в функцию iter ().

Как пройти через итератор в Python?

Самый простой способ обойти итератор – использовать цикл for. Мы можем получить доступ к каждому элементу в итераторе, используя цикл for следующим образом.

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
myIter = iter(myList)
print("list is:", myList)
print("Elements in the iterator are:")
for element in myIter:
    print(element)

Выход:

list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Elements in the iterator are:
1
2
3
4
5
6
7
8
9
10

Как обсуждалось ранее, цикл for не будет работать, если у нас нет порядка или последовательности для обхода итератора. Для этого мы можем использовать два способа.

Первый способ получить доступ к элементу итератора – использовать метод __next __ (). Метод __next __ () при вызове на итераторе возвращает элемент, следующий за ранее пройденным элементом. Он всегда сохраняет информацию об элементе, который был возвращен в последний раз, и всякий раз, когда он вызывается, он возвращает только следующий элемент, который еще не был пройден. Мы можем понять это на следующем примере.

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
myIter = iter(myList)
print("list is:", myList)
print("Elements in the iterator are:")
try:
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
    print(myIter.__next__())
except StopIteration as e:
    print("All elements in the iterator already traversed. Raised exception", e)

Выход:

list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Elements in the iterator are:
1
2
3
4
5
6
7
8
9
10
All elements in the iterator already traversed. Raised exception 

Другой способ получить доступ к элементам итератора – использовать функцию next (). Функция next () принимает итератор в качестве входных данных и возвращает следующий элемент, который еще не был пройден, как и метод __next __ ().

myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
myIter = iter(myList)
print("list is:", myList)
print("Elements in the iterator are:")
try:
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
    print(next(myIter))
except StopIteration as e:
    print("All elements in the iterator already traversed. Raised exception", e)

Выход:

list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Elements in the iterator are:
1
2
3
4
5
6
7
8
9
10
All elements in the iterator already traversed. Raised exception 

Из двух приведенных выше примеров вы можете заметить, что функционирование метода __next __ () и функции next () почти одинаково. Кроме того, как функция next (), так и метод __next __ () вызывают ошибку StopIteration, когда все элементы итератора уже пройдены. Поэтому рекомендуется использовать обработку исключений с использованием блоков try except python.

Пример использования итератора

Теперь давайте более подробно рассмотрим описанную выше ситуацию, когда мы должны получить доступ к элементам из списка только тогда, когда пользователь вводит четное число. Теперь у нас есть функция next (), которая может обращаться к элементу из итератора всякий раз, когда мы вызываем функцию.

Мы можем использовать его для доступа к элементам из списка. Для этого мы создадим итератор для списка, а затем будем обращаться к элементам из списка с помощью функции next () всякий раз, когда пользователь вводит четное число. Мы можем реализовать для этого функцию Python следующим образом.

myList = range(0, 101)
myIter = iter(myList)
while True:
    try:
        user_input = int(input("Input an even number to get an output, 0 to exit:"))
        if user_input == 0:
            print("Good Bye")
            break
        elif user_input % 2 == 0:
            print("Very good. Here is an output for you.")
            print(next(myIter))
        else:
            print("Input an even number.")
            continue
    except StopIteration as e:
        print("All the output has been exhausted.")

Выход:

Input an even number to get an output, 0 to exit:1
Input an even number.
Input an even number to get an output, 0 to exit:2
Very good. Here is an output for you.
0
Input an even number to get an output, 0 to exit:4
Very good. Here is an output for you.
1
Input an even number to get an output, 0 to exit:3
Input an even number.
Input an even number to get an output, 0 to exit:6
Very good. Here is an output for you.
2
Input an even number to get an output, 0 to exit:0
Good Bye

Заключение

В этой статье мы обсудили, как мы можем получить доступ к элементам из разных итерируемых объектов с помощью итератора в Python. Чтобы узнать больше о программировании на Python, вы можете прочитать эту статью о понимании списков. Вам также может понравиться эта статья в связанном списке в Python.

Ответить