पायथन में कार्यवाहक संचालक (^) क्या करता है?


111

मैं आज अजगर में कार्यवाहक ऑपरेटर के पार चला गया और इसे आज़मा रहा था, मुझे निम्न आउटपुट मिला:

>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>

यह 8 पर आधारित लगता है, इसलिए मैं किसी प्रकार के बाइट ऑपरेशन का अनुमान लगा रहा हूं? मैं इस खोज साइटों के बारे में बहुत कुछ पता नहीं लगा सकता, क्योंकि यह तैरने के लिए अजीब तरह से व्यवहार करता है, क्या किसी के पास इस ऑपरेटर के लिए कोई लिंक है या क्या आप इसे यहाँ समझा सकते हैं?


4
पूर्णांक के लिए, यह वही बात करता है जो C. ^ _- में होता है
माइक डेसिमोन

15
FYI करें, अजगर खोल से, आप टाइप कर सकते हैंhelp('^')
सेठ

6
ध्यान दें कि यह तैरने के लिए अजीब तरह से व्यवहार नहीं करता है (यह सिर्फ तैरने के साथ काम नहीं करता है!)। यह भी ध्यान दें कि कई लोग गलती से तलाश कर रहे हैं **, प्रतिपादक ऑपरेटर।
माइक ग्राहम

3
@ सेठ: help('^')मेरे पाइथन 2.6.1 (ऐप्पल बिल्ड) में कुछ भी नहीं है। @ S.Lott: क्या आप इसका मतलब यह है ( docs.python.org/reference/… ) जब आप कह रहे हैं "पूरी तरह से कवर"। अवधारणा से अपरिचित किसी व्यक्ति के लिए थोड़ा विरल लगता है ...
क्रिस्टोफ डी

3
सभी को धन्यवाद, मुझे लगता है कि अगर मुझे पता था कि यह एक बिटवाइज़र ऑपरेटर है, तो मुझे पता है कि मुझे कहाँ देखना है, लेकिन मुझे पता नहीं था, इसलिए सवाल :) आपके सभी उत्तर के लिए धन्यवाद वे प्रत्येक सहायक थे और अब मुझे थोड़ा और पता है ! :)
फ्राँ

जवाबों:


173

यह एक बिटवेअर XOR (एक्सक्लूसिव OR) है।

यह सच होता है अगर ऑपरेंड्स में से कोई एक (और केवल एक) सच का मूल्यांकन करता है।

प्रदर्शित करना:

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1

अपने स्वयं के उदाहरणों में से एक को समझाने के लिए:

>>> 8^3
11

इस तरह से इसके बारे में सोचो:

1000 # 8 (बाइनरी)
0011 # 3 (बाइनरी)
---- # APPLY XOR ('लंबवत')
1011 # परिणाम = 11 (बाइनरी)

14
एक और अधिक उदाहरण के उदाहरण 1में यह स्पष्ट करने के लिए दोनों संख्याओं को एक ही बिट में शामिल किया जा सकता है 1 xor 1 = 0
माइक ग्राहम

1
मैं जोड़ना चाहता था, 0bXजहाँ X आपका बाइनरी है, वहां टाइप करके आप बाइनरी नंबर कर सकते हैं । 0b0001, 0b0010आदि, तो, 0b1101 ^ 0b1110आपको 0b0011(या 3) देंगे ।
जेफ

मुझे लगता है कि "यह सच होता है अगर एक (और केवल एक) ऑपरेंड का (मूल्यांकन) सच हो।" यह सटीक नहीं है, यह एक बुलियन
एक्सोर

42

यह आवश्यकतानुसार वस्तु __xor__()या __rxor__()विधि को आमंत्रित करता है , जो पूर्णांक प्रकारों के लिए एक बिटवाइस अनन्य-या करता है।


4
पूर्णांक ऑपरेशन के बाहर, यह वास्तव में क्या करता है, यह इंगित करने के लिए +1 ।
माइक डीसिमोन


8

सामान्यतया, प्रतीक या विधियों ^का एक infix संस्करण है । प्रतीक के दाईं और बाईं ओर जो भी डेटा प्रकार रखे गए हैं उन्हें इस फ़ंक्शन को संगत तरीके से लागू करना चाहिए। पूर्णांकों के लिए, यह सामान्य ऑपरेशन है, लेकिन उदाहरण के लिए प्रकार के साथ फ़ंक्शन के लिए अंतर्निहित परिभाषा नहीं है :__xor____rxor__XORfloatint

In [12]: 3 ^ 4
Out[12]: 7

In [13]: 3.3 ^ 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-858cc886783d> in <module>()
----> 1 3.3 ^ 4

TypeError: unsupported operand type(s) for ^: 'float' and 'int'

पाइथन के बारे में एक साफ बात यह है कि आप इस व्यवहार को अपनी कक्षा में रोक सकते हैं। उदाहरण के लिए, कुछ भाषाओं में ^प्रतीक का अर्थ है घातांक। आप इस तरह से कर सकते हैं, सिर्फ एक उदाहरण के रूप में:

class Foo(float):
    def __xor__(self, other):
        return self ** other

तब ऐसा कुछ काम करेगा, और अब, केवल उदाहरणों के लिएFoo , ^प्रतीक का अर्थ होगा घातांक।

In [16]: x = Foo(3)

In [17]: x
Out[17]: 3.0

In [18]: x ^ 4
Out[18]: 81.0

वाह, क्या यह भी संभव था? और क्या हम शायद बदल सकते हैं कि +ऑपरेटर कैसे काम करता है?
K DawG

हाँ, यह है कि कैसे सांख्यिक प्रकारों के लिए एक और प्रकार की क्रिया (गणितीय जोड़) करते हुए +प्रतीक एक प्रकार की क्रिया करने में सक्षम है list। उस स्थिति में, आप अपनी कक्षा में __add__या __radd__विधियों को ओवरराइड करेंगे ।
ely

1
एक साइड नोट के रूप में, __r*__इन (जैसे __rxor__या __radd__) के संस्करण को इन्फिक्स प्रतीक के दाहिने हाथ की तरफ दिखाई देने वाले तर्क से आमंत्रित किया जाएगा , और केवल तभी जब बाएं हाथ के प्रतीक के लिए फ़ंक्शन पर कॉल काम नहीं करता है। आप इसे पसंद कर सकते हैं try: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol), लेकिन पायथन डेटा मॉडलxor में किसी भी उपलब्ध infix ऑपरेटर द्वारा प्रतिस्थापित किया जा सकता है ।
ely

तो इसका मतलब है कि मैं अपने खुद के ऑपरेटर को तैयार कर सकता हूं जो intतार के साथ संयोजन की अनुमति देता है ? आदमी, अजगर मेरे सोचने के तरीके से जटिल है
K DawG

1
तो आप ऐसा कुछ कह सकते हैं (CompositionA | CompositionB) // CompositionCऔर इसका मतलब सिर्फ यह होगा "रचना बी के बाद रचना ए, इस बीच समानांतर में एक ही समय में रचना सी भी खेल रहे हैं।" कोड के एक सुंदर टुकड़े के बारे में बात करो!
Ely

3

जब आप ^ऑपरेटर का उपयोग करते हैं , तो पर्दे के पीछे विधि __xor__कहा जाता है।

a^bके बराबर है a.__xor__(b)

इसके a ^= bबराबर, a = a.__ixor__(b)(जहाँ उपयोग के माध्यम से कहा जाता है, लेकिन इसका कोई अस्तित्व नहीं है) के बराबर (जहाँ पर __xor__इसका उपयोग बैकबैक के रूप में किया __ixor__जाता ^=है)।

सिद्धांत रूप में, __xor__इसके कार्यान्वयन के लिए पूरी तरह से क्या है। पायथन में सामान्य उपयोग के मामले हैं:

  • सेट का सममितीय अंतर (दो सेटों में से एक में मौजूद सभी तत्व)

डेमो:

>>> a = {1, 2, 3}
>>> b = {1, 4, 5}
>>> a^b
{2, 3, 4, 5}
>>> a.symmetric_difference(b)
{2, 3, 4, 5}
  • दो पूर्णांकों के बिट्स के लिए बिटवाइज नॉन-इक्वल

डेमो:

>>> a = 5
>>> b = 6
>>> a^b
3

स्पष्टीकरण:

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