पायथन में '@ =' प्रतीक क्या है?


173

मुझे पता @है कि सज्जाकार के लिए है, लेकिन @=पायथन में क्या है ? क्या यह केवल भविष्य के विचार के लिए आरक्षण है?

यह पढ़ने के दौरान मेरे कई सवालों में से एक है tokenizer.py।



SymbolHound एक खोज-इंजन है जो विराम चिह्नों पर खोज कर सकता है। हालाँकि , @ = python पर खोज करने से वर्तमान में प्रासंगिक परिणाम वापस नहीं आते हैं, क्योंकि Python 3.5 प्रलेखन में '@' शामिल हैं, लेकिन कहीं भी '@ =' का उदाहरण नहीं है। मैंने उसे सुधारने में मदद करने के लिए एक संदेश भेजा। पायथन डॉक में भी सुधार हो सकता है।
— Smci

1
अजगर 3.8 के := वालरस ऑपरेटर के साथ संयुक्त , आपको @:=कांटेदार गुलाब ऑपरेटर के रूप में जाना जाता है । (या जापान में इसे एल्विस-वालरस ऑपरेटर के रूप में जाना जाता है।)
— बॉब स्टीन

जवाबों:


185

से प्रलेखन :

@(पर) ऑपरेटर आव्यूह गुणन लिए इस्तेमाल किया जा करने का इरादा है। कोई भी अंतर्निहित पायथन प्रकार इस ऑपरेटर को लागू नहीं करता है।

@ऑपरेटर अजगर 3.5 में पेश किया गया था। @=जैसा कि आप अपेक्षा करेंगे मैट्रिक्स गुणा कार्य के बाद है। वे मैप करते हैं __matmul__, __rmatmul__या __imatmul__समान कैसे +और +=मैप करने के लिए __add__, __radd__या __iadd__।

पीईपी 465 में ऑपरेटर और इसके पीछे के तर्क पर विस्तार से चर्चा की गई है ।


12
यह बताता है कि क्यों यह tokenizer.py के नवीनतम संस्करण में है, लेकिन 3.4 डॉक्स के लिए नहीं।
— 18 अक्टूबर को ऑक्टेविया तोगामी

10

क्या यह पायथन सज्जाकारों के साथ संघर्ष है? यह पायथन 2. एन में लागू नहीं है, है ना?
— फ्रैंकलीआओ

4
यह डेकोरेटर सज्जाकार नहीं करता है, क्योंकि डेकोरेटर कभी भी एक अभिव्यक्ति से पहले नहीं हो सकता है, और बाइनरी ऑपरेटरों को हमेशा एक अभिव्यक्ति से पहले होना चाहिए।
— राइट

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 में उपयोग

अब तक, नेम्पी ने निम्नलिखित सम्मेलन का इस्तेमाल किया:

  • *ऑपरेटर (और अंकगणितीय ऑपरेटर सामान्य रूप में) पर तत्व के लिहाज से संचालन के रूप में परिभाषित किया गया ndarrays और पर मैट्रिक्स गुणा के रूप में numpy.matrix प्रकार।

  • dotndarrays के मैट्रिक्स गुणन के लिए विधि / फ़ंक्शन का उपयोग किया गया था

@ऑपरेटर का परिचय मैट्रिक्स कोड को शामिल कोड को पढ़ने में बहुत आसान बनाता है। 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, जो कि ऐसा नहीं है।
— at१०

1
@के साथ जुड़ा हुआ है np.matmul, नहीं np.dot। दोनों समान हैं लेकिन समान नहीं हैं।
— एक्यूमेनस

@ABB, शायद आप एक उदाहरण प्रदान कर सकते हैं जो स्पष्टता को स्पष्ट करता है और सुनिश्चित करता है कि उत्तर पूर्ण है?
— बेंजामिनमग्रॉस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.