在我的功能上用括号混淆bug

时间:2016-10-09 00:40:46

标签: python recursion

def cube_of(valz):    
    '''Returns the cube of values'''    
    if len(valz) == 0:    
        return 0    
    else:    
        new_val = [valz[0] ** 3]    
        return  [new_val] + [cube_of(valz[1:])] 

所以我正在为演示创建此函数,该演示采用名为valz的值列表并获取每个值的立方体,然后返回这些立方体的列表。

例如,我们假设输入为[-1,2,-3,4,-5] - 它应该返回[-1,8,-27,64,-125]但它会返回[-1, [8, [-27, [64, [-125, 0]]]]]。 造成额外支架的原因是什么?如果我删除代码中的括号,则它会给出这些多维数据集的总和(这是不正确的),或者它给出了一个错误(关于向int添加list)。我试着调试这个,甚至让我的朋友看看,但我们都很难过。

4 个答案:

答案 0 :(得分:2)

cube_of(valz[1:])已经是一个列表。没有必要用括号括起来。

return [new_val] + cube_of(valz[1:])

答案 1 :(得分:1)

您的代码可以简化

使用列表理解:

def cube_of(valz):        
    return [item**3 for item in valz]

递归方法:

def cube_of(valz):
    return [valz[0]**3] + cube_of(valz[1:]) if valz else []

示例运行:

>>> cube_of([-1,2,-3,4,-5])
[-1, 8, -27, 64, -125]

答案 2 :(得分:1)

如果valz为空,则应返回空列表而不是0 - return []

new_valz是一个列表,因此您不需要括号。 cube_of会返回列表,因此您也不需要括号。

def cube_of(valz):    
    '''Returns the cube of values'''    
    if len(valz) == 0:    
        return []    
    else:    
        new_val = [valz[0] ** 3]    
        return  new_val + cube_of(valz[1:])

cube_of([-1,2,-3,4,-5])
# [-1,8,-27,64,-125]

cube_of([])
# []

答案 3 :(得分:0)

cube_of(valz)已经在分支的else部分返回了列表的初始片段,即[new_val]。因此,为了使其整体返回值为类型列表,它应该返回所有分支中的列表。

你应该改变这样的功能:

def cube_of(valz):    
    '''Returns the cube of values'''    
    if len(valz) == 0:    
       return []    
    else:    
       new_val = [valz[0] ** 3]    
       return [new_val] + cube_of(valz[1:])

注意,现在,由于if-else的两个分支都返回最终列表的初始段,cube_of本身现在通过归纳返回一个列表,从而使整个递归调用返回列表类型的值。

但是,如果您正在寻找一种优雅且更具惯用性/ Pythonic的解决方案,那么只需匿名即可。