На этот вопрос уже правильно ответили: list.sort()
возвращает None
. Причина, по которой «Разделение команд и запросов»:
http://en.wikipedia.org/wiki/Command-query_separation
Python возвращает None
, потому что каждая функция должна что-то возвращать, и соглашение состоит в том, что функция, которая не выдает никакого полезного значения, должна возвращать None
.
Я никогда прежде не видел вашего соглашения о том, чтобы ставить комментарий после строки, на которую он ссылается, но начинать комментарий с карата, чтобы указывать на строку. Пожалуйста, оставляйте комментарии перед строками, на которые они ссылаются.
Хотя вы можете использовать метод .pop()
, вы также можете просто проиндексировать список. Последнее значение в списке всегда можно проиндексировать с помощью -1
, потому что в Python отрицательные индексы «оборачиваются» и индексируются в обратном направлении от конца.
Но мы можем упростить еще больше. Единственная причина, по которой вы сортируете список, заключается в том, что вы можете найти его максимальное значение. Для этого в Python есть встроенная функция: max()
Использование list.sort()
требует построения целого списка. Затем вы извлечете одно значение из списка и откажетесь от него. max()
будет использовать итератор без необходимости выделять потенциально большой объем памяти для хранения списка.
Кроме того, в Python сообщество предпочитает использовать стандарт кодирования под названием PEP 8. В PEP 8 вы должны использовать строчные буквы для имен функций и подчеркивание для разделения слов, а не CamelCase.
http://www.python.org/dev/peps/pep-0008/
С учетом вышеизложенных комментариев, вот мое переписывание вашей функции:
def longest_path(T):
paths = [Ancestors(T,x) for x in OrdLeaves(T)]
return max(len(path) for path in paths)
Внутри вызова к max()
у нас есть «выражение генератора», которое вычисляет длину для каждого значения в списке paths
. max()
будет извлекать значения из этого, сохраняя самое большое, пока все значения не будут исчерпаны.
Но теперь ясно, что нам даже не нужен список paths
. Вот финальная версия:
def longest_path(T):
return max(len(Ancestors(T, x)) for x in OrdLeaves(T))
Я на самом деле думаю, что версия с явной переменной paths
немного более читабельна, но это не ужасно, и если может быть большое количество путей, вы можете заметить улучшение производительности из-за отсутствия сборки и уничтожить список paths
.