¿Es arr .__ len __ () la forma preferida de obtener la longitud de una matriz en Python?

En Python , ¿es la siguiente la única forma de obtener el número de elementos?

arr.__len__() 

Si es así, ¿por qué la extraña syntax?

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

Lo mismo funciona para las tuplas:

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

Y cuerdas, que en realidad son solo matrices de caracteres:

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

Se hizo intencionalmente de esta manera para que las listas, las tuplas y otros tipos de contenedores no .length() implementar explícitamente un .length() público .length() , en lugar de eso, simplemente puede verificar el len() de cualquier cosa que implemente el ‘magic’ __len__() método.

Claro, esto puede parecer redundante, pero las implementaciones de verificación de longitud pueden variar considerablemente, incluso dentro del mismo idioma. No es raro ver que un tipo de colección use un método .length() mientras que otro tipo usa una propiedad .length , mientras que otro usa .count() . Tener una palabra clave de nivel de idioma unifica el punto de entrada para todos estos tipos. Por lo tanto, incluso los objetos que usted no puede considerar como listas de elementos podrían ser revisados ​​por longitud. Esto incluye cadenas, colas, árboles, etc.

La naturaleza funcional de len() también se presta bien a los estilos funcionales de progtwigción.

 lengths = map(len, list_of_containers) 

La forma en que tomas una longitud de cualquier cosa para lo que tenga sentido (una lista, un diccionario, una tupla, una cadena, …) es para llamarle a len .

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

La razón de la syntax “extraña” es que internamente python traduce len(object) en object.__len__() . Esto se aplica a cualquier objeto. Por lo tanto, si está definiendo alguna clase y tiene sentido que tenga una longitud, simplemente defina un __len__() y luego puede llamar a len en esas instancias.

Python utiliza la escritura de pato : no le importa lo que es un objeto, siempre que tenga la interfaz adecuada para la situación en cuestión. Cuando llama a la función incorporada len () en un objeto, en realidad está llamando a su método __len__ interno. Un objeto personalizado puede implementar esta interfaz y len () devolverá la respuesta, incluso si el objeto no es conceptualmente una secuencia.

Para obtener una lista completa de las interfaces, eche un vistazo aquí: http://docs.python.org/reference/datamodel.html#basic-customization

La forma preferida de obtener la longitud de cualquier objeto de Python es pasarlo como un argumento a la función len . Internamente, python intentará llamar al método especial __len__ del objeto que se pasó.

Solo usa len (arr):

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

puede usar len(arr) como se sugiere en las respuestas anteriores para obtener la longitud de la matriz. En caso de que desee las dimensiones de una matriz 2D, puede usar arr.shape devuelve alto y ancho

len(list_name) toma la lista como un parámetro y llama a la función __len__() .

Python sugiere que los usuarios usen len() lugar de __len__() para __len__() coherencia, como han dicho otros chicos. Sin embargo, hay algunos otros beneficios:

Para algunos tipos incorporados como list , str , bytearray , etc., la implementación de Cython de len() toma un atajo. Devuelve directamente el ob_size en una estructura C, que es más rápido que llamar a __len__() .

Si está interesado en tales detalles, puede leer el libro llamado “Fluent Python” de Luciano Ramalho. Hay muchos detalles interesantes en él, y puede ayudarte a entender Python más profundamente.