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


回答:


1229
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

それはして意図的にこの方法を行っているリスト、タプルや他のコンテナタイプまたはイテレート可能オブジェクトが明示的に公共実装するためのすべての必要はありませんでしたので、.length()この方法ではなく、あなただけ確認することができ、len()何もその道具「魔法」の__len__()方法。

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

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

lengths = map(len, list_of_containers)

8
len()は言語コマンドで、__ len __()はコンテナタイプのメソッドです。
2009

33
len()はグローバルな組み込み関数です。__len __()は、オブジェクトが実装できるメソッドです。len(foo)は通常、foo .__ len __()を呼び出します。
Tim Lesher、

13
len()を提供することにより、各コンテナは.length()メソッドを実装する必要がないと述べましたが、各タイプがlen()によって呼び出される__len __()メソッドを実装している場合、これはどのように違うのですか?異なるコンテナタイプはlen()によって異なる方法で処理されますか?
Simon B. Jensen、

10
@Simon:「すべてが.length()を実装する必要はありません」についてのビットは混乱を招きます。コンテナータイプは、長さを返すメソッドを実装する必要があります。ポイントは、それが標準化されたプロトコルであり、各タイプについて調べる必要があるアドホックな方法ではないということです。ダブルアンダースコアはこれを意味します。
カールマイヤー

16
Carl Meyerに同意します。パブリック.length()メソッドを「明示的に実装する必要はない」と言うのは誤解を招くものであり、その本質的な意味においては正しくありません。何でもlenを実装する必要があり、len関数を回避して、好きな名前の独自の長さメソッドをいつでも実装できます。だから私は本当にこれをグイドが世界を見る方法に合ういくつかの恣意的な奇妙さだと思っています。それはおそらく普遍的な推論とは何の関係もありません。
BT

52

意味のあるもの(リスト、ディクショナリ、タプル、文字列など)を呼び出す方法はlen、それを呼び出すことです。

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

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


23

Pythonはダックタイピングを使用します当面の状況に適したインターフェースを備えていれば、オブジェクト何であるかは問題ではありません。オブジェクトの組み込み関数len()を呼び出すと、実際にはその内部__len__メソッドが呼び出されます。カスタムオブジェクトはこのインターフェイスを実装でき、オブジェクトが概念的にシーケンスでない場合でも、len()は回答を返します。

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


23

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



10

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



1

Pythonは、他の人が言ったようlen()__len__()、一貫性のためではなく、ユーザーが使用することを推奨しています。ただし、他にもいくつかの利点があります。

内蔵されたようなタイプのいくつかのためにliststrbytearrayようにと、のCythonの実装では、len()ショートカットを取ります。を直接ob_sizeC構造体で返します__len__()。これは、を呼び出すよりも高速です。

このような詳細に興味がある場合は、Luciano Ramalhoの「Fluent Python」という本を読んでください。その中には多くの興味深い詳細があり、Pythonをより深く理解するのに役立つかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.