在python中使用迭代器?
我刚刚学习了Python中的迭代器,但是我很难实现它们 我正在尝试编写一个类,以使此循环工作:在python中使用迭代器?,python,Python,我刚刚学习了Python中的迭代器,但是我很难实现它们 我正在尝试编写一个类,以使此循环工作: odds = OddNumbers(13) for i in odds: print(i) 我想写一个iter()函数和一个next()函数来实现这一点 到目前为止,我已经: class OddNumbers: def __init__(self, number): self.number = number def __iter__(self
odds = OddNumbers(13)
for i in odds:
print(i)
我想写一个iter()函数和一个next()函数来实现这一点
到目前为止,我已经:
class OddNumbers:
def __init__(self, number):
self.number = number
def __iter__(self):
return self
def __next__(self):
current = self.number
if self.number%2 == 0:
return current
else:
raise StopIteration
但目前这一切都没有回报。我希望输出是
1
3
5
7
9
11
13
帮助?您的对象需要跟踪其状态,并在调用
\uuuu next\uuuu
时对其进行更新
class OddNumbers(object):
def __init__(self, number):
self.current = ...
self.number = number
def __iter__(self):
return self
def __next__(self):
# Update self.current
# If the limit has been reached, raise StopIteration
# Otherwise, return something
您需要另一个变量来跟踪当前编号:
def __init__(self, number):
self.number = number
self.current = 1
然后,您需要将其与结束数字进行比较,并可能增加它:
def __next__(self):
if self.current > self.number:
raise StopIteration
current = self.current
self.current += 2
return current
可能有一种更干净的方法可以做到这一点,但这里有一个简单的方法:
class OddNumbers:
def __init__(self, number):
self.number = number
def __iter__(self):
self.current = self.number
return self
def __next__(self):
if self.current > 0:
if self.current % 2 == 0:
self.current -= 1
self.current -= 1
return self.current + 1
raise StopIteration
这将为您提供一个类似迭代器的对象,它提供偶数或奇数。但是,它不能满足for循环语义,因为它不是真正的迭代器
class NumberIterator(object):
"""Returns simple even/odd number iterators."""
def __init__(self, current):
self.current = current
def next(self):
self.current += 2
return self.current
@classmethod
def getOddIterator(cls):
return cls(-1) # start at 1
@classmethod
def getEvenIterator(cls):
return cls(0) # start at 2
odd_numbers = NumberIterator.getOddIterator()
even_numbers = NumberIterator.getEvenIterator()
odd_numbers.next() # Returns 1
odd_numbers.next() # Returns 3
你想干什么?您只有一个元素。为什么需要将该类设置为iterable?示例代码应该打印哪些数字?如果以奇数开头,则
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果以偶数开头,它将只返回该数字。你的意思是让\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!不过我现在已经编辑了它。在您的情况下,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
将在第一个循环中引发异常,因此迭!这解决了我的问题!在某个阶段,我确实有另一个变量来跟踪迭代次数,除了我没有用init方法初始化它,我只是在下一个阶段引入了它。再次感谢你!你不应该把全部答案告诉OP,这并不能教会他们任何东西。@augurar,OP表现出了努力,并发布了真实的代码,所以答案是正确的。评论显示他从中吸取了教训。@BrentWashburne你刚刚告诉了他答案。所以他知道了正确的答案。干得好,我想。