Este arr.__len__() metoda preferată pentru a obține lungimea de o matrice în Python?

În Python, este următoarea singurul mod de a obține numărul de elemente?

arr.__len__()

Dacă da, de ce ciudat sintaxa?

Soluția
my_list = [1,2,3,4,5]
len(my_list)
# 5

La fel funcționează pentru tupluri:

my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

Și siruri de caractere, care sunt de fapt tablouri de caractere:

my_string = 'hello world'
len(my_string)
# 11

A fost făcut asta în mod intenționat way, astfel încât liste, tupluri și alte tipuri de containere n't toți trebuie să pună în aplicare în mod explicit un public .lungime () metodă, în schimb puteți verifica doarlen()de ceva care implementează 'magic'len () metodă.

Sigur, acest lucru poate părea redundant, dar lungimea verificarea implementări poate varia considerabil, chiar și în cadrul aceluiași limbaj. L's nu mai puțin frecvente pentru a vedea o colecție de tip folosi un .lungime () metoda în timp ce un alt tip folosește o.lungimea de proprietate, în timp ce încă o foloseste.count()`. Având un limbaj de nivel de cuvinte cheie unifică punct de intrare pentru toate aceste tipuri. Deci, chiar obiecte nu se poate considera a fi liste de elemente ar putea fi încă lungime-verificat. Aceasta include siruri de caractere, cozi, arbori, etc.

Natura funcțională a len() de asemenea, se pretează bine la stiluri funcționale de programare.

lengths = map(len, list_of_containers)
Comentarii (17)

Modul în care avea o lungime de nimic pentru care are sens (o listă, dicționar, tuplu, șir de caractere, ...) este de a apela " len " pe ea.

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

Motivul pentru "ciudat" sintaxa este că pe plan intern python se traduce len(obiect) " în " obiect.__len__(). Acest lucru este valabil pentru orice obiect. Deci, dacă sunteți în definirea unor clase și nu are sens, pentru ca acesta să aibă o lungime, doar defini o __len__() metoda pe ea și apoi o putem numi " len " pe aceste cazuri.

Comentarii (0)

Python folosește duck typing: nu't grijă despre ceea ce un obiect este, atâta timp cât acesta are interfață corespunzătoare pentru fiecare situație în parte. Atunci când apelați funcția built-in len() pe un obiect, sunt de fapt de asteptare sale interne __len__ metoda. Un obiect personalizat poate pune în aplicare această interfață și len() va returna răspunsul, chiar dacă obiectul nu este din punct de vedere conceptual o secvență.

Pentru o listă completă de interfețe, au o privire aici: http://docs.python.org/reference/datamodel.html#basic-customization

Comentarii (0)

Modul preferat de a obține lungimea de orice obiect python este de a se trece ca argument la " len " funcția. Pe plan intern, python va încerca apoi pentru a apela speciale __len__ metoda a obiectului care a fost trecut.

Comentarii (0)

Doar folosi len(arr):

>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
Comentarii (0)

puteți utiliza len(arr) după cum sa sugerat în răspunsurile anterioare pentru a obține lungimea de matrice. În cazul în care doriți dimensiunile unei matrice 2D ai putea folosi `arr.forma se înălțime și lățime

Comentarii (0)

len(list_name) funcția ia lista ca un parametru și lista de apeluri'slen () funcția.

Comentarii (0)

Python sugerează utilizatorii folosesc len () "în loc de" __len__() pentru a asigura coerența, la fel ca alți băieți spus. Cu toate acestea, Nu're alte beneficii:

Pentru unele built-in tipuri, cum ar fi lista, str, bytearray și așa mai departe, Cython punerea în aplicare a len() ia-o pe scurtătură. Direct întoarce ob_size într-o C structura, care este mai rapid decât de asteptare __len__().

Dacă sunteți interesat în astfel de detalii, ai putea citi cartea numită "Fluent Python" de Luciano Ramalho. Nu're multe detalii interesante în ea, și vă poate ajuta să înțelegeți Python mai profund.

Comentarii (0)