我使用自制类Node定义了一个类Queue。我认为它的工作正常,但我不确定代码是否正确。大多数情况下,我担心当队列为空时,将self.first和self.last分配给p(一个新节点)。我的理由是,由于p将是唯一的节点,它将是第一个节点和最后一个节点,但这可能不是Pythonic的思考方式。我的代码是否合情合理?
class Node:
def __init__(self):
self.value=0
self.next=None
class Queue:
def __init__(self):
self.first=None
self.last=None
def isempty(self):
return self.first==None
def put(self,x):
p=Node()
p.value=x
if self.first==None:
self.first=p
self.last=p
else:
self.last.next=p
self.last=p
def get(self):
if self.isempty():
print('Queue is empty!')
else:
x=self.first.value
self.first=self.first.next
return x
答案 0 :(得分:1)
这里有一个问题,在第一次调用get之后你会松开Head指针,还是有目的?
def get(self):
try:
x=self.first.value
self.first=self.first.next
return x
except AttributeError:
print('Empty queue!')
此外,不要捕获AttributeError,为什么不使用self.isempty()方法。
关于self.last:看起来你根本不需要它。
我会按如下方式修改Node:
class Node:
def __init__(self, val=0):
self.value= val
self.next = None
这样你就可以写:
def put(self,x):
p = Node(x)
下面可以稍微缩短一下: 从:
if self.first==None:
self.first=p
self.last=p
else:
self.last.next=p
self.last=p
要:
if self.first==None:
self.first=p
else:
self.last.next=p
self.last=p
使用链接列表作为队列对我来说有点奇怪,但是嘿,为什么不呢:)
关于代码样式的注意事项: 使用更多空格,并尝试关注https://www.python.org/dev/peps/pep-0008/ 您可以在代码上运行flake8或pylint以通过练习来学习(而不是阅读PEP ;-))
编辑:
新的获得很好。你可以避免这样else
。根据经验,较少条件的陈述/范围越好:
if self.isempty():
print('Queue is empty!')
return None
x = self.first.value
self.first = self.first.next
return x
对于关于val=0
的问题,它被称为默认参数,因此如果您在未指定Node()
的情况下致电val
,则无论如何都会0
。
n = Node()
print(n.val)
>> 0
n = Node(42)
print(n.val)
>> 42