【问题标题】:To which iterator are my iterators binding to?我的迭代器绑定到哪个迭代器?
【发布时间】:2018-02-23 00:57:28
【问题描述】:

这是我针对这个问题的 Python 代码。

class iterator():
    def __init__(self, data):
        self.__data__ = data
        self.__base__ = -1
        self.__sentinel__ = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        self.__base__ = self.__base__ + 1
        if self.__base__ == self.__sentinel__:
            raise StopIteration
        else:
            return self.__data__[self.__base__]

class iterable():
    def __init__(self, data):
        self.__iterator__ = iterator(data)

    def __iter__(self):
        return self.__iterator__

根据上面的定义,我写了下面的代码来理解迭代器绑定的概念

love = 'Welcome to my house!'
house = iterable(love)
ice = iter(house)
joy = iter(house)

if ice is joy:
    print("ice and joy are the same iterators")

king = iter(love)
mouse = iter(love)

if king is not mouse:
    print("king and mouse are not the same iterators")

当我运行上面的代码时,我会得到上面的消息,这表明从iter函数调用数据得到的迭代器不一样,但是从iter函数调用我的iterable得到的迭代器是一样的。谁能向我解释发生了什么事?我将不胜感激这方面的任何帮助。谢谢。

【问题讨论】:

  • 只是一个风格提示:根据 PEP8,您应该使用“dunder”名称:“__double_leading_and_trailing_underscore__:”位于用户控制的命名空间中的“魔术”对象或属性。例如 __init__、@ 987654325@ 或 __file__永远不要发明这样的名字;只使用它们作为记录。”
  • 不应该使用笨拙的名字,这是我的意思。

标签: python iterator iterable


【解决方案1】:

你错误地实现了协议,来自data-model__iter__方法:

当容器需要迭代器时调用此方法。 这个方法应该返回一个可以迭代的 new 迭代器对象 容器中的所有对象。

你总是返回相同的旧迭代器

def __iter__(self):
    return self.__iterator__

仅在此处设置:

self.__iterator__ = iterator(data)

...

Iterator 对象也需要实现这个方法;他们是必需的 自己返回。

您在这方面正确实现了您的迭代器。


你的iterable 实现应该是这样的:

class iterable:
    def __init__(self, data):
        self.data = data

    def __iter__(self):
        return iterator(self.data)

【讨论】:

  • 感谢您的回复!!
【解决方案2】:

您误用了iterable。可迭代非迭代器的 __iter__ 应该在每次调用时返回一个 new 迭代器,因此正确的实现应该是:

class iterable:
    def __init__(self, data):
        # Convert to reusable data in case input is itself an iterator
        self.data = tuple(data)

    def __iter__(self):
        return iterator(self.data)

这保留了迭代器和可迭代对象的一个​​重要属性。 iter(iterator) 应该总是返回iterator,但iter(iterable) 不应该只返回一个新对象,而且每次都应该是一个不同的对象(因为想法是非迭代器可以被迭代单独且可重复地,只有迭代器是有状态的);那是iter(iterable) is not iter(iterable)

【讨论】:

  • 感谢您的回复!!
猜你喜欢
  • 2018-05-16
  • 2017-11-11
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2018-01-09
  • 2016-07-24
相关资源
最近更新 更多