В Python , следующий ли единственный способ получить количество элементов?
arr.__len__()
Если так, то почему странный синтаксис?
В Python , следующий ли единственный способ получить количество элементов?
arr.__len__()
Если так, то почему странный синтаксис?
Ответы:
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)
То, как вы берете длину чего-либо, для чего это имеет смысл (список, словарь, кортеж, строка, ...) - это вызывать lenэто.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
Причина "странного" синтаксиса в том, что внутренне Python переводит len(object) в object.__len__(). Это относится к любому объекту. Итак, если вы определяете некоторый класс, и для него имеет смысл иметь длину, просто определите для него __len__()метод, и тогда можно будет вызывать lenэти экземпляры.
Python использует утиной типизации : он не заботится о том, что объект является , до тех пор , как он имеет соответствующий интерфейс для конкретной ситуации. Когда вы вызываете встроенную функцию len () для объекта, вы фактически вызываете его внутренний метод __len__. Пользовательский объект может реализовать этот интерфейс, и len () вернет ответ, даже если объект концептуально не является последовательностью.
Полный список интерфейсов можно найти здесь: http://docs.python.org/reference/datamodel.html#basic-customization.
Вы можете использовать, len(arr)
как предложено в предыдущих ответах, чтобы получить длину массива. Если вам нужны размеры 2D-массива, вы можете использовать arr.shapeвозвращаемые значения высоты и ширины.
len(list_name)Функция принимает список в качестве параметра и вызывает __len__()функцию списка .
Python предлагает пользователям использовать len()вместо __len__()согласованности, как говорили другие парни. Однако есть и другие преимущества:
Для некоторых встроенных типов , таких как list, str, bytearrayи так далее, реализация Cython из len()занимает ярлык. Он напрямую возвращает ob_sizeструктуру C, которая быстрее, чем вызов __len__().
Если вас интересуют такие детали, вы можете прочитать книгу Лучано Рамалхо под названием «Свободный питон». В нем много интересных деталей, которые могут помочь вам глубже понять Python.