2017-02-10 3 views
2

Я пытаюсь изучить python, прочитав книгу Learning Python, и наткнулся на раздел использования инструкции return в генераторах, и мне трудно оборачивать вокруг себя голову.Использование оператора return в генераторах

В нем говорится, что при использовании инструкции return в функции генератора она будет вызывать исключение StopIteration, которое должно быть поднято, что фактически заканчивает итерацию. Если оператор return фактически должен был вернуть функцию, это приведет к поломке итерационного протокола.

Вот пример кода

def geometric_progression(a, q): 
    k = 0 
    while True: 
     result = a * q**k 
     if result <= 100000: 
      yield result 
     else: 
      return 
     k += 1 

for n in geometric_progression(2,5): 
    print(n) 

Может кто-нибудь, пожалуйста, объясните это, а также, как использовать его в дальнейшем в любом другом контексте. Приведите дополнительные примеры, если сможете.

+0

Просто подумайте об этом как о начале итерации. В этом случае условие 'result <= 100000' останавливает генератор от получения результата больше, чем' 100000', что является своего рода надуманным, поскольку вы могли бы сделать while-loop 'while <= 100000' для достижения того же эффект (с некоторым соответствующим начальным значением для «результата»). Честно говоря, я не думаю, что он используется очень много, но бывают случаи, когда вы хотите немедленно прекратить итерацию, где это может пригодиться. –

+0

Возможный дубликат [Возврат в генераторе вместе с доходностью в Python 3.3] (http://stackoverflow.com/questions/16780002/return-in-generator-together-with-yield-in-python-3-3) –

+0

@ Chris_Rands - FWIW, это _slightly_ отличается от этого вопроса. Это специально задает вопрос о том, что означает «возвращаемое значение», в то время как это также спрашивает о голом возврате (и поэтому применимо также к python2.x). Я согласен с этим: они похожи друг на друга, и я мог понять, закончилось ли это закрытием как обман :-) – mgilson

ответ

3

return в генераторе просто синтаксический сахар для raise StopIteration. В python 3.3 (?) + Вы также можете вернуть значение (return value == raise StopIteration(value)).

Что касается того, почему вы хотите его там поместить, очевидно, повышение уровня StopIteration означает, что генератор прекратит сдавать предметы. Другими словами, генератор завершен, как return сигнализирует о завершении выполнения функции. Аналогично, все, что итерирует генератор (например, цикл for), поймет, что он должен прекратить попытки получить значения из генератора.

Добавлен бит return value для поддержки некоторых рабочих процессов, используя совместные подпрограммы IIRC. Это довольно продвинутая функция, но находит много полезности в различных асинхронных контекстах.

+0

Итак, здесь выражение 'return' подразумевает разрыв с итерацией при достижении требуемого значения? – phawk

+0

@phawk - Да. Довольно много. – mgilson

Смежные вопросы