Является ли arr .__ len __ () предпочтительным способом получения длины массива в Python? - PullRequest
691 голосов
/ 06 февраля 2009

В Python , следующий единственный способ получить количество элементов?

arr.__len__()

Если так, то почему странный синтаксис?

Ответы [ 8 ]

1193 голосов
/ 06 февраля 2009
my_list = [1,2,3,4,5]
len(my_list)
# 5

То же самое работает для кортежей:

my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

И строки, которые на самом деле являются просто массивами символов:

my_string = 'hello world'
len(my_string)
# 11

Это было намеренно сделано таким образом , чтобы списки, кортежи и другие типы контейнеров не нуждались в явной реализации публичного .length() метода, вместо этого вы можете просто проверить len() чего-либо который реализует «волшебный» метод __len__().

Конечно, это может показаться излишним, но реализации проверки длины могут значительно различаться даже на одном и том же языке. Весьма распространено видеть, что один тип коллекции использует метод .length(), в то время как другой тип использует свойство .length, а другой использует .count(). Наличие ключевого слова на уровне языка объединяет точку входа для всех этих типов. Таким образом, даже объекты, которые вы не считаете списками элементов, все же могут быть проверены по длине. Сюда входят строки, очереди, деревья и т. Д.

Функциональная природа len() также хорошо подходит для функциональных стилей программирования.

lengths = map(len, list_of_containers)
49 голосов
/ 06 февраля 2009

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

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

Причина "странного" синтаксиса в том, что внутренне Python переводит len(object) в object.__len__(). Это относится к любому объекту. Итак, если вы определяете некоторый класс, и для него имеет смысл иметь длину, просто определите для него метод __len__(), а затем можно вызвать len для этих экземпляров.

23 голосов
/ 06 февраля 2009

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

Полный список интерфейсов можно найти здесь: http://docs.python.org/reference/datamodel.html#basic-customization

23 голосов
/ 06 февраля 2009

Предпочтительный способ получить длину любого объекта python - передать его в качестве аргумента функции len. Внутри себя python попытается вызвать специальный метод __len__ объекта, который был передан.

20 голосов
/ 06 февраля 2009

Просто используйте len (обр):

>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
9 голосов
/ 20 октября 2015

вы можете использовать len(arr) как предложено в предыдущих ответах, чтобы получить длину массива. Если вам нужны размеры 2D-массива, вы можете использовать arr.shape, который возвращает высоту и ширину

7 голосов
/ 12 апреля 2016
Функция

len(list_name) принимает список в качестве параметра и вызывает функцию __len__() списка.

1 голос
/ 18 февраля 2019

Python предлагает пользователям использовать len() вместо __len__() для согласованности, как говорили другие парни. Однако есть и другие преимущества:

Для некоторых встроенных типов, таких как list, str, bytearray и т. Д., Реализация Cython len() использует ярлык. Он напрямую возвращает ob_size в структуре C, что быстрее, чем вызов __len__().

Если вас интересуют такие подробности, вы можете прочитать книгу Лучано Рамалхо под названием «Свободный питон». В нем много интересных деталей, которые могут помочь вам глубже понять Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...