我正在学习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的用户。
答案 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]