Почему этот код Python 3.3 не работает с доходностью?

def main(i):
    while i > 0:
        if i == 5: yield i
        i -= 1
    print("ran")

main(10)

Он не печатает «run», удаление «yield i» исправляет это, но как мне правильно отформатировать это? Пример фильма lynda.com для python3 идентичен, есть ли синтаксическая разница между 3.3 и 3.1?


person user2817436    schedule 30.09.2013    source источник


Ответы (1)


yield — это волшебное ключевое слово, которое превращает функцию в генератор. Это означает, что он фактически приостановлен на строке yield i, и вы сможете возобновить выполнение в строке main, когда вы используете это значение.

Попробуйте заменить последнюю строку на

it=main(10)
next(it) # = 5
next(it) # prints "ran", then raises StopIteration
person Steve Howard    schedule 30.09.2013
comment
Теперь я понял, спасибо, я действительно не понимал, что функцию нужно вызывать снаружи, чтобы она продолжала вращаться. Спасибо :) - person user2817436; 02.10.2013
comment
Пожалуйста. Как я уже сказал, это генератор, способ генерировать списки без их создания. Общее название для такого типа функций, где выполнение переходит туда и обратно до тех пор, пока не будет выполнена функция уступки, — это сопрограмма. - person Steve Howard; 02.10.2013