สัญลักษณ์ '@ =' สำหรับใน Python คืออะไร


173

ฉันรู้ว่า@สำหรับนักตกแต่ง แต่@=สำหรับ Python มีอะไรบ้าง? มันเป็นเพียงการจองสำหรับแนวคิดในอนาคตบางอย่าง?

นี่เป็นเพียงหนึ่งในหลาย ๆ tokenizer.pyคำถามของฉันในขณะที่อ่าน



SymbolHound เป็นเครื่องมือค้นหาที่สามารถค้นหาสัญลักษณ์เครื่องหมายวรรคตอน อย่างไรก็ตามการค้นหาใน @ = pythonไม่ได้แสดงผลลัพธ์ที่เกี่ยวข้องในขณะนี้เนื่องจากเอกสาร Python 3.5 มี '@' แต่ไม่ใช่ตัวอย่างของ '@ =' ที่ใดก็ได้ ฉันส่งข้อความ SH เพื่อช่วยปรับปรุง Python doc ก็สามารถปรับปรุงได้เช่นกัน
smci

1
เมื่อรวมกับตัว:= ดำเนินการวอลรัสของ Python 3.8 คุณจะได้สิ่งที่เรียกว่าตัว@:=ดำเนินการกุหลาบหนาม (หรือในญี่ปุ่นเป็นที่รู้จักกันในนามผู้ดำเนินการ Elvis-walrus)
Bob Stein

คำตอบ:


185

จากเอกสาร :

ตัวดำเนินการ@(at) มีวัตถุประสงค์เพื่อใช้สำหรับการคูณเมทริกซ์ ไม่มีไพ ธ อนชนิดใด ๆ ในตัวที่ใช้ตัวดำเนินการนี้

@ผู้ประกอบการได้รับการแนะนำในหลาม 3.5 @=คือการคูณเมทริกซ์ตามด้วยการมอบหมายตามที่คุณคาดหวัง พวกเขาแมปไป__matmul__, __rmatmul__หรือ__imatmul__คล้ายกับวิธีการ+และ+=แมปไป__add__, หรือ__radd____iadd__

ผู้ประกอบการและเหตุผลที่อยู่เบื้องหลังมันจะกล่าวถึงในรายละเอียดในPEP 465


12
นั่นอธิบายว่าทำไมมันอยู่ใน tokenizer.py รุ่นล่าสุด แต่ไม่ใช่ 3.4 docs
Octavia Togami

10
สิ่งนี้ครอบคลุมในเอกสาร 3.5 ของ - docs.python.org/3.5/reference/ …และdocs.python.org/3.5/reference/…
jonrsharpe

สิ่งนี้ขัดแย้งกับเครื่องมือตกแต่งของ Python หรือไม่? สิ่งนี้ไม่ได้ถูกนำมาใช้ใน Python 2.n ใช่ไหม?
frankliuao

4
สิ่งนี้ไม่ได้ขัดแย้งนักตกแต่งเพราะผู้ตกแต่งอาจไม่เคยนำหน้าด้วยนิพจน์และผู้ประกอบการไบนารี่จะต้องนำหน้าด้วยนิพจน์เสมอ
rightfold

58

@= และ @ผู้ประกอบการใหม่ที่นำมาในหลาม3.5การดำเนินการคูณเมทริกซ์ พวกเขาตั้งใจที่จะชี้แจงความสับสนที่มีอยู่กับผู้ปฏิบัติงาน*ซึ่งใช้ทั้งในการคูณองค์ประกอบที่ชาญฉลาดหรือการคูณเมทริกซ์ขึ้นอยู่กับระเบียบที่ใช้ในห้องสมุด / รหัสนั้น ๆ เป็นผลให้ในอนาคตผู้ประกอบการ*มีวัตถุประสงค์เพื่อใช้สำหรับการคูณองค์ประกอบที่ชาญฉลาดเท่านั้น

ตามที่อธิบายไว้ในPEP0465ผู้ประกอบการทั้งสองได้รับการแนะนำ:

  • ตัวดำเนินการไบนารีใหม่ที่A @ Bใช้ในทำนองเดียวกันเป็นA * B
  • รุ่นในสถานที่A @= Bใช้ในทำนองเดียวกันเป็นA *= B

การคูณเมทริกซ์กับการคูณองค์ประกอบที่ชาญฉลาด

เพื่อเน้นความแตกต่างอย่างรวดเร็วสำหรับสองเมทริกซ์:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • การคูณองค์ประกอบที่ชาญฉลาดจะให้ผล:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
  • การคูณเมทริกซ์จะทำให้:

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

การใช้งานใน Numpy

จนถึงตอนนี้ Numpy ใช้การประชุมดังต่อไปนี้:

การแนะนำตัว@ดำเนินการทำให้โค้ดที่เกี่ยวข้องกับการคูณเมทริกซ์อ่านง่ายขึ้นมาก PEP0465 ให้ตัวอย่างแก่เรา:

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

เห็นได้ชัดว่าการใช้งานครั้งล่าสุดนั้นง่ายกว่ามากในการอ่านและตีความว่าเป็นสมการ


11
เพื่อความกระจ่าง: จากตัวอย่างแรกของคุณเราอาจคิดว่า@มีการนำไปใช้listซึ่งไม่ใช่กรณี
Conchylicultor

1
@มีความเกี่ยวข้องกับไม่np.matmul np.dotทั้งสองมีความคล้ายคลึงกัน แต่ไม่เหมือนกัน
คิวเมนตัส

@ABB คุณอาจให้ตัวอย่างที่ชัดเจนถึงความแตกต่างเล็กน้อยและทำให้มั่นใจว่าคำตอบนั้นสมบูรณ์หรือไม่
benjaminmgross

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.