鉴于此:
class DataFromBls:
"""this is a spitout of data in BLS dump"""
def __init__(self, dataSource, yearOfData, inflationAdjusted):
self.dataSource = dataSource
self.yearOfData = yearOfData
self.inflationAdjusted = inflationAdjusted
def printData(self):
for value in self.dataSource:
yield self.dataSource[value]
然后假设x = DataFromBls([2, 3, 5, 6, 6, 7], 2010, "yes")
然后假设以下内容被提供给解释器,
for value in x.printData():
print value
然后我让解释器吐出5,6,7然后给我一个Traceback IndexError:列表索引超出范围
我不明白它是如何超出范围或为什么只有5到7出
谢谢
答案 0 :(得分:1)
下一个元素是6
,self.dataSource[6]
超出范围(最后一个元素是self.dataSource[5]
)。
你的意思是写:
def printData(self):
for value in self.dataSource:
yield value
答案 1 :(得分:1)
让我们仔细看看以下循环的每次迭代:
for value in self.dataSource:
yield self.dataSource[value]
假设self.dataSource
是列表[2, 3, 5, 6, 6, 7]
:
value
将是2
,self.dataSource[2]
将是第3个元素,或5
value
将是3
,self.dataSource[3]
将是第四个元素,或6
value
为5
,self.dataSource[5]
为第6个元素,或7
value
为6
,self.dataSource[6]
会导致IndexError
您的问题是您直接在列表中的元素上循环,而不是索引。您想要执行以下操作之一:
for value in self.dataSource:
yield value
或者...
for i in range(len(self.dataSource)):
yield self.dataSource[i]
显然第一种方法是首选方法,第二种方法只是说明了如何获得所需的指数。
请注意,在Python 3.3及更高版本中,您只需使用yield from self.dataSource
即可获得与for value in self.dataSource: yield value
相同的行为。