2017-08-28 9 views
5

を返していない私のコードです:Pythonの:イテレータはここでどれ

class Prizes(object): 
    def __init__(self, purchases, n, d): 
     self.p = purchases 
     self.n = n 
     self.d = d 
     self.x = 1 

    def __iter__(self): 
     return self 

    def __next__(self): 
     print(self.x) 

     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 

     self.x = self.x + 1 

def superPrize(purchases, n, d): 
    return list(Prizes(purchases, n, d)) 

使い方の例:

superPrize([12, 43, 13, 465, 1, 13], 2, 3) 

出力は次のようになります。

[4] 

しかし、実際の出力は次のようになります。

[None, None, None, 4, None, None]. 

どうしてですか?

+3

あなたの問題は__next__' 'の実装です。 Pythonが '__next__'を呼び出すとき、常に戻り値を期待します。しかし、あなたのケースでは、必ずしもそれぞれの呼び出しで戻り値があるとは限りません。したがって、Pythonは関数のデフォルト戻り値 'None'を使います。 –

+1

この「Prizes」イテレータを作ることのポイントは何ですか? –

+2

また、最初の質問をここで聞いていい仕事をしました。あなたはすべてを正しくしました。あなたは[mcve]を提供し、あなたの期待される出力を掲示し、あなたの実際の投稿を掲載しました。このため、あなたは(うまくいけば)有用な答えを得ました。おめでとう。 –

答えて

2

お客様の問題は__next__です。 Pythonが__next__を呼び出した場合、は常に戻り値を期待します。しかし、あなたの場合、それぞれの呼び出しで常に戻り値があるとは限りません。したがって、Pythonは関数のデフォルト戻り値を使用します - None

実際に戻り値が得られるまで、プログラム制御を__next__の内部に保つために何らかの方法が必要です。これはwhile -loopを使用して行うことができます。

def __next__(self): 
    while True: 
     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 
     self.x = self.x + 1 
+0

なぜこれがダウン投票されたのか聞いてもよろしいですか?私は本当に感謝しています。ありがとうございました。 –

+1

私はコードワイズなので推測します。'少し古い回答の正確な複製 – Eric

+1

コード部分が他の答えと同じであるため、私はdownvotedしませんでした。これは良い答えです。何が起こっているのか、理由とその理由を実際に説明しているからです。 – MSeifert

1

使用すると、1つを見つけるまで、あなたのメソッドが値を返さないようにwhileでそれをラップ:イテレータで作業

def __next__(self): 
    while True: 
     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 

     self.x = self.x + 1 

物事はそれが値を返すことを期待__next__を呼び出しますが、この方法は、唯一の値を返しますそれ以外の場合はメソッドの最後に到達し、Noneを返します。

関連する問題