Вы явно спрашиваете количество элементов в списке. Если поисковик приходит сюда в поисках размера объекта в памяти, то это фактический вопрос и ответы, которые они ищут: Как определить размер объекта в Python?
Аарон Холл
Ответы:
2640
len()Функция может быть использована с несколькими различными типами в Python - как встроенные типы и библиотеки типов. Например:
Все в Python является объектом, включая списки. Все объекты имеют какой-то заголовок в C-реализации.
В частности, списки и другие подобные встроенные объекты с «размером» в Python имеют атрибут с именем ob_size, в котором кэшируется количество элементов в объекте. Поэтому проверка количества объектов в списке выполняется очень быстро.
Вернуть длину (количество элементов) объекта. Аргумент может быть последовательностью (такой как строка, байты, кортеж, список или диапазон) или коллекцией (такой как словарь, набор или замороженный набор).
lenреализуется с помощью __len__из модели данных документов :
object.__len__(self)
Вызывается для реализации встроенной функции len(). Должен возвращать длину объекта, целое число> = 0. Кроме того, объект, который не определяет метод __nonzero__()[в Python 2 или __bool__()в Python 3] и чей __len__()метод возвращает ноль, считается ложным в логическом контексте.
И мы также можем видеть, что __len__это метод списков:
items.__len__()
возвращает 3.
Встроенные типы вы можете получить len(длина)
И фактически мы видим, что можем получить эту информацию для всех описанных типов:
Хотя это может быть бесполезно из-за того факта, что было бы гораздо более разумно использовать функциональность «из коробки», довольно простым способом было бы создать класс со lengthсвойством:
class slist(list):@propertydef length(self):return len(self)
Вы можете использовать это так:
>>> l = slist(range(10))>>> l.length
10>>>print l
[0,1,2,3,4,5,6,7,8,9]
По сути, он в точности идентичен объекту списка с дополнительным преимуществом наличия lengthсвойства, удобного для ООП .
просто чтобы вы знали, вы можете просто length = property(len)пропустить однострочную упаковочную функцию и сохранить документацию / самоанализ lenвашего свойства.
Тадхг Макдональд-Дженсен
17
Кроме того, lenвы также можете использовать operator.length_hint(требуется Python 3.4+). Для обычного listони эквивалентны, но length_hintпозволяют получить длину итератора списка, что может быть полезно в определенных обстоятельствах:
>>>from operator import length_hint
>>> l =["apple","orange","banana"]>>> len(l)3>>> length_hint(l)3>>> list_iterator = iter(l)>>> len(list_iterator)TypeError: object of type 'list_iterator' has no len()>>> length_hint(list_iterator)3
Но length_hintэто по определению только «намек», поэтому в большинстве случаев lenлучше.
Я видел несколько ответов, предлагающих доступ __len__. Это нормально при работе со встроенными классами, такими как list, но это может привести к проблемам с пользовательскими классами, потому что len(и length_hint) реализовать некоторые проверки безопасности. Например, оба не допускают отрицательных длин или длин, которые превышают определенное значение ( sys.maxsizeзначение). Так что всегда безопаснее использовать lenфункцию вместо __len__метода!
В Python имена, начинающиеся с подчеркивания, являются семантически закрытыми методами и не должны использоваться пользователями.
Аарон Холл
2
1 __foo__.: это просто соглашение, способ для системы Python использовать имена, которые не будут конфликтовать с именами пользователей. 2 _foo.: это просто соглашение, способ для программиста указать, что переменная является закрытой (что бы это ни значило в Python). 3 __foo.: это имеет реальное значение: интерпретатор заменяет это имя _classname__fooкак способ гарантировать, что имя не будет совпадать с аналогичным именем в другом классе. * Никакая другая форма подчеркивания не имеет значения в мире Python. * В этих соглашениях нет разницы между классом, переменной, глобальным и т. Д.
Шай Алон
4
В этом разделе «Вопросы и ответы» объясняется, почему вы не должны использовать специальные методы непосредственно как пользователь: stackoverflow.com/q/40272161/541136
Аарон Холл
@AaronHall, но для функции len это почти то же самое. Это может быть быстрее для очень больших переменных. Однако я понимаю вашу точку зрения, и мы должны использовать len (obj), а не obj .__ len __ ().
Шай Алон
7
А для полноты (в первую очередь образовательной) это возможно без использования len()функции. Я не одобрил бы это как хороший вариант. НЕ ПРОГРАММИРУЙТЕ, КАК ЭТО ТАКОЕ В ПИТОНЕ , но он служит цели для изучения алгоритмов.
(Двоеточие в list[:]неявно и, следовательно, также необязательно.)
Урок для начинающих программистов: вы не можете получить количество элементов в списке, не посчитав их в какой-то момент. Возникает вопрос: когда самое время их считать? Например, высокопроизводительный код, такой как системный вызов connect для сокетов (написанный на C) connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);, не рассчитывает длину элементов (возлагая эту ответственность на вызывающий код). Заметьте, что длина адреса передается, чтобы сохранить шаг подсчета длины в первую очередь? Другой вариант: в вычислительном отношении может иметь смысл отслеживать количество элементов по мере их добавления в передаваемый объект. Имейте в виду, что это занимает больше места в памяти. Смотрите ответ Нафтули Кея .
Пример отслеживания длины для улучшения производительности, занимая больше места в памяти. Обратите внимание, что я никогда не использую функцию len (), потому что длина отслеживается:
classMyList(object):def __init__(self):
self._data =[]
self.length =0# length tracker that takes up memory but makes length op O(1) time# the implicit iterator in a list classdef __iter__(self):for elem in self._data:yield elem
def add(self, elem):
self._data.append(elem)
self.length +=1def remove(self, elem):
self._data.remove(elem)
self.length -=1
mylist =MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)print(mylist.length)# 3
mylist.remove(3)print(mylist.length)# 2
Почему for item in list[:]:? Почему нет for item in list:? Кроме того, я бы использовал += 1для увеличения.
Бабушка
@GrannyAching Я явно упомянул необязательное двоеточие (спецификатор диапазона). Я оставил там спецификатор диапазона для образовательных целей - полезно знать, что это подразумевается. Тип списка [] также выводится, как вы предлагаете - эквивалентно моему коду. Оператор приращения также эквивалентен добавлению 1 к существующей переменной, но во всех случаях короче. Так что я бы согласился, что это следует использовать, если это ваше мнение. Этот код не должен быть запущен в любом месте, в любом случае (кроме как при изучении программирования).
Джонатан Комар
0
С точки зрения того, как на len()самом деле работает, это его реализация C :
static PyObject*
builtin_len(PyObject*module,PyObject*obj)/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/{Py_ssize_t res;
res =PyObject_Size(obj);if(res <0){assert(PyErr_Occurred());return NULL;}returnPyLong_FromSsize_t(res);}
Py_ssize_tмаксимальная длина, которую может иметь объект. PyObject_Size()это функция, которая возвращает размер объекта. Если он не может определить размер объекта, он возвращает -1. В этом случае этот блок кода будет выполнен:
if(res <0){assert(PyErr_Occurred());return NULL;}
И в результате возникает исключение. В противном случае этот блок кода будет выполнен:
returnPyLong_FromSsize_t(res);
resкоторое является Cцелым числом, конвертируется в питон longи возвращается. Все целые числа Python хранятся как longsначиная с Python 3.
Почему знание или знание о реализации C имеет значение?
cs95
Поскольку этот вопрос не является специфичным для CPython, этот ответ может вводить в заблуждение. PyPy, IronPython, ... могут и делают это по-разному.
MSeifert
-2
Здесь вам нужна длина списка, поэтому для вычисления используйте простую функцию len ().
Ответы:
len()
Функция может быть использована с несколькими различными типами в Python - как встроенные типы и библиотеки типов. Например:Официальная документация 2.x здесь: Официальная документация 3.x здесь:
len()
len()
источник
Чтобы найти размер списка, используйте встроенную функцию
len
:И сейчас:
возвращает 3.
объяснение
Все в Python является объектом, включая списки. Все объекты имеют какой-то заголовок в C-реализации.
В частности, списки и другие подобные встроенные объекты с «размером» в Python имеют атрибут с именем
ob_size
, в котором кэшируется количество элементов в объекте. Поэтому проверка количества объектов в списке выполняется очень быстро.Но если вы проверяете, равен ли размер списка нулю или нет, не используйте
len
- вместо этого поместите список в логический контекст - он будет считаться ложным, если пустым, в противном случае - истиной .Из документов
len(s)
len
реализуется с помощью__len__
из модели данных документов :object.__len__(self)
И мы также можем видеть, что
__len__
это метод списков:возвращает 3.
Встроенные типы вы можете получить
len
(длина)И фактически мы видим, что можем получить эту информацию для всех описанных типов:
Не используйте
len
для проверки на пустой или непустой списокЧтобы проверить на определенную длину, конечно, просто проверьте на равенство:
Но есть особый случай для проверки списка нулевой длины или обратного. В этом случае не проверяйте на равенство.
Кроме того, не делайте:
Вместо этого просто сделайте:
или
Я объясняю почему здесь, но вкратце,
if items
илиif not items
это более читабельно и более производительно.источник
Хотя это может быть бесполезно из-за того факта, что было бы гораздо более разумно использовать функциональность «из коробки», довольно простым способом было бы создать класс со
length
свойством:Вы можете использовать это так:
По сути, он в точности идентичен объекту списка с дополнительным преимуществом наличия
length
свойства, удобного для ООП .Как всегда, ваш пробег может отличаться.
источник
length = property(len)
пропустить однострочную упаковочную функцию и сохранить документацию / самоанализlen
вашего свойства.Кроме того,
len
вы также можете использоватьoperator.length_hint
(требуется Python 3.4+). Для обычногоlist
они эквивалентны, ноlength_hint
позволяют получить длину итератора списка, что может быть полезно в определенных обстоятельствах:Но
length_hint
это по определению только «намек», поэтому в большинстве случаевlen
лучше.Я видел несколько ответов, предлагающих доступ
__len__
. Это нормально при работе со встроенными классами, такими какlist
, но это может привести к проблемам с пользовательскими классами, потому чтоlen
(иlength_hint
) реализовать некоторые проверки безопасности. Например, оба не допускают отрицательных длин или длин, которые превышают определенное значение (sys.maxsize
значение). Так что всегда безопаснее использоватьlen
функцию вместо__len__
метода!источник
Отвечая на ваш вопрос в качестве примеров, также приведенных ранее:
источник
__foo__
.: это просто соглашение, способ для системы Python использовать имена, которые не будут конфликтовать с именами пользователей. 2_foo
.: это просто соглашение, способ для программиста указать, что переменная является закрытой (что бы это ни значило в Python). 3__foo
.: это имеет реальное значение: интерпретатор заменяет это имя_classname__foo
как способ гарантировать, что имя не будет совпадать с аналогичным именем в другом классе. * Никакая другая форма подчеркивания не имеет значения в мире Python. * В этих соглашениях нет разницы между классом, переменной, глобальным и т. Д.А для полноты (в первую очередь образовательной) это возможно без использования
len()
функции. Я не одобрил бы это как хороший вариант. НЕ ПРОГРАММИРУЙТЕ, КАК ЭТО ТАКОЕ В ПИТОНЕ , но он служит цели для изучения алгоритмов.(Двоеточие в
list[:]
неявно и, следовательно, также необязательно.)Урок для начинающих программистов: вы не можете получить количество элементов в списке, не посчитав их в какой-то момент. Возникает вопрос: когда самое время их считать? Например, высокопроизводительный код, такой как системный вызов connect для сокетов (написанный на C)
connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
, не рассчитывает длину элементов (возлагая эту ответственность на вызывающий код). Заметьте, что длина адреса передается, чтобы сохранить шаг подсчета длины в первую очередь? Другой вариант: в вычислительном отношении может иметь смысл отслеживать количество элементов по мере их добавления в передаваемый объект. Имейте в виду, что это занимает больше места в памяти. Смотрите ответ Нафтули Кея .Пример отслеживания длины для улучшения производительности, занимая больше места в памяти. Обратите внимание, что я никогда не использую функцию len (), потому что длина отслеживается:
источник
for item in list[:]:
? Почему нетfor item in list:
? Кроме того, я бы использовал+= 1
для увеличения.С точки зрения того, как на
len()
самом деле работает, это его реализация C :Py_ssize_t
максимальная длина, которую может иметь объект.PyObject_Size()
это функция, которая возвращает размер объекта. Если он не может определить размер объекта, он возвращает -1. В этом случае этот блок кода будет выполнен:И в результате возникает исключение. В противном случае этот блок кода будет выполнен:
res
которое являетсяC
целым числом, конвертируется в питонlong
и возвращается. Все целые числа Python хранятся какlongs
начиная с Python 3.источник
Здесь вам нужна длина списка, поэтому для вычисления используйте простую функцию len ().
источник