Soru Python'daki köşeli ayraç ve nokta notasyonları arasındaki fark nedir?


Javascript arka planından geliyorum (özelliklerin her ikisine de erişilebildiği yerler) . ve [] notasyon), lütfen beni affet, ama tam olarak, Python'daki ikisi arasındaki fark nedir?

Denememden şunu görüyor [] her zaman, her ikisi de bir list veya set ve belirli bir anahtardaki değeri almak için dictionary. Bu doğru mu, eğer değilse, ne zaman . Python'da mı?


18
2018-05-15 01:52


Menşei


(Temel olarak) [] dizinlere erişmek ve listeler oluşturmak için. kullanım . nesne yöntemlerine erişmek için - RafaelC
@RafaelCardoso: . sadece niteliklere değil, sadece özniteliklere yöneliktir. - too honest for this site


Cevaplar:


Nokta operatörü herhangi bir nesnenin niteliklerine erişmek için kullanılır. Örneğin, karmaşık bir sayı

>>> c = 3+4j

(diğerleri arasında) iki özelliği vardır real ve imag:

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

Bunların yanı sıra, bir yöntemi vardır conjugate(), aynı zamanda bir özelliktir:

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

Bir koleksiyonun üyelerine erişmek için köşeli ayraç notasyonu kullanılır. Bu, ister sözlükte ister başka bir haritalamada olsun:

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

... ya da bir liste veya dize gibi bir dizinin durumunda indeksle:

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

Ayrıca, bu koleksiyonların da özellikleri vardır:

>>> 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>

... ve yine, yukarıdaki durumlarda, bu öznitelikler yöntem olarak gerçekleşir.

Tüm nesnelerin bazı özellikleri olsa da, tüm nesnelerin üyeleri yoktur. Örneğin, karmaşık numaramızın bir üyesine erişmek için köşeli parantez gösterim kullanmaya çalışırsak c:

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

... bir hata alırız (bu da mantıklıdır, çünkü karmaşık bir sayının üye olması için açık bir yol yoktur).

Nasıl olduğunu tanımlamak mümkün [] ve . Özel yöntemler kullanarak kullanıcı tanımlı bir sınıfa erişme __getitem__() ve __getattr__() sırasıyla. Bunun nasıl yapılacağını açıklamak, bu sorunun kapsamı dışındadır, ancak bu konuda daha fazla bilgi edinebilirsiniz. Python Eğitimi.


17
2018-05-15 02:02



Ayrıca, kullanıcı tanımlı sınıflardaki bu işleçlerin davranışını uygulayarak davranışlarınızı geçersiz kılabilirsiniz. __getitem__ (için []) ve __getattr__ (için .) yöntemler. - augurar
@augurar iyi nokta; Buna kısa bir paragraf ekledim. - Zero Piraeus
Dokümanlardan: Özellik referansları ve Abonelikler - wwii


. özniteliklere erişmek için kullanılır (yöntemler dahil). [] Tipik olarak çeşitli konteyner nesnelerinin içeriği olan "öğeler" olarak adlandırılan öğelere erişmek için kullanılır.

JavaScript, bu iki şeyi birbirinden ayırmaz, ancak Python yapar. Sen haklısın [] Verilere bir liste veya dikte erişmek için kullanılır. . Örneğin, gibi yöntemlere erişmek için kullanılır list.append ve dict.update. Diğer nesnelerdeki diğer verilere erişmek için de kullanılır; Örneğin, düzenli ifade nesneleri derlenmiş pattern regex desenini tutan öznitelik rx.pattern).

Genel olarak, bu kongre [] Nesnenin ne kadar veya ne çeşit veri tutacağını önceden bilmediğiniz "açık uçlu" veri depolama için kullanılır; . Nesnenin "doğa tarafından" sahip olduğu ve önceden tanımlanmış bir isimle erişilebildiği spesifik veriler için daha yaygın kullanılır. Örneğin, bir liste olarak bir şeyin size içinde ne olduğunu söylemediğini (sizin için kullandığınız []), ancak size ekleyebileceğinizi (ve kullandığınız ekleme yöntemine erişebildiğinizi söyler) .).

Python ve JavaScript arasındaki bu önemli fark, Python'da, her ikisinin de davranışlarıdır. . ve [] nesne tarafından özelleştirilebilir. Yani obj.foo veya obj[foo]eğer özel bir şey yapabilir obj onlar için kendi davranışlarını tanımlayan bir nesnedir. Bunu kendi amaçları için kullanan çeşitli özel tipler vardır.


5
2018-05-15 01:59





[] liste veya sözlük gibi bir kapsayıcıdır.

. Bir nesnenin ve modüllerin üyesidir. Bir yöntem, üye verileri veya öznitelik olabilir.

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

>>> xs.count(4)
3

>>> xs[1]
7

3
2018-05-15 01:59





Aslında, Python bir anahtarı kapatmak için köşeli parantezleri kullanır. Listeler için, bu bir tamsayı (işaretsiz) indeks veya bir dilimdir. Dicts için bu, string, tuple vb. Gibi bir (inaktif) nesne veya hatta bir tamsayıdır (singe ve unsigned). Bu, benzer veya hatta özdeş bir sözdizimi kullanan birçok başka dile doğrudan iletilir.

. C ++, C, Java, JavaScript, vb. gibi bir nesnenin üyelerine erişmek için kullanılır. Öğelerine erişmek için nokta-sözdizimini kullanmasına izin veren bir sözlük sınıfı yazmak oldukça basittir. Ancak, bunun için anahtarların geçerli bir Python tanımlayıcısı olması gerekir. (letter { letter | digit |_}. Ancak, bu çok yaygın değildir.

Bir küme dahili olarak sipariş edilmediğinden ve bir "anahtar" ile "bir değer" arasında bir ilişki olmadığı için indekslemeyi desteklemez. Bir liste için "indeksi" almazsınız, ancak "bir indeks için değer elde edersiniz". Bir dict için bu benzerdir, ancak "index" daha esnektir. Ancak, dict dilimlemeye izin vermez ve (set gibi) sırasızdır.

Sidenote: Python, üyelerini organize etmek için bir nesne için dahili bir dict kullanır. Sadece konsolu dene:

class MyClass:
    def myfunc(self):
        pass

print(MyClass.__dict__)

Bu sınıfın tüm özniteliğini (name: value) alacaksınız. Girişi için not myfunc.


0
2018-05-15 02:10