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

use*_*929 4 python queue methods class

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

这就是我到目前为止,有人能引导我走上正轨吗?

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)
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 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)
Run Code Online (Sandbox Code Playgroud)

如果你想自定义异常,那么它说,例如,你可以用一个语句IndexError: dequeue from empty Queue来代替:IndexError: pop from empty listtry

    def dequeue(self):
        try:
            return self.queue.pop(0)
        except IndexError:
            raise IndexError('dequeue from empty Queue') 
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

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

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