所以我有这个问题,它说创建一个类队列并使该方法出列并入队
到目前为止,我有什么能引导我走上正轨吗?
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)
答案 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
之类的索引。另外,有一些事情可能更简单:
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)