有时没有印刷,有时没有,不明白为什么?

2024-04-29 01:18:09 发布

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

我接到了学校的作业,这是我的密码:

class Doubly_linked_node():
    def __init__(self, val):
        self.value = val
        self.next = None
        self.prev = None

    def __repr__(self):
        return str(self.value)

class Deque():
    def __init__(self):
        self.header = Doubly_linked_node(None)
        self.tailer = self.header
        self.length = 0

    def __repr__(self):
        string = str(self.header.value)
        index = self.header
        while not (index.next is None):
            string+=" " + str(index.next.value)
            index = index.next
        return string


    def head_insert(self, item):
        new = Doubly_linked_node(item)

        new.next=self.header
        self.header.prev=new

        self.header=new
        self.length+=1

        if self.tailer.value==None:
            self.tailer = self.header

    def tail_insert(self, item):
        new = Doubly_linked_node(item)

        new.prev=self.tailer
        self.tailer.next=new

        self.tailer=new
        self.length+=1

        if self.header.value==None:
            self.header = self.tailer

它构建了一个堆栈,允许您添加和删除头部或尾部的项(我没有包含所有代码,只包含重要的内容)。你知道吗

当我初始化一个对象时,如果我返回self.next,它打印None,但是如果我返回self.prev,它什么也不打印,只是跳过,我不明白为什么,因为它们的定义和你看到的完全一样,如果我只插入头部几次,例如for i in range(1,5): D.head_insert(i),然后我打印D,它打印5 4 3 2 1 None,但是如果我插入尾部,例如for i in range(1,5): D.tail_insert(i),然后打印D,它打印1 2 3 4 5",就像没有None一样。为什么?你知道吗

我包括了一张图片:

image


Tags: selfnonenodenewindexvaluedefitem
3条回答

按照Günther的建议,我将__repr__修改为:

def __repr__(self):
    string = str(self.header.value)
    index = self.header
    while not (str(index.next) == "None"):
        string += (" " + str(index.next.value))
        index = index.next
    return string

这确实解决了问题,但这是我见过的最丑陋的解决办法。你知道吗

有人知道更好的方法吗?你知道吗

  1. 请记住,您创建的Deque不是空的。您正在用值为None

  2. 您正在交换value和Node对象。当你检查if self.tailer.value==None:时,这可能不是你的意思

  3. 第2点之后是对空Deque的特殊处理,其中header和tailer是None

如果我要实现Deque,我的想法是这样的。我稍微改变了__repr__的返回值。你知道吗

class Deque():
    def __init__(self):
        self.header = None
        self.tailer = None
        self.length = 0

    def __repr__(self):
        if self.header is None:
          return 'Deque<>'
        string = str(self.header.value)
        index = self.header.next
        while index!=None:
            string+=" " + str(index.value)
            index = index.next
        return 'Deque<'+string+'>'

    def head_insert(self, item):
        new = Doubly_linked_node(item)

        new.next=self.header
        if self.length==0:
          self.tailer=new
        else:
          self.header.prev=new

        self.header=new
        self.length+=1

    def tail_insert(self, item):
        new = Doubly_linked_node(item)

        new.prev=self.tailer
        if self.length==0:
          self.header=new
        else:
          self.tailer.next=new

        self.tailer=new
        self.length+=1

下面是一个更好的__repr__方法的问题。用__iter__方法扩展Deque类。因此,您可以迭代Deque,这很好,例如:

for item in D:
  print item

基于此,__repr__方法是简单的。以下是全部变化:

def __repr__(self):
  return 'Deque<'+' '.join([str(item.value) for item in self])+'>'

def __iter__(self):
  index=self.header
  while index is not None:
    yield index.value
    index=index.next

相关问题 更多 >