2017-09-25 3 views
0

Ich erstelle eine einfach verknüpfte Liste, die ungerade Zahlen in einem bestimmten Bereich zurückgibt, anstatt 1, 3, 5, usw. zurückzugeben es gibt 1, keine, 3, keine, 5 usw. Ich möchte es so machen, dass es aufhört, keine und nur ungeraden Zahlen zurück zu geben.verknüpfte Liste, die keine zurückgibt, wenn angegeben nicht auch

class Odds: 
    def __init__(self,end): 
     self.__start = 1 
     self.__end = end 

    def __iter__(self): 
     return OddsIterator(self.__end) 

class OddsIterator: 
    def __init__(self,finish): 
     self.__current = 0 
     self.__step = 1 
     self.__end = finish 

    def __next__(self): 
     x = None 
     if self.__current > self.__end: 
      raise StopIteration 
     else: 
      self.__current += self.__step 
      if (self.__current - self.__step + 1) % 2 != 0: 
       x = self.__current - self.__step + 1 
     if x != None: 
      return x 
+0

Stop-Doppeldecker-Name-Mangeln –

Antwort

1

Der Grund None zurückgegeben wird, ist es möglich, das Ende __next__ ohne eine return-Anweisung zu erreichen, in diesem Fall gibt jede Python-Funktion None zurück. Die Lösung hier ist, self.__step = 2 und self.__current = 1 zu setzen, wenn Sie initialisieren. Sie können auch die if x != None: entfernen, da es nichts tut. Es gibt einige andere kleine Änderungen, die ich unten gemacht habe, um mit dieser neuen Definition von self.__current zu passen. Momentan enthält der Code unten nicht den endgültigen Wert, wenn Sie möchten, dass er dann self.__current >= self.__end zu self.__current > self.__end ändert.

class Odds: 
    def __init__(self,end): 
     self.__start = 1 
     self.__end = end 

    def __iter__(self): 
     return OddsIterator(self.__end) 

class OddsIterator: 
    def __init__(self,finish): 
     self.__current = 1 
     self.__step = 2 
     self.__end = finish 

    def __next__(self): 
     x = None 
     if self.__current >= self.__end: 
      raise StopIteration 
     else: 
      return_value = self.__current 
      self.__current += self.__step 
      return return_value 

odds = Odds(21) 
print(list(odds)) 
+0

Ändern der Schritt zu 2 Änderungen bedeutet, dass wenn eine ungerade Zahl für das Ende verwendet wird, dann wird es eine mehr als es sollte dh 'Odds (22) 'wird 23 am Ende haben – BadUserName

+0

Guter Fang! Ich habe das jetzt behoben und die Logik hoffentlich ein wenig klarer gemacht. –

+0

Vielen Dank, ich habe eine 'if' Anweisung in der' __init__' Funktion zu minus 1 vom Endwert hinzugefügt, wenn eine ungerade Zahl eingegeben wird, Prost! – BadUserName

0

Sie sind da mindestens eine der zen von Python Regeln: Einfach ist besser als Komplex (https://www.python.org/dev/peps/pep-0020/#id3)

Und tatsächlich kann der Code durch gelöst werden:

>>> odds = range(1, 51, 2) # Here you specify the start, stop and step values 
>>> iterator = iter(odds) # Here you make it work with next keyword 
>>> next(iterator) 
1 
>>> next(iterator) 
3 
>>> [x for x in iterator] 
[5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49] 
+1

mit Es ist möglich (wahrscheinlich?) Dies für eine Zuordnung und die Fragesteller muss eine verknüpfte Liste verwenden. –

+0

@ JeremyMcGibbon: Genau das, was ich dachte! – Unni

+0

Ich benutze eine verkettete Liste in dieser, so dass dies nicht möglich sein wird – BadUserName

Verwandte Themen