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?
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?
Odpowiedzi:
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.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
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.
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
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.
Po prostu użyj len(arr)
:
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
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
len(list_name)
Funkcja przyjmuje listę jako parametr i wywołuje __len__()
funkcję listy .
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 of len()
zajmuje skrót. Zwraca bezpośrednio ob_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.