У 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
Кращий спосіб отримати довжину будь-якого об’єкта python - це передавати його як аргумент len
функції. Потім внутрішньо пітон спробує викликати спеціальний __len__
метод переданого об'єкта.
ви можете використовувати, len(arr)
як було запропоновано в попередніх відповідях, щоб отримати довжину масиву. Якщо вам потрібні розміри 2D масиву, ви можете використовувати arr.shape
повернення висоти та ширини
len(list_name)
Функція приймає список як параметр і викликає __len__()
функцію списку .
Python пропонує користувачам використовувати len()
замість __len__()
консистенції, як і інші хлопці. Однак є й інші переваги:
Для деяких вбудованих типів , таких як list
, str
, bytearray
і так далі, реалізація Cython з len()
займає ярлик. Він безпосередньо повертає ob_size
структуру C, що швидше, ніж виклик __len__()
.
Якщо вас цікавлять такі подробиці, ви можете прочитати книгу Лучано Рамальо під назвою "Плавний пітон". У ньому багато цікавих деталей, і вони можуть допомогти вам глибше зрозуміти Python.