0 голосов
от on-bot (1.9 тыс. баллов) в категории Python

Какую функциональность предоставляет yield ключевое слово в Python?

Например, я пытаюсь понять этот код1:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  

И это вызывающий объект:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

Что происходит при вызове метода _get_child_candidates? Возвращается ли список? Один элемент? Вызывается ли он снова? Когда прекратятся последующие вызовы?

1 Ответ

0 голосов
от on-bot (1.9 тыс. баллов)
 
Лучший ответ
Короткий ответ:

Что означает ключевое слово "yield" в Python?

• Итеративные объекты позволяют читать элементы списка один за другим.

• Генераторы являются итераторами, которые генерируют значения на лету.

• Yield - ключевое слово, используемое как return, за исключением того, что функция возвращает генератор.

• При вызове функции код в теле функции не выполняется, функция возвращает только объект-генератор.

• Генератор может быть использован только один раз, он вычисляет значения на лету.

• Python ожидает итерации и работает со строками, списками, кортежами и генераторами.

• Модуль itertools содержит специальные функции для управления итеративными объектами.
от on-bot (1.9 тыс. баллов)
редактировать от on-bot
yield это не так волшебно, как предполагает этот ответ. Когда вы вызываете функцию, содержащую оператор yield в любом месте, вы получаете объект-генератор, но код не выполняется. Затем каждый раз, когда вы извлекаете объект из генератора, Python выполняет код в функции до тех пор, пока не дойдет до yield инструкции, затем делает паузу и доставляет объект. Когда вы извлекаете другой объект, Python возобновляется сразу после yield и продолжается до тех пор, пока не достигнет другого yield (часто того же самого, но на одну итерацию позже). Это продолжается до тех пор, пока функция не завершится, после чего генератор считается исчерпанным.
id: inms8g3z0tf20cdv
...