缺少参数和类型错误

问题描述:

我被指示运行当前代码并理解错误消息,并且仅更改函数bs的一行,并修复了错误,我可以理解错误消息的内容,但是我不知道如何 修复它或在实际问题中的函数BS缺少参数和类型错误

def bs(L, item, left, right): 
    if right is None: 
     right = len(L) 
    if right - left == 0: 
     return False 
    if right - left == 1: 
     return L[left] == item 
    median = (right + left)//2 
    if item < L[median]: 
     return bs(L, item, left, median) 
    else: 
     return bs(L, item, median, right) 

L = [i for i in range(10)] 
for i in range(20): 
    print(bs(L, i)) 

错误发生如下

print(bs(L, i)) 
    TypeError: bs() missing 2 required positional arguments: 'left' and 'right' 
+1

错误是相当多的自我解释,正是你难道不明白吗? – alfasin

+0

您需要为该函数提供两个以上的参数。该函数需要4个参数 –

+0

我不明白我如何修改函数bs而不改变多行。我认为这个错误出现在打印声明中缺少左侧和右侧,print(bs(L,i)),但那不是它, –

编辑

简单,默认值分配给您的参数:(感谢trentcl

def bs(L, item, left = 0, right = None): 
... 

之前编辑

如果你想调用函数一样bs(L, i),你需要在默认值你的功能。 left必须为0,right默认为len(L),但据我所知,在函数定义中不能这样做。改变这些行:

sentinel = object() 
def bs(L, item, left = 0, right = sentinel): 
    if right is sentinel: 
     right = len(L) 
... 

Sentinel用作标记或伪数据如常。 Here就是一个例子。如果它混淆了你的心,你不想使用它,只需使用一个特殊的整数像-1

def bs(L, item, left = 0, right = -1): 
    if right is -1: 
     right = len(L) 
... 
+0

'如果权利是哨兵'条款是在原来的代码。标记值是“无”。 – trentcl

+0

@trentcl你说得对,给参数分配默认值就足够了 – Alperen