web-dev-qa-db-ja.com

Pythonの角括弧とドット表記の違いは何ですか?

私はJavascriptのバックグラウンドから来ています(プロパティは.[]の両方の表記法を介してアクセスできます)ので、許してください、しかし正確には、Pythonの2つの違いは何ですか?

私の実験から、listまたはsetのインデックスを取得し、dictionaryの特定のキーから値を取得するために、[]を常に使用する必要があるようです。これは正しいですか?そうでない場合は、Pythonで.をいつ使用しますか?

26
Startec

ドット演算子は、オブジェクトの属性にアクセスするために使用されます。たとえば、複素数

>>> c = 3+4j

(特に)2つの属性realimagを持っています:

>>> c.real
3.0
>>> c.imag
4.0

それらと同様に、メソッドconjugate()があり、これも属性です。

>>> c.conjugate
<built-in method conjugate of complex object at 0x7f4422d73050>
>>> c.conjugate()
(3-4j)

角括弧表記は、コレクションのメンバーにアクセスするために使用されます。辞書または他のマッピングの場合、それはキーによるものであるかどうか:

>>> d = {'a': 1, 'b': 2}
>>> d['a']
1

...またはリストや文字列のようなシーケンスの場合はインデックスによる:

>>> s = ['x', 'y', 'z']
>>> s[2]
'z'
>>> t = 'Kapow!'
>>> t[3]
'o'

これらのコレクションには、個別に属性もあります。

>>> d.pop
<built-in method pop of dict object at 0x7f44204068c8>
>>> s.reverse
<built-in method reverse of list object at 0x7f4420454d08>
>>> t.lower
<built-in method lower of str object at 0x7f4422ce2688>

...また、上記の場合、これらの属性はメソッドです。

すべてのオブジェクトには属性がありますが、すべてのオブジェクトにメンバーがあるわけではありません。たとえば、角括弧表記を使用して複素数cのメンバーにアクセスしようとすると:

>>> c[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'complex' object is not subscriptable

...エラーが発生します(複素数がメンバーを持つ明白な方法がないため、これは理にかなっています)。

特別なメソッド __getitem__() および __getattr__() を使用して、ユーザー定義クラスで[]および.アクセスがどのように機能するかを定義することができます。それぞれ。その方法の説明はこの質問の範囲外ですが、詳細については Pythonチュートリアル で読むことができます。

23
Zero Piraeus

[]は、リストや辞書などのコンテナのインデックスです。

.は、オブジェクトとモジュールのメンバーです。メソッド、メンバーデータ、または属性を指定できます。

>>> xs = [1, 7, 3, 4, 5, 4, 3, 4, 1]

>>> xs.count(4)
3

>>> xs[1]
7
3
chrisaycock

実際、Pythonは、角括弧を使用してキーを囲みます。リストの場合、これは整数(符号なし)インデックスまたはスライスです。一方、辞書の場合、これは文字列、タプルなど、または整数(単数および符号なし)でも、これは類似または同一の構文を使用する他の多くの言語にとっては簡単です。

.は、C++、C、Java、JavaScriptなどのオブジェクトのメンバーにアクセスするために使用されます。ドット構文を使用して要素にアクセスできる辞書クラスを作成するのは非常に簡単です。ただし、このためには、キーは有効である必要がありますPython identifier (letter { letter | digit |_}。ただし、これはあまり一般的ではありません。

セットは内部的に順序付けられておらず、「キー」と「値」の間に関係がないため、セットはインデックス付けをサポートしていません。リストの場合、「インデックスの取得」は行いませんが、「インデックスの値の取得」は行います。 dictではこれは似ていますが、「インデックス」はより柔軟です。ただし、dictはスライスを許可せず、(セットのように)順序付けされていません。

サイドノート:Pythonはオブジェクトの内部辞書を使用してメンバーを整理します。コンソールで試してください:

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

このクラスのすべての属性(名前:値)を取得します。 myfuncのエントリに注意してください。