Что происходит, когда вы вызываете функцию, содержащую yield? - PullRequest
1 голос
/ 07 мая 2020

Я прочитал здесь следующий пример:

>>> def double_inputs():
...     while True:      # Line 1
...         x = yield    # Line 2
...         yield x * 2  # Line 3
...
>>> gen = double_inputs()
>>> next(gen)       # Run up to the first yield
>>> gen.send(10)    # goes into 'x' variable

Если я правильно понимаю вышеизложенное, похоже, это означает, что Python на самом деле ждет, пока next(gen) не «запустится» to "to Line 2 в теле функции. Другими словами, интерпретатор не начнет выполнение тела функции, пока мы не вызовем next.

  1. Это действительно правильно?
  2. Насколько мне известно, Python не выполняет компиляцию AOT и не «смотрит вперед», за исключением синтаксического анализа кода и проверки его правильности Python. Это верно?
  3. Если вышесказанное верно, как Python узнает, когда я вызываю double_inputs(), что ему нужно дождаться, пока я позвоню next(gen), прежде чем он даже войдет в l oop while True?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Верно. Вызов double_inputs никогда не выполняет никакого кода; он просто возвращает объект generator. Присутствие выражения yield в теле, обнаруженное, когда оператор def анализируется , изменяет семантику оператора def для создания объекта generator, а не function объект.

2 голосов
/ 07 мая 2020

Функция содержит yield - генератор.

Когда вы вызываете gen = double_inputs(), вы получаете в результате экземпляр генератора. Вам нужно использовать этот генератор, позвонив next.

Итак, для вашего первого вопроса это правда. Он запускает строки 1, 2, 3, когда вы впервые звоните next.

Что касается вашего второго вопроса, я не совсем понимаю вашу точку зрения. Когда вы определяете функцию, Python знает, что вы определяете, ему не нужно смотреть вперед при запуске.

Для вашего третьего вопроса ключом является yield ключевое слово.

...