Почему возникает ошибка утверждения, когда возвращаемое значение совпадает?

#python #return-value

Вопрос:

Поэтому в настоящее время я пытаюсь создать простую функцию, которая принимает список чисел и создает новый список, содержащий разницу между каждым элементом и его последующим элементом.

например

difference([1, 2, 5, 3]) бы вернулся [1, 3, -2]

теперь мой код

 def difference(numbers):
    for number in numbers:
        i=0
        dif_list=[]
        while i < len(numbers)-1:
            dif_list.append(numbers[i 1]-numbers[i])
            i  =1
        if len(dif_list) == len(numbers)-1:
            return print(dif_list)
 

Это возвращает правильный вывод, но когда я пытаюсь использовать утверждение для его проверки, оно говорит об ошибке утверждения.

assert difference([1, 2, 5, 3]) == [1, 3, -2] выдает

 <ipython-input-23-c9c23c8f4955> in <module>
----> 1 assert difference([1, 2, 5, 3]) == [1, 3, -2]
 

Знает ли кто-нибудь сейчас, почему это происходит?

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

1.«Теперь мой код: возвращает правильный вывод» Нет, это не так. Он печатает список, который вас интересует. Он возвращается None . Пожалуйста, хорошенько подумайте о том, что return print(dif_list) на самом деле означает. Подумайте о том, что значит возвращать значение, и о том, что print делает функция. (Подсказка: print не имеет абсолютно никакого отношения к возвращению.)

2. Зачем вам нужны две петли для повторения одномерной последовательности?

Ответ №1:

Если вы вернетесь напрямую , удалив print , это будет работать:

 def difference(numbers):
    for number in numbers:
        i=0
        dif_list=[]
        while i < len(numbers)-1:
            dif_list.append(numbers[i 1]-numbers[i])
            i  =1
        if len(dif_list) == len(numbers)-1:
            return (dif_list)

assert difference([1,2,5,3]) == [1, 3, -2]
 

Ответ №2:

 def difference(numbers):
    dif_list=[]
    i = 0
    while i < len(numbers)-1:
        dif_list.append(numbers[i 1]-numbers[i])
        i  =1
    if len(dif_list) == len(numbers)-1:
        return dif_list

assert difference([1,2,5,3]) == [1, 3, -2]
print('pass')
 

Выход: pass

Основная проблема заключалась в том, что вы возвращали print (), но я также переместил ваш dif_list за пределы цикла for, потому что это имело смысл. Не сильно изменился, но именно туда я бы его и поместил. Я бы, наверное, тоже немного переработал это, но сейчас это все равно работает.

РЕДАКТИРОВАТЬ — Я не мог не провести небольшой рефакторинг, потому что ваш for цикл совершенно не нужен, он ничего не делает.

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

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