🔢 دوال Tuple في بايثون: أدواتك الذكية للتعامل مع المجموعات الثابتة

مرحباً بك مجدداً في رحلة تعلم بايثون! 🎯 في الدروس السابقة، تعلمنا ما هي الـ Tuple وكيف ننشئها ونتعامل مع عناصرها. اليوم، سنتعمق أكثر ونتعرف على الدوال (Methods) المدمجة التي توفرها لنا بايثون خصيصاً للتعامل مع الـ Tuples.

هل تساءلت يوماً: "كيف أعرف كم مرة تكرر اسم في قائمة أسماء ثابتة؟" أو "كيف أعرف موقع عنصر معين داخل الـ Tuple؟" 🧐 الإجابة تكمن في الدرس اليوم!


📌 لماذا دوال Tuple محدودة؟

قبل أن نبدأ، من المهم أن نتذكر خاصية أساسية للـ Tuple: هي غير قابلة للتغيير (Immutable). هذا يعني أننا لا نستطيع إضافة عناصر جديدة أو حذف عناصر موجودة أو تغيير قيمها بعد الإنشاء. ⛔

نتيجة لهذه الخاصية، فإن عدد الدوال المدمجة للـ Tuple قليل جداً مقارنةً بالقوائم (Lists). معظم الدوال التي تغير المحتوى (مثل append(), remove(), sort()) غير موجودة هنا. ومع ذلك، تقدم لنا بايثون دالتين أساسيتين ومفيدتين جداً للاستعلام عن بيانات الـ Tuple دون تغييرها.


1. الدالة count(): عَدّ وتكرار العناصر 🔄

الدالة الأولى والأهم هي count(). كما يتضح من اسمها، وظيفتها هي عدّ عدد مرات ظهور قيمة معينة داخل الـ Tuple.

صيغة استخدام الدالة:

tuple_name.count(value)
  • tuple_name: اسم الـ Tuple الذي نريد البحث بداخله.
  • value: القيمة التي نريد معرفة عدد تكراراتها.

مثال عملي بسيط: لنفترض أن لدينا tuple لتسجيل درجات الطلاب في اختبار ما.

# تعريف tuple للدرجات
grades = (85, 90, 85, 78, 92, 85, 88)

# كم مرة حصل طالب على درجة 85؟
repeat_count = grades.count(85)
print(f"درجة 85 تكررت {repeat_count} مرات.")
# المخرجات: درجة 85 تكررت 3 مرات.

# ماذا عن درجة 100؟
print(grades.count(100))
# المخرجات: 0 (لأن القيمة غير موجودة)

💡 ملاحظة: الدالة ترجع الرقم 0 إذا كانت القيمة المطلوبة غير موجودة في الـ Tuple، ولا تسبب أي خطأ.


2. الدالة index(): البحث عن موقع العنصر 🎯

الدالة الثانية هي index(). وظيفتها هي العثور على الفهرس (الموقع) الأول لعنصر معين داخل الـ Tuple.

صيغة استخدام الدالة:

tuple_name.index(value, start, end)
  • tuple_name: اسم الـ Tuple.
  • value: القيمة التي نريد البحث عن موقعها (إلزامي).
  • start: الفهرس الذي نريد بدء البحث منه (اختياري).
  • end: الفهرس الذي نريد إنهاء البحث عنده (اختياري).

مثال عملي: لنستخدم نفس tuple الدرجات.

grades = (85, 90, 85, 78, 92, 85, 88)

# ما هو موقع أول ظهور للدرجة 85؟
position = grades.index(85)
print(f"أول ظهور للدرجة 85 هو عند الفهرس {position}.")
# المخرجات: أول ظهور للدرجة 85 هو عند الفهرس 0.

# البحث عن موقع الدرجة 78
print(grades.index(78))
# المخرجات: 3

ماذا لو كان العنصر غير موجود؟ ⚠️ إذا حاولت البحث عن قيمة غير موجودة، سترمي الدالة index() خطأً من نوع ValueError.

print(grades.index(100))  # سيتسبب هذا في خطأ!

الاستخدام المتقدم (مع start و end): ماذا لو أردنا البحث عن ظهور ثاني للدرجة 85؟ نبدأ البحث من الفهرس الذي يلي أول ظهور.

grades = (85, 90, 85, 78, 92, 85, 88)
first_position = grades.index(85)  # الفهرس 0
second_position = grades.index(85, first_position + 1)  # ابدأ البحث من الفهرس 1
print(f"الظهور الثاني للدرجة 85 هو عند الفهرس {second_position}.")
# المخرجات: الظهور الثاني للدرجة 85 هو عند الفهرس 2.

🧪 تدريب عملي: مشكلة من الحياة الواقعية

لنطبق ما تعلمناه على مشكلة بسيطة. تخيل أنك تدير متجراً صغيراً وتسجل الألوان الأساسية للسلع المباعة في يوم معين في tuple (لأن البيانات ثابتة بعد إغلاب اليوم).

# ألوان القمصان المباعة اليوم
sold_colors = ("Red", "Blue", "White", "Blue", "Black", "White", "Blue", "Red")

# السؤال 1: ما هو أكثر لون تم بيعه؟
blue_count = sold_colors.count("Blue")
red_count = sold_colors.count("Red")
white_count = sold_colors.count("White")
black_count = sold_colors.count("Black")

print(f"The blue color was sold {blue_count} times.")
print(f"The red color was sold {red_count} times.")
# ... وهكذا

# السؤال 2: متى تم بيع أول قميص أسود؟
try:
    first_black_sale = sold_colors.index("Black")
    print(f"The first black shirt was sold at {first_black_sale + 1}th sale of the day.")
except ValueError:
    print("No black shirt was sold today.")

💎 ملخص الدرس

  • الدوال (Methods) هي أدوات مدمجة في بايثون للتعامل مع الكائنات مثل الـ Tuple.
  • نظراً لأن الـ Tuple غير قابل للتغيير، فإن دواله محدودة.
  • الدالة count(value) تُرجع عدد مرات تكرار قيمة معينة داخل الـ Tuple.
  • الدالة index(value, start, end) تُرجع الفهرس الأول للقيمة المطلوبة.
  • استخدام index() على قيمة غير موجودة يسبب خطأ ValueError، لذا كن حذراً.

ماذا سنتعلم في الدرس القادم؟ 🚀

لقد أتقنت التعامل مع المجموعات الثابتة (Tuples)! ولكن ماذا عن المجموعات التي نريدها أن تكون فريدة تماماً ولا تسمح بتكرار العناصر؟ في الدرس القادم، سننتقل إلى عالم المجموعات (Sets) في بايثون. سنتعلم كيف ننشئها، وما هي خصائصها المميزة، وكيف يمكنها حل مشاكل مثل إزالة التكرارات من القوائم بسهولة! استعد لتعلم هيكل بيانات سريع وذكي.