2016-09-21 3 views
0

J'ai une fonction qui doit imprimer les carrés dans l'intervalle donné:Pourquoi mon programme renvoie-t-il 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) 

Il faut imprimer 9, 16, 25, 49, mais la sortie était:

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 

Pourquoi?

+0

Vous ne renvoyez rien du bloc interne 'else:'? –

+0

si le numéro n'est pas dans la liste, alors ne pas besoin de revenir, ai-je raison? –

+0

L'itérateur doit renvoyer une valeur suivante. Si ce n'est pas le cas, vous obtenez ce que vous voyez actuellement. Donc soit changer votre code pour a) générer une liste qui ne contient que des carrés ou b) sauter des valeurs qui ne sont pas des carrés. –

Répondre

0

La raison pour laquelle Aucun est retourné à chaque fois que le résultat variable est pas un carré parfait, est que la fonction suivante() retourne Aucun par défaut si aucun retour est spécifié.

Si vous devez utiliser un itérateur pour ce projet, vous devez structurer votre code afin qu'une valeur est retournée chaque passe. Notez également que chaque fois que next() est appelée, un tableau entièrement nouveau appelé a_list est généré, ce qui est plutôt inefficace. Il serait préférable d'initialiser ce tableau une fois.

Vérifiez les différences dans cet exemple.

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)