Biểu tượng '@ =' trong Python là gì?


173

Tôi biết @là dành cho trang trí, nhưng những gì @=dành cho Python? Có phải nó chỉ đặt trước cho một số ý tưởng trong tương lai?

Đây chỉ là một trong nhiều câu hỏi của tôi trong khi đọc tokenizer.py.


1
Xem cset c553d8f72d65 ( gương GitHub ... dễ đọc hơn ) trong repo CPython.
Nick T

SymbolHound là một công cụ tìm kiếm có thể tìm kiếm trên các ký hiệu dấu chấm câu. Tuy nhiên, tìm kiếm trên @ = python hiện không trả về kết quả có liên quan, vì tài liệu Python 3.5 chứa '@' nhưng không phải là ví dụ về '@ =' ở bất cứ đâu. Tôi đã gửi cho SH một tin nhắn để giúp cải thiện điều đó. Python doc cũng có thể cải thiện.
smci

1
Kết hợp với := toán tử hải mã của Python 3.8, bạn sẽ có được cái được gọi là @:=toán tử hoa hồng gai. (Hoặc ở Nhật Bản, nó được gọi là nhà điều hành Elvis-walrus.)
Bob Stein

Câu trả lời:


185

Từ các tài liệu :

Các @(ở) nhà điều hành được thiết kế để được sử dụng cho phép nhân ma trận. Không có loại Python dựng sẵn nào thực hiện toán tử này.

Các @nhà điều hành đã được giới thiệu trong Python 3.5. @=là phép nhân ma trận theo sau là phép gán, như bạn mong đợi. Chúng ánh xạ tới __matmul__, __rmatmul__hoặc __imatmul__tương tự như cách ++=ánh xạ tới __add__, __radd__hoặc __iadd__.

Toán tử và lý do đằng sau nó được thảo luận chi tiết trong PEP 465 .


12
Điều đó giải thích tại sao đó là phiên bản mới nhất của tokenizer.py mà không phải là 3,4 tài liệu.
Octavia Togami

10
Này được đề cập trong tài liệu 3.5 - docs.python.org/3.5/reference/...docs.python.org/3.5/reference/...
jonrsharpe

Điều này có mâu thuẫn với các nhà trang trí Python không? Điều này không được thực hiện trong Python 2.n, phải không?
frankliuao

4
Điều này không xung đột với các nhà trang trí, bởi vì các nhà trang trí có thể không bao giờ được đi trước bởi một biểu thức và các toán tử nhị phân phải luôn được đi trước bởi một biểu thức.
đúng vào

58

@=@là các toán tử mới được giới thiệu trong phép nhân ma trận thực hiện Python 3.5 . Chúng có nghĩa là để làm rõ sự nhầm lẫn tồn tại cho đến nay với toán tử được sử dụng cho phép nhân phần tử hoặc nhân ma trận tùy thuộc vào quy ước được sử dụng trong thư viện / mã cụ thể đó. Kết quả là, trong tương lai, toán tử chỉ được sử dụng cho phép nhân phần tử.**

Như đã giải thích trong PEP0465 , hai toán tử đã được giới thiệu:

  • Một toán tử nhị phân mới A @ B, được sử dụng tương tự nhưA * B
  • Một phiên bản tại chỗ A @= B, được sử dụng tương tự nhưA *= B

Phép nhân ma trận so với phép nhân nguyên tố

Để nhanh chóng làm nổi bật sự khác biệt, cho hai ma trận:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • Phép nhân nguyên tố sẽ mang lại:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
    
  • Phép nhân ma trận sẽ mang lại:

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

Sử dụng trong Numpy

Cho đến nay, Numpy đã sử dụng quy ước sau:

Giới thiệu @toán tử làm cho mã liên quan đến phép nhân ma trận dễ đọc hơn nhiều. PEP0465 cho chúng ta một ví dụ:

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

Rõ ràng, việc thực hiện cuối cùng là dễ dàng hơn nhiều để đọc và giải thích như một phương trình.


11
Chỉ cần làm rõ: từ ví dụ đầu tiên của bạn, chúng tôi có thể nghĩ rằng @đã được thực hiện cho list, đó không phải là trường hợp.
Conliclicultor

1
@được liên kết với np.matmul, không np.dot. Hai cái tương tự nhưng không giống nhau.
Acumenus

@ABB, có lẽ bạn có thể cung cấp một ví dụ làm rõ sắc thái và đảm bảo câu trả lời đã hoàn tất?
benjaminmg trong

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.