Unter Python Ist die folgende Methode die einzige Möglichkeit, die Anzahl der Elemente zu ermitteln?
arr.__len__()
Wenn ja, warum dann die seltsame Syntax?
Unter Python Ist die folgende Methode die einzige Möglichkeit, die Anzahl der Elemente zu ermitteln?
arr.__len__()
Wenn ja, warum dann die seltsame Syntax?
my_list = [1,2,3,4,5]
len(my_list)
# 5
Das Gleiche gilt für Tupel:
my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5
Und Zeichenketten, die eigentlich nur Anordnungen von Zeichen sind:
my_string = 'hello world'
len(my_string)
# 11
Es war absichtlich auf diese Weise gemacht so dass Listen, Tupel und andere Containertypen oder Iterables nicht alle explizit eine öffentliche .length()
Methode, stattdessen können Sie einfach die len()
von allem, was die "Magie" implementiert __len__()
Methode.
Sicher, das mag redundant erscheinen, aber die Implementierungen der Längenprüfung können erheblich variieren, sogar innerhalb derselben Sprache. Es ist nicht ungewöhnlich, dass ein Sammlungstyp eine .length()
Methode, während ein anderer Typ eine .length
Eigenschaft, während eine andere die .count()
. Ein Schlüsselwort auf Sprachebene vereinheitlicht den Einstiegspunkt für alle diese Typen. So können auch Objekte, die Sie vielleicht nicht als Listen von Elementen betrachten, auf ihre Länge geprüft werden. Dazu gehören Zeichenketten, Warteschlangen, Bäume usw.
Der funktionelle Charakter der len()
eignet sich auch gut für funktionale Programmierungsstile.
lengths = map(len, list_of_containers)
Der Weg, wie man eine Länge von irgendetwas, für das das Sinn macht (eine Liste, ein Wörterbuch, ein Tupel, eine Zeichenkette, ...) nimmt, ist der Aufruf len
darauf.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
Der Grund für die "seltsame" Syntax ist, dass Python intern die len(object)
in object.__len__()
. Dies gilt für jedes Objekt. Wenn Sie also eine Klasse definieren und es sinnvoll ist, dass sie eine Länge hat, definieren Sie einfach eine __len__()
Methode auf und dann kann man die len
auf diese Instanzen.
Python verwendet Duckmäuserschreiben : Es kümmert sich nicht darum, was ein Objekt ist sofern es über die für die jeweilige Situation geeignete Schnittstelle verfügt. Wenn Sie die eingebaute Funktion len() für ein Objekt aufrufen, rufen Sie eigentlich dessen interne Methode __len__ auf. Ein benutzerdefiniertes Objekt kann diese Schnittstelle implementieren und len() wird die Antwort zurückgeben, auch wenn das Objekt konzeptionell keine Sequenz ist.
Eine vollständige Liste der Schnittstellen finden Sie hier: http://docs.python.org/reference/datamodel.html#basic-customization
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Ich habe eine Erklärung dazu unter Warum ist Pythons
len
Funktion schneller als die__len__
Methode?