yield和update list不起作用

时间:2015-03-30 21:43:45

标签: python yield

基本上我希望这段代码产生列表的元素0并更新列表,以便下次它将产生下一个元素。相反,我得到了这个错误:

"TypeError: 'NoneType' object has no attribute '__getitem__' "

import random

def deterministicNumber():
    return next(gener())

def gener():    
    listy = [10,12,14,16,18,20]
    while True:
        listy = listy[1:].append(listy[0])
        print listy
        yield listy[0]
    return 

4 个答案:

答案 0 :(得分:3)

listy = listy[1:].append(listy[0])

此行指定listy = None,因为list.append方法在适当的位置运行并返回None。然后,在循环的下一次迭代中,TypeError是由访问None[1:].append(None[0])

引起的

对于列表中的一次性迭代器,您只需使用:

gener = iter([10,12,14,16,18,20])

答案 1 :(得分:2)

看起来你想要一个在列表中反复循环的迭代器。

您最好使用itertools模块中的函数cycle执行此任务:

>>> import itertools
>>> gener = itertools.cycle([10,12,14,16,18,20])
>>> def deterministicNumber(it):
        return next(it)
>>> for _ in range(10):
        print(deterministicNumber(gener))
10
12
14
16
18
20
10
12
14
16

答案 2 :(得分:0)

无需更新列表。

def gener():    
    listy = [10,12,14,16,18,20]
    for item in listy:
        yield item

答案 3 :(得分:0)

听起来你想永远归还这些数字。

def listy(array):
    i = 0
    while 1:
        yield array[i % len(array)]
        i += 1


for l in listy(['a', 'b', 'c']):
  print l

如果你只想做一个循环:

def listy(array):
    i = 0
    while i < len(array):
        yield array[i]
        i += 1

for l in listy(['d', 'e', 'f']):
  print l