2016-08-05 2 views
2

Это почти наверняка результат моего незнания того, как работают генераторы, но я полностью потерян.Почему эта функция генератора питона работает правильно только один раз?

Если я интерактивно создавать следующий генератор:

def neighborhood(iterable): 
    iterator = iter(iterable) 
    prev = None 
    item = next(iterator) 
    for post in iterator: 
     yield (prev,item,post) 
     prev = item 
     item = post 
    yield (prev,item,None) 

, а затем проверить это нравится:

for prev,item,next in neighborhood([1,2,3,4,5]): 
print(prev, item, next) 

Он производит:

None 1 2 
1 2 3 
2 3 4 
3 4 5 
4 5 None 

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

объект «NoneType» не вызываемую»

ошибка.

ответ

7

Когда вы сделали

for prev,item,next in ... 
#    ^^^^ 

вы затеняли встроенную функцию next. В следующий раз, когда вы попытаетесь использовать генератор, он терпит неудачу, потому что он получает ваш next variab le вместо функции, в которой она была необходима.

+0

Dang it. Да. Настолько глуп. – WildGunman

3

Это потому, что вы используете переменную с именем next в тестовом коде. Используйте имя, которое не скрывает встроенную функцию next.

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