তু

তুলনা মধ্যে Python

7টি অনুশীলনী

তুলনা সম্পর্কে

Python-এ একটি তুলনা অপারেটর (যাকে Python রিলেশনাল অপারেটরও বলা হয়) দুটি অপারেন্ডের মান দেখে এবং comparison শর্তটি পূরণ হয়েছে কি হয়নি তার ভিত্তিতে একটি বুলিয়ান True বা False রিটার্ন করে।

নিচের টেবিলে Python-এর সবচেয়ে বেশি ব্যবহৃত তুলনা অপারেটরগুলো দেখানো হয়েছে:

Operator Operation Description
> "এর চেয়ে বড়" a-এর মান b-এর চেয়ে কঠোরভাবে বড় হলে a > b হলো True
< "এর চেয়ে ছোট" a-এর মান b-এর চেয়ে কঠোরভাবে ছোট হলে a < b হলো True
== "সমান" a-এর মান b-এর কঠোরভাবে সমান হলে a == b হলো True
>= "এর চেয়ে বড় বা সমান" a-এর মান b-এর চেয়ে বড় অথবা সমান হলে a >= b হলো True
<= "এর চেয়ে ছোট বা সমান" a-এর মান b-এর চেয়ে ছোট বা সমান হলে a <= b হলো True
!= "সমান নয়" a == b যদি False হয়, তাহলে a != b হলো True
is "আইডেন্টিটি" a আর b একই অবজেক্ট হলে এবং কেবল তখনই a is b হলো True
is not "নেগেটেড আইডেন্টিটি" a আর b একই অবজেক্ট না হলে এবং কেবল তখনই a is not b হলো True
in "কন্টেইনমেন্ট টেস্ট" a, b-এর সদস্য, সাবসেট বা এলিমেন্ট হলে a in b হলো True
not in "নেগেটেড কন্টেইনমেন্ট টেস্ট" a, b-এর সদস্য, সাবসেট বা এলিমেন্ট না হলে a not in b হলো True

এদের সবার অগ্রাধিকার একই (যা বুলিয়ান অপারেশন-এর অগ্রাধিকারের চেয়ে বেশি, কিন্তু গাণিতিক বা বিটওয়াইজ অপারেশনের অগ্রাধিকারের চেয়ে কম)।

বিভিন্ন ডেটা টাইপের মধ্যে তুলনা

ভিন্ন টাইপের অবজেক্টগুলো (সংখ্যাসূচক টাইপ ছাড়া) ডিফল্টভাবে কখনোই সমান হিসেবে বিবেচিত হয় না। একটি class-এর অ-অভিন্ন ইনস্ট্যান্সও সমান হিসেবে বিবেচিত হবে না, যদি না class-টি এমন বিশেষ রিচ তুলনা মেথড ডিফাইন করে যা ডিফল্ট object তুলনার আচরণ কাস্টমাইজ করে। আরও (অনেক) বিস্তারিত জানতে Python ডকুমেন্টেশনের ভ্যালু তুলনা দেখুন।

সংখ্যাসূচক টাইপগুলো এই টাইপ মেলানোর নিয়মের (বেশিরভাগ ক্ষেত্রে) একটি ব্যতিক্রম। একটি integer, একটি float-এর সমান হিসেবে বিবেচিত হতে পারে (বা একটি octal, একটি hexadecimal-এর সমান), যতক্ষণ তুলনার জন্য টাইপগুলো অন্তর্নিহিতভাবে রূপান্তর করা যায়।

বাকি সংখ্যাসূচক টাইপগুলোর (কমপ্লেক্স, দশমিক, ভগ্নাংশ) ক্ষেত্রে, তুলনা অপারেটরগুলো সেখানেই ডিফাইন করা যেখানে সেগুলো "অর্থবহ" (যেখানে অন্তর্নিহিত রূপান্তর ফলাফল বদলায় না), কিন্তু অন্তর্নিহিত অবজেক্টগুলো তুলনার জন্য নির্ভুলভাবে রূপান্তর করা না গেলে একটি TypeError থ্রো করে। 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 (not a number) টাইপের সাথে যেকোনো ক্রমভিত্তিক তুলনা করলে ফল হয় False। Python-এ NaN-এর সংজ্ঞার একটি বিভ্রান্তিকর পার্শ্বপ্রতিক্রিয়া হলো, NaN কখনোই NaN-এর সমান হিসেবে বিবেচিত হয় না। Python-এ NaN কেন এভাবে ডিফাইন করা হয়েছে তা জানতে আগ্রহী হলে, আন্তর্জাতিক স্ট্যান্ডার্ড নির্ধারণকে ঘিরে লেখা এই NaN নিয়ে Stack Overflow পোস্টটি মজার একটি পাঠ।

>>> x = float('NaN')

>>> 3 < x
False

>>> x < 3
False

# NaN never compares equal to NaN
>>> x == x
False

স্ট্রিং তুলনা

স্ট্রিং (str) তুলনা করা হয় লেক্সিকোগ্রাফিক্যাল ক্রমে, তাদের প্রতিটি ইউনিকোড কোড পয়েন্ট ব্যবহার করে (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)

কন্টেইনার ডেটা টাইপের তুলনা

কন্টেইনার ডেটা টাইপগুলোও (lists, tuples, sets, dicts, ইত্যাদি) লেক্সিকোগ্রাফিক্যাল ক্রমে তুলনা করা হয়। দুটি কন্টেইনারের ডেটা এবং ডেটা টাইপ একই হলে তারা সমান (lists আর tuples-এর ক্ষেত্রে তাদের ক্রমও একই হতে হবে), অন্যথায় অসম।

>>> [1, 2] == [1, 2]
True

# But if the data is not in the same order, they are not equal.
>>> [2, 1] == [1, 2]
False

# The same holds true for tuples
>>> (3,4,5) == (5,4,3)
False

# Length is also compared
>>> [1, 2] < [1, 2, 3]
True

# Comparing dicts
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 18}
False

>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 19}
True

তুলনা চেইনিং

তুলনা অপারেটরগুলো ইচ্ছেমতো চেইন করা যায়। মনে রাখবেন, একটি এক্সপ্রেশনের ইভ্যালুয়েশন হয় 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() ফাংশন ব্যবহার করে তা জানা যায়।

id(<apple>) == id(<orange>) হলে এবং কেবল তখনই <apple> is <orange>-এর মান হয় True। <apple> is not <orange> তার বিপরীত ফল দেয়।

সিঙ্গলটন হওয়ার কারণে, None আর NotImplemented-এর সাথে অন্য আইটেমের তুলনা সবসময় is আর is not দিয়ে করা উচিত। এই কনভেনশন সম্পর্কে আরও বিস্তারিত জানতে Python রেফারেন্স ডকে ভ্যালু তুলনা ও PEP8 দেখুন।


# A list of favorite numbers.
>>> 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>, <soup>-এর সদস্য হলে (<fish>, <soup>-এর একটি সাবসেট হলে বা তার ভেতরে থাকলে) <fish> in <soup>-এর মান True, অন্যথায় False। <fish> not in <soup> হলো <fish> in <soup>-এর নেগেশন, বা তার বিপরীত।

স্ট্রিং আর bytes টাইপের ক্ষেত্রে, <name>, <fullname>-এর একটি সাবস্ট্রিং হলে এবং কেবল তখনই <name> in <fullname> হলো True।


# 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

অবজেক্টের তুলনার আচরণ rich comparison methods ইমপ্লিমেন্ট করে কাস্টমাইজ করা যায়। আরও তথ্যের জন্য দেখুন Python টিউটোরিয়াল: ক্লাস, Python ক্লাস ও ম্যাজিক মেথড (Dan Bader), এবং বিশেষ মেথডের নাম।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

তুলনা শিখুন

অনুশীলন লক করা আছে

তুলনা অনুশীলন করতে আরও 4টি অনুশীলনী আনলক করুন