队列类,出队和入队?蟒蛇

时间:2013-12-13 01:15:34

标签: python class methods queue

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

到目前为止,我有什么能引导我走上正轨吗?

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)

2 个答案:

答案 0 :(得分:10)

这里有一些问题。

  • 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函数的第一个参数不需要list [-1],它需要-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)来组织和简化测试。

答案 1 :(得分:0)

使用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)