2017-08-13 67 views
-3

为什么没有“找不到”的代码不工作。这个声明有什么用?Python中“和不”的用法是什么?

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'都必须为true;它只是一个布尔表达式。这里没有'和''结构。 –

+1

该代码过于复杂,使用'found'标志;你可以删除'和not found',用'return True'替换'found = True',用'return False'返回(found)'。 –

回答

0

这不是一份声明中,这是一个表达式(三个表达式*,真的)。

如果您删除and not found部件,搜索在找到该项目时不会停止,它将继续前进,直至到达结尾。使用and not found,它在找到该项目时停止。

对于您的情况,由于您正在寻找列表中找不到的东西(8),所以它没有任何区别。但是,如果你寻找,说,3,它会。


*的不必要的细节:

  1. 访问一个变量是导致变量包含值的表达式,所以在and not foundfound是一个表达式。
  2. not v1(其中v1是来自#1的值)是第二个表达式:它采用给定的值并且否定它。
  3. v0 and v2(其中V2是从#2和的值V0and not found前的表达式的结果)是第三个表达式:当它的两个操作数的都为真,否则为假其结果为true。
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 
相关问题