Функция len() в Python

Функция len() в Python

Смотрим на встроенный метод для измерения объектов

В языках программирования есть много полезных инструментов, которые облегчают жизнь разработчика. Если писать код и не использовать эти возможности, работа будет длинной и сложной, потому что придётся подробно описывать даже самое незначительное действие.

Сегодня на примерах разбираем принципы и правила использования одного из таких встроенных инструментов в языке программирования 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() для экземпляра класса. Такая возможность будет удобна для работы с объектами, длину которых важно знать.

Что нужно запомнить:

  1. Метод __len__ возвращает целое число, которое описывает длину объекта.
  2. 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)

Обложка:

Алексей Сухов

Корректор:

Елена Грицун

Вёрстка:

Кирилл Климентьев

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
easy