758 votes

Est-ce que arr.__len__() est le meilleur moyen d'obtenir la longueur d'un tableau en Python ?

En Python La méthode suivante est-elle la seule façon d'obtenir le nombre d'éléments ?

arr.__len__()

Si oui, pourquoi cette syntaxe étrange ?

0 votes

J'ai ajouté une explication à ce sujet à l'adresse suivante Pourquoi l'approche de Python len plus rapidement que la fonction __len__ méthode ?

1256voto

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

Le même principe s'applique aux tuples :

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

Et les chaînes de caractères, qui ne sont en fait que des tableaux de caractères :

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

C'était fait intentionnellement de cette façon afin que les listes, les tuples et les autres types de conteneurs ou itérables ne doivent pas tous implémenter explicitement une fonction publique .length() à la place, vous pouvez simplement vérifier la méthode len() de tout ce qui met en œuvre la "magie __len__() méthode.

Bien sûr, cela peut sembler redondant, mais les implémentations de la vérification de la longueur peuvent varier considérablement, même au sein d'un même langage. Il n'est pas rare de voir un type de collection utiliser une fonction .length() tandis qu'un autre type utilise une méthode .length tandis qu'un autre encore utilise la propriété .count() . Le fait d'avoir un mot clé au niveau du langage unifie le point d'entrée de tous ces types. Ainsi, même les objets que vous ne considérez pas comme des listes d'éléments peuvent être contrôlés quant à leur longueur. Cela inclut les chaînes de caractères, 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)

0 votes

Quelle est la différence entre len et len ?

9 votes

Len() est une commande du langage, __len__() est une méthode sur les types de conteneurs.

35 votes

Len() est une fonction globale, intégrée ; __len__() est une méthode que l'objet peut implémenter. len(foo) finit généralement par appeler foo.__len__().

54voto

rz. Points 7261

La façon de prendre la longueur d'un élément pour lequel cela a un sens (une liste, un dictionnaire, un tuple, une chaîne de caractères, ...) est d'appeler len sur elle.

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

La raison de cette syntaxe "étrange" est qu'en interne python traduit len(object) en object.__len__() . Cela s'applique à tout objet. Ainsi, si vous définissez une classe et qu'il est logique qu'elle ait une longueur, définissez simplement un objet __len__() sur celui-ci, puis on peut appeler len sur ces instances.

26voto

Tim Lesher Points 3056

Il suffit d'utiliser len(arr) :

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

24voto

David Locke Points 4419

La meilleure façon d'obtenir la longueur d'un objet python est de le passer en argument à la fonction len fonction. En interne, python essaiera alors d'appeler la fonction spéciale __len__ de l'objet qui a été transmis.

24voto

UncleZeiv Points 9033

Python utilise dactylographie du canard : il ne se soucie pas de ce qu'un objet es pour autant qu'il dispose de l'interface appropriée pour la situation en question. Lorsque vous appelez la fonction intégrée len() sur un objet, vous appelez en fait 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 conceptuellement une séquence.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X