鉴于此:
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:list index out of range
我不明白为什么它超出了范围,或者为什么只有5到7个
谢谢
让我们仔细看看下面循环的每次迭代是什么样子的:
for value in self.dataSource:
yield self.dataSource[value]
假设self.dataSource
为列表[2, 3, 5, 6, 6, 7]
:
- 迭代1:,
value
为2
,self.dataSource[2]
将是第三个元素,或者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
相同的行为。
下一个元素是6
, self.dataSource[6]
是越界的(最后一个元素是self.dataSource[5]
)
你的意思是:
def printData(self):
for value in self.dataSource:
yield value
?