Python निम्नलिखित बुनियादी तुलना ऑपरेटरों को सपोर्ट करता है:
| ऑपरेटर | कार्य | विवरण |
|---|---|---|
> |
"इससे बड़ा" |
a > b तब True होता है जब a का मान b से सख्ती से बड़ा हो |
< |
"इससे छोटा" |
a < b तब True होता है जब a का मान b से सख्ती से छोटा हो |
== |
"इसके बराबर" |
a == b तब True होता है जब a का मान b के सख्ती से बराबर हो |
>= |
"इससे बड़ा या बराबर" |
a >= b तब True होता है जब a > b हो या a == b हो |
<= |
"इससे छोटा या बराबर" |
a <= b तब True होता है जब a < b हो या a == b हो |
!= |
"इसके बराबर नहीं" |
a != b तब True होता है जब a == b False हो |
is |
"पहचान" |
a is b और केवल तभी True होता है जब a और b एक ही ऑब्जेक्ट हों |
is not |
"पहचान का उलटा" |
a is not b तब True होता है जब a और b एक ही ऑब्जेक्ट न हों |
in |
"समावेश की जाँच" |
a in b तब True होता है जब a, b का सदस्य, उपसमुच्चय या एलिमेंट हो |
not in |
"समावेश की जाँच का उलटा" |
a not in b तब True होता है जब a, b का सदस्य, उपसमुच्चय या एलिमेंट न हो |
इन सभी की प्राथमिकता एक जैसी होती है (जो बूलियन ऑपरेशन की प्राथमिकता से ऊँची है, लेकिन अंकगणितीय या बिटवाइज़ ऑपरेशन की प्राथमिकता से नीची)।
अलग-अलग टाइप के ऑब्जेक्ट (संख्यात्मक टाइप को छोड़कर) डिफ़ॉल्ट रूप से कभी बराबर नहीं माने जाते।
किसी class के भिन्न इंस्टेंस भी बराबर नहीं माने जाते, जब तक कि वह class ऐसे विशेष रिच कम्पैरिज़न मेथड परिभाषित न करे जो object की डिफ़ॉल्ट तुलना का व्यवहार बदल दें।
rich comparisons के ज़रिए व्यवहार बदलना आगे के किसी अभ्यास में सिखाया जाएगा।
इस विषय पर (बहुत) अधिक जानकारी के लिए Python के डॉक्युमेंटेशन में वैल्यू की तुलना देखिए।
संख्यात्मक टाइप इस टाइप-मिलान नियम के (मुख्यतः) अपवाद हैं।
एक integer को float के बराबर माना जा सकता है (या एक octal को hexadecimal के बराबर), बशर्ते तुलना के लिए इनका अंतर्निहित रूपांतरण संभव हो।
Python की स्टैंडर्ड लाइब्रेरी के बाकी संख्यात्मक टाइप (complex, decimal, fractions) के लिए तुलना के ऑपरेटर वहाँ परिभाषित हैं जहाँ वे "समझ में आते हैं" (यानी जहाँ अंतर्निहित रूपांतरण से नतीजा नहीं बदलता), लेकिन अगर तुलना के लिए मूल ऑब्जेक्ट ठीक-ठीक रूपांतरित न हो सकें तो वे TypeError फेंकते हैं।
numeric conversion के लिए python जो नियम इस्तेमाल करता है, उनके बारे में अधिक जानकारी के लिए Python के डॉक्युमेंटेशन में अंकगणितीय रूपांतरण देखिए।
>>> import fractions
# A string cannot be converted to an int.
>>> 17 == '17'
False
# An int can be converted to float for comparison.
>>> 17 == 17.0
True
# The fraction 6/3 can be converted to the int 2
# The int 2 can be converted to 0b10 in binary.
>>> 6/3 == 0b10
True
# An int can be converted to a complex number with a 0 imaginary part.
>>> 17 == complex(17)
True
# The fraction 2/5 can be converted to the float 0.4
>>> 0.4 == 2/5
True
>>> complex(2/5, 1/2) == complex(0.4, 0.5)
True
किसी संख्या की NaN (संख्या नहीं) टाइप से कोई भी क्रम-तुलना False देती है।
Python में NaN की परिभाषा का एक उलझाने वाला नतीजा यह है कि NaN कभी NaN के बराबर नहीं होता।
>>> x = float('NaN')
>>> 3 < x
False
>>> x < 3
False
# NaN never compares equal to NaN
>>> x == x
False
संख्याओं के विपरीत, स्ट्रिंग (str) की तुलना शब्दकोशीय क्रम में होती है, और इसके लिए उनके अलग-अलग Unicode कोड पॉइंट काम में लिए जाते हैं (यानी str के हर कोड पॉइंट को बिल्ट-इन फंक्शन ord() में पास करने पर जो int मिलता है, वही)।
अगर दोनों स्ट्रिंग के सारे कोड पॉइंट मेल खाएँ और एक ही क्रम में हों, तो दोनों स्ट्रिंग बराबर मानी जाती हैं।
यह तुलना 'जोड़ी-दर-जोड़ी' होती है: पहला पहले से, दूसरा दूसरे से, वगैरह।
Python 3.x में str और bytes को सीधे न बदला जा सकता है, न उनकी तुलना की जा सकती है।
>>> 'Python' > 'Rust'
False
>>> 'Python' > 'JavaScript'
True
# Examples with Mandarin.
# hello < goodbye
>>> '你好' < '再见'
True
# ord() of first characters
>>> ord('你'), ord('再')
(20320, 20877)
# ord() of second characters
>>> ord('好'), ord('见')
(22909, 35265)
# And with Korean words.
# Pretty < beautiful.
>>> '예쁜' < '아름다운'
False
>>> ord('예'), ord('아')
(50696, 50500)
तुलना के ऑपरेटरों की शृंखला मनमाने ढंग से बनाई जा सकती है, यानी इन्हें किसी भी लंबाई के किसी भी संयोजन में इस्तेमाल किया जा सकता है।
ध्यान दीजिए कि किसी एक्सप्रेशन का मूल्यांकन left से right की ओर होता है।
उदाहरण के लिए, x < y <= z और x < y and y <= z बराबर हैं, बस इसमें y का मूल्यांकन सिर्फ़ एक बार होता है।
दोनों ही सूरतों में, जब x < y को False पाया जाता है, तब z का मूल्यांकन बिल्कुल भी नहीं होता।
इसे अक्सर short-circuit evaluation कहा जाता है, यानी अगर एक्सप्रेशन का सत्य मान पहले ही तय हो चुका हो, तो मूल्यांकन वहीं रुक जाता है।
Short circuiting को कई बूलियन ऑपरेटर, फंक्शन, और Python में तुलना की शृंखला भी सपोर्ट करती है।
C, C++, C# और Java समेत कई दूसरी प्रोग्रामिंग भाषाओं के विपरीत, Python में a < b < c जैसे जुड़े एक्सप्रेशन का पारंपरिक गणितीय अर्थ और प्राथमिकता होती है।
>>> x = 2
>>> y = 5
>>> z = 10
>>> x < y < z
True
>>> x < y > z
False
>>> x > y < z
False
ऑपरेटर is और is not ऑब्जेक्ट के मान के बजाय ऑब्जेक्ट की पहचान जाँचते हैं।
किसी ऑब्जेक्ट की पहचान बनने के बाद कभी नहीं बदलती, और उसे id() फंक्शन की मदद से पता किया जा सकता है।
<apple> is <orange> और केवल तभी True देता है जब id(<apple>) == id(<orange>) हो।
<apple> is not <orange> इसका उलटा देता है।
ये सिंगलटन होते हैं, इसलिए None और NotImplemented की तुलना हमेशा is और is not से ही करनी चाहिए।
इस परंपरा के बारे में और जानकारी के लिए Python के संदर्भ दस्तावेज़ों में वैल्यू की तुलना और PEP8 देखिए।
>>> my_fav_numbers = [1, 2, 3]
>>> your_fav_numbers = my_fav_numbers
>>> my_fav_numbers is your_fav_numbers
True
# The returned id will differ by system and python version.
>>> id(my_fav_numbers)
4517478208
# your_fav_numbers is only an alias pointing to the original my_fav_numbers object.
# Assigning a new name does not create a new object.
>>> id(your_fav_numbers)
4517478208
>>> my_fav_numbers is not your_fav_numbers
False
>>> my_fav_numbers is not None
True
>>> my_fav_numbers is NotImplemented
False
ऑपरेटर in और not in सदस्यता जाँचते हैं।
<fish> in <soup> तब True देता है जब <fish>, <soup> का सदस्य हो (यानी <fish>, <soup> का उपसमुच्चय हो या <soup> के अंदर मौजूद हो), वरना False देता है।
<fish> not in <soup> इसका उलटा यानी <fish> in <soup> का विपरीत लौटाता है।
स्ट्रिंग और बाइट्स टाइप के लिए, <name> in <fullname> और केवल तभी True होता है जब <name>, <fullname> की सबस्ट्रिंग हो।
# A set of lucky numbers.
>>> lucky_numbers = {11, 22, 33}
>>> 22 in lucky_numbers
True
>>> 44 in lucky_numbers
False
# A dictionary of employee information.
>>> employee = {'name': 'John Doe',
'id': 67826, 'age': 33,
'title': 'ceo'}
# Checking for the membership of certain keys.
>>> 'age' in employee
True
>>> 33 in employee
False
>>> 'lastname' not in employee
True
# Checking for substring membership
>>> name = 'Super Batman'
>>> 'Bat' in name
True
>>> 'Batwoman' in name
False
इस अभ्यास में आप Blackjack के कुछ नियम लागू करेंगे, जैसे कि यह गेम कैसे खेला जाता है और कैसे स्कोर किया जाता है।
नोट : इस अभ्यास में A का मतलब इक्का, J का मतलब गुलाम, Q का मतलब बेगम, और K का मतलब बादशाह है।
जोकर हटा दिए जाते हैं।
एक मानक फ्रेंच-सूट वाली 52 पत्तों की गड्डी मानी जाती है, लेकिन अधिकतर संस्करणों में खेलने के लिए कई गड्डियाँ मिलाकर फेंटी जाती हैं।
Blackjack में यह हर खिलाड़ी पर निर्भर करता है कि इक्के की वैल्यू 1 होगी या 11 अंकों की (इस पर आगे बात करेंगे)।
फेस कार्ड (J, Q, K) 10 अंकों के गिने जाते हैं, और बाकी हर कार्ड की वैल्यू उसकी "पिप" (संख्यात्मक) वैल्यू के बराबर होती है।
card पैरामीटर वाला value_of_card(<card>) फंक्शन बनाइए।
यह फंक्शन दी गई कार्ड स्ट्रिंग की संख्यात्मक वैल्यू लौटाना चाहिए।
चूँकि इक्का कई वैल्यू ले सकता है (1 या 11), इस फंक्शन को अभी के लिए इक्के वाले कार्ड की वैल्यू 1 तय करनी चाहिए।
आगे आप एक फंक्शन बनाएँगे जो मौजूदा हैंड को देखकर इक्के वाले कार्ड की वैल्यू तय करेगा।
>>> value_of_card('K')
10
>>> value_of_card('4')
4
>>> value_of_card('A')
1
card_one और card_two पैरामीटर वाला higher_card(<card_one>, <card_two>) फंक्शन बनाइए।
स्कोर करने के लिए J, Q और K की वैल्यू 10 होती है।
यह फंक्शन लौटाना चाहिए कि स्कोर के लिए किस कार्ड की वैल्यू अधिक है।
अगर दोनों कार्डों की वैल्यू बराबर हो, तो दोनों लौटाइए।
दोनों कार्ड लौटाने के लिए return स्टेटमेंट में कॉमा का इस्तेमाल किया जा सकता है:
# Using a comma in a return creates a Tuple. Tuples will be covered in a later exercise.
>>> def returning_two_values(value_one, value_two):
return value_one, value_two
>>> returning_two_values('K', '3')
('K', '3')
इक्का कई वैल्यू ले सकता है, इसलिए इस काम के लिए हम A कार्डों की वैल्यू 1 मान लेंगे।
>>> higher_card('K', '10')
('K', '10')
>>> higher_card('4', '6')
'6'
>>> higher_card('K', 'A')
'K'
जैसा कि पहले बताया गया, इक्के की वैल्यू 1 या 11 अंकों की हो सकती है। खिलाड़ी 21 के स्कोर के जितना करीब हो सके उतना करीब पहुँचने की कोशिश करते हैं, लेकिन 21 से ऊपर नहीं जाते (इसी को "बस्ट" होना कहते हैं)।
card_one और card_two पैरामीटर वाला value_of_ace(<card_one>, <card_two>) फंक्शन बनाइए। ये पैरामीटर उन दो कार्डों की जोड़ी हैं जो इक्का मिलने से पहले हैंड में मौजूद होते हैं।
आपके फंक्शन को तय करना होगा कि आने वाले इक्के की वैल्यू 1 होगी या 11, और वही वैल्यू लौटानी होगी।
याद रखिए: इक्के सहित हैंड की वैल्यू 21 से ऊपर जाए बिना जितनी अधिक हो सके उतनी होनी चाहिए।
संकेत: अगर हैंड में पहले से इक्का है, तो आने वाले इक्के की वैल्यू 1 होगी।
>>> value_of_ace('6', 'K')
1
>>> value_of_ace('7', '3')
11
अगर किसी खिलाड़ी को पहले दो कार्ड के रूप में इक्का (A) और कोई दस-कार्ड (10, K, Q या J) मिलता है, तो खिलाड़ी का स्कोर 21 होता है।
इसे blackjack हैंड कहते हैं।
card_one और card_two पैरामीटर वाला is_blackjack(<card_one>, <card_two>) फंक्शन बनाइए। ये दो कार्डों की जोड़ी हैं।
तय कीजिए कि दो-कार्ड वाला हैंड blackjack है या नहीं, और अगर है तो बूलियन True लौटाइए, वरना False।
नोट : स्कोर की गणना कई तरीकों से की जा सकती है। लेकिन अगर हो सके, तो हम चाहेंगे कि आप हैंड की वैल्यू जोड़ने के बजाय यह जाँचें कि हैंड में कोई इक्का और कोई दस-कार्ड है या नहीं (या किसी निश्चित स्थान पर है)।
>>> is_blackjack('A', 'K')
True
>>> is_blackjack('10', '9')
False
अगर हैंड के पहले दो कार्डों की वैल्यू समान हो (जैसे दो छक्के, या एक Q और एक K), तो खिलाड़ी उन्हें दो अलग-अलग हैंड मानने का फैसला कर सकता है।
इसे "जोड़ियाँ बाँटना" कहते हैं।
card_one और card_two पैरामीटर वाला can_split_pairs(<card_one>, <card_two>) फंक्शन बनाइए। ये दो कार्डों की जोड़ी हैं।
तय कीजिए कि इस दो-कार्ड वाले हैंड को दो जोड़ियों में बाँटा जा सकता है या नहीं।
अगर हैंड को बाँटा जा सकता है, तो बूलियन True लौटाइए, वरना False लौटाइए।
>>> can_split_pairs('Q', 'K')
True
>>> can_split_pairs('10', 'A')
False
जब बाँटे गए शुरुआती दो कार्डों का कुल 9, 10 या 11 अंक हो, तो खिलाड़ी अपने शुरुआती दाँव के बराबर एक अतिरिक्त दाँव लगा सकता है। इसे "दाँव दुगना करना" कहते हैं।
card_one और card_two पैरामीटर वाला can_double_down(<card_one>, <card_two>) फंक्शन बनाइए। ये दो कार्डों की जोड़ी हैं।
तय कीजिए कि दो-कार्ड वाले हैंड का दाँव दुगना किया जा सकता है या नहीं, और अगर हो सकता है तो बूलियन True लौटाइए, वरना False।
>>> can_double_down('A', '9')
True
>>> can_double_down('10', '2')
False
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।