web-dev-qa-db-fra.com

Arr .__ len __ () est-il le moyen privilégié d'obtenir la longueur d'un tableau en Python?

Dans Python , le suivant est-il le seul moyen d’obtenir le nombre d’éléments?

arr.__len__()

Si oui, pourquoi cette syntaxe étrange?

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

Les mêmes travaux pour les tuples:

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

Et des chaînes, qui ne sont en réalité que des tableaux de caractères:

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

C'était intentionnellement de cette façon pour que les listes, les nuplets et les autres types de conteneurs n'aient pas tous besoin d'implémenter explicitement une méthode publique .length(), vous pouvez simplement vérifier la len() de tout ce qui implémente la méthode 'magique' __len__().

Bien sûr, cela peut sembler redondant, mais les implémentations de contrôle de longueur peuvent varier considérablement, même dans le même langage. Il n'est pas rare de voir un type de collection utiliser une méthode .length() alors qu'un autre type utilise une propriété .length, tandis qu'un autre utilise .count(). Avoir un mot clé au niveau de la langue unifie le point d’entrée pour tous ces types. Ainsi, même les objets que vous ne considérez peut-être pas comme des listes d'éléments peuvent toujours faire l'objet d'une vérification de longueur. Cela inclut les chaînes, les files d'attente, les arbres, etc.

La nature fonctionnelle de len() se prête également bien aux styles de programmation fonctionnels.

lengths = map(len, list_of_containers)
1197
Soviut

La façon dont vous prenez une longueur de tout ce qui a du sens (une liste, un dictionnaire, un tuple, une chaîne de caractères, ...) consiste à appeler len dessus.

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

La syntaxe "étrange" s'explique par le fait qu'en interne python traduit len(object) en object.__len__(). Ceci s'applique à n'importe quel objet. Donc, si vous définissez une classe et qu'il est logique qu'elle ait une longueur, définissez simplement une méthode __len__() et vous pourrez alors appeler len sur ces instances.

50
rz.

La méthode préférée pour obtenir la longueur de tout objet python consiste à le transmettre en tant qu'argument à la fonction len. En interne, python tentera ensuite d'appeler la méthode spéciale __len__ de l'objet qui a été transmis.

23
David Locke

Python utilise typage de canard : il se fiche de ce qu'est un objet , tant qu'il possède l'interface appropriée la situation actuelle. Lorsque vous appelez la fonction intégrée len () sur un objet, vous appelez sa méthode interne __len__. Un objet personnalisé peut implémenter cette interface et len ​​() retournera la réponse, même si l'objet n'est pas une séquence sur le plan conceptuel.

Pour une liste complète des interfaces, regardez ici: http://docs.python.org/reference/datamodel.html#basic-customization

23
UncleZeiv

Il suffit d'utiliser len (arr):

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

vous pouvez utiliser len(arr) comme suggéré dans les réponses précédentes pour obtenir la longueur du tableau. Si vous voulez les dimensions d'un tableau 2D, vous pouvez utiliser arr.shape renvoie la hauteur et la largeur.

9
Ahmed Abobakr

La fonction len(list_name) prend la liste comme paramètre et appelle la fonction __len__() de la liste.

7
Harun ERGUL

Python suggère aux utilisateurs d’utiliser len() au lieu de __len__() pour des raisons de cohérence, comme d’autres l'ont dit. Cependant, il y a d'autres avantages:

Pour certains types intégrés tels que list, str, bytearray et ainsi de suite, l'implémentation Cython de len() prend un raccourci. Il renvoie directement le ob_size dans une structure C, ce qui est plus rapide que d'appeler __len__().

Si de tels détails vous intéressent, vous pouvez lire le livre intitulé "Fluent Python" de Luciano Ramalho. Il contient de nombreux détails intéressants et peut vous aider à mieux comprendre Python.

1
JOHNKYON