Друкарня від 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)

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

  • Вітаємо з Різдвом Христовим!

    Друкарня та платформа WE.UA вітають всіх наших читачів та авторів зі світлим святом Різдва! Зичимо всім українцям довгожданого миру, міцного здоровʼя, злагоди, родинного затишку та втілення всього доброго і прекрасного, чого вам побажали колядники!

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

    Різдво
  • Каблучки – прикраси, які варто купувати

    Ювелірні вироби – це не тільки спосіб витратити гроші, але і зробити вигідні інвестиції. Бо вартість ювелірних виробів з кожним роком тільки зростає. Тому купуючи стильні прикраси, ви вигідно вкладаєте кошти.

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

    Як Вибрати Каблучку
  • П'ять помилок у виборі домашнього текстилю, які псують комфорт сну

    Навіть ідеальний матрац не компенсує дискомфорт, якщо текстиль підібрано неправильно. Постільна білизна безпосередньо впливає на терморегуляцію, стан шкіри та глибину сну. Більшість проблем виникає не через низьку якість виробів, а через вибір матеріалів та подальшу експлуатацію

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

    Домашній Текстиль
  • Як знайти житло в Києві

    Переїжджаєте до Києва і шукаєте житло? Дізнайтеся, як орендувати чи купити квартиру, перевірити власника та знайти варіанти, про які зазвичай не говорять.

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

    Агентство Нерухомості
  • Як заохотити дитину до читання?

    Як залучити до читання сучасну молодь - поради та факти. Користь читання для дітей - основні переваги. Розвиток дітей - це наше майбутнє.

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

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

Python SDET @ ajax.systems

850Прочитань
10Автори
18Читачі
Підтримати
На Друкарні з 14 квітня

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

  • Пайтон: дескриптори - що це???

    Можливо, навіть далеко не всі чули, що таке дескриптори, але точно всі використовували їхЯ кажу це так впевнено, оскільки @property є дескриптором

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

    Програмування
  • Майбутнє фронтенду — Пайтон?🤔

    PyWeb - фронтенд фреймворк, написаний на Пайтоні, мого авторства 🤓 Щоб запускати Пайтон в браузері використовується Pyodide та WebAssembly

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

    Python

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

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

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

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