web-dev-qa-db-ja.com

Pythonで配列の長さを取得するにはarr .__ len __()が望ましい方法ですか?

Python で、要素数を取得する唯一の方法は次のとおりですか?

arr.__len__()

もしそうなら、なぜ奇妙な構文?

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

タプルについても同じことが言えます。

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

そして文字列は、実際には単に文字の配列です。

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

これは 意図的にこの方法で行われた ので、リスト、タプル、その他のコンテナタイプはすべてpublic .length()メソッドを明示的に実装する必要はありません'magic' len()メソッドを実装しているものすべての__len__()をチェックしてください。

確かに、これは冗長に思えるかもしれませんが、長さチェックの実装は同じ言語の中でさえもかなり異なる可能性があります。あるコレクション型が.length()メソッドを使用し、別の型が.lengthプロパティを使用し、別の型が.count()を使用することは珍しくありません。言語レベルのキーワードを使用すると、これらすべてのタイプのエントリポイントが統一されます。ですから、あなたが要素のリストであるとは考えていないかもしれないオブジェクトでも、まだ長さをチェックすることができます。これには、文字列、キュー、ツリーなどが含まれます。

len()の機能的性質は、プログラミングの機能的スタイルにも適しています。

lengths = map(len, list_of_containers)
1193
Soviut

意味のある長さ(リスト、辞書、Tuple、stringなど)を取るには、lenを呼び出します。

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

"奇妙な"構文の理由は、内部的にpythonがlen(object)object.__len__()に変換するからです。これはどのオブジェクトにも当てはまります。ですから、何らかのクラスを定義していて、それが長さを持つことが理にかなっている場合は、それに__len__()メソッドを定義するだけで、それらのインスタンスでlenを呼び出すことができます。

49
rz.

Pythonオブジェクトの長さを取得するための望ましい方法は、それをlen関数への引数として渡すことです。内部的には、pythonは渡されたオブジェクトの特別な__len__メソッドを呼び出そうとします。

23
David Locke

Pythonは アヒルタイピング を使います:オブジェクトであるかどうかは気にしません当面の状況に適したインタフェースを持っています。オブジェクトに対して組み込み関数len()を呼び出すときは、実際にはその内部の__len__メソッドを呼び出しています。カスタムオブジェクトはこのインタフェースを実装することができ、たとえオブジェクトが概念的にシーケンスでなくてもlen()は答えを返します。

インターフェースの完全なリストについては、こちらをご覧ください。 http://docs.python.org/reference/datamodel.html#basic-customization

23
UncleZeiv

Len(arr)を使ってください。

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

配列の長さを取得するには、前の回答で提案したようにlen(arr)を使用できます。 2次元配列の大きさが必要な場合は、arr.shapeを使って高さと幅を返すことができます。

9
Ahmed Abobakr

len(list_name)関数はlistをパラメータとして受け取り、listの__len__()関数を呼び出します。

7
Harun ERGUL

Pythonは他の人が言ったように、一貫性のためにlen()の代わりに__len__()を使うことを勧めています。しかし、他にもいくつかの利点があります。

liststrbytearrayなどの組み込み型の場合、len()のCython実装はショートカットを使用します。 Cの構造体で直接ob_sizeを返すので、__len__()を呼び出すよりも高速です。

このような詳細に興味があるなら、Luciano Ramalhoによる "Fluent Python"という本を読むことができます。そこにはたくさんの興味深い詳細があります、そしてあなたがより深くPythonを理解するのを助けるかもしれません。

1
JOHNKYON