выход из python3

Кто-нибудь из вас мог бы объяснить мне, из чего получается и для чего он, а также привести краткий пример кода?

Большое спасибо.

1
задан 02.12.2019, 19:27
1 ответ

IntroducciГіn: 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.

5
ответ дан 02.12.2019, 20:34

Теги

Похожие вопросы