【问题标题】:Using a condition with `__next__` on a Python class在 Python 类上使用带有 `__next__` 的条件
【发布时间】:2020-10-17 13:10:13
【问题描述】:

是否可以使用__next__ 方法在类迭代器中实现条件?在像下面这样的情况下,如果不满足条件,迭代器返回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

我只想打印34 的实际值,而不是在循环中测试None,让类只发出这些值会更好。有可能吗?

【问题讨论】:

  • 是的,您只需要让__next__ 只返回您感兴趣的值,而不让它返回任何其他值。 (如果if 条件都不为真,则函数将返回None,以防您想知道。)
  • @mkrieger1 if 条件已经存在但仍返回 None...
  • 是的,因为如果控制流到达任何函数的末尾而没有遇到return 语句,该函数将返回None。您需要确保在所有可能的情况下都有 return 语句。
  • @mkrieger1 我知道,但 AFAIU 将始终默认返回 None,并且想知道是否有办法避免这种情况。
  • 问题是:当self.it小于self._min__next__应该返回什么。您需要做出决定,然后编写一个 return 语句,返回您认为在这种情况下合适的值。

标签: python-3.x class next


【解决方案1】:

我不知道这是否是最正确的方法,因为可能存在我可能忽略的问题/缺点(如果有人可以向我指出这些问题,我将不胜感激),但对于这种特殊情况,如果兴趣是仅基于某些条件忽略值,递归调用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

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2016-03-08
    • 1970-01-01
    • 2017-01-06
    • 2020-10-30
    • 2020-04-08
    • 2012-09-15
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多