Запутанная ошибка со скобками в моей функции

#python #recursion

#python #рекурсия

Вопрос:

 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]]]]] . Что вызывает дополнительные скобки? Если я удаляю скобки в коде, то он либо выдает сумму этих кубов (что неверно), либо выдает ошибку (что-то о добавлении an int к a list ). Я попытался отладить это и даже попросил моего друга взглянуть, но мы оба в тупике.

Комментарии:

1. Возникли проблемы с форматированием на мобильном устройстве :/

2. добавьте 4 пробела перед каждой строкой кода, чтобы правильно отформатировать его в SO.

3. Да, кому-то удалось отредактировать форматирование для меня, но я не знал, что это возможно, спасибо!

Ответ №1:

cube_of(valz[1:]) это уже список. Нет необходимости заключать это в скобки.

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

Ответ №2:

Если 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([])
# []
  

Комментарии:

1. Спасибо, добрый сэр! Довольно неприятно, что я все время был в двух скобках от решения, но теперь я его получил! Большое спасибо. Должен ли я поставить галочку, чтобы указать ваше решение в качестве решения?

Ответ №3:

Ваш код может быть упрощен

используя понимание списка:

 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]
  

Комментарии:

1. К сожалению, эта демонстрация посвящена рекурсии. Понимание списка было бы намного проще :/

2. @Jawndoyghoi1569: Никаких проблем. Рекурсивный подход также проще. Программа обновления также отвечает на этот вопрос 🙂

Ответ №4:

cube_of(valz) уже возвращает начальный сегмент списка в else части ветки, т. Е. [new_val] . Поэтому, чтобы его общее возвращаемое значение было типа list , оно должно возвращать списки во всех своих ветвях.

Вы должны изменить функцию следующим образом:

 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 сам теперь возвращает список по индукции, тем самым заставляя весь рекурсивный вызов возвращать значение типа list .

Однако, если вы ищете элегантное и более идиоматическое / питоновское решение, смотрите не дальше, чем anonymous ‘.