因此,在另一个代码评审的启发下,我想看看我是否能够实现一个非常基本的堆栈,而不需要OP在其实现中采用的链接列表方法。
为此,我提出了下面的Stack类。我为Python 3编写了它,但实际上它也是在Python 2中使用的:
class Stack:
_stack = []
def __init__(self):
self._stack = []
@property
def size(self):
return len(self._stack)
@property
def count(self):
return self.size
def __sizeof__(self):
return self.size
def pop(self):
if self.size == 0:
return "Cannot pop from an empty stack."
item = self._stack[self.size - 1]
self._stack.remove(item)
return item
def peek(self):
if self.size == 0:
return "Cannot peek into an empty stack."
return self._stack[self.size - 1]
def push(self, item):
self._stack.append(item)
def __iter__(self):
return iter(self._stack)我可能错过了一个人希望从堆栈中得到的一些关键部分,但是任何改进都是值得欢迎的。字面上说是任何改善。
__init__中的空列表。由于某种原因,PyCharm会在__init__中使用属性时抱怨属性是否已经是类的一部分,所以这或多或少是为了让PyCharm停止对我大喊大叫。__sizeof__声明为引用size属性函数。这样,如果有人不想做len(StackObject),就可以使用stack.size。记住这些,你可以告诉我你的想法,或者指出我犯的任何错误。(我不是数据结构方面的专家,所以我可能搞砸了一些观点)。
发布于 2017-12-09 17:49:23
到目前为止,这段代码最大的问题是错误处理。当从空stack弹出或窥视时,会返回一个字符串。这个真的坏了。关于为什么这样做的例子,假设我将字符串"Cannot peek into an empty stack."添加到堆栈中,然后尝试查看top元素是什么。我不知道我得到的答案是因为堆栈是空的,还是因为堆栈中有字符串。解决这一问题的方法是在堆栈为空时raise一个IndexError。我还认为,您不应该定义size或count,因为得到某些东西长度的pythonic方法是调用len(x)。您可能还想知道python列表已经有了一个pop函数,所以您可以将其用于pop。
发布于 2017-12-10 07:19:59
我有意将
__sizeof__声明为引用size属性函数。这样,如果有人不想做len(StackObject),就可以使用stack.size。
来自Python的禅宗:
应该有1,最好只有一种--很明显的方法。
Python喜欢有一种真正的方法来做事情,因为它在任何地方都保持使用的一致性。
在这种情况下,我将完全取消size和count属性,只需定义一个__len__ (而不是__sizeof__,就像其他答案提到的那样)。使用__len__ (或者更确切地说,是len()函数)是在Python中查找容器大小的标准方法,因此您应该提供此方法,而不提供任何其他方法。
而不是:
...
@property
def size(self):
return len(self._stack)
@property
def count(self):
return self.size
def __sizeof__(self):
return self.size
...这样做:
def __len__(self):
return len(self._stack)https://codereview.stackexchange.com/questions/182435
复制相似问题