用于散列类的Python理解方法

时间:2017-07-17 20:19:16

标签: python class oop

这是我上一个问题的第二部分,但我决定将它们作为单独的问题提出来。我按照以下代码实现了麻省理工学院讲义/视频中的哈希表。讲师没有解释他的代码,所以我无法从视频中得到问题的答案。我是OOP的新手,我想完全理解这个特殊的方法。以下是实施的code

class intSet(object):
    #An intSet is a set of integers
    def __init__(self):
        """Create an empty set of integers"""
        self.numBuckets = 47
        self.vals = []
        for i in range(self.numBuckets):
            self.vals.append([])

    def hashE(self, e):
        #Private function, should not be used outside of class
        return abs(e)%len(self.vals)

    def insert(self, e):
        """Assumes e is an integer and inserts e into self"""
        for i in self.vals[self.hashE(e)]:
            if i == e: return
        self.vals[self.hashE(e)].append(e)

    def member(self, e):
        """Assumes e is an integer
           Returns True if e is in self, and False otherwise"""
        return e in self.vals[self.hashE(e)]

    def __str__(self):
        """Returns a string representation of self"""
        elems = []
        for bucket in self.vals:
            for e in bucket: elems.append(e)
        elems.sort()
        result = ''
        for e in elems: result = result + str(e) + ','
        return '{' + result[:-1] + '}'

我不明白为什么方法insert(self,e)有效。这是我的理解。 仅在执行return语句时才附加值e,这取决于if语句if i==e。我相信,因为最初self.vals只是一个空列表的列表,这个if语句永远不会是真的,因此不会返回任何内容。但是在视频讲师中,代码工作正常。为什么会这样?

我是否因为缩进而错误地阅读了代码?我是Python的新手,所以可能if i==e为真,该方法不返回任何内容,否则它会跳到最后一行并附加值,从而确保元素不会被添加两次?感谢任何帮助,谢谢!!

1 个答案:

答案 0 :(得分:0)

  

“[我]的情况是,如果i == e为真,则该方法返回   没有,否则它会跳到最后一行并附加值,   从而确保元素不会被添加两次?“

是的,这就是发生的事情。你想通了!做得好。你说你是新手,所以对未来的建议是以交互模式启动Python,只需在命令行中运行python即可。在那里,您可以测试简单的代码(例如此插入函数)并查看其行为,这可能有助于您自己了解函数中发生的事情。

如果您有兴趣,请在交互模式下a tutorial I found

if i==e: return是一个有条件的,但它只占用一行,在这种情况下不需要缩进。