• Выражения-генераторы:
    • Создают итератор “на лету”, не храня все значения в памяти.
    • Синтаксис: (выражение for элемент in итерируемый_объект [if условие]) (круглые скобки!).
    • Пример: squares_generator = (i**2 for i in range(1000))
  • Итератор vs Итерируемый объект:
    • Итерируемый объект (Iterable): Объект, который можно перебирать (например, список, строка, кортеж, словарь, множество, файл). Имеет метод __iter__(), который возвращает итератор.
    • Итератор (Iterator): Объект, который представляет поток данных. Имеет метод __next__(), возвращающий следующий элемент или вызывающий StopIteration, когда элементы кончились. Итератор помнит свое текущее состояние.
  • Генератор: Особый тип итератора, создаваемый выражениями-генераторами или функциями-генераторами. Элементы генерируются по запросу и могут быть перебраны только один раз.
  • Функция iter():
    • Принимает итерируемый объект и возвращает итератор для него.
    • Пример:
      s = [1, 2, 3]  
      my_iter = iter(s) 
      print(next(my_iter)) # Вывод: 1
      print(next(my_iter)) # Вывод: 2
      print(next(my_iter)) # Вывод: 3
      # print(next(my_iter)) # Вызовет StopIteration
  • Функции-генераторы:
    • Функции, содержащие ключевое слово yield.
    • При вызове возвращают объект-генератор (итератор).
    • yield возвращает значение и “замораживает” выполнение функции, сохраняя ее состояние. При следующем вызове next() для генератора выполнение возобновляется со строки после yield.
    • Пример:
      def simple_generator():
          print("Начало генератора")
          yield 1
          print("После первого yield")
          yield 2
          print("После второго yield")
          yield 3
          print("Конец генератора")
       
      gen = simple_generator()
      print(next(gen)) # Вывод: Начало генератора \n 1
      print(next(gen)) # Вывод: После первого yield \n 2 

〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰