2016-09-21 2 views
0

У меня есть функция, которая должна печатать квадраты в заданном интервале:Почему моя программа возвращает None in for loop?

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

если число isnt в списке, то не нужно возвращаться, я прав? –

+0

Итератор должен вернуть следующее значение. Если этого не произойдет, вы получите то, что видите сейчас. Поэтому либо измените свой код на a) сгенерируйте список, который содержит только квадраты, либо b) пропустите значения, которые не являются квадратами. –

ответ

0

Причина, по которой Ни не возвращаются каждый раз, когда переменная результат не является квадрат, является то, что следующая функция() возвращает None по умолчанию, если не указан возврат.

Если вы должны использовать итератор для этого проекта, вам необходимо структурировать свой код, чтобы каждый возврат возвращался.

Также обратите внимание, что каждый раз, когда вызывается 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) 
Смежные вопросы