Итератор в 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.