6

変な質問かもしれません。しかし、リストの長さを取得したい場合、単に list.len() と言うことができず、リストを len() に渡してサイズを取得する必要があるのはなぜですか? そして、この len() は実際にはどこから来ているのでしょうか?

4

2 に答える 2

11

たくさんのアイテムの長さを手に入れることができます。リスト、ディクテーション、セット、その他のコレクション。したがって、内部的に呼び出すビルトインlen()type(obj).__len__(obj)は、長さを取得するための標準 API を提供します。

これらすべてのコレクション型に直接呼び出されるメソッドがあった場合、誰かが egまたはプロパティlen()を使用するカスタム コレクション クラスを作成するのを妨げるものは何もありません。.length().length

Python の作成者である Guido van Rossum の説明は次のとおりです

まず第一に、私はHCI の理由で選択len(x)しました (かなり後で来ました)。実際には 2 つの絡み合った理由があり、どちらも HCI です。x.len()def __len__()

(a) 一部の演算では、前置記法は後置記法よりも読みやすいだけです。前置記法 (および中置記法!) 演算には、数学で長い伝統があり、ビジュアルが数学者が問題について考えるのに役立つ記法が好まれます。式を簡単に書き直すことと、生の OO 表記を使用して同じことを行うことの不器用さをx*(a+b)比較してください。x*a + x*b

(b)何かの長さを要求していることlen(x)知っているというコードを読んだとき。これは、結果が整数であることと、引数がある種のコンテナであることの 2 つを示しています。逆に、 を読むときはx.len()、 x がインターフェイスを実装するか、標準のlen(). マッピングを実装していないクラスにget()orkeys() メソッドがある場合や、ファイルではない何かにメソッドがある場合に、時々混乱することがありますwrite()

同じことを別の言い方をすれば、「len」は組み込み 操作と見なされます。それを失うのはもったいない。そのつもりかどうかは定かではありませんが、「def len(self): ...」というのは確かに普通のメソッドに降格させたいようですね。私は強く-1です。

于 2012-11-12T13:33:59.353 に答える
5

それは実際に由来し__len__()ます:

In [15]: lis=[1,2,3]

In [16]: lis.__len__()
Out[16]: 3

object.__len__(self):

組み込み関数 len() を実装するために呼び出されます。オブジェクトの長さ、整数 >= 0 を返す必要があります。また、ゼロ以外の() メソッドを定義せず、そのlen () メソッドがゼロを返すオブジェクトは、ブール値のコンテキストでは false と見なされます。

于 2012-11-12T13:33:28.030 に答える