it-swarm.com.de

Ist arr .__ len __ () die bevorzugte Methode, um die Länge eines Arrays in Python zu ermitteln?

Ist in Python die folgende Methode die einzige, um die Anzahl der Elemente zu ermitteln?

arr.__len__()

Wenn ja, warum die seltsame Syntax?

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

Dasselbe gilt für Tupel:

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

Und Strings, die eigentlich nur Arrays von Zeichen sind:

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

Es wurde absichtlich auf diese Weise gemacht , damit Listen, Tupel und andere Containertypen nicht alle explizit eine öffentliche .length() -Methode implementieren mussten, sondern stattdessen einfach die len() -Methode überprüfen können. von allem, was die Methode 'magic' __len__() implementiert.

Sicher, dies mag redundant erscheinen, aber die Implementierungen für die Längenprüfung können erheblich variieren, auch innerhalb derselben Sprache. Es ist nicht ungewöhnlich, dass ein Auflistungstyp eine .length() -Methode verwendet, während ein anderer Typ eine .length -Eigenschaft verwendet, während ein anderer .count() verwendet. Mit einem Schlüsselwort auf Sprachebene wird der Einstiegspunkt für alle diese Typen vereinheitlicht. Daher können auch Objekte, die Sie möglicherweise nicht als Elementlisten betrachten, einer Längenprüfung unterzogen werden. Dazu gehören Zeichenfolgen, Warteschlangen, Bäume usw.

Die funktionale Natur von len() eignet sich auch gut für funktionale Programmierstile.

lengths = map(len, list_of_containers)
1197
Soviut

Die Art und Weise, wie Sie eine Länge von allem nehmen, was Sinn macht (eine Liste, ein Wörterbuch, ein Tupel, eine Zeichenfolge, ...), besteht darin, len darauf aufzurufen.

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 len(object) in object.__len__() übersetzt. Dies gilt für jeden Gegenstand. Wenn Sie also eine Klasse definieren, für die eine Länge sinnvoll ist, definieren Sie einfach eine __len__() -Methode, und dann kann man len für diese Instanzen aufrufen.

50
rz.

Die bevorzugte Methode zum Abrufen der Länge eines python -Objekts besteht darin, es als Argument an die len -Funktion zu übergeben. Intern versucht python dann, die spezielle __len__ -Methode des übergebenen Objekts aufzurufen.

23
David Locke

Python verwendet duck typing : Es ist egal, was ein Objekt ist , solange es die entsprechende Schnittstelle für hat die Situation zur Hand. Wenn Sie die integrierte Funktion len () für ein Objekt aufrufen, rufen Sie tatsächlich die interne Methode __len__ auf. Ein benutzerdefiniertes Objekt kann diese Schnittstelle implementieren, und len () gibt die Antwort zurück, 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

23
UncleZeiv

Benutze einfach len (arr):

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

sie können len(arr) verwenden, wie in den vorherigen Antworten vorgeschlagen, um die Länge des Arrays zu ermitteln. Wenn Sie die Abmessungen eines 2D-Arrays wünschen, können Sie arr.shape verwenden, um Höhe und Breite zurückzugeben

9
Ahmed Abobakr

Die Funktion len(list_name) nimmt die Liste als Parameter und ruft die Funktion __len__() der Liste auf.

7
Harun ERGUL

Python schlägt vor, dass Benutzer len() anstelle von __len__() verwenden, um die Konsistenz zu gewährleisten. Es gibt jedoch einige andere Vorteile:

Bei einigen integrierten Typen wie list, str, bytearray usw. ist die Cython-Implementierung von len() eine Verknüpfung. Es gibt direkt den ob_size in einer C-Struktur zurück, was schneller ist als der Aufruf von __len__().

Wenn Sie an solchen Details interessiert sind, können Sie das Buch "Fluent Python" von Luciano Ramalho lesen. Es enthält viele interessante Details und kann Ihnen helfen, Python tiefer zu verstehen.

1
JOHNKYON