Разница между двумя показателями доходности - PullRequest
0 голосов
/ 28 февраля 2020

Какая разница между следующими двумя функциями генератора?

def get_primes(number):
    while True:
        if is_prime(number):
            number = yield number
        number += 1

И:

def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

Насколько я понимаю, я могу назвать их так:

p = get_primes(0)

# first call works for both
next(p) # or p.send(None)

# second call different for both
next(p)    # works for second way only
p.send(14) # works for first way only

Я думаю, моя проблема в том, что я не совсем понимаю, как работает send и как он устанавливает значение и все.

1 Ответ

1 голос
/ 28 февраля 2020

Если вы извлекаете документы , он говорит:

Возобновляет выполнение и «отправляет» значение в функцию генератора. Аргумент value становится результатом текущего выражения yield.

Это может звучать немного крипти c, поэтому, возможно, другими словами:

Использование send() генератор возобновляет работу с того места, где он дал, и отправленное вами значение - это то, что yield возвращает (и может быть присвоено любой переменной). Вы также можете попробовать следующий код:

def get_num():
    number = 1
    while True:
        print(number)
        number = yield number

g = get_num()
g.send(None)  # haven't yielded yet, cannot send a value to it
g.send(2)
g.send(5)

Будет возвращено:

  • 1: значение, которое мы изначально присвоили number
  • 2: мы сделали send(2), и это то, что number = yield ... присвоило number, затем мы продолжили, вернулись к print() и снова уступили.
  • 5: То же самое, но мы сделали send(5).
...