2017-09-25 15 views
0

我创建一个单一的链接列表,返回给定范围内的奇数,而不是返回1,3,5等,它返回1,None,3,None,5等我想使它停止返回None和只有奇数。链接列表返回时没有指定不是

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

采用双层名称压延 –

回答

1

原因None正在返回的是,可以在没有return语句的情况下到达__next__的末尾,在这种情况下,任何Python函数都会返回None。这里的解决方案是在初始化时设置self.__step = 2self.__current = 1。您也可以删除if x != None:,因为它什么都不做。为了适应self.__current这个新定义,我还做了一些其他小改动。目前下面的代码将不包含最终值,如果您希望它随后将self.__current >= self.__end更改为self.__current > self.__end

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

改变步骤到2的变化意味着如果一个奇数用于结束,那么它将返回比它应该多一个,即“赔率(22 )'最后会有23个 – BadUserName

+0

好抓!我现在已经解决了这个问题,希望能够使逻辑更加清晰。 –

+0

谢谢,如果输入了奇数,我在'__init__'函数的'if'语句中添加了从结束值减1的值,欢呼! – BadUserName

0

你违反了规则蟒禅宗之一:简单比复杂(https://www.python.org/dev/peps/pep-0020/#id3

而实际上你的代码可以通过更好地解决:

>>> 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

有可能停止(可能?)这是一个任务,并提问者需要使用一个链表。 –

+0

@JeremyMcGibbon:正是我的想法! – Unni

+0

我在这里使用一个链表,所以这是不可能的 – BadUserName