获取List索引超出范围,python生成器误解

时间:2013-03-15 17:15:08

标签: python python-2.7

鉴于此:

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出

谢谢

2 个答案:

答案 0 :(得分:1)

下一个元素是6self.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将是2self.dataSource[2]将是第3个元素,或5
  • 第二次迭代:value将是3self.dataSource[3]将是第四个元素,或6
  • 第3次迭代:value5self.dataSource[5]为第6个元素,或7
  • 第4次迭代:value6self.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相同的行为。