Для чего вы можете использовать функции генератора Python? - PullRequest
201 голосов
/ 19 сентября 2008

Я начинаю изучать Python, и я наткнулся на функции-генераторы, в которых есть оператор yield. Я хочу знать, какие проблемы эти функции действительно хорошо решают.

Ответы [ 16 ]

7 голосов
/ 19 сентября 2008

В основном избегая функций обратного вызова при переборе состояния поддержки ввода.

См. здесь и здесь для обзора того, что можно сделать с помощью генераторов.

4 голосов
/ 16 марта 2015

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

2 голосов
/ 28 апреля 2014

Так как метод отправки генератора не был упомянут, вот пример:

def test():
    for i in xrange(5):
        val = yield
        print(val)

t = test()

# Proceed to 'yield' statement
next(t)

# Send value to yield
t.send(1)
t.send('2')
t.send([3])

Показывает возможность отправки значения работающему генератору. Более подробный курс по генераторам в видео ниже (включая yield от объяснения, генераторы для параллельной обработки, выход за пределы рекурсии и т. Д.)

Дэвид Бизли о генераторах на PyCon 2014

2 голосов
/ 19 сентября 2008

Я использую генераторы, когда наш веб-сервер выступает в роли прокси:

  1. Клиент запрашивает прокси-URL с сервера
  2. Сервер начинает загружать целевой URL
  3. Сервер возвращает результаты клиенту, как только он их получает
1 голос
/ 19 сентября 2008

груды вещей. Каждый раз, когда вы хотите сгенерировать последовательность элементов, но не хотите «материализовать» их сразу в список. Например, у вас может быть простой генератор, который возвращает простые числа:

def primes():
    primes_found = set()
    primes_found.add(2)
    yield 2
    for i in itertools.count(1):
        candidate = i * 2 + 1
        if not all(candidate % prime for prime in primes_found):
            primes_found.add(candidate)
            yield candidate

Затем вы можете использовать это для генерации продуктов следующих простых чисел:

def prime_products():
    primeiter = primes()
    prev = primeiter.next()
    for prime in primeiter:
        yield prime * prev
        prev = prime

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

0 голосов
/ 22 сентября 2017

Также подходит для печати простых чисел до n:

def genprime(n=10):
    for num in range(3, n+1):
        for factor in range(2, num):
            if num%factor == 0:
                break
        else:
            yield(num)

for prime_num in genprime(100):
    print(prime_num)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...