В 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.