PyDA Course
📖 درس 14 مبتدئ ⏱ 12 دقيقة ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub slicing · indexing · negative-index · reverse

تقسيم السلاسل النصية (Slicing)

استخرج الأجزاء الفرعية بإحكام من السلاسل باستخدام بناء جملة الشريحة.

🎯 ماذا ستتعلم:
  • استخراج الأجزاء الفرعية باستخدام s[start:end]
  • استخدام الخطوات السالبة والمؤشرات السالبة للوصول العكسي
  • فهم أنّ التقسيم حصري من الأعلى ولكنه شامل من الأسفل
  • استخدام s[::-1] لعكس السلسلة

لغةُ النوافذ

السلسلةُ تسلسلٌ، وشخصياتُها تقف في مراكزَ 0,1,2,,n10, 1, 2, \ldots, n-1. والشريحةُ طلبُ النافذة بين حدّين. العلامةُ string[start:stop:step] ، والاختلالُ الوحيدُ الذي يجب حفظُه أن start مشمولٌ وstop مستبعدٌ، القاعدةُ شبهُ المفتوحةِ التي علّمك إياها range:

s[a:b]=sasa+1sb1,s[a:b]=max(0,ba).s[a:b] = s_a s_{a+1} \cdots s_{b-1}, \qquad |s[a:b]| = \max(0, b - a).
python
text = "Python"
text[0:3]    # 'Pyt'
text[2:5]    # 'tho'
text[:4]     # 'Pyth'  (البداية الافتراضية 0)
text[3:]     # 'hon'   (النهاية الافتراضية آخر السلسلة)
text[:]      # 'Python' (نسخة كاملة)

إغفالُ حدٍّ يرسله إلى افتراضه: start إلى البداية، وstop إلى النهاية. ويأخذ text[:] كلَّ شيء، فيخدمَ أيضًا النسخةَ الكلاسيكيةَ بمفتاحٍ واحد.

المؤشرات السالبة: العدُّ من النهاية

ترقّم الرياضياتُ من صفرٍ عند المقدمة. وتضيف بايثون مسطرةً ثانية، تعدّ عكسيًّا من آخر حرفٍ بأعدادٍ سالبة:

python
text = "Python"
text[-1]     # 'n'  (آخر حرف)
text[-3:]    # 'hon' (آخر 3 أحرف)
text[:-2]    # 'Pyth' (كل ما عدا آخر 2)
text[-4:-1]  # 'tho'

المركزُ k-k هو الحرفُ ذو الرقم nkn - k من المقدمة. وطلبُ آخرِ ثلاثةِ أحرفٍ هو text[-3:] ، إيماءةٌ ذهنيةٌ صغيرةٌ تُقرأ بطلاقة: الثلاثةُ الأخيرة.

الخطوة: الخطوةُ الوثّابة

بارامترٌ ثالثٌ يضبط كم مركزًا تتخطّى بين انتقاءين:

python
text = "abcdefghij"
text[::2]    # 'acegi'   (كل حرفٍ ثانٍ)
text[1::2]   # 'bdfhj'   (كل حرفٍ ثانٍ ابتداءً من المركز 1)
text[::-1]   # 'jihgfedcba'  (معكوسة!)
text[::-2]   # 'jhfdb'   (كل حرفٍ ثانٍ معكوسًا)

خطوةٌ سالبةٌ تعكس اتجاهَ السير ، إنها حسابُ a,a+d,a+2d,a, a+d, a+2d, \ldots بقوةِ dd سالبة. والانعكاسُ المقدَّسُ [::-1] يستحق حفظًا واحدًا ثابتًا، لأنّ كل ما هو أدقّ بعده تنويعٌ.

الشريحة لا ترمي خطأً قط

فهرسةُ مركزٍ غيرِ موجودٍ ترمي IndexError. أمّا الشريحةُ فألطفُ ، تنكمش على المدى المتاح وتُرجع الموجودَ دون أن تطلب شيئًا في الطريق:

python
text = "hi"
text[0:100]   # 'hi'  (لا خطأ، تتوقف فقط عند النهاية)
text[100:200] # ''    (سلسلة فارغة)

هذا كرمٌ متعمّد: نافذةٌ تمتد وراءَ النهاية تنكمش ببساطةٍ. وحيث تكون الفهرسةُ دعوى، تكون الشريحةُ التماسًا.

الآلةُ نفسها تعزف القوائم

الشريحةُ ليست اختصاصَ السلاسل؛ إنها علامةُ التسلسلات. وتجيب القوائمُ على النداءات نفسها:

python
nums = [0, 1, 2, 3, 4, 5]
nums[1:4]     # [1, 2, 3]
nums[::-1]    # [5, 4, 3, 2, 1, 0]

كل ما تعلمته عن الحروف ينتقل إلى أيِّ مجموعةٍ مرتَّبةٍ ، وبعيدًا عن القراءة، تقبل القوائمُ إسنادَ شرائحَ حيث ترفضه السلاسل: يستبدل nums[1:3] = [9, 9] نافذةً في موضعها.

مثالٌ محلول: تشريحُ اسمِ ملفٍ

تعيشُ البرامجُ بين أسماءِ ملفاتٍ مثل "report_2026_summary.txt"، والتقطيعُ طريقةُ قراءتِها أجزاءً. الامتدادُ هو الأحرفُ الثلاثةُ الأخيرةُ:

python
filename = "report_2026_summary.txt"
extension = filename[-3:]     # 'txt'
stem      = filename[:-4]     # 'report_2026_summary'
print(stem, extension)        # report_2026_summary txt

يقرأ [-3:] من ثلاثِ مواضعَ قبلَ النهايةِ إلى النهاية ، آخرَ ثلاثةِ أحرفٍ. ويقرأ [:-4] من البدايةِ حتى أربعةِ مواضعَ قبلَ النهاية، وهو كلُّ ما قبلَ النقطةِ. وتظهر قاعدةُ الفترةِ شبهِ المفتوحةِ من جديد: يستبعد [:-4] الموضعَ n4n - 4، أي النقطةَ نفسَها، فلا يتسرّبَ ذيلُ .txt إلى الجذرِ أبدًا. قاعدةٌ واحدةٌ، كلا الطرفينِ.

وعكسُ قراءةِ الأجزاءِ قراءةُ الكلِّ: فحصُ المتناظرةِ سطرٌ واحدٌ من الأداةِ نفسِها:

python
word = "radar"
print(word == word[::-1])     # True

أخطاء شائعة

  • الخلط بين الفهرسة والشريحة. text[3] حرفٌ واحدٌ دعوى؛ وtext[3:4] حرفٌ واحدٌ التماسٌ ، وسلسلةٌ جديدة.
  • اعتبارُ stop مشمولًا. يسلّم text[0:3] أحرفَ المراكزِ 0,1,20, 1, 2؛ والمركزُ 3 هو حيث تُغلق النافذة.
  • إسنادُ شرائحَ فوق السلاسل. ترفضها السلاسل ، فذاك الامتدادُ امتيازُ القوائم.
  • يجب أن توافقَ إشارةُ الخطوةِ الاتجاهَ. "abcdef"[0:5:-1] فارغةٌ ، نافذةٌ تمشي يمينًا وخطوةٌ تشيرُ يسارًا لا تلتقيانِ في مكانٍ ما. أبقِ البدايةَ والنهايةَ والخطوةَ جميعُها في الاتجاهِ نفسه.

🧩 تحديات

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

اعكس السلسلةَ "racecar" بشريحةٍ.

💡 الجواب: "racecar"[::-1]"racecar" ، تُقرأ نفسها من الوجهين، وهو بالضبط سببُ نجاةِ متناظرِ الحروفِ من انعكاسِه.

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

من "abcdefghij"، استخرج كلَّ حرفٍ ثالثٍ: a، d، g، j.

💡 الجواب: "abcdefghij"[::3]"adgj" ، البدايةُ الافتراضيةُ تثبّتك عند المركز 0، والخطوةُ 3 تزحف بك عبر المتتاليةِ الحسابية.

🤔 أسئلة سقراطية

  • لماذا لا ترمي الشريحةُ خطأً قط حيث ترميه الفهرسة؟ وأيُّ موقفٍ يفصل بينهما؟
  • بإسنادِ شريحةٍ فقط، كيف تبادل عنصرينِ من قائمةٍ؟
  • إذا كانت text[::-1] تعكس، فأيُّ سطرٍ يخبرك هل السلسلةُ متناظرةُ الحروف؟

✅ فحص سريع

١. ماذا ترجع "Python"[1:4]؟

٢. كيف تعكس سلسلةً s؟

slicingindexingnegative-indexreverse