En Python , les éléments suivants sont-ils le seul moyen d'obtenir le nombre d'éléments?
arr.__len__()
Si oui, pourquoi l'étrange syntaxe?
En Python , les éléments suivants sont-ils le seul moyen d'obtenir le nombre d'éléments?
arr.__len__()
Si oui, pourquoi l'étrange syntaxe?
Réponses:
my_list = [1,2,3,4,5]
len(my_list)
# 5
La même chose fonctionne pour les tuples:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
Et les chaînes, qui ne sont en réalité que des tableaux de caractères:
my_string = 'hello world'
len(my_string)
# 11
Cela a été fait intentionnellement de cette façon afin que les listes, tuples et autres types de conteneurs ou itérables n'aient pas tous besoin d'implémenter explicitement une .length()
méthode publique , à la place, vous pouvez simplement vérifier len()
tout ce qui implémente la __len__()
méthode `` magique '' .
Bien sûr, cela peut sembler redondant, mais les implémentations de vérification 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 .length()
méthode tandis qu'un autre type utilise une .length
propriété, tandis qu'un autre encore utilise .count()
. Le fait d'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 pas comme des listes d'éléments peuvent toujours être vérifiés en 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 fonctionnels de programmation.
lengths = map(len, list_of_containers)
La façon dont vous prenez une longueur de tout ce qui a du sens (une liste, un dictionnaire, un tuple, une chaîne, ...) est de l'appeler len
.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
La raison de la syntaxe "étrange" est que python se traduit len(object)
en interne object.__len__()
. Cela s'applique à tout objet. Donc, si vous définissez une classe et qu'il est logique qu'elle ait une longueur, définissez simplement une __len__()
méthode dessus et alors on peut invoquer len
ces instances.
Python utilise la dactylographie de canard : il ne se soucie pas de ce que l'objet est , tant qu'il a l'interface appropriée pour la situation. 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 une liste complète des interfaces, consultez ici: http://docs.python.org/reference/datamodel.html#basic-customization
La meilleure façon d'obtenir la longueur d'un objet python est de le passer en argument à la len
fonction. En interne, python tentera alors d'appeler la __len__
méthode spéciale de l'objet qui a été transmis.
Utilisez simplement len(arr)
:
>>> import array
>>> arr = array.array('i')
>>> arr.append('2')
>>> arr.__len__()
1
>>> len(arr)
1
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 la arr.shape
hauteur et la largeur de retour
len(list_name)
La fonction prend list comme paramètre et appelle la __len__()
fonction list .
Python suggère aux utilisateurs d'utiliser len()
au lieu de __len__()
pour plus de cohérence, tout comme d'autres gars l'ont dit. Cependant, il existe d'autres avantages:
Pour certains types comme intégré dans list
, str
, bytearray
et ainsi de suite, la mise en œuvre de Cython len()
prend un raccourci. Il renvoie directement le ob_size
dans une structure C, ce qui est plus rapide que d'appeler __len__()
.
Si vous êtes intéressé par de tels détails, 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.