2017-08-13 1 views
-3

なぜコードは "and not found"がなくても機能しません。この声明の使用は何ですか?Pythonで "and not"を使うのは何ですか?

def BinarySearch(alist, item): 
    first=0 
    last=len(alist)-1 
    found=False 
    while first<=last and not found: 
    midpt= (first+last)//2 
    if alist[midpt] == item: 
     found=True 
    else: 
     if item < alist[midpt]: 
     last=midpt-1 
     else: 
     first=midpt+1 
    return(found) 

alist=[1,2,3,4,5] 
item=8 
print(BinarySearch(alist,item) 

+1

(読み取り以外)この種のものを理解するための最良の方法を使用することですステートメントでコードステートメントをステップ実行するデバッガー。これを 'and not found'の有無にかかわらず行い、上のテストで' item'を '8'から' 3'に変更すると、その違いがわかります。 –

+1

'first <= last'と' not found'の両方が真でなければなりません。これは単なるブール式です。ここには「ない」という構造はありません。 –

+1

コードは 'found'フラグを使用することによって非常に複雑です。 'found = True'を' return True'に置き換え、 'return(found)'を 'return False'で置き換えることができます。 –

答えて

0

それは(3つの式*、本当に)式の、声明ではありません。

and not foundの部分を削除すると、項目が見つかると検索が停止せず、最後まで検索が続行されます。 and not foundで、アイテムが見つかると停止します。

あなたのケースでは、リスト内で見つからないもの(8)を探しているので、違いはありません。しかし、例えば3を探すなら、それはできます。


*不必要な詳細:変数へのアクセス

  1. 変数が含まれている値になる式であるので、and not foundfound式です。
  2. not v1v1は#1の値)は、2番目の式です。指定された値を受け取り、それを否定します。
  3. v0 and v2V2が#2の値とV0あるand not found前式の結果である)第三の式である:そのオペランドの両方が、そうでない場合はfalse、該当する場合、その結果が真です。
0

foundは、あなたが探していたアイテムを見つけたかどうかを示すブール型フラグです。一度それを見つけたら、それを探し続ける必要はなく、ただそれを返すべきです。

アン間違いなくすっきり実装が早期リターンのパラダイムを用いることであろうと、アイテムが発見されたら、ちょうどTrueを返す:

def BinarySearch(alist, item): 
    first = 0 
    last = len(alist) - 1 
    while first<=last: 
    midpt = (first+last)//2 
    if alist[midpt] == item: 
     return True 

    if item < alist[midpt]: 
     last = midpt - 1 
    else: 
     first = midpt + 1 

    return False 
関連する問題