在 Python class 上使用带有 `__next__` 的条件
Using a condition with `__next__` on a Python class
是否可以使用 __next__
方法在 class 迭代器中实现条件?在像下面这样的情况下,如果条件不满足迭代器 returns None
,但我想省略这些并且只接收实际值。例如:
class Foo2:
def __init__(self, _min=1, _max=5):
self._max = _max
self._min = _min
self.it = -1
def __iter__(self):
return self
def __next__(self):
self.it += 1
if self.it == self._max:
raise StopIteration
if self.it > self._min:
return self.it
fu = Foo2(_min=2, _max=5)
for x in fu:
# if x: -> can this be controlled by the __next__ method in the class?
print(x)
# prints
None
None
None
3
4
我只想打印实际值 3
和 4
,而不是在循环中测试 None
,让 class 只发出那些。可能吗?
我不知道这是否是最正确的方法,因为我可能忽略了 problems/drawbacks(如果有人能向我指出这些,我将不胜感激),但对于这个特殊的在这种情况下,如果兴趣只是忽略基于某些条件的值,则递归调用 next
似乎可以解决问题:
def __next__(self):
self.it += 1
if self.it == self._max:
raise StopIteration
elif self.it > self._min:
return self.it
else:
return self.__next__()
在 for
循环中工作并通过直接调用 next
:
fu = Foo2(_min=2, _max=5)
for x in fu:
print(x)
# prints
3
4
fu = Foo2(_min=2, _max=5)
print(next(fu)) # 3
print(next(fu)) # 4
print(next(fu)) # raise StopIteration
是否可以使用 __next__
方法在 class 迭代器中实现条件?在像下面这样的情况下,如果条件不满足迭代器 returns None
,但我想省略这些并且只接收实际值。例如:
class Foo2:
def __init__(self, _min=1, _max=5):
self._max = _max
self._min = _min
self.it = -1
def __iter__(self):
return self
def __next__(self):
self.it += 1
if self.it == self._max:
raise StopIteration
if self.it > self._min:
return self.it
fu = Foo2(_min=2, _max=5)
for x in fu:
# if x: -> can this be controlled by the __next__ method in the class?
print(x)
# prints
None
None
None
3
4
我只想打印实际值 3
和 4
,而不是在循环中测试 None
,让 class 只发出那些。可能吗?
我不知道这是否是最正确的方法,因为我可能忽略了 problems/drawbacks(如果有人能向我指出这些,我将不胜感激),但对于这个特殊的在这种情况下,如果兴趣只是忽略基于某些条件的值,则递归调用 next
似乎可以解决问题:
def __next__(self):
self.it += 1
if self.it == self._max:
raise StopIteration
elif self.it > self._min:
return self.it
else:
return self.__next__()
在 for
循环中工作并通过直接调用 next
:
fu = Foo2(_min=2, _max=5)
for x in fu:
print(x)
# prints
3
4
fu = Foo2(_min=2, _max=5)
print(next(fu)) # 3
print(next(fu)) # 4
print(next(fu)) # raise StopIteration