2016-09-21 127 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)