Друкарня від WE.UA

Насправді дуже крута штука, використавши яку тебе зауважає тімлід 😎

Що це та навіщо?

Генератор — це функція з yield або вираз (comprehension), що вертає ітератор (те, по чому можна пройтись циклом)

Генетори дуже корисні, коли нам не потрібно усі дані одразу, або ці дані генеруються динамічно

Найпростійший приклад — range([start], stop) - це генератор, що продукує послідовно цілі числа, починаючи з числа start, і зупиниться перед stop. Пам’ять пристрою буде використана лише для поточного числа в циклі, а не для мільйону чисел — чудове заощадження пам’яті 🤩

Як це виглядає?

generator_comprehension = (i**2 for i in range(10))

def generator_function(n):
    for i in range(n):
        yield i ** 2

generator = generator_function(10)

# Використання

# Цей код може бути використаним лише раз, бо генератор вичерпав свої значення
for j in generator:
    print(j)
for k in generator_comprehension:
    print(k)

# А цей можна повторювати вічно
for l in generator_function(100):
    print(l)

Виглядає просто, але водночас є гнучкішим та ефективнішим, ніж код нижче

def common_function(n):
    result = []
    for i in range(n):
        result.append(i ** 2)
    return result

# Цей код створить масив на 100 чисел
for j in common_function(100):
    print(j)

squared_numbers = common_function(100)
# Цей код теж можна повторювати вічно, бо масив давно в пам'яті
# Але зазвичай ми так не пишемо
for k in squared_numbers:
    print(k)

А можна реальний приклад?

Так, і хорошим прикладом тут буде — зрівняння/сплощення списку списків (flattening list):

def flatten(nested_list):
    for item in nested_list:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

# Використання:
nested_list = [1, [2, [3, 4], 5], 6], [7, 8]]
flattened_list = list(flatten(nested_list))
# Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Тобто, при будь-якій вкладеності списків в результаті у нас буде лише один список

Тут можна помітити рекурсію, але під час виконання функції, насправді не забирається зайва пам'ять, бо yield from фактично передає контроль над генерацією даних — новому генератору

Q&A

Якщо у вас все ще залишились запитання про генератори у пайтоні — завжди готовий відповісти у коментарях, а якщо про щось інше — теж пишіть, може зроблю з цього нову статтю

Усім добра та мирного неба над головою ❤️

Додаткові матеріали

Багато про генератори та корутини (предок async)

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Вітя
Вітя@kor0p we.ua/kor0p

Python SDET @ ajax.systems

6Довгочити
860Прочитання
18Підписники
Підтримати
На Друкарні з 14 квітня

Більше від автора

Це також може зацікавити:

  • Кібервійна в Україні так само важлива, як і битва в окопах

    Українська та російська сторони ведуть кібервійну, спрямовану на викрадення даних та сіяння паніки. Російські атаки вже давали тривожний дзвінок, вимикаючи електрику та зламуючи банки та енергетичні компанії. Україна змогла підвищити свою ефективність, але загроза залишається.

    Теми цього довгочиту:

    Війна
  • Навчання в Empat School

    Не так давно завершилось моє навчання в Empat School за напрямками Flutter Fundamentals та Full Stack. Якщо коротко - то це неймовірний досвід про зустріч з неймовірними людьми, офігезний досвід, потужний буст в знаннях та пізнання чогось нового.

    Теми цього довгочиту:

    Навчання
  • Шпаргалка по JavaScript Symbol-ам

    Symbol — один з примітивних типів даних. Однак це не текст, не літера, не число. Це дещо своєрідне та може бути складнішим в розумінні.

    Теми цього довгочиту:

    Javascript

Коментарі (2)

Як працює “from”, який стоїть після “yield”?

Це також може зацікавити:

  • Кібервійна в Україні так само важлива, як і битва в окопах

    Українська та російська сторони ведуть кібервійну, спрямовану на викрадення даних та сіяння паніки. Російські атаки вже давали тривожний дзвінок, вимикаючи електрику та зламуючи банки та енергетичні компанії. Україна змогла підвищити свою ефективність, але загроза залишається.

    Теми цього довгочиту:

    Війна
  • Навчання в Empat School

    Не так давно завершилось моє навчання в Empat School за напрямками Flutter Fundamentals та Full Stack. Якщо коротко - то це неймовірний досвід про зустріч з неймовірними людьми, офігезний досвід, потужний буст в знаннях та пізнання чогось нового.

    Теми цього довгочиту:

    Навчання
  • Шпаргалка по JavaScript Symbol-ам

    Symbol — один з примітивних типів даних. Однак це не текст, не літера, не число. Це дещо своєрідне та може бути складнішим в розумінні.

    Теми цього довгочиту:

    Javascript