2013-12-13 93 views
4

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

这是我到目前为止,有人可以指导我在正确的轨道上?

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

引用该成员时使用'self.queue' - 例如'e = queue [0]'应该是'e = self.queue [0]' – Tom

+0

虽然这对你的分类没有帮助,但是如果你想在将来使用队列数据结构,你应该几乎总是使用['collections.deque'](http://docs.python.org/3/library/collections.html#collections.deque)而不是自己编写。它以C语言实现(速度非常快),并且已经进行了多年的测试(所以你不可能绊倒任何bug)。 – Blckknght

回答

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)来组织和简化测试。

+0

好的,谢谢你的回答,这非常有帮助。那么我怎么去运行这个呢? – user2928929

+1

@ user2928929:好的,你需要编写一些函数来调用这个函数。我可以给答案增加一个例子。 – abarnert

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)