2017-01-15 3 views
-1
def fib(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
     yield b 
     a, b = b, a + b 
     n = n + 1  
    return 'done' 

print(next(fib(6))) 
print(next(fib(6))) 
print(next(fib(6))) 

результат: 1,1,1. Однако, если изменить содержание в print(), как показано ниже:О генераторе в Питоне

f = fib(6) 
print(next(f)) 
print(next(f)) 
print(next(f)) 

результат будет 1, 1, 2. Почему это происходит?

+0

Исправьте углубление. –

+0

Pls отправляет фактический отступ? – schwobaseggl

+0

Каждый раз вы создаете новые генераторы. Вы видите эту разницу, не так ли? –

ответ

4

Вызов print(next(fib(6))) всегда создает новый экземпляр генератора fib и выводит из него одно значение, затем выбрасываете его.

С другой стороны:

f = fib(6) 
print(next(f)) 
print(next(f)) 
print(next(f)) 

создает экземпляр f генератора fib и дает три значения из него.

Кроме того, использование max в качестве имени параметра недоказано, поскольку, по крайней мере, в локальной области, вы маскируете встроенную функцию с тем же именем.

Смежные вопросы