0

鉴于这种:

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 出

谢谢

4

2 回答 2

1

下一个元素是6,并且self.dataSource[6]超出范围(最后一个元素是self.dataSource[5])。

你的意思是写:

def printData(self):
    for value in self.dataSource:
        yield value

?

于 2013-03-15T17:20:45.943 回答
1

让我们仔细看看以下循环的每次迭代:

for value in self.dataSource:
    yield self.dataSource[value]

假设这self.dataSource是列表[2, 3, 5, 6, 6, 7]

  • 第一次迭代:  value将是2,    self.dataSource[2]将是第三个元素,或5
  • 第二次迭代:value将是3,    self.dataSource[3]将是第四个元素,或6
  • 第 3 次迭代:  value将是5,    self.dataSource[5]将是第 6 个元素,或7
  • 第 4 次迭代:  valuewill be 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.

于 2013-03-15T17:23:44.987 回答