如何在不使用子类的情况下创建自己的可迭代列表?

时间:2019-07-07 11:32:10

标签: python

我正在学习Python,并开发了一些Web应用程序等。现在,我想更深入地了解Python的幕后工作原理。为此,我想使自己的列表可迭代。到目前为止,这是我的努力:

 class CustomList:
    def __init__(self,*args):
        self.nums=args
        self.count=0
        i=0
        for arg in args:
            i+=1
        self.total=i

    def __iter__(self):
        return self

    def __next__(self):
        if self.count >= self.total:
            raise StopIteration
        self.count+=1

mylist=CustomList(1,2,3,4)
for item in mylist:
    print(item)

现在,在我的 next 函数中,我不确定如何遍历self.nums,以便我的print(item)逐个打印self.nums中的每个项目。

我真的不想使用与len(),append()等相关的任何东西。我想自己创建它们。这就是未来的计划。现在,我什至无法遍历给定* args的用户。

1 个答案:

答案 0 :(得分:0)

您需要返回上一级。 MyList(* args)中的args已经可以迭代。 每个列表项都需要明确指向下一个。因此,每个列表项都需要记录下一个指针以及与之关联的数据。这可能是一个命令,但是MyList.append然后需要显式访问记录。对我来说,MyListItem类更清晰。

class MyListItem:
    def __init__(self, data):
        self.next = None
        self.data = data

    def link_to(self, child):
        self.next = child

然后,MyList类可以将其用作列表结构中的节点。可能会有更好的实现,但这是我能获得的最基本的实现。

class MyList:
    def __init__(self):
        """ Create the list header record, initialised to an empty list. """
        self.top = None
        self.bottom = None
        self.curr = None    # Used to iterate through the list.

    def append(self, data):
        node = MyListItem(data) # Create the List item 
        if self.top is None:    # If the list is empty point top to node
            self.top = node
        else:
            self.bottom.link_to(node) # Otherwise point the bottom node to the new node
        self.bottom = node            # Point the bottom to the new node

    def __iter__(self): 
        self.curr = self.top      # Initialise the current pointer to top
        return self

    def __next__(self):
        if self.curr:                   # If the curr pointer is not None
            res = self.curr.data        # Get the data
            self.curr = self.curr.next  # Set curr to next
            return res                  # Return the data
        else:
            raise StopIteration

测试

test = MyList()

test.append(1)
test.append('Two')
test.append([1, 2, 3])

for node in test:
    print(node)

1
Two
[1, 2, 3]