【问题标题】:Queue Class, dequeue and enqueue ? python队列类,出队和入队? Python
【发布时间】:2013-12-13 01:15:34
【问题描述】:

所以我有这个问题,它说创建一个类队列并使方法出队和入队

这是我到目前为止所拥有的,有人可以指导我走上正确的道路吗?

class queue:
      def __init__(self,queue):
            self.queue = []
      def dequeue(self):
            if len(queue) > 0:
                  e = queue[0]
                  queue = list[1:len(queue)]
            else:
                  return "There are no elements to remove"
      def enqueue(self,element):
            queue.insert([-1], element)

【问题讨论】:

  • 在提及该成员时使用self.queue - 例如e = queue[0] 应该是 e = self.queue[0]
  • 虽然这对课堂作业没有帮助,但如果您以后想使用队列数据结构,您应该几乎总是使用collections.deque,而不是自己编写。它是用 C 语言实现的(而且速度非常快),并且经过多年的测试(所以你不太可能偶然发现任何错误)。

标签: python class methods queue


【解决方案1】:

这里有一些问题。

  • queue 本身是指您的,而不是实例的同名属性,即self.queue。你必须一直使用self.。为类及其属性赋予不同的名称确实会有所帮助,以避免这种混淆。 (使用 PEP 8 样式并将类命名为 Queue 也会有所帮助。)
  • 当队列不为空时,你会计算返回值e,但你永远不会return它;你只是从函数的末尾掉下来,这意味着你会自动返回None
  • list[1:len(queue)] 正在尝试对 list 类型进行切片,而不是您的实际列表 (self.queue)。你想要的是self.queue[1:len(queue)]
  • 您可能不想在错误时返回一个字符串——这可能是一个完全有效的东西,可以留在队列中。这正是例外的用途。
  • 您的__init__ 接受一个它从不使用的参数。您可能希望将其用作队列内容的起始值。而且您可能还希望将其设为可选。
  • list.insert 函数的第一个参数没有像 [-1] 这样的 list,而是像 -1 这样的索引。
  • 如果这是 Python 2.x,您不想创建经典类;如果您没有其他可继承的,请从 `object 继承。
  • 看起来您可能正在混合使用制表符和空格来进行缩进。不要那样做。

另外,还有一些事情可以更简单:

  • 如果您想切到列表的末尾,只需去掉末尾,例如 self.queue[1:],而不是使用 len(self.queue)
  • 但要更简单地从列表左侧获取和删除值,您可以使用pop(0)
  • 要向列表右侧添加值,您可以使用append
  • 要检查列表是否为非空,只需执行if the_list,而不是if len(the_list) > 0。空集合总是假的,非空集合是真的。
  • 但是您确实不需要检查 - 如果列表为空,pop 将引发异常,这正是您想要做的。

所以:

class Queue(object):
    def __init__(self, queue=None):
        if queue is None:
            self.queue = []
        else:
            self.queue = list(queue)
    def dequeue(self):
        return self.queue.pop(0)
    def enqueue(self, element):
        self.queue.append(element)

如果您想自定义异常,例如,IndexError: dequeue from empty Queue 而不是 IndexError: pop from empty list,您可以使用 try 语句来实现:

    def dequeue(self):
        try:
            return self.queue.pop(0)
        except IndexError:
            raise IndexError('dequeue from empty Queue') 

如果您想测试您的队列类是否正常工作,您需要编写测试函数,然后调用它们。例如:

def test_queue():
    q = Queue()
    for i in range(10):
        q.enqueue(i)
    for i in range(10):
        value = q.dequeue()
        if value != i:
            print('Value #{} should be {} but is {}'.format(i, i, value))
    try:
        value = q.dequeue()
    except IndexError:
        pass # we _want_ an error here
    else:
        print('#10 should raise an IndexError, but got {}'.format(value))

if __name__ == '__main__':
    test_queue()

现在您可以将文件作为脚本运行,它会运行您的测试。

在现实生活中,您会想要考虑更完整的测试,以涵盖您能想到的所有奇怪的边缘情况。您可能希望使用unittest 库或第三方解决方案(如nose)来组织和简化您的测试。

【讨论】:

  • 好的,谢谢您的回答,非常有帮助。那我该如何运行呢?
  • @user2928929:嗯,您需要编写某种使用队列的函数,然后调用该函数。我可以在答案中添加一个示例。
【解决方案2】:

使用self.queue,否则会报错

self.queue 不为空时你没有返回元素

最好不要在队列为空时返回消息,应该引发异常

class Queue:
    def __init__(self,queue):
        self.queue = []
    def dequeue(self):
        return self.queue.pop(0)
    def enqueue(self,element):
        self.queue.append(element)

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多