Warum verwendet der Python-Code die Funktion len () anstelle einer Längenmethode?
Ich weiß, dass python hat eine len()
Funktion, die verwendet wird, um zu bestimmen, die Größe einer Zeichenfolge, aber ich Frage mich, warum es nicht eine Methode des string-Objekts.
Update
Ok, ich merkte, ich war Irre peinlich. __len__()
ist eigentlich eine Methode, die ein string-Objekt. Es scheint gerade seltsam zu sehen, objektorientierter code in Python unter Verwendung der len-Funktion auf string-Objekte. Außerdem ist es seltsam zu sehen __len__
wie der name anstatt nur len.
InformationsquelleAutor der Frage fuentesjr | 2008-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Saiten haben eine length-Methode:
__len__()
Des Protokolls in Python zu implementieren Sie diese Methode auf Objekte, die eine Länge und verwenden Sie die integrierte
len()
- Funktion, die Anrufe für Sie, ähnlich wie die Weise, die Sie umsetzen würden__iter__()
und verwenden Sie die integrierte initer()
- Funktion (oder über die Methode " hinter den kulissen für Sie) auf Objekte sind iterierbar.Sehen Die Emulation container-Typen für weitere Informationen.
Hier ist gut zu Lesen, auf das Thema Protokolle in Python: Python und das Prinzip der Geringsten Verwunderung
InformationsquelleAutor der Antwort Jonny Buchanan
Jim ' s Antwort auf diese Frage kann helfen; ich kopiere es hier. Zitieren Guido van Rossum:
InformationsquelleAutor der Antwort Federico A. Ramponi
Es ist ein
len
Methode:InformationsquelleAutor der Antwort unmounted
Python ist pragmatisch-Programmiersprache, und die Gründe für
len()
ist eine Funktion und keine Methode derstr
list
dict
etc. sind pragmatisch.Den
len()
eingebaute Funktion, sich direkt mit built-in-Typen: die CPython-Implementierung vonlen()
tatsächlich liefert den Wert derob_size
Feld in derPyVarObject
struct C , steht für eine beliebige variable-sized-built-in-Objekt im Speicher. Dies ist viel schneller als der Aufruf einer Methode-keine Attribut-lookup gemacht werden muss. Immer die Anzahl der Elemente in einer Auflistung ist ein allgemeiner Vorgang und muss effizient arbeiten, die für solche grundlegenden und vielfältigen Arten, wiestr
list
array.array
etc.Jedoch zur Förderung der Kohärenz bei der Anwendung
len(o)
um einen benutzerdefinierten Typ, Python rufto.__len__()
als fallback.__len__
__abs__
und alle anderen speziellen Methoden dokumentiert, die in der Python Daten Modell machen es einfach, um Objekte zu erstellen, die sich Verhalten wie die built-ins, ermöglichen die ausdrucksstark und sehr konsistente APIs nennen wir "Pythonic".Durch die Implementierung von speziellen Methoden Ihrer Objekte unterstützen kann, iteration, überlast-infix-Operatoren, verwalten Kontexte, in
with
blocks usw. Sie können sich die Daten-Modell als ein Weg, mit der Sprache Python als Rahmen, in dem die Objekte, die Sie erstellen können nahtlos integriert werden.Einen zweiten Grund, unterstützt durch Zitate von Guido van Rossum wie diese eineist, dass es einfacher ist zu Lesen und zu schreiben
len(s)
alss.len()
.Die notation
len(s)
ist konsistent mit unären Operatoren mit Präfix-notation, wieabs(n)
.len()
verwendet wird, weit mehr, als oftabs()
und Sie verdient es so einfach zu schreiben.Kann es auch einen historischen Grund: in der ABC-Sprache, die vorausgegangen Python (und war sehr einflussreich in seinem design), es war ein unärer operator geschrieben werden als
#s
was bedeutetelen(s)
.InformationsquelleAutor der Antwort Luciano Ramalho
InformationsquelleAutor der Antwort Alex Coventry
Können Sie auch sagen
Mit Python 2.7.3.
InformationsquelleAutor der Antwort SpanosAngelos
Nicht?
InformationsquelleAutor der Antwort Nick Stinemates
Gibt es einige tolle Antworten hier, und so bevor ich meine eigenen möchte ich hervorheben ein paar der Edelsteine (keine ruby Wortspiel beabsichtigt), die ich hier gelesen hab.
len
ist tatsächlich ein Objekt. Ruby, auf der anderen Seite, keine erste-Klasse-Funktionen. Also dielen
Funktion Objekt hat seine eigenen Methoden, mit denen Sie überprüfen können, durch ausführendir(len)
.Wenn Sie nicht wie die Art und Weise dies funktioniert in Ihrem eigenen code, es ist trivial für Sie zu re-implementieren Sie die Behälter mit Ihrem bevorzugten Methode (siehe Beispiel unten).
InformationsquelleAutor der Antwort Charles Addis