Python'da '@ =' sembolü nedir?


173

@Dekoratörler için biliyorum , ama @=Python için ne var ? Sadece gelecekteki bir fikir için rezervasyon mu?

Bu, okurken birçok sorumdan sadece biri tokenizer.py.



SymbolHound noktalama işaretleri üzerinde arama yapabilen bir arama motorudur. Ancak @ = python'da arama yapmak şu anda ilgili sonuçları döndürmemektedir, çünkü Python 3.5 belgeleri '@' içerir, ancak hiçbir yerde '@ =' örneği içermez. Bunu iyileştirmek için SH'ye bir mesaj gönderdim. Python doc de gelişebilir.
smci

1
Python := 3.8'in mors operatörü ile birlikte, @:=dikenli gül operatörü olarak bilinen şeyi alırsınız . (Veya Japonya'da Elvis-walrus operatörü olarak bilinir.)
Bob Stein

Yanıtlar:


185

Gönderen belgeler :

@(At) operatör matris çoğalması için kullanılabilen amaçlanmıştır. Bu operatörü hiçbir yerleşik Python türü uygulamaz.

@Operatör Python 3.5 kullanılmaya başlandı. @=beklediğiniz gibi matris çarpımı ve ödevi izlemektir. Onlar için harita __matmul__, __rmatmul__ya __imatmul__nasıl benzer +ve +=eşleme __add__, __radd__ya __iadd__.

Operatör ve arkasındaki mantık PEP 465'te ayrıntılı olarak tartışılmaktadır .


12
Bu neden tokenizer.py'nin en son sürümünde olduğunu, ancak 3.4 dokümanda olmadığını açıklar.
Octavia Togami


Bunun Python dekoratörleriyle çatışması var mı? Bu Python 2.n'de uygulanmadı, değil mi?
frankliuao

4
Bu dekoratörler ile çelişmez, çünkü dekoratörler hiçbir zaman bir ifadeden önce gelmeyebilir ve ikili operatörler her zaman bir ifadeden önce gelmelidir.
sağa sola

58

@=ve @Python tanıtılan yeni operatörleri 3.5 gerçekleştiren matris çarpımı . Bunlar, *o kütüphane / kodda kullanılan kurala bağlı olarak, ya eleman bazında çarpma ya da matris çarpma için kullanılan operatör ile şimdiye kadar var olan karışıklığı açıklığa kavuşturmak içindir . Sonuç olarak, gelecekte, operatörün *sadece eleman-bazlı çarpma için kullanılması amaçlanmıştır.

PEP0465'te açıklandığı gibi , iki operatör tanıtıldı:

  • A @ BBenzer şekilde kullanılan yeni bir ikili operatörA * B
  • A @= BAynı şekilde kullanılan yerinde bir sürümA *= B

Matris Çarpma ve Eleman Bilge Çarpma

İki matris için farkı hızla vurgulamak için:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • Eleman-bazlı çarpma şunları sağlayacaktır:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
    
  • Matris çarpımı şu sonuçları verecektir:

    A @ B  =  [[1 * 11 + 2 * 13,   1 * 12 + 2 * 14],
               [3 * 11 + 4 * 13,   3 * 12 + 4 * 14]]
    

Numpy'de Kullanım

Şimdiye kadar Numpy aşağıdaki sözleşmeyi kullandı:

@Operatörün tanıtımı, matris çarpımlarını içeren kodun okunmasını çok daha kolay hale getirir. PEP0465 bize bir örnek veriyor:

# Current implementation of matrix multiplications using dot function
S = np.dot((np.dot(H, beta) - r).T,
            np.dot(inv(np.dot(np.dot(H, V), H.T)), np.dot(H, beta) - r))

# Current implementation of matrix multiplications using dot method
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)

# Using the @ operator instead
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

Açıkçası, son uygulamanın bir denklem olarak okunması ve yorumlanması çok daha kolaydır.


11
Sadece açıklama için: ilk örneğinizden, bunun @uygulandığını düşünebiliriz list, durum böyle değil.
Conchylicultor

1
@ile ilişkili np.matmul, değil np.dot. İkisi benzer fakat aynı değil.
Acumenus

@ABB, belki de nüansı açıklayan ve cevabın tamamlandığından emin olan bir örnek verebilir misiniz?
benjaminmgross

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.