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インデックスが範囲外になります。

どのように範囲外にあるのか、なぜ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]

  • 1回目の反復:、、  value3番目の要素、2または    self.dataSource[2]5
  • 2回目の反復:value3、     self.dataSource[3]4番目の要素、または6
  • 3回目の反復:、、  value6番目の要素、5または    self.dataSource[5]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]

明らかに、最初の方法が推奨されます。2番目の方法は、必要な場合にインデックスを取得する方法を示しています。

yield from self.dataSourcePython 3.3以降では、を使用してと同じ動作を取得できることに注意してくださいfor value in self.dataSource: yield value

于 2013-03-15T17:23:44.987 に答える