পাইথনে ক্যারেট অপারেটর (^) কী করবে?


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
পূর্ণসংখ্যার জন্য, সি তে একই জিনিস এটি করে ^ _-
মাইক ডিসিমোন

15
এফওয়াইআই, অজগর শেল থেকে আপনি টাইপ করতে পারেনhelp('^')
শেঠ

5
নোট করুন যে এটি ভাসমানদের জন্য অদ্ভুত আচরণ করে না (এটি কেবল ভাসমানদের সাথে কাজ করে না!)। এছাড়াও লক্ষ করুন যে **এক্সপেনসিয়েশন অপারেটরটি সন্ধান করতে গিয়ে অনেকে দুর্ঘটনাক্রমে এটিকে চালিত করে ।
মাইক গ্রাহাম

3
@ শেঠ: help('^')আমার পাইথন ২.6.১ (অ্যাপল বিল্ড) এ কিছুই করে না। @ এস.লট: আপনি যখন "সম্পূর্ণ কভার্ড" বলছেন তখন কি আপনার এই অর্থ ( ডকস.পিথন.আর. / রেফারেন্স / ))? ধারণাটির সাথে অপরিচিত কারও জন্য কিছুটা বিচ্ছিন্ন বলে মনে হচ্ছে ...
ক্রিস্টোফিড

3
সকলকে ধন্যবাদ, আমি অনুমান করি যদি আমি জানতাম যে এটি কিছুটা অপারেটর ছিল তবে আমি কোথায় কোথায় সন্ধান করতে হবে তা সঠিকভাবে জানতাম তবে আমি প্রশ্নটি করি নি, :) আপনার উত্তরগুলির জন্য ধন্যবাদ তারা সবাই সহায়ক ছিল এবং এখন আমি আরও কিছুটা জানি ! :)
ভেজে

উত্তর:


173

এটি খানিকটা XOR (একচেটিয়া OR)।

যদি অপারেন্ডগুলির মধ্যে একটি (এবং শুধুমাত্র একটি) সত্য হয় তবে এটি সত্য হয়।

প্রদর্শন করার জন্যে:

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

আপনার নিজস্ব উদাহরণের একটি ব্যাখ্যা করতে:

>>> 8^3
11

এই ভাবে চিন্তা করুন:

1000 # 8 (বাইনারি)
0011 # 3 (বাইনারি)
---- # প্রয়োগের XOR ('উল্লম্বভাবে')
1011 # ফলাফল = 11 (বাইনারি)

14
কিছুটা উদাহরণস্বরূপ উদাহরণে 1এটি পরিষ্কার করার জন্য উভয় সংখ্যা একই বিটযুক্ত থাকতে পারে 1 xor 1 = 0
মাইক গ্রাহাম

1
আমি যোগ করতে চেয়েছিলাম, 0bXএক্স আপনার বাইনারি যেখানে টাইপ করে আপনি বাইনারি সংখ্যা করতে পারেন । 0b0001, 0b0010ইত্যাদি ইত্যাদি তাই 0b1101 ^ 0b1110আপনাকে দেবে 0b0011(বা 3)।
জেফ

আমি মনে করি "যদি অপারেন্ডগুলির মধ্যে একটি (এবং কেবলমাত্র একজন) সত্যায়িত হয় (এটি মূল্যায়ন করে) তবে এটি সত্য হয়ে যায়" " সঠিক নয়, এটি একটি বুলিয়ান জোরের সংজ্ঞা কী হবে
জাভিয়ের কমবেল

42

এটি প্রয়োজন হিসাবে বস্তুর জন্য __xor__()বা __rxor__()পদ্ধতিটি আহ্বান করে , যা পূর্ণসংখ্যার ধরণের জন্য কিছুটা এক্সক্লুসিভ-বা করে।


4
পূর্ণসংখ্যা অপারেশনের বাইরে এটি কী করে তা নির্দেশ করার জন্য +1 ।
মাইক ডিসিমোন


8

সাধারণভাবে বলতে গেলে, প্রতীকটি ^হ'ল বা পদ্ধতিগুলির একটি ইনফিক্স সংস্করণ । চিহ্নের ডান এবং বামে যে কোনও উপাত্ত স্থাপন করা উচিত অবশ্যই এই কার্যকারিতাটি একটি সামঞ্জস্যপূর্ণ উপায়ে প্রয়োগ করতে হবে। পূর্ণসংখ্যার জন্য, এটি সাধারণ অপারেশন, তবে উদাহরণস্বরূপ টাইপের সাথে টাইপের জন্য ফাংশনের একটি অন্তর্নির্মিত সংজ্ঞা নেই :__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শুধুমাত্র , ^প্রতীক exponentiation মানে হবে।

In [16]: x = Foo(3)

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

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

ওহ, এটা কি সম্ভব ছিল? এবং আমরা সম্ভবত কীভাবে +অপারেটরটি কাজ করে তা পরিবর্তন করতে পারি ?
কে ডগ

হ্যাঁ, এইভাবে +সংখ্যার জন্য listঅন্য ধরণের ক্রিয়া (গাণিতিক সংযোজন) করার সময় প্রতীকটি একরকম ক্রিয়া (কনট্যাকটেশন) করতে সক্ষম হয় । সেক্ষেত্রে আপনি আপনার ক্লাসের পদ্ধতি __add__বা __radd__পদ্ধতিগুলিকে ওভাররাইড করবেন ।
ইলি

1
পার্শ্ব নোট হিসাবে __r*__, এগুলির (যেমন __rxor__বা __radd__) সংস্করণটি ইনফিক্স প্রতীকটির ডানদিকে উপস্থিত হওয়া যুক্তি থেকে আহ্বান করা হবে , এবং কেবল তখনই যদি বাম হাতের প্রতীকটির জন্য ফাংশনে কল কাজ না করে। আপনি মত মনে করতে পারেন try: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol), কিন্তু xorপাওয়া পোতা অপারেটরদের কোনো দ্বারা প্রতিস্থাপিত হতে পারে পাইথন তথ্য মডেল
ইলি

সুতরাং এর মানে হল যে আমি নিজের অপারেটরকে নৈপুণ্য intবজায় রাখতে পারি যা স্ট্রিংগুলির সাথে সম্মিলনকে অনুমতি দেয় ? মানুষ,
পাইথনটি

1
সুতরাং আপনি এর মতো কিছু বলতে পারেন (CompositionA | CompositionB) // CompositionCএবং এটির অর্থ কেবল "কম্পোজিশন এ প্লে করুন কম্পোজিশন বি এর পরে, একই সময়ে একই সাথে সমান্তরালে কম্পোজিশন সি বাজানো হবে।" একটি সুন্দর কোডের কথা বলুন!
ইলি

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.