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


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.