这里有几个问题。
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
)来组织和简化测试。
引用该成员时使用'self.queue' - 例如'e = queue [0]'应该是'e = self.queue [0]' – Tom
虽然这对你的分类没有帮助,但是如果你想在将来使用队列数据结构,你应该几乎总是使用['collections.deque'](http://docs.python.org/3/library/collections.html#collections.deque)而不是自己编写。它以C语言实现(速度非常快),并且已经进行了多年的测试(所以你不可能绊倒任何bug)。 – Blckknght