首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内置列表的Python3堆栈实现

内置列表的Python3堆栈实现
EN

Code Review用户
提问于 2017-12-09 17:10:43
回答 2查看 599关注 0票数 4

因此,在另一个代码评审的启发下,我想看看我是否能够实现一个非常基本的堆栈,而不需要OP在其实现中采用的链接列表方法。

为此,我提出了下面的Stack类。我为Python 3编写了它,但实际上它也是在Python 2中使用的:

代码语言:javascript
复制
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)

我可能错过了一个人希望从堆栈中得到的一些关键部分,但是任何改进都是值得欢迎的。字面上说是任何改善。

注意:我有几件事是故意做的:

  1. 我有意将_stack属性初始化为类本身和__init__中的空列表。由于某种原因,PyCharm会在__init__中使用属性时抱怨属性是否已经是类的一部分,所以这或多或少是为了让PyCharm停止对我大喊大叫。
  2. 我有意将__sizeof__声明为引用size属性函数。这样,如果有人不想做len(StackObject),就可以使用stack.size

记住这些,你可以告诉我你的想法,或者指出我犯的任何错误。(我不是数据结构方面的专家,所以我可能搞砸了一些观点)。

EN

回答 2

Code Review用户

回答已采纳

发布于 2017-12-09 17:49:23

到目前为止,这段代码最大的问题是错误处理。当从空stack弹出或窥视时,会返回一个字符串。这个真的坏了。关于为什么这样做的例子,假设我将字符串"Cannot peek into an empty stack."添加到堆栈中,然后尝试查看top元素是什么。我不知道我得到的答案是因为堆栈是空的,还是因为堆栈中有字符串。解决这一问题的方法是在堆栈为空时raise一个IndexError。我还认为,您不应该定义sizecount,因为得到某些东西长度的pythonic方法是调用len(x)。您可能还想知道python列表已经有了一个pop函数,所以您可以将其用于pop

票数 9
EN

Code Review用户

发布于 2017-12-10 07:19:59

我有意将__sizeof__声明为引用size属性函数。这样,如果有人不想做len(StackObject),就可以使用stack.size

来自Python的禅宗

应该有1,最好只有一种--很明显的方法。

Python喜欢有一种真正的方法来做事情,因为它在任何地方都保持使用的一致性。

在这种情况下,我将完全取消sizecount属性,只需定义一个__len__ (而不是__sizeof__,就像其他答案提到的那样)。使用__len__ (或者更确切地说,是len()函数)是在Python中查找容器大小的标准方法,因此您应该提供此方法,而不提供任何其他方法。

而不是:

代码语言:javascript
复制
...

@property
def size(self):
    return len(self._stack)

@property
def count(self):
    return self.size

def __sizeof__(self):
    return self.size

...

这样做:

代码语言:javascript
复制
def __len__(self):
    return len(self._stack)
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/182435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档