In Python , il seguente è l'unico modo per ottenere il numero di elementi?
arr.__len__()
Se è così, perché la strana sintassi?
In Python , il seguente è l'unico modo per ottenere il numero di elementi?
arr.__len__()
Se è così, perché la strana sintassi?
Risposte:
my_list = [1,2,3,4,5]
len(my_list)
# 5
Lo stesso vale per le tuple:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
E le stringhe, che sono in realtà solo matrici di personaggi:
my_string = 'hello world'
len(my_string)
# 11
È stato fatto intenzionalmente in questo modo in modo che elenchi, tuple e altri tipi di contenitori o iterabili non dovessero tutti implementare esplicitamente un .length()
metodo pubblico , invece puoi semplicemente controllare len()
tutto ciò che implementa il __len__()
metodo "magico" .
Certo, questo può sembrare ridondante, ma le implementazioni del controllo della lunghezza possono variare considerevolmente, anche nella stessa lingua. Non è raro vedere un tipo di raccolta utilizzare un .length()
metodo mentre un altro tipo utilizza una .length
proprietà, mentre un altro ancora utilizza .count()
. La presenza di una parola chiave a livello di lingua unifica il punto di ingresso per tutti questi tipi. Quindi anche gli oggetti che potresti non considerare come elenchi di elementi potrebbero essere ancora controllati in base alla lunghezza. Ciò include stringhe, code, alberi, ecc.
La natura funzionale di len()
si presta bene anche a stili funzionali di programmazione.
lengths = map(len, list_of_containers)
Il modo in cui prendi una parte di tutto ciò per cui ha senso (un elenco, un dizionario, una tupla, una stringa, ...) è chiamarlo len
.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
La ragione per la sintassi "strana" è che internamente pitone si traduce len(object)
in object.__len__()
. Questo vale per qualsiasi oggetto. Quindi, se stai definendo una classe e ha senso che abbia una lunghezza, basta definire un __len__()
metodo su di essa e quindi si può chiamare len
quelle istanze.
Python usa duck typing : essa non si preoccupa di quello che un oggetto è , fintanto che ha l'interfaccia appropriata per la situazione a portata di mano. Quando si chiama la funzione integrata len () su un oggetto, si sta effettivamente chiamando il suo metodo __len__ interno. Un oggetto personalizzato può implementare questa interfaccia e len () restituirà la risposta, anche se l'oggetto non è concettualmente una sequenza.
Per un elenco completo delle interfacce, dai un'occhiata qui: http://docs.python.org/reference/datamodel.html#basic-customization
Il modo preferito per ottenere la lunghezza di qualsiasi oggetto Python è passarlo come argomento alla len
funzione. Internamente, python tenterà quindi di chiamare il __len__
metodo speciale dell'oggetto che è stato passato.
Usa solo len(arr)
:
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
è possibile utilizzare len(arr)
come suggerito nelle risposte precedenti per ottenere la lunghezza dell'array. Nel caso in cui desideri le dimensioni di un array 2D, puoi utilizzare l' arr.shape
altezza e la larghezza dei ritorni
len(list_name)
La funzione prende la lista come parametro e chiama la __len__()
funzione della lista .
Python suggerisce agli utenti di utilizzare len()
invece che __len__()
per coerenza, proprio come altri ragazzi hanno detto. Tuttavia, ci sono altri vantaggi:
Per alcuni tipi predefiniti come list
, str
, bytearray
e così via, l'attuazione di Cython len()
prende un collegamento. Restituisce direttamente ob_size
in una struttura C, che è più veloce della chiamata __len__()
.
Se sei interessato a tali dettagli, potresti leggere il libro "Fluent Python" di Luciano Ramalho. Ci sono molti dettagli interessanti in esso e possono aiutarti a capire Python in modo più approfondito.