链接列表返回时没有指定不是
我创建一个单一的链接列表,返回给定范围内的奇数,而不是返回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
原因None
正在返回的是,可以在没有return
语句的情况下到达__next__
的末尾,在这种情况下,任何Python函数都会返回None
。这里的解决方案是在初始化时设置self.__step = 2
和self.__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))
改变步骤到2的变化意味着如果一个奇数用于结束,那么它将返回比它应该多一个,即“赔率(22 )'最后会有23个 – BadUserName
好抓!我现在已经解决了这个问题,希望能够使逻辑更加清晰。 –
谢谢,如果输入了奇数,我在'__init__'函数的'if'语句中添加了从结束值减1的值,欢呼! – BadUserName
你违反了规则蟒禅宗之一:简单比复杂(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]
有可能停止(可能?)这是一个任务,并提问者需要使用一个链表。 –
@JeremyMcGibbon:正是我的想法! – Unni
我在这里使用一个链表,所以这是不可能的 – BadUserName
采用双层名称压延 –