cb
codebamin
الفصل 6 · القوائم (Lists)

أساليب النصوص وثبات الكائنات (Immutability)

سبق أن رأيت أن len والفهرسة تعملان مع النصوص أيضًا، وكأن النص قائمة من المحارف إلى حد ما. وتدعم النصوص بعض الأساليب الجديدة التي تعلمناها، ليس للمحارف فقط بل لأي نص فرعي (Substring). جرّب مثلًا:

__copyable__ print('the' in 'feed the dog and the cat')

يعمل in مع النصوص كما يعمل مع القوائم. أعاد الأمر True لأن the موجودة داخل feed the dog and the cat كنص فرعي. ماذا عن count وindex؟

__copyable__ __program_indented__

يعمل هذان الأسلوبان أيضًا مع النصوص بطريقة تشبه القوائم. تعيد index فهرس بداية كلمة البحث 'the' داخل النص الأطول 'feed the dog and the cat'، وهو 5.

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... | |---|---|---|---|---|---|---|---|---|---| | f | e | e | d | | t | h | e | | ... |

لاحظ أن معظم الأساليب التي تعدّل قائمة في مكانها، مثل append وinsert وremove، تُرجع فقط None. أما بقية الدوال والأساليب فعادة تُرجع قيمة جديدة مفيدة من دون تغيير الوسيط الأصلي. والاستثناء هنا هو pop لأنها تعدّل القائمة وتُرجع العنصر المحذوف.

يسمى تغيير قيمة موجودة مباشرة التعديل (Mutation). الأنواع التي يمكن تعديلها تسمى Mutable، والتي لا يمكن تعديلها تسمى Immutable. القوائم قابلة للتعديل. أما النصوص فغير قابلة للتعديل؛ لذلك لا تملك أساليب مثل append ولا تسمح حتى بالإسناد عبر الفهرس. جرّب بنفسك:

__copyable__ 'Python'.append(' is cool!')

لا يمكنك تغيير النص نفسه؛ يمكنك فقط إنشاء نصوص جديدة واستخدامها بدلًا منه. ولهذا فإن كتابة السطر التالي وحده لا تحقق فائدة دائمة:

word.lower()

النص الذي يشير إليه word لم يتغير؛ word.lower() أعاد نصًا جديدًا ثم تم تجاهل هذه القيمة فورًا. إذا أردت تغيير القيمة التي يشير إليها word فعليك إسناد القيمة الجديدة إلى المتغير:

__copyable__ __program_indented__

لاحظ أن sentence.upper() لا يغيّر النص الأصلي الموجود في sentence.

ويمكنك استخدام word.lower() مباشرة داخل تعبير أكبر، مثل:

if word.lower() == 'yes':

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>