Czy w Pythonie następujący sposób uzyskania liczby elementów jest następujący?
arr.__len__()
Jeśli tak, to dlaczego ta dziwna składnia?
my_list = [1,2,3,4,5]
len(my_list)
# 5
To samo działa w przypadku krotek:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
I ciągi, które tak naprawdę są tylko tablicami znaków:
my_string = 'hello world'
len(my_string)
# 11
Zostało to celowo wykonane w taki sposób , aby listy, krotki i inne typy kontenerów lub iteracje nie musiały jawnie implementować .length()
metody publicznej , zamiast tego można po prostu sprawdzić len()
wszystko, co implementuje __len__()
metodę „magii” .
Oczywiście może się to wydawać zbędne, ale implementacje sprawdzania długości mogą się znacznie różnić, nawet w tym samym języku. Często zdarza się, że jeden typ kolekcji korzysta z .length()
metody, podczas gdy inny typ korzysta z .length
właściwości, podczas gdy inny używa .count()
. Posiadanie słowa kluczowego na poziomie języka ujednolica punkt wejścia dla wszystkich tych typów. Tak więc nawet obiekty, których nie możesz uznać za listy elementów, nadal mogą być sprawdzane pod względem długości. Obejmuje to ciągi, kolejki, drzewa itp.
Funkcjonalny charakter len()
nadaje się również do funkcjonalnych stylów programowania.
lengths = map(len, list_of_containers)
Sposób, w jaki bierzesz długość wszystkiego, co ma sens (lista, słownik, krotka, ciąg, ...), polega na wywołaniu
len
go.Powodem składni „dziwne” jest to, że wewnętrznie pyton przekłada
len(object)
sięobject.__len__()
. Dotyczy to każdego obiektu. Jeśli więc definiujesz jakąś klasę i ma sens, aby miała ona długość, po prostu zdefiniuj__len__()
na niej metodę, a następnie będziesz mógł wywoływaćlen
te instancje.źródło
Python używa kaczka wpisując : to nie dba o to, co obiekt jest tak długo, jak to ma odpowiedni interfejs do sytuacji. Kiedy wywołujesz wbudowaną funkcję len () na obiekcie, w rzeczywistości wywołujesz jego wewnętrzną metodę __len__. Obiekt niestandardowy może zaimplementować ten interfejs, a len () zwróci odpowiedź, nawet jeśli obiekt nie jest koncepcyjnie sekwencją.
Pełna lista interfejsów znajduje się tutaj: http://docs.python.org/reference/datamodel.html#basic-customization
źródło
Preferowanym sposobem uzyskania długości dowolnego obiektu python jest przekazanie go jako argumentu do
len
funkcji. Wewnętrznie Python spróbuje następnie wywołać specjalną__len__
metodę przekazanego obiektu.źródło
Po prostu użyj
len(arr)
:źródło
możesz użyć,
len(arr)
jak sugerowano w poprzednich odpowiedziach, aby uzyskać długość tablicy. W przypadku, gdy chcesz mieć wymiary tablicy 2D, możesz użyćarr.shape
zwrotów wysokości i szerokościźródło
len(list_name)
Funkcja przyjmuje listę jako parametr i wywołuje__len__()
funkcję listy .źródło
Python sugeruje użytkownikom używanie
len()
zamiast__len__()
spójności, tak jak mówili inni faceci. Istnieją jednak inne korzyści:Dla niektórych typów wbudowanych, takich jak
list
,str
,bytearray
i tak dalej, realizacja Cython oflen()
zajmuje skrót. Zwraca bezpośrednioob_size
strukturę C, która jest szybsza niż wywołanie__len__()
.Jeśli jesteś zainteresowany takimi szczegółami, możesz przeczytać książkę „Fluent Python” Luciano Ramalho. Zawiera wiele interesujących szczegółów i może pomóc w lepszym zrozumieniu Pythona.
źródło