شرح دالتي any() و all() في بايثون مع أمثلة عملية واضحة

دقائق القراءة: 6
شرح دالتي any و all في لغة بايثون مع أمثلة برمجية تطبيقية

مقدمة: لماذا نستخدم any() وall() في بايثون؟

عند كتابة البرامج بلغة Python نحتاج كثيراً إلى التحقق مما إذا كان عنصر واحد على الأقل داخل كائن قابل للتكرار يحقق شرطاً معيناً، أو ما إذا كانت جميع العناصر تحقق هذا الشرط. هنا تظهر فائدة الدالتين any() وall()، إذ تقدمان أسلوباً مختصراً وواضحاً وأكثر أناقة من كتابة سلاسل طويلة من الشروط.

في هذا المقال ستتعرّف إلى آلية عمل الدالتين، والفرق بينهما، وكيفية استخدامهما مع القيم المنطقية والسلاسل النصية ومجموعات الشروط المتعددة، مع أمثلة عملية سهلة الفهم.

فهم القيم المنطقية في Python

قبل استخدام any() وall()، من المهم فهم كيف تتعامل Python مع القيم المنطقية. يمكن تمرير أي كائن إلى الدالة bool() لمعرفة ما إذا كانت قيمته المنطقية True أو False.

بوجه عام:

  • القيمة None تُقيَّم على أنها False.
  • السلاسل النصية الفارغة مثل "" تُقيَّم على أنها False.
  • القوائم الفارغة وباقي الكائنات القابلة للتكرار إذا كانت فارغة تُقيَّم على أنها False.
  • العدد 0 بجميع تمثيلاته مثل 0 و0.0 و0j يُقيَّم على أنه False.
  • أي قيمة غير صفرية أو أي كائن غير فارغ يُقيَّم غالباً على أنه True.
# truth value of None is False
print(bool(None))
# Output False

# truth value of an empty string ("") is False
print(bool(""))
# Output False

# truth value of an empty list (or any iterable) is False
print(bool([]))
# Output False

# truth value of 0 {int (0), float (0.0) and complex (0j)} is False
print(bool(0))
# Output False

ما هي الدالة any() في بايثون؟

تُستخدم الدالة any() لمعرفة ما إذا كان هناك عنصر واحد على الأقل داخل كائن قابل للتكرار يمتلك قيمة منطقية تساوي True.

صيغة استخدام any()

any(iterable)
  • تعيد True إذا كانت قيمة bool(x) تساوي True لعنصر واحد على الأقل داخل iterable.
  • تعيد False إذا كان الكائن القابل للتكرار فارغاً.

بعبارة أبسط، إذا كان لديك مجموعة قيم وتريد التأكد من أن واحدة منها فقط صحيحة أو غير فارغة أو غير صفرية، فإن any() هي الخيار المناسب.

أمثلة بسيطة على الدالة any()

list_1 = [0, 0, 0, 1, 0, 0, 0, 0]
# any(a list with at least one non-zero entry) returns True
print(any(list_1))
# Output True

list_2 = [0j, 0, 0, 0.0, 0, 0, 0.0, 0]
# any(a list of zeros) returns False
print(any(list_2))
# Output False

list_3 = [True, False, False]
# any(a list with at least one True value) returns True
print(any(list_3))
# Output True

list_4 = ["", "", "code more"]
# any(a list with at least one non-empty string) returns True
print(any(list_4))
# Output True

list_5 = ["", "", ""]
# any(a list of empty strings) returns False
print(any(list_5))
# Output False

استخدام any() للتحقق من وجود أرقام داخل سلسلة نصية

من الاستخدامات العملية الشائعة للدالة any() فحص ما إذا كانت السلسلة النصية تحتوي على رقم واحد على الأقل.

خطوات التنفيذ

  1. المرور على كل حرف داخل السلسلة النصية.
  2. استدعاء الدالة isdigit() على كل حرف.
  3. إذا وُجد حرف واحد على الأقل يُمثّل رقماً، فستُعيد any() القيمة True.

يمكن تنفيذ ذلك بكفاءة عبر List Comprehension لإنشاء قائمة من القيم المنطقية.

# List Comprehension
[output_expression for every_item in an_iterable]

# In essence,
# Loop through the iterable, do something on each item
# and return the result of the operation.
my_string = "coding**is**cool**345"
are_there_digits = [char.isdigit() for char in my_string]
print(any(are_there_digits))
# Output True

في المثال السابق، تحتوي السلسلة my_string على الأرقام 345، لذلك تُعيد any() القيمة True.

print(are_there_digits)
# Output [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True]

استخدام any() للتحقق من وجود حروف داخل سلسلة نصية

يمكن تطبيق الفكرة نفسها لمعرفة ما إذا كانت السلسلة النصية تحتوي على أحرف أبجدية. في هذه الحالة نستخدم الدالة isalpha().

my_string = "***456278)))"
is_letter = [char.isalpha() for char in my_string]
print(any(is_letter))
# Output False

بما أن السلسلة لا تحتوي على أي حروف، فستكون النتيجة False.

print(is_letter)
# Output [False, False, False, False, False, False, False, False, False, False, False, False]

استخدام any() مع شروط متعددة بطريقة تشبه العامل المنطقي or

إذا كان لديك عدد من الشروط وتريد تنفيذ أمر ما عند تحقق شرط واحد على الأقل، فإن any() تمنحك أسلوباً أنظف من كتابة سلسلة طويلة باستخدام العامل or.

توضيح استخدام الدالة any في بايثون مع عدة شروط منطقية

بدلاً من كتابة الشروط بهذه الصورة:

if c1 or c2 or ... or cN:
    # DO THIS
else:
    # DO THIS

يمكنك جمع الشروط داخل قائمة أو tuple ثم تمريرها إلى any():

conditions = [c1, c2, ..., c_N]
if any(conditions):
    # DO THIS
else:
    # DO THIS

هذه الطريقة مفيدة جداً عندما يكون عدد الشروط كبيراً أو يتم توليدها ديناميكياً داخل البرنامج.

ما هي الدالة all() في بايثون؟

على عكس any()، تُستخدم الدالة all() للتحقق مما إذا كانت جميع العناصر داخل الكائن القابل للتكرار تُقيَّم على أنها True.

صيغة استخدام all()

all(iterable)
  • تعيد True إذا كانت قيمة bool(x) تساوي True لكل عنصر داخل iterable.
  • تعيد True أيضاً إذا كان الكائن القابل للتكرار فارغاً.
  • تعيد False إذا وُجد عنصر واحد فقط قيمته المنطقية False.

استخدام all() للتحقق من أن جميع المحارف حروف

لنفترض أن لدينا سلسلة نصية ونريد التأكد من أن كل محارفها حروف فقط. سنستخدم isalpha() مع all().

my_string = "coding**is**cool"
are_all_letters = [char.isalpha() for char in my_string]
print(all(are_all_letters))
# Output False

print(are_all_letters)
# Output [True, True, True, True, True, True, False, False, True, True, False, False, True, True, True, True]

النتيجة كانت False لأن السلسلة تحتوي على الرمز *، وهو ليس حرفاً أبجدياً.

استخدام all() للتحقق من أن جميع المحارف أرقام

إذا كانت السلسلة تحتوي فقط على أرقام، فإن استخدام all() مع isdigit() سيُعيد True.

my_string = "56456278"
are_all_digits = [char.isdigit() for char in my_string]
print(all(are_all_digits))
# Output True

print(are_all_digits)
# Output [True, True, True, True, True, True, True, True]

استخدام all() مع شروط متعددة بطريقة تشبه العامل المنطقي and

إذا كنت تحتاج إلى تنفيذ إجراء عند تحقق جميع الشروط، فإن all() تمثل بديلاً مرتباً لسلسلة الشروط المرتبطة بالعامل and.

توضيح استخدام الدالة all في بايثون مع مجموعة شروط منطقية

بدلاً من الصياغة التقليدية:

if c1 and c2 and ... and cN:
    # DO THIS
else:
    # DO THIS

يمكن كتابة الشروط بطريقة أكثر اختصاراً:

conditions = [c1, c2, ..., c_N]
if all(conditions):
    # DO THIS
else:
    # DO THIS

هذا النمط مفيد خصوصاً عند التعامل مع التحقق من المدخلات، أو صلاحيات المستخدم، أو اكتمال عدة متطلبات قبل تنفيذ خطوة معيّنة.

الفرق بين any() وall() في بايثون

الدالة متى تعيد True؟ حالة الكائن الفارغ
any() عند تحقق عنصر واحد على الأقل تعيد False
all() عند تحقق جميع العناصر تعيد True

هذا الفرق مهم جداً، خاصة عند التعامل مع القوائم الفارغة. لذلك يجب دائماً الانتباه إلى سلوك كل دالة قبل استخدامها في منطق البرنامج.

أفضل الممارسات عند استخدام any() وall()

  • استخدم any() عندما يكفي تحقق شرط واحد فقط.
  • استخدم all() عندما يكون نجاح العملية متوقفاً على تحقق جميع الشروط.
  • يمكن تمرير generator expression بدلاً من بناء قائمة كاملة لتحسين الأداء في بعض الحالات.
  • راجع دائماً سلوك الدالتين مع القيم الفارغة لتجنب النتائج غير المتوقعة.

الخلاصة التقنية

تُعد الدالتان any() وall() من الأدوات الصغيرة ذات التأثير الكبير في كتابة كود نظيف ومقروء في Python. الأولى مثالية للتحقق من وجود حالة صحيحة واحدة على الأقل، بينما الثانية مناسبة عندما يتطلب المنطق البرمجي تحقق كل الشروط دون استثناء. من الناحية العملية، استخدامهما لا يجعل الكود أقصر فقط، بل يجعله أيضاً أوضح وأسهل في الصيانة، وهو ما ينعكس مباشرة على جودة التطبيقات البرمجية وقابليتها للتطوير.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *