2017-07-17 9 views
0

これは私の以前の質問の2番目の部分であることを意図していましたが、別の質問としてそれらを尋ねることにしました。私はMITの講義ノート/ビデオからハッシュテーブルを実装する次のコードに従っています。講師は彼のコードを説明しないので、私はビデオからの質問への答えを得ることができません。私はOOPの新人です。私はこの特定の方法を完全に理解したいと思います。ここでは実装されてcodeです:クラスをハッシュするためのPythonの理解方法

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)働く理由を私は理解していません。ここに私の理解がある。 値eは、returnステートメントが実行された場合にのみ追加され、ifステートメントif i==eによって異なります。最初はself.valsが空のリストのリストにすぎないので、このif文は決して真実ではないので、何も返されないと私は信じています。しかし、ビデオ講師では、コードは正常に動作します。これはなぜですか?

インデントのコードが間違っていますか?私はPythonの初心者なので、おそらくif i==eがtrueの場合はメソッドは何も返しません。それ以外の場合は最後の行にスキップして値を追加するので、要素が2回追加されません。私は助けていただきありがとうございます!

+1

コードを画像として埋め込む代わりに記述することを検討してください。ありがとう! – iehrlich

答えて

0

「[I]それ私== eが真である、おそらく場合こうして素子を二回添加されない保証方法は、 何も返さないそれ以外の場合は、最後の行にスキップして、値を追加し、 場合よ? "

はい、これが起こります。あなたはそれを理解した!よくやった。あなたはあなたが新しいと言ったので、将来的には対話モードでPythonを起動することをお勧めします。コマンドラインでpythonを実行するだけで実行できます。そこでは、単純なコード(この挿入関数など)をテストしてその動作を見ることができます。これは、関数内で何が起こっているのかを自分で理解するのに役立ちます。

インタラクティブモードの場合はa tutorial I foundとなります。

if i==e: returnは条件付きですが、1行しか要しません。この場合、インデントは不要です。

+0

ありがとう! – Iltl

関連する問題