В языках программирования есть много полезных инструментов, которые облегчают жизнь разработчика. Если писать код и не использовать эти возможности, работа будет длинной и сложной, потому что придётся подробно описывать даже самое незначительное действие.
Сегодня на примерах разбираем принципы и правила использования одного из таких встроенных инструментов в языке программирования Python — функции len()
.
Введение в функцию len()
Функция len()
в Python умеет возвращать по запросу длину контейнерного объекта. Но не любого, а только тех, которые поддерживают такую возможность.
Чтобы понять принцип работы функции, нужно коротко разобрать несколько вещей:
- контейнерные объекты;
- классы;
- атрибуты и методы классов.
Контейнерный объект содержит в себе другие объекты. Это могут быть упорядоченные и неупорядоченные коллекции и другие типы данных, например массивы и наборы данных для работы с Big Data. Главное, что нужно понять — контейнерный объект состоит из элементов. Если что, строка — это тоже контейнерный объект, потому что состоит из символов.
Классы — основа всех объектов в Python. Это шаблоны-конструкторы, в которых чётко прописано, как работает каждый экземпляр созданного по этому шаблону объекта.
Внутри каждого класса есть атрибуты и методы:
- Атрибуты — сведения о каждом объекте. Например, это могут быть имя, числовые и строковые характеристики, переменные-флаги.
- Методы — умения каждого объекта, которые можно встраивать в класс. Это то, что объект может делать сам, или то, что можно делать с ним.
Когда мы создаём список, или словарь, или любой другой новый объект, Python смотрит на классы-шаблоны, находит нужный и создаёт экземпляр этого класса. Новый объект будет иметь все те же свойства, что и класс-родитель.
Чтобы функция len()
могла узнать длину объекта, в классе-родителе должен быть атрибут __len__
. Этот атрибут подсчитывает количество элементов в объекте. Если количество элементов обновляется, атрибут увидит это и тоже обновит своё значение.
Как в итоге работает функция len():
Функция len()
ищет у объекта атрибут __len__
, который показывает длину. Она считывает этот параметр и выдаёт его.
Основы использования функции len()
Синтаксис функции len(). Функция len()
работает с простым синтаксисом. Нужно написать ключевое слово len()
и передать в скобки аргумент — объект, длину которого нужно узнать. Эта команда вернёт целое число, потому что количество элементов может быть только целым.
Результат вычисления длины можно сразу вывести на экран, а можно предварительно сохранить в другой переменной и использовать где-то ещё:
# создаём объект, у которого можно посмотреть длину
data = [1, 2, 3]
# создаём переменную, в которой храним результат
# измерения длины объекта функцией len
length = len(data)
# выводим значение длины на экран,
# предварительно сохранив его в переменной
print(length)
# выводим значение длины на экран напрямую
print(len(my_list))
В обоих случаях результатом работы оператора print()
будет число 3, потому что в созданном нами списке 3 элемента.
Параметры функции len(). Функция принимает один параметр — объект, длину которого надо вычислить. Это работает с любым объектом, внутри которого реализован метод подсчёта количества элементов.
Использование функции len() с различными типами данных
Для наглядной демонстрации работы мы применим len() на разных типах данных и посмотрим на результаты.
Строка (string) — последовательность символов, заключённая в одинарные ('), двойные (") или тройные кавычки ('''или """). Вычисляем длину строки:
# длина строки — количество символов
text = "Hello, world!"
# выводим длину на экран
print(len(text))
На экране в консоли получим количество элементов строки, где учтён каждый символ:
13
Список (list) — упорядоченная изменяемая коллекция объектов любого типа. Элементы списка могут повторяться и их можно добавлять, удалять или изменять. Списки создаются с помощью квадратных скобок [].
Длина списка определяется количеством элементов внутри него:
# длина списка — количество элементов
object = ["яблоко", "банан", "киви", "груша"]
# выводим длину на экран
print(len(object))
В консоли видим размер списка:
4
Кортеж (tuple) — упорядоченная неизменяемая коллекция объектов. Как и список, кортеж может содержать элементы любых типов. Питон позволяет создавать кортежи с помощью круглых скобок () или без них, если кортеж из одного элемента содержит запятую: this_tuple = ("яблоко",)
.
Длина кортежа — количество его элементов, как в списке:
# длина кортежа — количество элементов
tokyo_coordinates = (35.652832, 139.839478)
# выводим длину на экран
len(tokyo_coordinates)
Результат запуска кода:
2
Словарь (dictionary) — неупорядоченная изменяемая коллекция пар «ключ-значение». Ключи словарей уникальны и неизменяемы, а значения могут быть любыми. Словари создаются с помощью фигурных скобок {}.
Длина словаря считается количеством пар:
# длина словаря — количество ключей
user_info = {"name": "Алиса", "age": 30, "city": "Лондон"}
# выводим длину на экран
print(len(user_info))
В нашем словаре 3 пары ключей и значений:
3
Множество — неупорядоченная коллекция уникальных элементов. Оно используется для работы с математическими операциями со множествами, таких как объединение, пересечение или разность.
Множества создаются с помощью фигурных скобок {} или функции set(). Они могут содержать повторяющиеся элементы, но их длина выражается количеством только уникальных, неповторяющихся:
# длина множества — количество уникальных элементов
number = {1, 2, 2, 3, 3, 3}
# выводим длину на экран
print(len(number))
У нас три уникальных элемента, это и будет длиной:
3
Примеры использования функции len()
Вот ещё несколько примеров получения длины объектов с использованием len()
.
Пример с пустым списком. Пустой список не содержит элементов, поэтому его длина будет равняться 0:
# пустой список не содержит элементов
empty = []
# выводим длину на экран
print(len(empty))
Проверяем код:
0
Пример с различными типами данных в списке. Список — упорядоченная коллекция данных. Он может хранить любые элементы: целые числа, числа с плавающей точкой, строки, булевы переменные, другие списки. Независимо от типов данных длина списка всегда будет равна их количеству:
# длина списка равна количеству элементов, независимо от их типа
items = [1, "привет", 3.14, True]
# выводим длину на экран
print(len(items))
Выводим длину на экран и видим количество элементов:
4
Использование len() в циклах. Длина объекта может помочь определить количество итераций в цикле.
Когда мы используем цикл for вместе с len()
и функцией range()
, Python определяет длину объекта с помощью len()
. После этого range()
генерирует последовательность индексов от 0 до len() - 1
. Эти индексы присваиваются каждому элементу и будут использоваться как порядковые номера. Цикл идёт по ним по очереди:
# создаём список
words = ["кот", "пёс", "петух", "осёл"]
# используем len() и range() в цикле
for i in range(len(words)):
print(f"Индекс {i}: {words[i]}")
Проверяем вывод:
Индекс 0: кот
Индекс 1: пёс
Индекс 2: петух
Индекс 3: осёл
Использование len() с пользовательскими классами. Это возможно, если в классе реализован метод __len__
. Метод определяет, какое значение будет возвращать вызов len()
для экземпляра класса. Такая возможность будет удобна для работы с объектами, длину которых важно знать.
Что нужно запомнить:
- Метод
__len__
возвращает целое число, которое описывает длину объекта. - Python автоматически вызывает этот метод, когда вы используете
len()
.
Реализуем класс с таким методом. Мы создадим корзину товаров магазина. В неё можно будет добавлять товары и удалять — это будет происходить в виде работы со списком. Метод __len__
всегда будет возвращать актуальную длину этого списка.
Так выглядит код:
# создаём класс корзины товаров
class ShoppingCart:
def __init__(self):
# создаём пустой список для хранения товаров
self.items = []
# метод добавления товара в корзину
def add_item(self, item):
self.items.append(item)
# метод удаления товара из корзины
def remove_item(self, item):
if item in self.items:
self.items.remove(item)
# реализуем метод __len__, который
# возвращает количество товаров в корзине
def __len__(self):
return len(self.items)
# создаём экземпляр класса
cart = ShoppingCart()
# добавляем товары
cart.add_item("яблоко")
cart.add_item("банан")
cart.add_item("апельсин")
# вызываем len() для объекта
print('Количество товаров в корзине после добавления', len(cart))
# удаляем товар и проверяем длину
cart.remove_item("банан")
print('Количество товаров в корзине после удаления', len(cart))
Сначала мы добавили 3 товара, а потом удалили один. Запускаем код и смотрим, что получилось в итоге:
Количество товаров в корзине после добавления 3
Количество товаров в корзине после удаления 2
Частые ошибки и как их избежать
При работе с len()
можно ошибиться и применить её неправильно. Вот две самые частые ошибки, о которых нужно помнить.
Ошибка: передача неправильного типа данных. Len()
не работает с объектами, которые не поддерживают атрибут длины __len__
. Например:
- целые числа;
- числа с плавающей точкой;
- булевы переменные со значениями True или False.
Ошибка: использование len() для получения длины вложенных структур. Списки, словари и другие коллекции могут иметь внутри себя другие коллекции. Но len()
возвращает только количество верхнеуровневых элементов, то есть не считает количество элементов внутри вложенных коллекций:
# создаём список с 3 вложенными списками внутри
data = [["яблоко", "банан"], ["молоко"], ["хлеб", "сыр", "масло"]]
# считаем длину списка
length = len(data)
# выводим длину на экран
print(length)
В консоли получим 3, потому что в нашем списке 3 элемента:
3
Можно отдельно посчитать длину каждой вложенной структуры, например с помощью цикла for
:
# создаём список с 3 вложенными списками внутри
data = [["яблоко", "банан"], ["молоко"], ["хлеб", "сыр", "масло"]]
# проходим по вложенным элементам циклом for
total_items = sum(len(inner_list) for inner_list in data)
# выводим на экран количество всех элементов
print(total_items)
Теперь при запуске Python посчитает количество всех элементов:
6
Практические задачи для закрепления материала
Вот несколько задач, которые помогут запомнить принципы работы этой функции. Сначала перечислим задачи, а ниже — решение к каждой.
Задача 1: подсчёт количества элементов в списке. Посчитайте длину списка:
my_list = ["яблоко", "хлеб", "молоко", "сыр", 1000, {'Год взятия Бастилии': 1789}]
Задача 2: подсчёт длины строки. Есть переменная, внутри которой хранится текст. Нужно узнать длину этой строки.
text = "Привет, мир!"
Задача 3: подсчёт количества ключей в словаре. Длина словаря — количество пар «ключ-значение» внутри. Посчитайте длину этого словаря:
categories = {"книги": 114, "одежда": 31, "спортинвентарь": 2}
Задача 4: подсчёт общего количества элементов во вложенных списках. У нас есть список, внутри которого хранятся другие коллекции. Найдите длину всех элементов внутри основного списка nested_list
:
nested_list = [["Москва", "Будапешт", "Стамбул"], [2, 3, 5, 7, 11, 13], [{"Ключ": "Значение"}]]
Задача 5: подсчёт количества уникальных элементов в множестве. Существует множество телефонных номеров, некоторые из них повторяются. Нужно найти количество только тех номеров, которые не дублируются.
phone_numbers = {"+79123456789", "+79876543210", "+79123456789", "+79876543333", "+79066543210"}
Теперь решения.
Задача 1:
# создаём переменную и передаём туда длину списка
method = len(my_list)
# выводим эту переменную на экран
print(method)
Задача 2:
# создаём переменную и передаём туда длину строки
built = len(text)
# выводим эту переменную на экран
print(built)
Задача 3:
# создаём переменную и передаём туда длину словаря
returns = len(categories)
# выводим эту переменную на экран
print(returns)
Задача 4:
# создаём цикл, которым перебираем все вложенные элементы и считаем их длину
# этот цикл находится внутри функции sum, которая считает полученные значения
items = sum(len(inner_list) for inner_list in nested_list)
# выводим общую длину на экран
print(items)
Задача 5:
# создаём переменную и передаём туда длину множества
unique_count = len(phone_numbers)
# выводим эту переменную на экран
print(unique_count)