ال

المقارنات في Python

7 تمارين

نبذة عن المقارنات

عامل المقارنة في Python (ويُسمى أيضًا العامل العلائقي في Python) ينظر إلى قيم طرفَي العملية، ويُرجع قيمة منطقية True أو False إذا تحقق شرط comparison أو لم يتحقق.

يوضّح الجدول أدناه أكثر عوامل المقارنة شيوعًا في 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. لمزيد من التفاصيل (الموسّعة)، راجع مقارنات القيم في توثيق 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 (ليس عددًا) تكون False. ومن الآثار الجانبية المُربكة لتعريف NaN في Python أن NaN لا تُقارن أبدًا على أنها مساوية لـ NaN. وإذا كنت فضوليًا لمعرفة سبب تعريف NaN بهذه الطريقة في Python، فإن منشور Stack Overflow حول 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)

مقارنة أنواع البيانات الحاوية

تُقارن أنواع البيانات الحاوية (مثل 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 يُقيَّم مرة واحدة فقط. وفي كلتا الحالتين، لا يُقيَّم z على الإطلاق عندما يتبيّن أن x < y تساوي False. ويُسمى هذا غالبًا short-circuit evaluation: إذ يتوقف التقييم إذا كانت قيمة الصدق للتعبير قد حُدّدت بالفعل.

يدعم Short circuiting عدد من العوامل المنطقية والدوال، وكذلك تسلسل المقارنات في Python. وعلى خلاف كثير من لغات البرمجة الأخرى، بما فيها C وC++ وC# وJava، فإن التعبيرات المتسلسلة مثل a < b < c في Python لها تفسير رياضي وأسبقية تقليدية.

>>> 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 لمزيد من التفاصيل حول هذه القاعدة.


# 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> in <soup> إلى True إذا كان <fish> عضوًا في <soup> (أي إذا كان <fish> مجموعة فرعية من <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

يمكن تخصيص سلوك المقارنة للكائنات عبر تنفيذ rich comparison methods. لمزيد من المعلومات، راجع درس Python: الأصناف، وأصناف Python والدوال السحرية (Dan Bader)، وأسماء الدوال الخاصة.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم المقارنات

التدريب مقفل

افتح 4 تمارين إضافية لممارسة المقارنات