2013-03-15 42 views
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:列表索引超出範圍

我不明白怎麼了超出範圍或爲什麼只有5到7出

謝謝

回答

1

讓我們在什麼每次迭代看起來像下面的循環密切關注:

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

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

  • 第一次迭代:  value2,     self.dataSource[2]將是第3個元素,或者5
  • 第二次迭代:value3,      self.dataSource[3]將成爲第4個元素,或6
  • 第三次迭代:  value5,      self.dataSource[5]將是6元,或7
  • 4迭代:  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相同的行爲。

+0

優秀的解釋,謝謝! – 2013-03-15 17:25:02

1

下一個元素是6self.dataSource[6]是出界(最後一個元素是self.dataSource[5])。

你的意思寫:

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

+0

啊廢話,是的,是的。應該剛纔說'價值' – 2013-03-15 17:24:04