Рубрики
Без рубрики

Как использовать метод Python ITER ()?

В этой статье мы посмотрим на использование функции Python ITER ().

Автор оригинала: Pankaj Kumar.

В этой статье мы посмотрим на использование функции Python ITER ().

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

Это называется Ленивый загрузка или на основе потока нагрузка. Это очень полезно, если вы хотите сохранить память, и не загружать весь объект одновременно, если ваш объект очень большой!

Основной синтаксис Python ITER ()

Мы можем использовать ИТЕР () Функция для генерации итератора на итеративный объект, такой как словарь, Список , набор и т. Д.

Основной синтаксис использования Python ИТЕР () Функция выглядит следующим образом:

iterator = iter(iterable)

Это будет генерировать итератор от ИТЕРИТЕЛЬНО объект.

Мы можем просто загружать объекты один за другим, используя Далее (итератор) , пока мы не получим Заставка Исключение.

Кроме того, обратите внимание, что мы Не может Итайте через итерацию через то же самое, используя тот же итератор. Мы должны генерировать другой итератор, используя Python ИТЕР () Перед итерацией!

Использование Python ITER () – простой пример

Вот простой пример, используя ИТЕР () Отказ Мы возьмем список из 10 элементов и загружаем их один за другим.

a = [i for i in range(10)]

iterator = iter(a)

while True:
    try:
        out = next(iterator) # Load the next element
        print(f"Iterator loaded {out}")
    except StopIteration:
        # End of loading. Break out of the while loop
        print("End of iterator loading!")
        break

Выход

Iterator loaded 0
Iterator loaded 1
Iterator loaded 2
Iterator loaded 3
Iterator loaded 4
Iterator loaded 5
Iterator loaded 6
Iterator loaded 7
Iterator loaded 8
Iterator loaded 9
End of iterator loading!

Как вы можете видеть, действительно, он загружает элементы из списка один за другим, пока не поймаю Заставка Исключение!

Использование Python ITER () для пользовательских объектов

Как я уже упоминал ранее, мы можем использовать Python ITER () на любом объекте, при условии, что он является несомненным.

Это также относится к пользовательским объектам, если он удовлетворяет несколько условий.

Но каковы условия для любого объекта, чтобы быть итеративным в Python?

  • Класс этого объекта должен иметь __er __ () метод.
  • Класс объекта должен иметь __Next __ () метод. Кроме того, рекомендуется также поднять Заставка Исключение, если достигнуто завершение условия.

Теперь Python ИТЕР () Метод будет построить итератор и позвонить в __er __ () метод. Точно так же Далее (итератор) позвонит __Next __ () Метод за капюшоном.

Примечание : Если класс делает Не есть эти методы, он должен по крайней мере иметь __GetItem () __ Способ с целочисленными аргументами от 0. В противном случае мы получим Типеррор Исключение.

Давайте теперь напишем класс для пользовательского объекта, который генерирует целые числа до предела.

class MyClass():
    def __init__(self, max_val):
        # Set the maximum limit (condition)
        # max_val must be a natural number
        assert isinstance(max_val, int) and max_val >= 0
        self.max_val = max_val
    def __iter__(self):
        # Called when the iterator is generated
        # Initialise the value to 0
        self.value = 0
        return self
    def __next__(self):
        # Called when we do next(iterator)
        if self.value >= self.max_val:
            # Terminating condition
            raise StopIteration
        self.value += 1
        # Return the previously current value
        return self.value - 1

# Set the limit to 10
my_obj = MyClass(10)

# An iterator to the object
my_iterator = iter(my_obj)

while True:
    try:
        val = next(my_obj)
        print(f"Iterator Loaded {val}")
    except StopIteration:
        print("Iterator loading ended!")
        break

Выход

Iterator Loaded 0
Iterator Loaded 1
Iterator Loaded 2
Iterator Loaded 3
Iterator Loaded 4
Iterator Loaded 5
Iterator Loaded 6
Iterator Loaded 7
Iterator Loaded 8
Iterator Loaded 9
Iterator loading ended!

Как видите, мы действительно можем использовать ИТЕР () Функция на нашем пользовательском объекте. __er __ () Метод создает объект iTerator, который мы тогда обновляем используя __Next __ () Отказ

Условие завершения – это когда текущее значение больше, чем максимальное значение, которое, когда мы поднимаем Заставка исключение.

Создание значений до значения Sentinel с ITER ()

Мы можем пройти еще один аргумент на Python ИТЕР () Отказ Этот второй аргумент называется Sentinel элемент.

Если мы передам этот сентинельный элемент, итератор будет продолжать генерирующие значения до тех пор, пока не сгенерированное значение не равно это значение Sentinel, после чего Заставка будет поднят.

После этого генерация итератора автоматически остановится!

Это очень полезно, если у вас есть последовательные данные, исходящие из функций. Также необходимы функции, поскольку первый аргумент Должен Будьте подходяны, если мы используем аргумент Sentinel.

iterator = iter(callable_object, sentinel)

Здесь итератор это итератор, который будет продолжать звонить callable_object пока не возвращаемое значение равно Sentinel Отказ

Здесь callable_object Может быть функцией, метод или даже лямбда!

Давайте возьмем простой пример, используя лямбда как callable.

Мы возьмем строку в качестве ввода и передаем ее на функцию лямбда и продолжаем генерировать значения до A Новая линия Sentinel Element (‘\ N’).

a = "This is a long string consisting of two lines.\nThis is the second line.\nThis is the third line."

start = 0
size = 1

def func(a):
    return a[start: start+size]

iterator = iter(lambda: func(a), '\n')

# Will generate values until '\n'
for out in iterator:
    print(f"Iterator loaded {out}")
    start += size

print("Encountered Newline!")

Выход

Iterator loaded T
Iterator loaded h
Iterator loaded i
Iterator loaded s
Iterator loaded
Iterator loaded i
Iterator loaded s
Iterator loaded
Iterator loaded a
Iterator loaded
Iterator loaded l
Iterator loaded o
Iterator loaded n
Iterator loaded g
Iterator loaded
Iterator loaded s
Iterator loaded t
Iterator loaded r
Iterator loaded i
Iterator loaded n
Iterator loaded g
Iterator loaded
Iterator loaded c
Iterator loaded o
Iterator loaded n
Iterator loaded s
Iterator loaded i
Iterator loaded s
Iterator loaded t
Iterator loaded i
Iterator loaded n
Iterator loaded g
Iterator loaded
Iterator loaded o
Iterator loaded f
Iterator loaded
Iterator loaded t
Iterator loaded w
Iterator loaded o
Iterator loaded
Iterator loaded l
Iterator loaded i
Iterator loaded n
Iterator loaded e
Iterator loaded s
Iterator loaded .
Encountered Newline!

Как вы можете наблюдать, итератор генерирует значения, пока не столкнулся с новой строкой! Вы также можете сделать ту же программу, используя в то время как петля и ловить Заставка исключение.

Это на самом деле очень полезно, если вы хотите иметь дело с блоками выходов, возвращаемых функциями, поэтому определенно осознавать параметр Sentinel для ИТЕР () !

Заключение

В этой статье мы смотрели, как мы могли бы использовать ИТЕР () Функция в Python для генерации повторных документов для различных объектов.

Рекомендации