Почему этот алгоритм сортировки вставкой выводит None? - PullRequest
0 голосов
/ 12 сентября 2018
def insertion_sort(list):
    for index in range(1,len(list)):
        value = list[index]
        i = index - 1
        while i>=0:
            if value < list[i]:
                list[i+1] = list[i]
                list[i] = value
                i = i - 1
            else:
                break

a = [7,1,3,5,9,2,3]

print(insertion_sort(a))

Этот код взят из видео Академии Хана .Тем не менее, когда я пытаюсь запустить его самостоятельно как на Jupyter Notebook, так и на IDLE, выводится None.Я не могу понять почему, когда это точно так же из видео.Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 12 сентября 2018

Ваша функция нигде не имеет оператора return.Если функция не return ничего явно указывает, она всегда возвращает None.

И почти наверняка намеренно, что эта функция ничего не возвращает.


Обратите внимание, чтофункция изменяет свой аргумент на месте:

>>> a = [7,1,3,5,9,2,3]
>>> insertion_sort(a)
>>> a
[1, 2, 3, 3, 5, 7, 9]

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

И обратите внимание, что в цитируемом видео , это именно то, что делает инструктор - они не print результат insertion_sort, они просто вызывают его, а затем смотрят на значение переменной.


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

Итак, если бы эта функция была названа insertion_sorted, программисты Python ожидали бы, что она оставит свой аргумент один и возвратит новый отсортированный список;так как он называется insertion_sort, они будут ожидать, что он отсортирует свой аргумент на месте и ничего не вернет.

...