Перейти к содержимому

Len python что это

  • автор:

Как работает метод len() в Python? [закрыт]

Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 3 года назад .

Метод len() вернет длину массива, это ясно. Когда смотрю примеры кода, частенько вижу использование for in len(arr) — 1 или for in len(arr) . Пожалуйста, объясните, как это работает или зачем это юзать в цикле . Все понятно

Отслеживать
Atabekdemurtaza
задан 24 авг 2020 в 12:51
Atabekdemurtaza Atabekdemurtaza
37 1 1 серебряный знак 8 8 бронзовых знаков
Вы не могли видеть такие коды, они синтаксически некорректны и не будут работать
24 авг 2020 в 12:52
Может там было for i in range(len(arr)) ?
24 авг 2020 в 12:53
Да , я ошибся for i in range(1, len(arr)) или for i in range(len(arr))//2 вроде таких
24 авг 2020 в 12:57

Вы спрашиваете про len(), хотя вас интересует как работает for. А как работает for написано в каждом учебнике.

24 авг 2020 в 12:59

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Допустим, у вас есть список: lst = [10, 20, 30, 40]

И вы хотите пройтись по всем его элементам, допустим, для итерации. С помощью функции len() измеряется длина списка. range() предоставляет последовательность целых чисел, которые можно использовать как индексы для элементов того же списка. Теперь можно пройтись по элементам в цикле:

for i in range(len(lst)): lst[i] += 1 

Теперь в вашем списке элементы выглядят так: [11, 21, 31, 41] .

Погуглите «Python введение в цикл for».

Отслеживать
ответ дан 24 авг 2020 в 13:04
livefastdiewhenever livefastdiewhenever
395 2 2 серебряных знака 11 11 бронзовых знаков

Если нужно произвести количество итераций равное по длине итерируемому объекту, то используется len.

for i in range(len(_list)). # Иногда лучшим варианиом будет for i in enumerate(_list) 

Отслеживать
ответ дан 24 авг 2020 в 13:03
358 2 2 серебряных знака 15 15 бронзовых знаков

Допустим вам нужно пройти по списку сколько — то раз и прибавить к каждому числу в списке + 1. Вы не знаете какой длиной этот список. Как раз для этого вам и нужен len() . С помощью len() вы узнаёте длину массива и таким образом проходите по списку столько раз и делает что вам нужно.

Отслеживать
ответ дан 24 авг 2020 в 13:29
350 1 1 серебряный знак 13 13 бронзовых знаков

Note: Вообще надо стараться избегать такого кода т.к.
часто это плохой код стайл и написание в лоб. Обычно можно делать так: (пример)

for i in range(len(lst)): lst[i] += 1 # do smth with lst[i] 
lst = list(map(lambda i:i + 1, lst)) 
lst = [i + 1 for i in lst] 

Вам уже объяснили что это, но повторю:

Проитерироваться по списку, получая в i индекс текущего элемента

Иногда полезна функция enumerate() :

>>> list(enumerate(['a', 'b', 'c'])) [(0, 'a'), (1, 'b'), (2, 'c')] 

Как получить отрицательную длину len()≤0 на Python

Рассказываем, возможно ли получить негативное значение из встроенной функции len() в Python, как это работает и зачем это нужно.

Возможно ли получить негативное значение из встроенной функции len() в Python?

Встроенная функция len() возвращает длину (количество элементов) объекта. Интуитивно понятно, что количество элементов в коллекции не может быть отрицательным. Оно должно быть равно 0 или больше.

Однако, я задумался над этим вопросом когда встретил следующий рабочий Python код:

if len(files_names) 

Условие пропускается, если коллекция не пустая. Если же она пустая, то мы попадаем в if блок. На первый взгляд это выглядит как незначительная ошибка из-за невнимательности. Но все же давайте исследуем ситуации когда len() может вернуть отрицательное значение.

Встроенная функция len()

Прежде всего, давайте взглянем на документацию:

Return the length (the number of items) of an object. The argument may be a sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set).

Несколько примеров использования len() с последовательностями и коллекциями:

>>> names = ['Hanna', 'Georg', 'Richard'] >>> len(names) 3 >>> name = 'Theodor' >>> len(name) >>> 7 >>> manager = (35, 'Thea') >>> len(manager) 2 >>> plants_ph = >>> len(plants_ph) 2 >>> unique_plants = >>> len(unique_plants) 4 

Для тех кто хочет глубже погрузиться в реализацию может обратиться к исходникам.

Специальный метод __len__

Встроенная функция len() работает как фасад к дандер методу __len__() объекта (см. док). Вы можете явно вызвать его для встроенных типов, таких как последовательности или коллекции:

>>> names = ['Hanna', 'Georg', 'Richard'] >>> names.__len__() 3 >>> plants_ph = >>> plants_ph.__len__() 2 >>> unique_plants = >>> unique_plants.__len__() 4 

Но если вы попытаетесь использовать len() с кастомным классом без определения __len__ , то это не сработает, и вы получите исключение:

>>> class Plant: >>> pass >>> >>> len(Plant()) TypeError: object of type 'Plant' has no len() 

Было вызвано исключение TypeError, поскольку специальный метод __len__ не был определен, и len() не может быть использован с экземпляром этого класса.

Возврат отрицательного значения

Итак, чтобы проверить первоначальную гипотезу — может ли len() вернуть отрицательное значение, нам нужно создать пользовательский тип и определить специальный метод __len__ , возвращающий такое значение.

Сначала сэмулируем пользовательский тип контейнера и определим __len__() , возвращающий небольшое отрицательное целое число:

>>> class MyList: >>> def __len__(self): >>> return -1 >>> >>> len(MyList()) ValueError: __len__() should return >= 0 >>> >>> MyList().__len__() -1 

В результате это приводит к ValueError, что соответствует задокументированному поведению, хотя ничто не мешает нам явно вызвать __len__ .

Как насчет возврата большого отрицательного числа?

>>> import sys >>> class MyList: >>> def __len__(self): >>> return -sys.maxsize - 2**10 >>> >>> len(MyList()) ValueError: __len__() should return >= 0 

Мы получаем одно и то же значение ошибки независимо от того, насколько отрицательным является значение.

Однако, согласно баг-трекеру и pull request раньше наблюдалась ошибка переполнения OverflowError. Вы можете проверить это на предыдущих версиях python (например, Python 3.6.15).

Предыдущая реализация, возвращающая OverflowError, имела ограничения на длину в реализации CPython, которая все еще работает для больших положительных чисел для Python 3.11.2:

CPython implementation detail: In CPython, the length is required to be at most sys.maxsize. If the length is larger than sys.maxsize some features (such as len()) may raise OverflowError.

>>> import sys >>> class MyList: >>> def __len__(self): >>> return sys.maxsize + 2 ** 10 >>> >>> len(MyList()) OverflowError: cannot fit 'int' into an index-sized integer 

Итак, мы не можем заставить len() возвращать отрицательное значение, потому что выходные данные __len__ тщательно валидируются. Вот почему невозможно перейти в условие:

if len(obj) < 0: print('negative length')

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

Поиска метода __len__

В качестве продвинутого примера давайте рассмотрим поиск метода __len__ и обратимся к соответствующему параграфу о специальных методах:

For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary.

Это объяснение нелегко уловить сразу. В нем говорится о 2 случаях определения __len__ :

  • определение в словаре экземпляра объекта
  • определение в типе объекта (работает корректно)

Мы рассмотрим оба случая с примерами для пояснения. Сначала создайте пользовательский тип без __len__ и назначьте его в качестве атрибута экземпляру объекта:

>>> class ImperfectList: >>> pass >>> >>> imperfect_list = ImperfectList() >>> imperfect_list.__dict__ # object's instance dictionary is empty <> >>> >>> imperfect_list.__len__ = lambda: 100 >>> imperfect_list.__dict__ at 0x7fc8d86ba040>> >>> >>> ImperfectList.__dict__.keys() dict_keys(['__module__', '__dict__', '__weakref__', '__doc__']) >>> >>> len(imperfect_list) TypeError: object of type 'ImperfectList' has no len() 

Можно увидеть, что неявный вызов __len__ через len() вызывает исключение, поскольку __len__ добавляется в качестве атрибута экземпляра вне класса. Тем не менее, если мы определим метод __len__ внутри определения типа, он будет работать корректно:

>>> class PerfectList: >>> def __len__(self): >>> return 7 >>> >>> perfect_list = PerfectList() >>> perfect_list.__dict__ <> >>> >>> PerfectList.__dict__.keys() dict_keys(['__module__', '__len__', '__dict__', '__weakref__', '__doc__']) >>> >>> len(perfect_list) 7 

Таким образом, неявный вызов специального метода __len__ не использует метод, определенный в словаре экземпляра объекта. Если вы собираетесь определить методы, поместите их в область видимости классов.

Мы пришли к выводу, что не можем получить отрицательное значение из встроенной функции len() , поскольку значение возвращаемое __len__ в этом случае валидируется. Если __len__ пользовательского типа возвращает отрицательное значение, это приведет к исключению при его неявном вызове. Таким образом, подобные условные выражения не представляют никакой практической ценности:

if len(files_names) < 0:

Не стоит забывать, что ошибки имеют тенденцию накапливаться вместе. Когда вы где-то сталкиваетесь с незначительной проблемой, существует высокая вероятность того, что вы обнаружите в близлежащем коде более серьезные проблемы. Дважды перепроверяйте смежный код, чтобы убедиться, что все работает должным образом.

  • Ссылка на оригинальную статью
  • Linkedin_profile

2. Функция len()

Функция len() возвращает количество символов в строке.

Рис. \(1\). Программа вычисления длины строки и результат

Считаются символы с \(1\) до \(n\).

Значение \(len()\) всегда целое число.

Что можно подсчитать?

1. Количество символов в строке (см. пример выше).

2. Количество цифр в числе, если перевести его в строку.

Рис. \(2\). Программа вычисления длины числа и результат

3. Количество байт в строке (если указать кодировку).

pic33.jpg

Рис. \(3\). Программа вычисления количества байт и результат

\(5\) байт, так как в данной кодировке \(1\) символ \(=\) \(1\) байт.

Функция len

Функция len длину итерируемого объекта на Python: это может быть строка, список, словарь, множество, кортеж. В параметре функции передаем объект, длину которого мы хотим узнать.

Синтаксис

Пример

Давайте узнаем длину строки:

txt = 'abc' print(len(txt))

Результат выполнения кода:

Пример

Давайте узнаем длину списка:

lst = ['ab', 'cd', 'ef'] print(len(lst))

Результат выполнения кода:

Пример

Давайте узнаем длину словаря:

dct = < 'a': 1, 'b': 2, 'c': 3 >print(len(dct))

Результат выполнения кода:

Пример

Давайте узнаем длину множества:

st = <'a', 'b', 'c'>print(len(st))

Результат выполнения кода:

Смотрите также

  • метод clear ,
    который удаляет все элементы словаря
  • метод copy ,
    который копирует словарь
  • метод update ,
    который обновляет словарь ключами и значениями другого словаря

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *