迭代器上的下一个函数暂停程序

2024-10-03 23:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

以下程序在第行暂停:

m = MapH()

这与功能有关:

def next(self):

如果重新定义为(应该只有两个下划线):

def __next__(self):

然后,得到错误消息:

instance has no next() method

打线时:

for e in m:

完整代码如下:

class MapEntryH:
    def __init__(self, key, value):
        self.key = key
        self.value = value

class MapIteratorH:
    def __init__(self,entryList):
        self._myEntryList = entryList
        self._currItem = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self._currItem < len(self._myEntryList):
            item = self._myEntryList[self._currItem]
            self._currItem += 1
            return item
        else:
            StopIteration

class MapH:
    def __init__(self):
        self._entryList = list()
    def __len__(self):
        return len(self._entryList)
    def _findPosition(self,key):
        for i in range(len(self)):
            if self._entryList[i].key == key:
                return i
        return None
    def __contains__(self,key):
        ndx = self._findPosition(key)
        return ndx is not None
    def add(self,key,value):
        ndx = self._findPosition(key)
        if ndx is not None:
            self._entryList[ndx].value = value
            return False
        else:
            entry = MapEntryH(key,value)
            self._entryList.append(entry)
            return True
    def valueOf(self, key):
        ndx = self._findPosition(key)
        assert ndx is not None, "Invalid map key"
        return self._entryList[ndx].value
    def remove(self,key):
        ndx =self._findPosition(key)
        assert ndx is not None,"Invalid map key"
        self._entryList.pop(ndx)
    def __iter__(self):
        return MapIteratorH(self._entryList)


def test_Map():
    m = MapH()
    m.add(1,"arg")
    m.add(2,"eeu")
    m.add(3,"ale")
    m.add(4,"sue")
    m.add(5,"bra")
    temp = m.remove(5)
    m.add(5,"chl")
    m.add(5,"bol")
    temp = m.valueOf(5)
    temp = m._findPosition(4)
    for e in m:
        print(e)
    me = MapEntryH(1,"arg")

test_Map()

如何支持迭代,如:

for e in m:
    print(e)

或类似于:

me = MapEntryH(1,"arg")
if me in m:
    print me.value + " is on the map"

Tags: keyinselfnoneaddforreturnis