2016-09-21 5 views
0

私は一定の間隔で正方形を印刷する必要がある機能を持っている:なぜ私のプログラムはforループでNoneを返すのですか?

class Squares: 

    def __init__(self, min, max): 
     self.min = min 
     self.max = max 

    def __iter__(self): 
     return self 

    def __next__(self): 
     a_list = [] 
     for i in range((self.max)+1): 
      a_list += [i**2] 

     if self.min <= self.max: 
      if self.min in a_list: 
       result = self.min 
       self.min += 1 
       return result 
      else: 
       self.min += 1 

     else: 
      raise StopIteration 

import math 

for i in Squares(5, 50): 

    print(i) 

それは9、16、25、49を印刷する必要がありますが、出力された:

None 
None 
None 
None 
9 
None 
None 
None 
None 
None 
None 
16 
None 
None 
None 
None 
None 
None 
None 
None 
25 
None 
None 
None 
None 
None 
None 
None 
None 
None 
None 
36 
None 
None 
None 
None 
None 
None 
None 
None 
None 
None 
None 
None 
49 
None 

これはなぜですか?

+0

内部の 'else:'ブロックからは何も返されませんか? –

+0

番号がリストにない場合は、返却する必要はありません。 –

+0

イテレータは次の値を返す必要があります。それがなければ、あなたは現在あなたが見ているものを得る。したがって、コードをa)正方形だけを含むリストを生成するか、またはb)正方形でない値をスキップするように変更します。 –

答えて

0

なしは、変数結果は、完全な方形ではないたびに返されないことを理由は、ノーリターンが指定されていない場合は、次の()関数は、デフォルトでなしを返さないことです。

の場合は、このプロジェクトのイテレータを使用する必要があります。各パスに値が返されるようにコードを構造化する必要があります。

また、next()が呼び出されるたびに、a_listという名前のまったく新しい配列が生成されますが、これはかなり非効率的です。その配列を一度初期化するほうがずっと良いでしょう。

この例の違いを確認してください。

class Squares: 

def __init__(self, min, max): 
    self.min = min 
    self.max = max 

def __iter__(self): 
    self.a_list = [] 
    for i in range((self.max)+1): 
     self.a_list += [i**2] 
    self.iter_index = 0 
    return self 

def next(self): 
    self.iter_index += 1 
    if self.a_list[self.iter_index] > self.max: 
     raise StopIteration 
    else: 
     return self.a_list[self.iter_index] 

import math 
import pdb 

for i in Squares(5, 50): 
    print(i) 
関連する問題