yield
yield
используется в Пайтоне, чтобы строить генераторы.
Генератор - тип funciГіn, который может, из-за asГ - говорить, возвращать стоимость, не заканчиваясь совсем Ваш ejecuciГіn, будучи возможным перезагружать ее despuГ©s. yield
- способ делать один из этих "специальных возвратов". Помимо этого tambiГ©n смоги содержать return
, в случае которых retornarГ - в окончательно.
Любой funciГіn python, что содержал yield
, превращает automГЎticamente в одну funciГіn порождающая , и когда ты выполняешь ее, не начинается действительно Ваш ejecuciГіn, но python он создает порождающий объект и - на этом объекте, на котором возможно начинать ее ejecuciГіn "частично", что avanzarГЎ до того, чтобы находить один yield
внутри нее funciГіn.
Пример:
def ejemplo_tonto():
print("Acabo de comenzar")
yield 1
print("Continúo")
yield 2
return
, Если ты пробуешь выполнять эту funciГіn обычно, asГ-:
>>> r = ejemplo_tonto()
verГЎs, что не появляется ningГєn сообщение, что показывает, что она funciГіn действительно не comenzГі aГєn, чтобы работать. r
- генератор и чтобы начинать выполнять действительно эту funciГіn, нужно делать next()
на r
:
>>> r
<generator object ejemplo_tonto at 0x7f6ec11563b8>
>>> resultado = next(r)
Acabo de comenzar
>>> resultado
1
, Поскольку ты видишь, сделав next(r)
, начинает действительно ее ejecuciГіn генератора, и Г©sta он задерживается, когда он прибывает к yield 1
. 1
- стоимость, возвращенная этим yield
и serГЎ результат, который возвращает нам next()
, который в этом примере это guardГ© в переменной resultado
. Но генератор "помнит", что из-за dГіnde он шел. Если мы делаем снова yield
yield
на Г©l, continuarГЎ в ней lГ-nea следующий, что это habГ - в оставленный медлительный:
>>> resultado = next(r)
Continúo
>>> resultado
2
и снова он остался прерванным во втором yield
. Если пробуем другой next()
mГЎs, reanudarГЎ Ваш ejecuciГіn и alcanzarГЎ return
, и в этом моменте закончись окончательно. Восток return
конечно podrГ, - чтобы это опустить так как так или иначе, есть один return
implГ - я назначаю встречу в конце всего funciГіn.
, Когда генератор иссякает (он прибывает к Вашим return
), Пайтон производит ее excepciГіn StopIteration
:
>>> next(r)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
В действительности, генератор предоставляет интерфейс iterable , когда несколько раз позволяют делать next()
и производить один StopIteration
, когда уже нет mГЎs элементов, чтобы возвращаться. Это позволяет мне использовать это в цикле for
, например asГ-:
>>> for dato in ejemplo_tonto():
... print(dato)
...
Acabo de comenzar
1
Continúo
2
>>>
[MГЎs детали на cГіmo оно функционирует for
здесь ]
yield from
Синтаксис yield from
позволяет сцеплять генераторов. Представь, что у меня есть сейчас другой этот генератор:
def ejemplo_tonto2():
yield 0
for dato in ejemplo_tonto():
yield dato
yield -1
ВїQuГ© происходи, если ты это называешь с ejemplo_tonto2()
?
На данный момент не происходит ничто, но создается генератор . ВїY, если seguidamente ты делаешь next()
на созданном генераторе? ComenzarГЎ ejecuciГіn генератора что ejecutarГЎ до первого yield
, и мы получим 0. Но следующий next()
harГЎ, что выполнил внутренний генератор, чтобы получать первого dato
, что valdrГ - в 1, и retornarГ - в эту стоимость. AsГ - seguirГ - в возвращая данные, которых ему дает внутренний генератор, до того, чтобы выходить из цикла for
. Делая next()
однажды mГЎs retornarГЎ-1 Гєltimo yield
. И другой next()
causarГЎ return
(implГ - я назначаю встречу этот раз) и terminarГЎ генератор.
ComprobГ©moslo:
>>> for ej in ejemplo_tonto2():
... print(ej)
...
0
Acabo de comenzar
1
Continúo
2
-1
Ну вот, для этого типа вещей существует yield from
. Предыдущий пример podrГ, - чтобы это написать asГ-:
def ejemplo_tonto2():
yield 0
yield from ejemplo_tonto()
yield -1
, Когда внутри генератора используется yield from
, генератор в cuestiГіn "прерывает" одновременно, что соединяет Ваш "вывод" из-за asГ - говорить, с "выводом" генератора, который ты помещаешь вслед за yield from
. Начиная с этого момента, всех next()
были сделаны на "внешнем" генераторе они прибывают прямо к ученику закрытого учебного заведения, который irГЎ возвращая Вашу стоимость. Когда внутренний генератор иссякнет и вызовет StopIteration
, reanudarГЎ она ejeuciГіn внешнего генератора, который был медлительным.
Замечает : До того, как Пайтон 3.5 aГ±adiera синтаксис
async
/await
,yield
иyield from
были использованы подобно "приему", чтобы помогать programaciГіn asГ-ncrona и corutinas. Я не хочу распространиться в этом, потому что serГ - в очень длинный и сложный, но я упоминаю об этом, потому что возможно контекст, в котором tГє ты нашел этот синтаксис, был точно этим. С Пайтона 3.5 предпочитается синтаксисasync
/await
.