2015-03-30 56 views
0

基本上我希望這段代碼產生列表的元素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 

回答

0

無需更新列表。

def gener():  
    listy = [10,12,14,16,18,20] 
    for item in listy: 
     yield item 
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]) 
2

看起來你想要一個迭代器,在列表中反覆循環。

您更好地使用功能cycle從itertools模塊裏完成這個任務:

>>> 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 
+0

+1啊,是實際上是沒有看起來就像是背後'listy的真實意圖[1:]追加(listy [0 ])'。良好的心理調試! – wim 2015-03-30 23:27:16

+0

太棒了!十分感謝大家! :d – Paca 2015-03-31 21:05:39

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