列表索引超出范围,python生成器误解



鉴于此:

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:,value2,   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

?

最新更新