Skip to content

Latest commit

 

History

History
72 lines (57 loc) · 3.61 KB

File metadata and controls

72 lines (57 loc) · 3.61 KB

Итераторы, Выражения-генераторы

Генератор - Это генератор, элементы которого можно перебирать только 1 раз.

Итератор - Это обьект, который поддерживает функцию next для перехода к след элементу коллекции.

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

Для создания генератора можно использовать 2 способа:

  1. Для этого можно использовать уже существующую последовательность, к примеру список, при помощи функции iter() создаем итерируемый обьект и при помощи функции next() проходимся по его элементам, каждый раз при вызове функции next() она будет вызывать следующий элемент итерируемого обьекта, и не может вернуться назад, при вызове большего количества чем содержится в итераторе раз, это даст ошибку:
    lt1 = [1, 2, 3]
    
    it = iter(lt1)
    print(it)

    print(next(it))
    print(next(it))
    print(next(it))

    # Вывод
    # <list_iterator object at 0x7f248ee9ccf8>
    # 1
    # 2
    # 3
  1. Второй способ это создать выражение-генератор, выглядит так же как и генерация списков, но с круглыми скобками, это создаст генератор, по которому можно будет пройтись уже без использования функции next() а просто вызывая его элементы последовательно:
    lt2 = (element for element in range(1000))

    for elem in lt2:
        print(elem)
        if elem >= 100:
            break
          
    for elem in lt2:
        print(elem)
        if elem >= 200:
            break

В качестве вывода увидим числа от 0 до 100 и от 100 до 200, если бы мы использовали списки то повторный вызов цикла вывел бы первые 100 элементов повторно, но итераторы проходятся только 1 раз и не более того, так что вызов второго цикла приведет к выводу элементов с 100 до 200.

Зачем нужны итераторы или выражения генераторы ?

Дело в том что итераторы не хранят в памяти сразу все свои значения, а генерируют их по мере необходимости, при обращении к следующему элементу, так что така запись создания списка my_list = [elem for elem in range(10000000000000)] сожрет всю память, в то время как создание генератора такого типа my_generator = (elem for elem in range(10000000000000)) Создаст генератор который, будет генерировать кожное новое значение при обращении к нему.