我想把电话里所有的单数都打印出来:
o = Odds(10)
,输出应该是1, 3, 5, 7, 9
,但我在注释区域做了一些错误,它应该相对简单,但我看不到它。在
class Odds:
def __init__(self, arg):
self.num = arg
def __iter__(self):
return OddsIterator(self.num)
class OddsIterator:
def __init__(self, arg):
self.high = arg
self.low = 1
def __next__(self):
if self.low <= self.high:
if (self.low % 2) == 0: #somethings wrong around here
self.low += 1
else:
self.low += 1
return self.low - 1
raise StopIteration
使用一个简单的生成器来实现这个目的怎么样,除非你需要其他目的的赔率类-
如果您确实出于特定原因想使用类
^{pr2}$Odds
您的具体问题是,第一个偶数将落到
StopIteration
行,使您的序列相当短:{ 1 }
。在在我看来,生成所有奇数应该要容易得多。从
-1
开始,然后在每次呼叫时:可通过以下方式实现:
话虽如此,我不确定我是否会像你那样执行它。当您可以将两个独立的类合并为一个类时,似乎没有必要使用它们:
^{pr2}$此外,还可以通过提供
start
和step
值使其更通用:尽管它很危险地侵犯了
range()
的功能,所以我还是用它。除非你的目的是自我教育,在这种情况下要玩得开心。在您的
if
分支没有返回任何,因此您总是在此时到达raise StopIteration
。假设low
是2,high
是10:您需要在
^{pr2}$__next__
中创建更大的步骤,因为该方法总是返回一些东西。当一个数字是偶数时,您不必返回,而是需要返回序列中的下一个数字,因此每次递增self.low
2,第一次请确保从奇数开始:我在这里对
StopIteration
条件进行了反向测试,以便更清楚地表明,当仍有值可从iterable返回时,函数总是返回某些内容。在只是为了重新迭代,
__next__
总是返回一些东西,你不能期望它不返回某些东西,所以它至少会返回None
。迭代器不计数。Python不去让我们先询问1的结果,然后是2的结果,然后是3的结果。Python只询问奇数序列中的下一个值是什么。1之后是3,但是Python不知道,您的代码需要生成它。在相关问题 更多 >
编程相关推荐