Достаточно сложная и интересная тема – итераторы и генераторы Python, изучив которую вы по другому начнете смотреть на цикл for, и возможно, такие типы данных данных, как list.
Итерейбл (iterable – перебираемый) – это объект, элементы которого можно перебрать в цикле. Это листы, строки, кортежи, словари и т.д.
Итерейторы (iterators – переборщик или перебиратель) и его можно получить при помощи метода __iter__ или функции iter() из итерейбл объекта.
number_list = [1, 5, 2, 3, 4, 7] #имеем список чисел number_list_iterator = iter(number_list) # применяем к нему функцию iter() и результат записываем в переменную print(number_list_iterator) print(type(number_list_iterator))
Получаем следующий ответ:
<list_iterator object at 0x000001B5BDF49840> <class 'list_iterator'>
В первои во втором случае мы видим, что тип данных имеем: list_iterator
Для чего же нужны итераторы?
Дело в том, что в цикле for не явно используются итераторы! Для итератора можно вызвать метод __next__, именно этот метод переходит к следующему элементу объекта iterable
Дандро метод __next__ переходит к следующему элементу объекта итерейбл, именно с его помощью мы перебираем все элементы объекта iterable.
Итак: элементы объекта iterable перебираются при помощи iterator
number_list = [1, 5, 2, 3, 4, 7] # исходный список number_list_iterator = iter(number_list) # создаем итератор print(number_list_iterator.__next__()) # получаем первый элемент print(number_list_iterator.__next__()) # получаем второй элемент
Стоит помнить, что если мы примерим метод __next__() больше раз, чем есть элементов итераторе, то мы получим ошибку StopIteration, потому что нет больше элементов, которые можно перебирать!
Кроме метода __next__(), мы можем использовать и функцию next(), передавая в нее в качестве параметра iterable
number_list = [1, 5, 2, 3, 4, 7] number_list_iterator = iter(number_list) print(next(number_list_iterator)) print(next(number_list_iterator))