Функция len в Python¶
len() — встроенная функция языка программирования Python, возвращающая длину объекта: количество элементов в последовательности, число ключей в словаре или символов в строке. Принимает один аргумент — объект, поддерживаемый протоколом __len__, — и возвращает неотрицательное целое число (int). Одна из самых часто используемых функций языка, доступная без импорта модулей.
¶Сигнатура и принцип работы
`` len(obj) ``
Аргумент obj — объект, для которого определён метод __len__ (магический метод протокола длины). Если метод отсутствует, функция возбуждает исключение TypeError: object of type 'X' has no len(). Возвращаемое значение имеет тип int и не может быть отрицательным; по соглашению протокола, если len(obj) == 0, объект считается ложным в булевом контексте.
``python len("привет") # 6 len([1, 2, 3]) # 3 len({"a": 1}) # 1 ``
¶Поддерживаемые типы объектов
Функция работает со всеми основными встроенными контейнерами и последовательностями:
| Тип | Что возвращает len() |
|---|---|
str | Количество Unicode-символов |
bytes, bytearray | Количество байтов |
list, tuple | Количество элементов |
dict, defaultdict, Counter | Количество ключей |
set, frozenset | Количество элементов |
range | Число значений в диапазоне |
``python len(b"hello") # 5 len(range(10, 20)) # 10 len({1, 2, 3, 3}) # 3 — множество хранит уникальные значения ``
Для строк len() считает именно символы Unicode, а не байты. Длина строки "ёж" равна 2, хотя в UTF-8 она занимает 3 байта. Для подсчёта байтов используется len(s.encode('utf-8')).
¶Пользовательские классы
Пользовательские классы получают поддержку len() через определение метода __len__:
```python class Basket: def __init__(self): self.items = []
def add(self, item): self.items.append(item)
def __len__(self): return len(self.items)
b = Basket() b.add("apple") b.add("pear") print(len(b)) # 2 ```
Метод __len__ должен возвращать целое число; если оно отрицательное, возбуждается ValueError. Если класс определяет __len__, объект автоматически получает истинность в булевом контексте, если длина ненулевая, даже без метода __bool__.
¶Сложность и производительность
Для встроенных контейнеров len() работает за константное время O(1): интерпретатор хранит длину в структуре объекта. Для пользовательских классов сложность зависит от реализации __len__ — если метод вычисляет длину за линейное время, len() будет работать не за константу.
¶Частые ошибки
- Попытка вызвать
len()для итератора, не являющегося последовательностью:len(iter([1, 2, 3]))возбудитTypeError. Решение — преобразовать итератор в список:len(list(it)). - Ожидание длины генератора: генераторы не хранят все значения в памяти, поэтому
len()для них неприменим. - Путаница между длиной строки и её байтовым представлением при работе с кодировками.
¶Связанные функции
sum(1 for _ in iterable)— подсчёт элементов итератора без материализации.operator.length_hint(obj)— оценка длины для объектов без__len__, возвращает приблизительное значение.bool(obj)— истинность объекта, для контейнеров определяется длиной.
¶История
Функция len() присутствует в Python с ранних версий языка (до появления Python 2.0, 2000 год) и не меняла сигнатуру. В Python 3.x сохранена без изменений; расширение поддерживаемых типов шло за счёт появления новых контейнеров в стандартной библиотеке.
¶Источники
- Документация Python: встроенные функции — docs.python.org/3/library/functions.html
- Документация Python: стандартные типы — docs.python.org/3/library/stdtypes.html
- «Python Cookbook» Дэвида М. Бизли, Брайана К. Джонса — О’Райли, 2013
- «Fluent Python» Лучано Рамальо — О’Райли, 2015
